kubenetes编写 deployment 清单模板

示例模板


apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    version: "1.1.6"
  labels:
    k8s-app: deployment-nginx
  name: deployment-nginx
  namespace: test
spec:
  minReadySeconds: 30
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      dyapp: nginx
      dyitem: zcy-test
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        dyapp: nginx
        dyitem: zcy-test
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: dylabel_node_memorysize
                operator: Gt
                values:
                - "8"
            weight: 1
      containers:
      - name: nginx
        env:
        - name: MY_ENV
          value: PRO
        image: nginx:1.21.6
        imagePullPolicy: IfNotPresent
        lifecycle:
          postStart:
            exec:
              command:
              - /bin/sh
              - -c
              - echo 'Container was started'
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - sleep 10
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /index.html
            port: 80
            scheme: HTTP
          initialDelaySeconds: 60
          periodSeconds: 3
          successThreshold: 1
          timeoutSeconds: 2
        ports:
        - containerPort: 80
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /index.html
            port: 80
            scheme: HTTP
          initialDelaySeconds: 5
          periodSeconds: 3
          successThreshold: 3
          timeoutSeconds: 2
        resources:
          limits:
            cpu: 500m
            ephemeral-storage: 2000Mi
            memory: 512Mi
          requests:
            cpu: 200m
            ephemeral-storage: 1000Mi
            memory: 512Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /tmp
          name: ephemeral
      dnsConfig:
        searches:
        - zcy.svc.cluster.local
        - test.svc.cluster.local
        - svc.cluster.local
        - cluster.local
      dnsPolicy: ClusterFirst
      hostAliases:
      - hostnames:
        - gray.mylocal.cn
        ip: 192.168.6.16
      hostNetwork: false
      imagePullSecrets:
      - name: tcr-dyzcy-test-pull
      initContainers:
      - name: setsysctl
        command:
        - sh
        - -c
        - |
          sysctl -w net.core.somaxconn=65535
          sysctl -w net.ipv4.ip_local_port_range="1024 65535"
          sysctl -w net.ipv4.tcp_tw_reuse=1
          sysctl -w fs.file-max=1048576
        image: busybox
        imagePullPolicy: IfNotPresent
        securityContext:
          privileged: true
      # nodeName: 192.168.3.12
      # nodeSelector:
      #   dyarea: wan
      #   dyenv: prod
      priority: 100
      preemptionPolicy: IfRequired
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: sa-imzcy
      serviceAccountName: sa-imzcy
      shareProcessNamespace: false
      terminationGracePeriodSeconds: 30
      tolerations:
      - effect: NoSchedule
        key: dynoderole
        operator: Equal
        value: gateway
      volumes:
      - name: ephemeral
        emptyDir: {}

deployment

在此级别下,包含如下字段:

  • apiVersion:指定使用的 Kubernetes API 的版本。

  • kind:指定该资源的类型。

  • metadata:指定该资源的元数据,例如 name、namespace 等。

  • spec:指定该资源的具体配置信息。

deployment.metadata

在此级别下,包含如下字段:

  • annotations:指定 Deployment 的注释信息。这些注释信息可以提供一些额外的描述、标记或关联其他资源等。它们对于扩展 Kubernetes 功能、监控和自动化过程非常有用。

  • labels:指定 Deployment 拥有的标签。后续可以根据标签查找匹配的 deployment 资源。

  • name:指定 Deployment 的名称。

  • namespace:指定 Deployment 所属的命名空间。

deployment.spec

