【kubernetes】关于k8s集群的声明式管理资源

目录

一、声明式管理方法

二、资源配置清单管理

1、导出资源配置清单

2、修改资源配置清单并应用

2.1离线修改

2.2在线修改

三、通过资源配置清单创建资源对象

获取K8S资源配置清单文件模板?

关于配置清单常见的字段

方案一:手写yaml配置文件

[方案二:根据现有的资源导出模板文件 创建新资源](#方案二:根据现有的资源导出模板文件 创建新资源)

方案三:无中生有创建模板,修改文件创建新资源

方案四:根据官方文档案例

四、总结yaml格式

[kubectl explain查看字段帮助信息,可一层层的查看相关资源对象的帮助信息](#kubectl explain查看字段帮助信息,可一层层的查看相关资源对象的帮助信息)

yaml文件的学习方法


一、声明式管理方法

1.适合于对资源的修改操作(陈述式方式修改资源非常不方便)
2.声明式资源管理方法依赖于yaml资源配置清单文件对资源进行管理
资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)
3.对资源的管理,是通过事先定义在统一资源配置清单yaml文件内,再通过陈述式命令应用到k8s集群里
4.语法格式:kubectl create/apply/delete -f xxxx.yaml

create:表示创建资源 不允许修改除非先删除

apply:建议使用的方式

delete:表示删除

二、资源配置清单管理

1、导出资源配置清单

复制代码
kubectl -n testapp get deployments.apps deploy-nginx -o yaml
//查看资源配置清单

命令格式:kubectl -n 命名空间 get 资源类型  资源名称 -o yaml

2、修改资源配置清单并应用

将配置清单导出为文件,进行修改

复制代码
kubectl -n testapp get deployments.apps deploy-nginx -o yaml >deploy-nginx.yaml
//导出资源配置清单为yaml文件

kubectl apply -f deploy-nginx.yaml
//基于yaml配置清单创建资源

2.1离线修改

复制代码
离线修改:

kubectl -n testapp get svc svc-nginx -o yaml > svc-nginx.yaml
//导出svc-nginx的配置清单模板

vim svc-nginx.yaml
//完成修改
  - nodePort: 32000  #修改端口号
    port: 6060

kubectl delete -f svc-nginx.yaml && kubectl apply -f svc-nginx.yaml
//清理并重新创建svc资源

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

kubectl -n 命名空间 get svc
//查看验证 

2.2在线修改

复制代码
在线修改:
直接使用 kubectl edit -n 命名空间 service svc-nginx 
//在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改(不影响离线方式的yaml文件)

kubectl -n testapp edit svc svc-nginx
//在线修改

2.3关于删除资源

复制代码
//删除资源配置清单
陈述式删除:
kubectl -n testapp delete svc svc-nginx-v2

声明式删除:
kubectl delete -f svc-nginx.yaml

三、通过资源配置清单创建资源对象

获取K8S资源配置清单文件模板?

1)手写yaml配置文件,可以根据 kubectl explain 命令获取字段信息
2)查看现有的资源配置获取:

  • kubectl get -n <命名空间> <资源类型> <资源名称> -o yaml > XXX.yaml
  • kubectl edit -n <命名空间> <资源类型> <资源名称> ,然后手动复制资源配置,粘贴到yaml文件中

3)无中生有(模拟运行kubectl陈述式创建资源的命令获取):

  • kubectl create|run|expose 选项 --dry-run=client -o yaml > XXX.yaml

4)复制K8S官网文档的资源配置案例

关于配置清单常见的字段

  • apiversion: #指定资源对象的在K8S中使用的api接口版本
  • kind: #指定资源对象的类型
  • metadata: #指定资源对象的元数据信息,比如****name指定资源名称、namespace指定命名空间、annotation指定注释、label指定标签
  • spec: #指定资源对象的资源配置清单**(配置属性),比如副本数、镜像、网络模式、存储卷、label selector标签选择器**
  • status: #资源对象在当前的运行状态信息

方案一:手写yaml配置文件

详细解读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    #定义容器的对外的端口

举例:

创建pod资源

复制代码
vim pod-demo.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: new-test
  labels:
    myapp: nginx
    myversion: v1
spec:
  containers:
  - name: myapp
    image: soscscs/myapp:v1
    ports:
    - containerPort: 80
      name: http
      protocol: TCP
    - containerPort: 443
      name: https
      protocol: TCP
  - name: busybox
    image: busybox
    command: [ "/bin/sh", "-c", "sleep 60" ]

创建deployment资源

复制代码
vim deployment-demo.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-demo2
  namespace: new-test
  labels:
    deploy: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      podname: nginx
  template:
    metadata:
      labels:
        podname: nginx
        podversion: v2
    spec:
      containers:
      - name: nginx
        image: soscscs/myapp:v2
        ports:
        - containerPort: 80
          name: http

创建service资源

复制代码
[root@master01 demo]#vim svc-demo.yaml 

apiVersion: v1
kind: Service
metadata:
  name: svc-demo2
  namespace: new-test
spec:
#资源类型
  type: NodePort
  selector:
#注意查看需要管理的pod标签,然后再做关联
    podname: nginx
  ports:
#clusterip端口
  - port: 1314
#pod容器的端口
    targetPort: 80
#node节点的port
    nodePort: 30088
#自定义service的clusterip,这个网段是在搭建k8s集群的时候定义的servicesubnet为10.96.0.0/16
  clusterIP: 10.96.100.100

