赞
踩
前言
Kubernetes 集群的声明式资源管理方法是当今云原生领域中的核心概念之一,使得容器化应用程序的部署和管理变得更加高效和可靠。本文将认识了解 Kubernetes 中声明式管理的相关理念、实际应用以及优势。
目录
通过使用 yaml 或 josn 文件对资源配置,然后再实现对资源的管理。
适合于对资源的修改操作
声明式资源管理方法依赖于资源配置清单文件对资源进行管理;资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)
对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
kubectl create -f xxxx.yaml
create 命令用于根据提供的配置文件创建新的 Kubernetes 资源。
kubectl apply -f xxxx.yaml
apply 命令也用于根据配置文件创建或更新资源。
kubectl delete -f xxxx.yaml
delete 命令用于根据配置文件删除 Kubernetes 资源;此命令非常直接,用于清理不再需要的资源。
在 K8s 中,控制器的定义是通过 YAML 文件完成的,该文件描述了资源的预期状态。这包括控制器的类型:如Deployment、statefulSet、Service 副本数量,使用的容器镜像,以及任何配置参数或环境变量。每一个控制器通常对应一种资源类型,如 Deployment、Service 等等。
在YAML中,我们可以指定这些资源的状态以及如何管理它们。Deployment 控制器在 YAML 文件中的定义可能包括:
① 使用 kubectl create 命令生成 yaml 文件导出
- 示例:
- kubectl create deployment nginx svc -o yaml > nginx-svc.yaml
② 使用 kubectl get 命令导出 yaml 文件
- 示例:
- kubectl get svc nginx-service -o yaml > my-svc.yaml
- 或
- kubectl edit svc nginx-service #复制配置,再粘贴到新文件
③ 官网或者其他网站下载 yaml 模版,然后进行修改快速的方法
官网获取网址:Pods | Kubernetes
GITHUB获取地址:kubernetes/hack/testdata at master · kubernetes/kubernetes · GitHub
④ 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息
- kubectl explain deployments.spec.template.spec.containers
- 或
- kubectl explain pods.spec.containers
⑤ 模拟运行 kubectl 陈述式创建资源的命令获取
- 用 --dry-run 命令生成:
- kubectl run my-deploy --image=nginx --dry-run=client -o yaml > my-deploy.yaml
资源配置清单是指用于定义 K8s 资源对象的配置文件。这些配置文件通常以 YAML 或 JSON 格式编写,用于描述要在 K8s 集群中创建、管理或删除的各种资源,如 Pod、Service、Deployment 等。
- 返回nginx-01的Deployment资源的摘要信息,并以yaml格式显示:
- [root@master01 ~]# kubectl get deployment nginx-01 -n fql -o yaml
-
- 获取nginx-service的Service资源,并以yaml格式输出该资源的详细信息:
- [root@master01 ~]# kubectl get svc nginx-service -n fql -o yaml
- 获取有关Kubernetes中Deployment资源的metadata字段的详细信息和说明:
- [root@master01 ~]# kubectl explain deployment.metadata
-
- 获取有关Kubernetes中Service资源的metadata字段的详细信息和说明
- [root@master01 ~]# kubectl explain service.metadata
-
- 在K8s中,metadata是用于描述资源对象的信息,metadata字段通常包括以下内容:
- # name:资源对象的名称,用于在集群中唯一标识该对象
- # namespace:资源对象所属的命名空间,用于对资源进行逻辑隔离和组织
- # labels:一组键值对,用于标识和分类资源对象,以便于查询和选择
- # annotations:一组键值对,用于存储额外的非标识性信息,如描述、构建信息等
- [root@master01 ~]# kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=2
- [root@master01 ~]# kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-svc --type=NodePort
-
- [root@master01 ~]# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d22h
- nginx-svc NodePort 10.96.72.223 <none> 80:30997/TCP 4s
- [root@master01 ~]# kubectl get pod,svc -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- pod/nginx-d9d8cf5c7-6rhcs 1/1 Running 0 7m1s 10.244.1.40 node01 <none> <none>
- pod/nginx-d9d8cf5c7-p44sk 1/1 Running 0 7m1s 10.244.1.39 node01 <none> <none>
-
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d22h <none>
- service/nginx-svc NodePort 10.96.72.223 <none> 80:30997/TCP 26s app=nginx
修改 yaml 文件,并用 kubectl apply -f xxxx.yaml 文件使之生效;注意:当 apply 不生效时,先使用 delete 清除资源,再 apply 创建资源。
- [root@master01 ~]# kubectl get svc nginx-svc -o yaml > nginx-svc.yaml
- [root@master01 ~]# vim nginx-svc.yaml
- port: 8080 # 修改
-
- [root@master01 ~]# kubectl delete -f nginx-svc.yaml # 清除资源
- service "nginx-svc" deleted
- [root@master01 ~]# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d22h
- [root@master01 ~]# kubectl apply -f nginx-svc.yaml
- service/nginx-svc created
- [root@master01 ~]# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d22h
- nginx-svc NodePort 10.96.72.223 <none> 8080:30997/TCP 2s
-
- [root@master01 ~]# curl 10.96.72.223:8080
- <title>Welcome to nginx!</title>
直接使用 kubectl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改
- [root@master01 ~]# kubectl edit svc nginx-svc
- service/nginx-svc edited
- # i:编辑,wq:保存
- [root@master01 ~]# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d22h
- nginx-svc NodePort 10.96.72.223 <none> 888:30997/TCP 10m
- [root@master01 ~]# vim nginx-svc.yaml
- port: 8080 # 未对yaml文件内容进行修改
- [root@master01 ~]# curl 10.96.72.223:888
- <title>Welcome to nginx!</title>
- [root@master01 ~]# kubectl api-versions
- apps/v1 # 如果是业务场景一般首选使用 apps/v1
- apps/v1beta1 # 带有beta字样的代表的是测试版本,不用在生产环境中
① 陈述式删除
- kubectl delete service nginx
- # 是一个命令,用于删除名为nginx的服务。这将从Kubernetes集群中删除该服务的定义和相关资源
② 声明式删除
- kubectl delete -f nginx-svc.yaml
- # 根据提供的YAML文件删除资源
区别:
- [root@master01 ~]# mkdir /data/demo -p
- [root@master01 ~]# cd /data/demo/
- [root@master01 demo]# vim nginx-dp.yaml
- apiVersion: apps/v1 # 指定api版本标签
- kind: Deployment # 定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
- metadata: # 定义资源的元数据信息,比如资源的名称、namespace、标签等信息
- name: nginx-01 # 定义资源的名称,在同一个namespace空间中必须是唯一的
- labels: # 定义Deployment资源标签
- web: nginx-01 # 定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
- spec:
- replicas: 3 # 定义副本数量
- selector: # 定义标签选择器
- matchLabels: # 定义匹配标签
- web: nginx-01 # 需与 .spec.template.metadata.labels 定义的标签保持一致
- template: # 定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
- metadata:
- labels: # 定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
- web: nginx-01
- spec:
- containers: # 定义容器属性
- - name: nginx # 定义一个容器名,一个 - name: 定义一个容器
- image: nginx:1.14 # 定义容器使用的镜像以及版本
- ports:
- - containerPort: 80 # 定义容器的对外的端口
- [root@master01 demo]# kubectl apply -f nginx-dp.yaml
- deployment.apps/nginx-01 created
- [root@master01 demo]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- nginx-01-8449c47886-22tm4 1/1 Running 0 8s
- nginx-01-8449c47886-csqhk 1/1 Running 0 8s
- nginx-01-8449c47886-zq9z8 1/1 Running 0 8s
- [root@master01 demo]# vim nginx-svc.yaml
- apiVersion: v1 # Kubernetes API 的版本,指定为 v1
- kind: Service # 定义了一个 Service(服务)
- metadata: # 包含了服务的元数据,比如名称、标签等
- name: nginx-svc # 服务的名称
- labels: # 服务的标签,用于标识和选择相关的资源
- web: nginx-01 # 服务的标签
- spec: # 定义了服务的规格,包括服务类型、端口和选择器
- type: NodePort # 服务的类型,被设置为 NodePort
- ports: # 服务的端口列表
- - port: 80 # 服务的端口
- targetPort: 80 # 服务转发请求的目标端口,设置为 80,与后端 Pod 的容器端口匹配
- selector: # 定义了用于选择后端 Pod 的标签
- web: nginx-01 # 选择器的标签,与 Deployment 或 Pod 的标签匹配
- [root@master01 demo]# kubectl apply -f nginx-svc.yaml
- service/nginx-svc created
- [root@master01 demo]# kubectl get pod,svc -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- pod/nginx-01-8449c47886-22tm4 1/1 Running 0 24m 10.244.1.43 node01 <none> <none>
- pod/nginx-01-8449c47886-csqhk 1/1 Running 0 24m 10.244.2.34 node02 <none> <none>
- pod/nginx-01-8449c47886-zq9z8 1/1 Running 0 24m 10.244.1.44 node01 <none> <none>
-
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d <none>
- service/nginx-svc NodePort 10.96.60.107 <none> 80:31646/TCP 10s web=nginx-01
- [root@master01 demo]# curl 10.96.60.107
- <title>Welcome to nginx!</title>
-
- [root@master01 demo]# curl 10.96.60.107 -I
- Server: nginx/1.14.2
① port
port 是 k8s 集群内部访问 service 的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service(四层)
② nodePort
nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service
③ targetPort
targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器
④ containerPort
containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort
- [root@master01 demo]# vim redis-db-svc.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: redis-dp
- labels:
- nosql: redis-01
- spec:
- replicas: 1
- selector:
- matchLabels:
- nosql: redis-01
- template:
- metadata:
- labels:
- nosql: redis-01
- spec:
- containers:
- - name: redis
- image: redis:latest
- ports:
- - containerPort: 6379
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: redis-svc
- labels:
- nosql: redis-01
- spec:
- selector:
- nosql: redis-01
- ports:
- - nodePort: 30001
- port: 6379
- protocol: TCP
- targetPort: 6379
- type: NodePort
- [root@master01 demo]# kubectl apply -f redis-db-svc.yaml
-
- [root@master01 demo]# kubectl get pod,svc
- NAME READY STATUS RESTARTS AGE
- pod/nginx-01-8449c47886-22tm4 1/1 Running 0 60m
- pod/nginx-01-8449c47886-csqhk 1/1 Running 0 60m
- pod/nginx-01-8449c47886-zq9z8 1/1 Running 0 60m
- pod/redis-dp-cd9f5cff6-clhdr 1/1 Running 0 8m25s
-
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d1h
- service/nginx-svc NodePort 10.96.60.107 <none> 80:31646/TCP 36m
- service/redis-svc NodePort 10.96.203.220 <none> 6379:30002/TCP 77s
使用 yaml 格式导出生成模板,并进行修改以及删除一些不必要的参数
① 生成并修改命名空间创建 yaml 文件
- [root@master01 ~]# kubectl create ns mysql-server -o yaml --dry-run=client > mysql.yaml
- [root@master01 ~]# vim mysql.yaml
- apiVersion: v1
- kind: Namespace
- metadata:
- name: mysql-server
- ---
② 生成并修改清单创建 yaml 文件
- [root@master01 ~]# kubectl create deployment mysql-01 --image=mysql:latest --port=3306 --replicas=1 -n mysql-server --dry-run=client -o yaml >> mysql.yaml
- apiVersion: v1 # Kubernetes API 的版本
- kind: Namespace # 定义了一个 Namespace
- metadata: # 包含了资源的元数据,比如名称、标签等
- name: mysql-server # Namespace 的名称
- --- # 这个分隔符表示 YAML 文件中的两个资源定义之间的分隔
- apiVersion: apps/v1
- kind: Deployment # 指定了资源类型为 Deploymen
- metadata: # 包含了 Deployment 的元数据,比如名称、标签等
- labels: # Deployment 的标签,用于标识和选择相关的资源
- app: mysql-01
- name: mysql-01 # Deployment 的名称
- namespace: mysql-server # Deployment 所属的 Namespace
- spec: # 定义了 Deployment 的规格,包括副本数量、选择器和 Pod 模板
- replicas: 1 # Deployment 的副本数量
- selector: # 定义了用于选择 Pod 的标签
- matchLabels: # 这是选择器的标签,与 Pod 模板中的标签匹配
- app: mysql-01
- template: # 定义了要创建的 Pod 的模板
- metadata: # 包含了 Pod 模板的元数据,比如标签等
- labels: # Pod 模板的标签,用于标识和选择相关的资源
- app: mysql-01
- spec: # 定义了 Pod 的规格,包括容器和端口
- containers:
- - image: mysql:latest # 容器的镜像,使用的是最新版本的 MySQL 镜像
- name: mysql # 容器的名称
- ports: # 容器的端口列表
- - containerPort: 3306 # 容器的端口
- env: # 定义环境变量列表
- - name: MYSQL_ROOT_PASSWORD # 环境变量的名称
- value: "123123" # 设置MySQL的root密码,也就是环境变量的值
- # 当MySQL容器首次启动时,它会检查数据库是否已经初始化,并且如果没有提供密码相关的环境变量,它会报错并退出
- volumeMounts: # 定义如何挂载卷到容器中
- - name: mysql-data # 引用的卷的名称
- mountPath: /var/lib/mysql # 卷在容器中的挂载路径
- volumes: # 定义Pod中使用的卷列表
- - name: mysql-data # 卷的名称,与volumeMounts中的name相对应
- emptyDir: {}
- # 一个空目录卷。这种类型的卷在Pod首次被调度到节点上时创建,并在Pod被删除时销毁。它不持久化数据,仅用于临时存储
- ---
③ 编辑 svc 资源 yaml 文件
由于集群中还未创建 mysql-01,无法使用命令生成模板:kubectl expose service mysql-01 --port=3306 --target-port=3306 --name=mysql-svc --type=NodePort --dry-run=client -o yaml >> mysql.yam
这里手动编辑 yaml 文件:
- [root@master01 ~]# vim mysql.yaml
- apiVersion: v1 # Kubernetes API 的版本
- kind: Namespace # 定义了一个 Namespace
- metadata: # 包含了资源的元数据,比如名称、标签等
- name: mysql-server # Namespace 的名称
- --- # 这个分隔符表示 YAML 文件中的两个资源定义之间的分隔
- apiVersion: apps/v1
- kind: Deployment # 指定了资源类型为 Deploymen
- metadata: # 包含了 Deployment 的元数据,比如名称、标签等
- labels: # Deployment 的标签,用于标识和选择相关的资源
- app: mysql-01
- name: mysql-01 # Deployment 的名称
- namespace: mysql-server # Deployment 所属的 Namespace
- spec: # 定义了 Deployment 的规格,包括副本数量、选择器和 Pod 模板
- replicas: 1 # Deployment 的副本数量
- selector: # 定义了用于选择 Pod 的标签
- matchLabels: # 这是选择器的标签,与 Pod 模板中的标签匹配
- app: mysql-01
- template: # 定义了要创建的 Pod 的模板
- metadata: # 包含了 Pod 模板的元数据,比如标签等
- labels: # Pod 模板的标签,用于标识和选择相关的资源
- app: mysql-01
- spec: # 定义了 Pod 的规格,包括容器和端口
- containers:
- - image: mysql:latest # 容器的镜像,使用的是最新版本的 MySQL 镜像
- name: mysql # 容器的名称
- ports: # 容器的端口列表
- - containerPort: 3306 # 容器的端口
- env: # 定义环境变量列表
- - name: MYSQL_ROOT_PASSWORD # 环境变量的名称
- value: "123123" # 设置MySQL的root密码,也就是环境变量的值
- # 当MySQL容器首次启动时,它会检查数据库是否已经初始化,并且如果没有提供密码相关的环境变量,它会报错并退出
- volumeMounts: # 定义如何挂载卷到容器中
- - name: mysql-data # 引用的卷的名称
- mountPath: /var/lib/mysql # 卷在容器中的挂载路径
- volumes: # 定义Pod中使用的卷列表
- - name: mysql-data # 卷的名称,与volumeMounts中的name相对应
- emptyDir: {}
- # 一个空目录卷。这种类型的卷在Pod首次被调度到节点上时创建,并在Pod被删除时销毁。它不持久化数据,仅用于临时存储
- ---
- apiVersion: v1
- kind: Service # 定义了一个 Service(服务)
- metadata: # 包含了服务的元数据,比如名称、标签等
- name: mysql-service # 服务的名称
- namespace: mysql-server # 服务所属的 Namespace
- labels: # 服务的标签,用于标识和选择相关的资源
- app: mysql-01 # 服务的标签,与 Deployment 或 Pod 的标签匹配
- spec: # 定义了服务的规格,包括服务类型、端口和选择器
- type: NodePort # 服务的类型,被设置为 NodePort
- ports: # 服务的端口列表
- - port: 3306 # 服务的端口
- targetPort: 3306 # 服务转发请求的目标端口
- selector: # 定义了用于选择后端 Pod 的标签
- app: mysql-01 # 选择器的标签,与 Deployment 或 Pod 的标签匹配
- [root@master01 ~]# kubectl apply -f mysql.yaml
- namespace/mysql-server created
- deployment.apps/mysql-01 created
- service/mysql-service created
-
- [root@master01 ~]# kubectl get pod,svc -n mysql-server -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- pod/mysql-01-776dd57c9b-fb5hp 1/1 Running 0 48s 10.244.2.37 node02 <none> <none>
-
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- service/mysql-service NodePort 10.96.103.121 <none> 3306:32316/TCP 68s app=mysql-01
- [root@master01 ~]# kubectl exec -it mysql-01-776dd57c9b-fb5hp -n mysql-server bash
- kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
- root@mysql-01-776dd57c9b-fb5hp:/# mysql -u root -p'123123'
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。