在此级别下,包含如下字段:

  • minReadySeconds:新创建的pod在没有任何容器异常的情况下准备就绪的最小秒数,以便被视为可用。默认值为0,即 pod 只要 ready 后马上被视为 available 。pod available 后才会开始终止老 pod 然后创建下一个新的pod。

  • paused:指示控制器是否暂停对该 Deployment 的操作。默认值为 false ,当设置为 true 时,Deployment 的更新将会暂停,不会进行新的 Replication Controller 的创建或删除。

  • progressDeadlineSeconds:指定 Deployment 控制器等待控制器进度的时间。如果超过这个时间,deployment 控制器将认为升级已经失败,并暂停升级。

  • replicas:指定要创建的 Pod 副本数量。

  • revisionHistoryLimit:指定保留的旧 ReplicaSets 历史记录的数量。旧的 ReplicaSet 将保留以便支持回滚操作。

  • selector:用来选择属于 Deployment 的 Pods 的标签选择器。只有具有匹配标签的 Pod 才会被该 Deployment 控制器管理。

  • strategy:指定用新 Pod 替换旧 Pod 时的策略,默认值为 RollingUpdate(滚动更新),当设置为 Recreate 时将先停掉所有老的 pod 再创建新 pod 。

  • template:定义 Pod 模板。它和 Pod 的语法规则完全相同。只是这里它是嵌套的,因此不需要指定 apiVersion 或 kind。

deployment.spec.template

在此级别下,包含如下字段:

  • metadata:指定 pod 的元数据信息。由于这里是作为模板定义受控制器管理的pod,所以无需设置 name 和 namespace,只需要设置 annotations 和 lables 即可。

  • spec:指定该资源的具体配置信息。

deployment.spec.template.spec

在此级别下,包含如下字段:

  • activeDeadlineSeconds:设置 Pod 的活动截止时间。它指定了一个整数值(以秒为单位),表示自Pod启动之时起,Pod可以持续运行的最长时间。一旦超过这个时间,Kubernetes将尝试终止该 Pod。默认值为0,表示不限制运行时间。

  • affinity:亲和性字段用于定义 Pod 与其他 Pod 或节点之间的关系和偏好。它可以帮助将相关的 Pod 放置在一起或将 Pod 分散到不同的节点上,以满足特定的调度需求和策略。

  • containers:定义 Pod 中包含的一个或多个容器。每个容器都有自己的镜像、环境变量、命令、参数和其他配置。

  • dnsConfig:用于定义 Pod 的 DNS 配置。

  • dnsPolicy:用于指定 Pod 的 DNS 策略。Default:表示使用默认的 DNS 策略。Pod 将使用集群中的 DNS 配置,通常是由 kubelet 进程维护的 DNS 服务器。ClusterFirst:表示优先使用集群内部的 DNS 解析。Pod 首先会使用集群中的 DNS 服务器来解析域名。如果无法解析,则会尝试使用外部的 DNS 服务器来解析。ClusterFirstWithHostNet:与 ClusterFirst 类似,但对于使用 HostNetwork 的 Pod,会直接使用主机网络的 DNS 配置而非集群内部的 DNS 配置。

  • hostAliases:用于在 Pod 中设置主机别名(相当于直接修改 hosts 文件)。

  • hostNetwork:指定 Pod 是否应该使用主机网络。默认情况下,每个 Pod 都会拥有自己的网络命名空间,Pod 内的容器只能通过 Pod 网络访问其他容器和外部服务。但是,当 hostNetwork 被设置为 true 时,Pod 将使用主机网络,即容器将直接绑定到主机上的网络接口。

  • imagePullSecrets:指定 Pod 中需要拉取私有容器镜像时所需的凭据。

  • initContainers:用于定义需要在主容器启动之前执行的初始化容器。定义多个初始化容器时将在主容器启动之前按顺序依次执行,每个初始化容器都必须成功完成才能继续主容器的启动过程。

  • nodeName:用于指定 Pod 运行的节点(node)。当你需要将特定的 Pod 调度到集群中的某个特定节点上时,可以使用 nodeName 字段来指定该节点的名称。

  • nodeSelector:用于通过标签选择器(label selector)来指定 Pod 所需的节点(node)。使用 nodeSelector 字段可以将特定的 Pod 调度到具有特定标签的节点上。

  • priority:优先级值。调度器(scheduler)使用优先级来确定哪些 Pod 优先被调度。具有更高优先级的 Pod 在资源紧张或节点资源不足时,将更有可能被调度到可用的节点上,以确保其优先运行。各种系统组件使用此字段查找 Pod 的优先级。启用 Priority Admission Controller 后,禁止用户设置此字段。准入控制器从 PriorityClassName 中填充此字段。数值越高,优先级越高。

  • preemptionPolicy:用于指定 Pod 的抢占策略。抢占是指在资源不足时,调度器可以暂停(预先抢占)低优先级的 Pod,以便为具有更高优先级的 Pod 留出足够的资源。preemptionPolicy 字段有两个可能的取值:PreemptLowerPriority:表示当资源不足时,具有较低优先级的 Pod 可以被抢占,以便为具有更高优先级的 Pod 分配资源。Never:表示 Pod 不会被抢占,即使资源不足。

  • restartPolicy:用于指定 Pod 中容器的重启策略。在 Kubernetes 中,一个 Pod 可能包含多个容器,restartPolicy 指定了当其中一个容器意外终止时,该容器应如何被重启。Always:表示当容器终止时,无论是由于错误、失败还是其他原因,Kubernetes 都会自动重启该容器。OnFailure:表示当容器以非零状态(即失败状态)终止时,Kubernetes 会自动重启该容器。如果容器正常退出(状态码为0),则不会触发重启。Never:表示当容器终止时,Kubernetes 不会自动重启该容器。

  • schedulerName:用于指定 Kubernetes 中用于调度 Pod 的调度器的名称。通过设置这个字段,你可以将特定的 Pod 分配给自定义的调度器,而不是集群默认的调度器。

  • securityContext:用于设置容器的安全上下文,以控制容器的安全属性和行为。通过 securityContext 字段,你可以指定容器运行时的一些安全配置,如用户 ID、访问权限等。

  • serviceAccount:用于为 Pod 指定所使用的 Service Account。Service Account 是 Kubernetes 中的一种身份验证方式,它用于授予 Pod 访问 Kubernetes API 和其他资源的权限。

  • serviceAccountName:用于为 Pod 指定所使用的 Service Account。

  • shareProcessNamespace:指定是否与其他容器共享进程命名空间。当将 shareProcessNamespace 设置为 true 时,Pod 中的所有容器将共享相同的进程命名空间,这意味着它们可以看到彼此的进程并进行相互通信。

  • terminationGracePeriodSeconds:指定在终止容器之前等待的时间(以秒为单位)。它定义了容器在接收到终止信号后的优雅终止期限。

  • tolerations:定义哪些污点可以被容忍。Pod 只有在它的 tolerations 包含了在节点上设置的污点后,才能在该节点上调度和运行。

  • volumes:定义为容器提供存储卷的配置。

