• Kubernetes——YAML文件编写


    目录

    一、创建Kubernetes对象YAML文件必备字段

    1.apiVersion

    2.kind

    3.metadata

    4.spec

    二、YAML格式基本规范

    1.结构表示

    2.键值对

    3.列表(数组)

    4.字典(映射)

    5.数据类型

    6.注释

    7.多文档支持

    8.复杂结构

    9.示例 

    三、YAML文件编写

    1.YAML文件的组成

    2.生成YAML文件框架

    2.1--dry-run命令

    2.2通过explain获取YAML文件字段的含义

    3.调整YAML文件内容

    3.1Deployment

    3.2Service

    4.Deployment Workload部署

    5.Kubectl命令行使用


    一、创建Kubernetes对象YAML文件必备字段

    在Kubernetes创建对象,我们通常是通过一个声明式的清单来创建。Kubernetes 对象是持久化的实体。是一种“意向表达”(Record of Intent)。一旦创建该对象, Kubernetes 系统将不断工作以确保该对象存在。

    我们在Kubernetes中创建对象,本质上是在通知 Kubernetes 系统,我们想要的集群工作负载状态看起来应该是什么样子的, 也就是 Kubernetes 集群所谓的期望状态(Desired State)。

    1.apiVersion

    创建该对象所使用的 Kubernetes API 的版本,比如 apps/v1,networking.k8s.io/v1等。

    2.kind

    想要创建的对象的类别,比如 Deployment,DaemonSet等。

    3.metadata

    帮助唯一标识对象的一些数据,包括一个 name 字符串(必需字段)、UID(自动生成) 和可选的 namespace。

    4.spec

    我们所期望的该对象的状态,对每个 Kubernetes 对象而言,其 spec都不同

    具体的可以参考官方文档:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/

    1. apiVersion: v1 # Kubernetes API 的版本,对于 Pod 来说,通常是 v1
    2. kind: Pod # 要创建的对象的类别,这里是 Pod
    3. metadata:
    4. name: my-pod # 对象的名称,在命名空间中必须是唯一的
    5. namespace: default # 命名空间,如果省略,则默认为 default
    6. # UID 是由 Kubernetes 系统自动生成的,不需要在清单文件中指定
    7. spec:
    8. containers: # Pod 规格中定义了容器的列表
    9. - name: my-container # 容器的名称
    10. image: nginx:1.19.2 # 容器使用的镜像及其标签
    11. # 其他容器配置,如端口、环境变量等...
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    二、YAML格式基本规范

    YAML(YAML Ain't Markup Language)是一种用于数据序列化的格式,常用于配置文件、数据交换等场景。YAML的目标是易于阅读和书写,同时也易于与编程语言交互。YAML文件通常以.yaml.yml作为文件扩展名。

    1.结构表示

    • 使用缩进表示层级关系,通常使用两个或四个空格的缩进,但必须在同一文档中保持一致。
    • 不使用制表符(Tab)进行缩进。

    2.键值对

    • 使用冒号加空格: 来分隔键和值。
    • 键是唯一的,通常是字符串。

    3.列表(数组)

    • 使用短横线加空格-  来表示列表项。
    • 列表项通常会缩进,表示属于上一级的列表。

    4.字典(映射)

    • 字典是一组键值对的集合。
    • 字典的每个键值对都会缩进,表示属于上一级的字典。

    5.数据类型

    • 支持字符串、布尔值、整数、浮点数、null、时间、日期等数据类型。
    • 字符串通常不需要引号,但如果包含特殊字符,则需要用单引号或双引号括起来。
    • 使用true/false表示布尔值。
    • 使用null表示空值。

    6.注释

    使用井号 # 开头表示注释,注释内容不会被解析。

    7.多文档支持

    使用三个短横线---来分隔文件中的多个文档。

    8.复杂结构

    字典和列表可以嵌套使用,形成复杂的结构。

    9.示例 

    1. # 这是一个注释
    2. person: # 字典的开始
    3. name: John Doe # 字符串
    4. age: 30 # 整数
    5. married: true # 布尔值
    6. children: # 列表的开始
    7. - name: Jane Doe
    8. age: 10
    9. - name: Doe Junior
    10. age: 5
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    三、YAML文件编写

    YAML文件通常用于配置管理系统、部署工具、持续集成和持续部署(CI/CD)等场景,它们易于阅读和编辑。在Kubernetes中,YAML文件被广泛用于定义资源对象,如Deployments、Services、Pods等。

    1.YAML文件的组成

    YAML文件由apiVersionkindmetadataspecstatus五部分组成,前四部分较常用。

    1. kubectl explain deployment
    2. KIND: Deployment
    3. VERSION: apps/v1
    4. DESCRIPTION:
    5. Deployment enables declarative updates for Pods and ReplicaSets.
    6. FIELDS:
    7. apiVersion
    8. APIVersion defines the versioned schema of this representation of an
    9. object. Servers should convert recognized schemas to the latest internal
    10. value, and may reject unrecognized values. More info:
    11. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
    12. kind
    13. Kind is a string value representing the REST resource this object
    14. represents. Servers may infer this from the endpoint the client submits
    15. requests to. Cannot be updated. In CamelCase. More info:
    16. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
    17. metadata
    18. Standard object's metadata. More info:
    19. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
    20. spec
    21. Specification of the desired behavior of the Deployment.
    22. status
    23. Most recently observed status of the Deployment.
    24. wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

      2.生成YAML文件框架

      2.1--dry-run命令

      1. kubectl create deployment jumpoint-web --image=nginx:latest --port=80 --replicas=2 --namespace=jumpoint-ns --dry-run=client --output=yaml
      2. apiVersion: apps/v1
      3. kind: Deployment
      4. metadata:
      5. creationTimestamp: null
      6. labels:
      7. app: jumpoint-web
      8. name: jumpoint-web
      9. namespace: jumpoint-ns
      10. spec:
      11. replicas: 2
      12. selector:
      13. matchLabels:
      14. app: jumpoint-web
      15. strategy: {}
      16. template:
      17. metadata:
      18. creationTimestamp: null
      19. labels:
      20. app: jumpoint-web
      21. spec:
      22. containers:
      23. - image: nginx:latest
      24. name: nginx
      25. ports:
      26. - containerPort: 80
      27. resources: {}
      28. status: {}
      wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

      若要定义Pod等资源对象,生成YAML文件的方法类似。

      2.2通过explain获取YAML文件字段的含义

      1. #若要查看metadata.labels字段的含义
      2. kubectl explain deployment.metadata.labels
      3. KIND: Deployment
      4. VERSION: apps/v1
      5. FIELD: labels
      6. DESCRIPTION:
      7. Map of string keys and values that can be used to organize and categorize
      8. (scope and select) objects. May match selectors of replication controllers
      9. and services. More info: http://kubernetes.io/docs/user-guide/labels
      wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
      1. #若要查看spec.selector.matchLabels字段的含义(其它字段含义查询方式类似)
      2. kubectl explain deployment.spec.selector.matchLabels
      3. KIND: Deployment
      4. VERSION: apps/v1
      5. FIELD: matchLabels
      6. DESCRIPTION:
      7. matchLabels is a map of {key,value} pairs. A single {key,value} in the
      8. matchLabels map is equivalent to an element of matchExpressions, whose key
      9. field is "key", the operator is "In", and the values array contains only
      10. "value". The requirements are ANDed.
      wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
      1. #若要查看deployment.spec.template.spec.containers字段下还有哪些字段可用,有时可能要根据实际需求添加一些字段(上边生成的YAML文件略简单)
      2. kubectl explain deployment.spec.template.spec.containers
      3. KIND: Deployment
      4. VERSION: apps/v1
      5. RESOURCE: containers <[]Object>
      6. DESCRIPTION:
      7. List of containers belonging to the pod. Containers cannot currently be
      8. added or removed. There must be at least one container in a Pod. Cannot be
      9. updated.
      10. A single application container that you want to run within a pod.
      11. FIELDS:
      12. ...
      13. imagePullPolicy
      14. Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always
      15. if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated.
      16. More info:
      17. https://kubernetes.io/docs/concepts/containers/images#updating-images
      18. Possible enum values:
      19. - `"Always"` means that kubelet always attempts to pull the latest image.
      20. Container will fail If the pull fails.
      21. - `"IfNotPresent"` means that kubelet pulls if the image isn't present on
      22. disk. Container will fail if the image isn't present and the pull fails.
      23. - `"Never"` means that kubelet never pulls an image, but only uses a local
      24. image. Container will fail if the image isn't present
      25. ...
      wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

      3.调整YAML文件内容

      精简不用的字段、修改字段的内容、添加镜像的拉取策略等,将其保存到nginx-deployment.yaml文件中。

      3.1Deployment

      1. apiVersion: apps/v1
      2. kind: Deployment
      3. metadata:
      4. labels:
      5. app: jumpoint-web-deployment-label
      6. name: jumpoint-web
      7. namespace: jumpoint-ns
      8. spec:
      9. replicas: 2
      10. selector:
      11. matchLabels:
      12. app: jumpoint-web-pod-label
      13. template:
      14. metadata:
      15. labels:
      16. app: jumpoint-web-pod-label
      17. spec:
      18. containers:
      19. - image: nginx:latest
      20. name: jumpoint-web-container-name
      21. imagePullPolicy: Always
      22. ports:
      23. - containerPort: 80
      24. protocol: TCP
      25. name: http
      wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
      1. #使用nginx-deployment.yaml文件创建Deployment资源对象。
      2. kubectl create namespace jumpoint-ns
      3. kubectl apply -f nginx-deployment.yaml
      4. kubectl get deployments -n jumpoint-ns
      5. kubectl get pods -n jumpoint-ns -o wide
      6. kubectl describe deployment -n jumpoint-ns jumpoint-web
      wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

      注意:YAML文件中spec.selector.matchLabels必须与spec.template.metadata.labels一致,若不一致,如spec.selector.matchLabels=jumpoint-web-pod-selector,spec.template.metadata.labels=jumpoint-web-pod-label,会遇到如下报错:

      1. kubectl apply -f nginx-deployment.yaml
      2. The Deployment "jumpoint-web" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"jumpoint-web-pod-label"}: `selector` does not match template `labels`

      上述报错的原因也比较好理解,在Kubernetes中,Deployment标签、Pod选择器,和Pod标签之间的关系是为了确保Deployment能够正确地管理其下属的Pod。以下是这三个标签作用的说明

      • Deployment标签(metadata.labels)

      这些标签是附加在Deployment资源本身上的,用于识别和组织资源,但并不直接影响Deployment如何选择和管理Pod。通常,这些标签用于帮助用户通过标签选择器(如kubectl get deployments -l app=jumpoint-web-deployment-label)找到特定的Deployment。

      • Pod选择器 (spec.selector.matchLabels)

      这个选择器定义了Deployment如何找到它应该管理的Pod。Deployment会监视并管理所有与这个选择器匹配的Pod。因此,该选择器需要与创建的Pod的标签相匹配,以便Deployment可以“认领”并管理这些Pod。

      • Pod标签 (spec.template.metadata.labels)

      这些标签是在Pod模板中定义的,将被附加到由Deployment创建的每个Pod实例上。该标签必须与Deployment的Pod选择器匹配,其会告诉Deployment哪些Pod属于它。如果这些标签不匹配,Deployment将无法找到(也就是无法选择)它应该管理的Pod,导致它不会执行任何更新或回滚操作。

      简而言之,spec.selector.matchLabels必须与spec.template.metadata.labels一致,因为这样设置后,Deployment才能正确地识别出它应该管理的Pod。而metadata.labels在Deployment上的标签主要是为了方便用户对Deployment进行分类和查询,并不直接参与Pod的选择过程。

      3.2Service

      1. cat nginx-service.yaml
      2. apiVersion: v1
      3. kind: Service
      4. metadata:
      5. labels:
      6. app: nginx-web-service-label
      7. name: nginx-web-service
      8. namespace: jumpoint-ns
      9. spec:
      10. type: NodePort
      11. ports:
      12. - name: http
      13. port: 80
      14. protocol: TCP
      15. targetPort: 80
      16. nodePort: 30001
      17. selector:
      18. app: jumpoint-web-pod-label

      Service的spec.selector,会匹配Pod的spec.template.metadata.labels,并将网络流量路由到匹配到的Pod上。

      4.Deployment Workload部署

      下面开始部署一个完整的Deployment工作负载(创建NameSpace---->部署Deployment---->创建Service)

      1. cat nginx-deployment-v2.yaml
      2. apiVersion: v1
      3. kind: Namespace
      4. metadata:
      5. name: jumpoint-ns-v2
      6. labels:
      7. app: jumpoint-ns-v2-namespace-label
      8. ---
      9. apiVersion: apps/v1
      10. kind: Deployment
      11. metadata:
      12. labels:
      13. app: jumpoint-web-deployment-label
      14. name: jumpoint-web
      15. namespace: jumpoint-ns-v2
      16. spec:
      17. replicas: 2
      18. selector:
      19. matchLabels:
      20. app: jumpoint-web-pod-label
      21. template:
      22. metadata:
      23. labels:
      24. app: jumpoint-web-pod-label
      25. spec:
      26. containers:
      27. - image: nginx:latest
      28. name: jumpoint-web-container-name
      29. imagePullPolicy: Always
      30. ports:
      31. - containerPort: 80
      32. protocol: TCP
      33. name: http
      34. ---
      35. apiVersion: v1
      36. kind: Service
      37. metadata:
      38. labels:
      39. app: nginx-web-service-label
      40. name: nginx-web-service
      41. namespace: jumpoint-ns-v2
      42. spec:
      43. type: NodePort
      44. ports:
      45. - name: http
      46. port: 80
      47. protocol: TCP
      48. targetPort: 80
      49. nodePort: 30004
      50. selector:
      51. app: jumpoint-web-pod-label
      52. kubectl apply -f nginx-deployment-v2.yaml

      5.Kubectl命令行使用

      1. kubectl get deployment -n jumpoint-ns-v2
      2. kubectl get pods -n jumpoint-ns-v2 -o wide
      3. kubectl get svc -n jumpoint-ns-v2
      4. kubectl get ep -n jumpoint-ns-v2
    25. 相关阅读:
      Spring Boot
      sql 查询
      基于 IntelliJ 的 IDE 将提供 Wayland 支持
      基于协作搜索算法的函数寻优及工程优化
      C语言判断一个大于1的整数是否为质数
      day18-web工程路径
      盘点13种即插即用的涨点模块,含注意力机制、卷积变体、Transformer变体
      C Primer Plus(6) 中文版 第11章 字符串和字符串函数 11.1 表示字符串和字符串I/O
      Power BI 傻瓜入门 13. 进入仪表板
      Hadoop核心之MapReduce框架总结Ⅱ
    26. 原文地址:https://blog.csdn.net/G_D0120/article/details/139384960