详解k8s中的port:
●port
port 是 k8s 集群内部访问service的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service

●nodePort
nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service。(默认:30000-32767)

●targetPort
targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器。

●containerPort
containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort。


方案二:根据现有的资源导出模板文件 创建新资源

跨命名空间创建deployment资源

复制代码
apiVersion: apps/v1  
kind: Deployment
metadata:
  labels:
    deploy: deploy-new   #标签修改为deploy-new
  name: deploy-new       #名称为deploy-new
  namespace: testapp     #命名空间指定testapp
spec:
  replicas: 5   #副本数设置为5
  selector:
    matchLabels:
      newname: nginx  #标签选择器与pod的新标签一致
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        newname: nginx #创建新标签
    spec:
      containers:
      - image: soscscs/myapp:v1 #修改版本为v1
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
      restartPolicy: Always
      terminationGracePeriodSeconds: 30

跨命名空间创建service资源

复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc-new      #自定义新svc名称
  namespace: testapp #修改为最新的命名空间testapp
spec:
  clusterIP: 10.96.100.200 #修改clusterip为10.96.100.200
  clusterIPs:
  - 10.96.100.200 #两种配置方式
#这是service资源转发策略,如果是cluster表示允许转发给别的node节点的pod,如果是local表示只允许转发给当前node节点的pod
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30188 #端口被占用了,需要修改30188
    port: 1314      #不同命名空间的service资源是可以有相同的端口号,可以不改
    protocol: TCP
    targetPort: 80
  selector:
#提前查看pod的标签进行关联
    newname: nginx
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

拓展:externalTrafficPolicy字段的cluster与local的区别

"externalTrafficPolicy"字段可以设置2个值:Cluster或者Local。

1)Cluster表示:流量可以转发到其他节点上的Pod。

2)Local表示:流量只发给本机的Pod。

cluster策略

流量可以转发到其他节点上的Pod。

local策略

流量只发给本机的Pod。

方案三:无中生有创建模板,修改文件创建新资源

无中生有创建deployment资源

无中生有创建service资源

复制代码
kubectl create svc nodeport svc-test --tcp=8080:80 --dry-run=client -o yaml > svc.yaml
//基于直接创建svc生成yaml
复制代码
kubectl -n new-test expose deployment deploy-demo2 --name=svc-test --port=8080 --dry-run=client -o yaml > svc-test.yaml
//基于deployment创建svc的yaml文件

补充案例

复制代码
//kubectl run --dry-run=client 打印相应的 API 对象而不执行创建
kubectl run nginx-test --image=nginx --port=80 --dry-run=client
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client

//查看生成yaml格式
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml

//查看生成json格式
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o json
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json

//使用yaml格式导出生成模板,并进行修改以及删除一些不必要的参数
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yaml
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml  > nginx-deploy.yaml

方案四:根据官方文档案例

k8s的官方中文搜索,有详细的信息

https://kubernetes.io/zh-cn/docs/home/

四、总结yaml格式

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

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

yaml语法

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

复制代码
K8S资源配置清单文件字段的值类型
字段: <integer>   数字         字段: 数值
字段: <string>    字符串       字段: "字符串"     字段: '字符串'    字段: 字符串
字段: <boolean>   布尔值       字段: true|false

字段: <Object>    对象:值可能是一层或多层子字段
                               字段:
							     二级字段:
								   三级字段

字段: <[]Object>   列表类型的对象             字段:
                                              - 二级字段:
											      三级字段
								              - 二级字段: 
字段: <map[string]string>    映射:值可能是一个或多个键值对类型的值

                                  字段:
								    key1: value1
								    key2: value2
								    key3: value3

kubectl explain查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

复制代码
kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers

总结

yaml文件的学习方法:

(1)多看别人(官方)写的,能读懂

(2)能照着现场的文件改着用

(3)遇到不懂的,善用kubectl explain ... 命令查

复制代码
//写yaml太累怎么办?
●用 --dry-run 命令生成
kubectl run my-deploy --image=nginx --dry-run=client -o yaml > my-deploy.yaml

●用get命令导出
kubectl get svc nginx-service -o yaml > my-svc.yaml
或
kubectl edit svc nginx-service  #复制配置,再粘贴到新文件
相关推荐
ICscholar12 小时前
ExaDigiT/RAPS
linux·服务器·ubuntu·系统架构·运维开发
sim202012 小时前
systemctl isolate graphical.target命令不能随便敲
linux·mysql
薛定谔的猫198213 小时前
RAG(二)基于 LangChain+FAISS + 通义千问搭建轻量级 RAG 检索增强生成系统
运维·服务器·langchain
米高梅狮子13 小时前
4. Linux 进程调度管理
linux·运维·服务器
再创世纪14 小时前
让USB打印机变网络打印机,秀才USB打印服务器
linux·运维·网络
fengyehongWorld15 小时前
Linux ssh端口转发
linux·ssh
人生匆匆15 小时前
k8s通过域名访问 StatefulSet的pod
云原生·容器·kubernetes
昨夜见军贴061615 小时前
IACheck AI审核如何实现自动化来料证书报告审核,全面提升生产效率与合规水平
运维·人工智能·自动化
赵文宇(温玉)16 小时前
免费|不限速|不限流量|多架构|容器镜像服务---第1批同步:Docker官方维护的143个library镜像仓库
docker·容器·架构
知识分享小能手16 小时前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的Shell编程详细知识点(含案例代码)(17)
linux·学习·ubuntu