deployment.spec.template.spec.containers

在此级别下,包含如下字段:

  • args:指定容器的命令行参数。容器启动时会执行指定的命令,并将 args 中的参数传递给该命令。

  • command:指定容器的入口点命令。将覆盖镜像中定义的默认命令,从而指定容器启动时要执行的特定命令。

  • env:指定容器的环境变量。

  • image:指定使用的镜像及版本。

  • imagePullPolicy:指定 Kubernetes 在创建或更新 Pod 时如何拉取镜像。Always:始终拉取最新版本的镜像。IfNotPresent:仅在本地不存在该镜像时才拉取。Never:仅使用本地已存在的镜像,不会尝试从远程仓库中拉取。

  • lifecycle:指定容器的生命周期钩子。postStart:在容器创建后立即执行的操作。preStop:在容器终止之前执行的操作,例如在容器终止前执行一些清理工作。

  • livenessProbe:指定容器的存活健康检查机制。

  • name:指定容器的名称。

  • ports:定义 Pod 中容器的端口映射的字段。

  • readinessProbe:指定容器的就绪健康检查机制。

  • resources:定义 Pod 或容器的资源需求和限制的字段。通过 resources 字段,我们可以指定 Pod 或容器在集群中运行时需要的计算资源,如 CPU 和内存,并可以对其进行限制,以确保资源的合理分配和管理。

  • startupProbe:用于检测容器启动过程中是否成功。它与 livenessProbe 和 readinessProbe 类似,但是它的目的是在容器启动期间进行健康检查,而不是在容器运行时。

  • terminationMessagePath:指定容器终止时终止消息的存储路径。当容器终止时,Kubernetes 将会将终止消息写入到指定路径的文件中。默认情况下,终止消息会被写入到容器的 /dev/termination-log 文件中。

  • terminationMessagePolicy:指定容器终止消息的策略。File:表示终止消息将被写入到文件中,并由 terminationMessagePath 字段指定的路径。FallbackToLogsOnError:表示终止消息将被写入到容器的日志中。如果写入终止消息到文件失败,Kubernetes 将会回退到将终止消息写入到日志中。

  • volumeMounts:用于将存储卷(Volumes)与容器内的特定路径进行挂载。它定义了容器中的路径和存储卷之间的映射关系。

