K8S的声明式管理方法

428 阅读7分钟

一、声明式管理方法

1.1 声明式管理方法介绍

  • 适合于对资源的修改操作

  • 声明式资源管理方法依赖于资源配置清单文件对资源进行管理

    • 资源配置清单文件有两种格式:yaml(人性化、易读),jason(易于aip接口解析)
  • 对资源的管理是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到K8S集群里

      #语法格式:
      kubectl create/apply/delete -f xxxx.yaml
      
    

1.2 查看资源配置清单(以yaml文件格式查看)

kubectl get deployments.apps <已有的副本控制器名称> -o yaml

image.png

1.3 解释资源配置清单

kubectl explain deployments.metdata.<下一级字段名>.<下下一级字段名>....

image.png

image.png

image.png

1.4 关于kubectl run命令创建Pod

该命令主要用于创建自主式Pod,该Pod与Pod副本控制器所创建的Pod的区别是:自主式Pod被kubectl delete命令删除后,不会像Pod副本控制器创建的Pod一样被重新拉起(创建),而会被删除且无法被拉起。

image.png

image.png

image.png

1.5 修改资源配置清单并应用

① 离线修改

离线修改:
修改yaml文件,并用 kubectl apply -f xxx.yaml 文件使之生效
注意:当apply不生效时,先使用delete清除资源,再apply创建资源

kubectl get deployments.apps nginx-test -o yaml > nginx-deployments.yaml   
#将名为nginx-test的deployment副本控制器的资源配置模板以yaml格式导出,文件名为nginx-deployments.yaml

vim nginx-deployments.yaml   #修改副本数为6

image.png

#修改完成后先使用delelte将原资源进行清除,再使用create钓创建资源
kubectl delete -f nginx-deployments.yaml    #将原副本控制器资源进行删除

kubectl apply -f nginx-deployments.yaml     #使用修改后的模板文件创建新资源

image.png

PS:若离线修改的yaml模板文件内容中的标签选择器字段、service资源字段等字段名称被修改,导致yaml文件中资源的名称字段与原已经创建的资源名称不同,将无法使用"kubectl delete -f <yaml文件>" 进行删除资源,只能先手动删除指定资源。

② 在线更新

#在线更新
kubectl edit deployments.apps nginx-test   
#对名为nginx-test的deployment副本控制器进行在线的修改
#注意:此修改方式不会对yaml文件内容进行修改

image.png

image.png

image.png

二、如何编写yaml文件

2.1 yaml文件语法格式

  • Kubernetes 支持 YAML 和 JSON 格式管理资源对象

    • JSON 格式:主要用于 api 接口之间消息的传递
    • YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读
  • YAML 语法格式:

    • 大小写敏感
    • 使用缩进表示层级关系
    • 不支持Tab键制表符缩进,只使用空格缩进
    • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
    • 符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
    • “---”表示YAML格式,一个文件的开始,用于分隔文件间
    • “#”表示注释

2.2 yaml文件资源版本标签

kubectl api-versions         #查看支持的api资源版本号
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1                      #如果是业务场景一般首选使用 apps/v1
authentication.k8s.io/v1     
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1             
autoscaling/v2beta1          #带有beta字样的代表的是测试版本,不用在生产环境中
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

2.3 创建副本控制器yaml示例

mkdir /opt/demo
cd /opt/demo/

#创建nginx的deployment副本控制器的yaml资源配置清单文件
vim nginx-deployment.yaml
apiVersion: apps/v1		#指定api版本标签(一级字段)
kind: Deployment		#定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
metadata:			#定义资源的元数据信息,比如资源的名称、namespace、标签等信息
  name: nginx-deployment	#定义资源的名称,在同一个namespace空间中必须是唯一的(二级字段)
  labels:			#定义Deployment资源标签,标签可以定义多个
    app: nginx	
spec:			#定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
  replicas: 3		#定义副本数量
  selector:		#定义标签选择器(必备的字段)
    matchLabels:	#定义匹配标签
      app: nginx	#需与 .spec.template.metadata.labels 定义的标签保持一致
  template:		#定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
    metadata:
      labels:           #定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
        app: nginx
    spec:
      containers:			#定义容器属性
      - name: nginx			#定义一个容器名,一个 - name: 定义一个容器
        image: nginx:1.15.4		#定义容器使用的镜像以及版本
        ports:
        - containerPort: 80		#定义容器的对外的端口

对上方内容进行配置时,需要保证字段的层级位置,若对于字段的层级概念模糊,可以查询官方文档或者使用"kubectl explain <一级字段>.<二级字段>.<三级字段>..."的格式对每个字段的下级字段进行查询。

#配置完成后对副本控制器的资源进行创建
kubectl create -f nginx-deployment.yaml    

#查看创建的pod资源
kubectl get pods -o wide

image.png

image.png

2.4 创建service服务资源yaml文件示例

vim nginx-service.yaml
apiVersion: v1  
kind: Service  
metadata:
  name: nginx-service
  labels:           #这里的标签内容与之前所创建的副本控制器资源的标签选择器标签一致
    app: nginx
spec:
  type: NodePort    #这里设置service资源类型为NodePort
  ports:            
  - port: 80        #使service端口80(port)转发到容器的80端口(containerPort)上
    targetPort: 80  #与之前Deployment控制器设置的containerPort端口号相同用于进行绑定
  selector:
    app: nginx
#上方的ports字段由于未指定nodePort的端口,所以默认映射端口为Node节点的随机端口

#编写完成后创建资源对象
kubectl create -f nginx-service.yaml 

#查看创建的service
kubectl get svc

#得到以下内容
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP        37d
nginx-service   NodePort    10.101.162.187   <none>        80:30462/TCP   5s

#在浏览器输入 nodeIP:nodePort 即可访问
http://192.168.142.20:30462
http://192.168.142.30:30462

image.png

image.png

2.5 创建pod资源yaml示例

vim apache.yaml   #编写资源清单配置文件
apiVersion: v1
kind: Pod         #设置资源种类为pod
metadata:
  name: apache    
  labels:
    name: apache-test   #标签为apache-test(与下方标签选择器相同)
spec:
  containers:
  - name: httpd         
    image: httpd        #选择镜像为httpd,后方未加标签则为lastest版本
    ports:
    - containerPort: 80     #容器暴露端口为80端口
---                         #使用分割线进行分割,下方为绑定的service资源配置清单
apiVersion: v1
kind: Service
metadata:
  name: apache-service
  labels:
    name: apache-test      
spec:
  type: NodePort            #设置service资源类型为NodePort
  ports:
  - port: 8080              #service端口号为8080
    targetPort: 80          #targetPort端口与containerPort相同
    nodePort: 30080         #映射Node节点端口号为30080
  selector:
    name: apache-test

#配置结束后生成资源
kubectl apply -f apache.yaml

#验证查看pod与svc状态
kubectl get svc,pods -o wide

image.png

#集群访问内部验证,格式:http://ClusterIP:port 
curl http://10.101.78.88:8080

#外部访问集群验证,格式:http://NodeIP:NodePort 
curl http://192.168.142.20:30080
curl http://192.168.142.30:30080

image.png

image.png

三、如何创建资源配置清单模板yaml文件

3.1 自主式pod资源清单模板创建示例

#使用kubectl run 命令进行创建
kubectl run nginx-test --image=nginx1.18 --port=80 --dry-run=client -o yaml > nginx-test.yaml
#--dry-run=client选项含义为空跑,用于检测这个创建自主pod命令的语法是否存在错误
#-o yaml 选项,即将这条命令所生成的资源配置清单使用yaml格式显示出来
#通过重定向输出,将yaml格式的资源配置清单生成为nginx-test.yaml文件

image.png

image.png

后续有需要可以在此资源配置模板文件中添加标签等字段信息,创建结束后,就可以使用"kubectl apply -f <资源配置清单文件>" 进行相关资源的创建。

3.2 service资源配置清单模板创建示例

#service资源使用kubectl expose 命令进行创建
kubectl expose deployment nginx-deployment --port=8080 --target-port=80 --type=NodePort --dry-run=client -o yaml > nginx-deployment-svc.yaml
#创建资源命令含义:创建一个service资源与nginx-deployment副本控制器进行绑定,service资源端口号为8080,暴露容器内部80端口并映射到Node节点的随机端口上

PS:设置的service服务绑定的副本控制器资源或者自主性pod资源,需要真实存在,否则不会正常生成资源配置模板文件

image.png

3.3 副本控制器资源配置清单模板创建示例

#副本控制器资源使用kubectl create 命令进行创建
kubectl create deployment nginx-test --image=nginx:1.18 --replicas=6 --port=80 --dry-run=client -o yaml > nginx-test-deployment.yaml
#创建资源命令含义:创建一个名为nginx-test的deployment副本控制器,使用的镜像为nginx:1.18,设置副本数为6,暴露pod容器端口号为80

image.png

3.4 补充:使用已有的资源进行资源配置清单模板文件的创建

使用" kubectl get <资源类型> <资源名称> -o yaml "命令,获取各个资源的资源配置清单,最后使用重定向输出,将配置清单文件导出,并以该文件为模板进行相关修改。

image.png