避坑!deployment 生成的 pod 名称有多种格式变化

背景

之前写了个脚本:传入 deployment 资源名称作为参数,脚本会正则匹配以该名称开头的 pod 列表(认为匹配到的 pod 是由该 deployment 创建的),再循环去获取 pod 的一些信息。正则匹配效果如下图所示:

正常使用了几个月后突然发现有些传入的 deployment 资源名称匹配不到 pod 了,于是开始查找原因。

发现问题

拿到报异常的 deployment 资源名称手动执行过滤,发现真的没匹配上。

仔细瞅了一下发现,pod 的名称格式竟然变了,之前是 deployment 名称开头加上 -77495f666c-6cjhn 这种相当于三段式格式。现在是 deployment 名称加上 -787b88f8pmjxx 这种两段式格式,那正则肯定匹配不上了。

经过一番测试,发现 deployment 资源名称的字符个数会影响生成的 pod 名称格式,deployment 资源字符长度的不同会产生好几种 pod 格式。这里做下记录(没用的知识又增加了...)

格式记录

测试下来 deployment 生成的 pod 命名格式为:deployment名称+k8s生成的随机字符拼接而成。pod 名称最多为 63 个字符,并且尾部最少包含5个k8s生成的随机字符,具体根据 deployment 名称的字符长度显示为不同格式。

格式1 - 三段式

第一种是常见的三段式格式:


grep -E "${deployment_name}-[a-z0-9]{9,10}-[a-z0-9]{5}"

z-fbc4889f6-g9525
z123456789z123456789z123456789z123456789z123456-fbc4889f6-gcf2l
test-shop-67d968f44b-x9tbq

需要注意的是如果第二段长度是9个字符,那么 deployment 资源名称的字符数为 1-47 个;第二段长度是10个字符,那么 deployment 资源名称的字符数为 1-46 个。超出字符长度 pod 名称则会转换为另一种格式。

格式2 - 两段式

两段式的格式相对就少见了,除非你把 deployment 资源的名称定义的特别长(超过46或47个字符)pod 的名称才会变成这种格式。


grep -E "${deployment_name}-[a-z0-9]{5,15}"

z123456789z123456789z123456789z123456789z1234567-fbc4889f6xt4g8
z123456789z123456789z123456789z123456789z123456789z123456-nhc5f

格式3 - 一段式

一段式的就更少见了,把 deployment 资源名称定义的如此长实属不易,长度大于等于58个字符的时候,生成的 pod 名称才会变成一段式。


grep -E "${deployment_name:0:58}[a-z0-9]{5}"

[root@imzcy ~]# kubectl -n test apply -f test.yaml
deployment.apps/z123456789z123456789z123456789z123456789z123456789z1234567 created
[root@imzcy ~]#
[root@imzcy ~]#
[root@imzcy ~]# kubectl -n test get pods -l app=zcy-test
NAME                                                              READY   STATUS    RESTARTS   AGE
z123456789z123456789z123456789z123456789z123456789z1234567jkl8h   1/1     Running   0          3s
[root@imzcy ~]#

需要注意的是,如果由于 deployment 的名称过长导致生成的 pod 名称在 63 个字符内无法在尾部填充最少5个随机字符,那么会将 deployment 名称从头部开始截取 58 个字符再拼接5个随机字符。

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值