Kubernetes yaml 模板与示例

11 minute read

一、Pod

实际生产环境中很少直接创建 pod 资源,基本都是通过资源控制器对 pod 进行管理。

yaml 模板

apiVersion: v1                # 必填,版本号
kind: Pod                     # 必填,资源类型
metadata:                     # 必填,元数据
  name: <name>-Depolyment     # 必填,资源名称
  namespace: <namespace>      # Pod 所属的命名空间
  labels:                     # 自定义标签
  - key: <value>              # 自定义标签名字<key: value>
  annotations:                # 自定义注解列表  
  - name: <string>            # 自定义注解名字  
spec:                         # 必填,部署的详细定义
  containers:                 # 必填,定义容器列表
  - name: <name>              # 必填,容器名称
    image: <image-name>       # 必填,容器的镜像名称
    # 镜像拉取策略:
    # Alawys 始终下载镜像;
    # IfnotPresent 优先使用本地镜像,本地不存在则下载镜像;
    # Nerver 从不下载镜像,仅使用本地镜像
    imagePullPolicy: [Always | Never | IfNotPresent] 
    command: [array]          # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]            # 容器的启动命令参数列表
    workingDir: string        # 选填,容器的工作目录
    env:                      # 容器运行前需设置的环境变量列表
    - name: string            # 环境变量名称
      value: string           # 环境变量的值
    ports:                    # 需要暴露的端口库号列表
    - name: string            # 端口号名称
      containerPort: int      # 容器需要监听的端口号
      hostPort: int           # 容器所在主机需要监听的端口号,默认与Container相同
      protocol: string        # 端口协议,支持TCP和UDP,默认TCP
    resources:                # 建议填写,资源限制和请求的设置
      limits:                 # 资源限制的设置
        cpu: string           # Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string        # 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests:               # 资源请求的设置
        cpu: string           # Cpu请求,容器启动的初始可用数量
        memory: string        # 内存请求,容器启动的初始可用数量
    volumeMounts:             # 挂载到容器内部的存储卷配置
    - name: string            # 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string       # 存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean       # 是否为只读模式
    livenessProbe:            # 建议填写,对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
      exec:                   # 对Pod内的容器健康检查方式设置为exec方式
        command: [string]     # exec方式需要指定的命令或脚本
      httpGet:                # 对Pod内的容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:              # 对Pod内的容器健康检查方式设置为tcpSocket方式
        port: number
      initialDelaySeconds: 0  # 容器启动完成后首次探测的时间,单位为秒
      timeoutSeconds: 0       # 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
      periodSeconds: 0        # 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
      successThreshold: 0     # 处于失败状态时,探测操作至少连续多少次的成功才被认为是通过检测,显示为#success属性,默认值为1
      failureThreshold: 0     # 处于成功状态时,探测操作至少连续多少次的失败才被视为是检测不通过,显示为#failure属性,默认值为3
    imagePullSecrets:         # Pull镜像时使用的secret名称,以key:secretkey格式指定
    - name: string
    hostNetwork: false        # 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
  volumes:                    # 在该pod上定义共享存储卷列表
  - name: string              # 共享存储卷名称 (volumes类型有很多种)
    emptyDir: {}              # 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: string          # 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
    path: string              # Pod所在宿主机的目录,将被用于同期中mount的目录
  - name: string              # 共享存储卷名称
    secret:                   # 类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
      scretname: string  
      items:     
      - key: string           # 选择secrets定义的某个key
        path: string          # 文件内容路径
  - name: string              # 共享存储卷名称
    configMap:                # 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string           # 选择configmap定义的某个key
        path: string          # 文件内容路径
  - name: string              # 共享存储卷名称
    persistentVolumeClaim:
      claimName: string       # 类型为PVC的持久化存储卷
  affinity:                   # 亲和调度
    nodeAffinity:             # 节点亲和调度
      # 硬亲和调度
      requiredDuringSchedulingIgnoredDuringExecution: 
      # 软亲和调度
      #preferredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:    # 选择条件
          - matchExpressions: # 匹配规则
              - key: key
                operator: In
                values:
                  - values
  nodeSelector:               # 设置NodeSelector表示将该Pod调度到包含这个label的node上
    name: string              # 自定义标签名字<key: value>
  # Pod的重启策略:
  # Always 一旦不管以何种方式终止运行,kubelet都将重启;
  # OnFailure 只有Pod以非0退出码退出才重启;
  # Nerver 不再重启该Pod
  restartPolicy: [Always | Never | OnFailure] 

yaml 示例

此处以最简单的busybox举例,添加容器启动命令参数

apiVersion: v1
kind: Pod
metadata:
  name: busybox-pod
  namespace: test
  labels:
    name: busybox-pod
spec:
  containers: 
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","while true;do echo hello;sleep 1;done"]
  restartPolicy: Always

二、资源控制器

1. Deployment

一个 Deployment 为 Pods 和 ReplicaSets 提供声明式的更新能力。

yaml 模板

apiVersion: apps/v1                # 必填,版本号
kind: Depolyment                   # 必填,资源类型
metadata:                          # 必填,元数据
  name: <name>-deploy              # 必填,资源名称
  namespace: <namespace>           # Pod所属的命名空间
  labels:                          # 自定义标签
    - name: string                 # 自定义标签名字<key: value>
spec:                              # 必填,部署的详细定义(期望状态)
  selector:                        # 必填,标签选择
    matchLabels:                   # 必填,标签匹配
      name: <name>                 # 必填,通过此标签匹配对应pod<key: value>
  replicas: <number>               # 必填,副本数量
  minReadySeconds: int             # 新创建的Pod状态为Ready持续的时间
  revisionHistoryLimit: int        # 保留的历史版本个数,默认是10
  # Pod自愿中断的场景中,至少要保证可用的Pod对象数量或比例,要阻止任何Pod对象发生自愿中断,可将其设置为100%。
  minAvailable: int
  # Pod自愿中断的场景中,最多可转换为不可用状态的Pod对象数量或比例,
  # 0值意味着不允许Pod对象进行自愿中断;此字段与minAvailable互斥.
  maxUnavailable: int
  strategy:                        # 版本更新控制
    type: RollingUpdate            # 更新策略,滚动更新(也可以是Recreate 重建更新)
    rollingUpdate:                 # 滚动更新配置
      maxSurge: int                # 升级期间存在的总Pod对象数量最多不超过多少(百分比)
      maxUnavailable: int          # 升级期间正常可用的Pod副本数(包括新旧版本)不低于多少(百分比)
  template:                        # 必填,应用容器模版定义
    metadata: 
      labels: 
        name: <name>               # 必填,与上面matchLabels的标签相同
    spec: 
      containers:                  # 此处参考pod的containers

yaml 示例

以grafana alert举例。指定容器监听端口,配置存活就绪检测,设置资源限制,挂载宿主机本机目录存储,建议生产环境为资源添加 limit 和 liveness

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: grafana-alert-deploy
  labels:
    name: grafana-alert-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      name: grafanaAlert
  template:
    metadata:
      labels:
        name: grafanaAlert
    spec:
      containers:
      - name: grafana-alert
        image: grafana_alert:cm_v2
        imagePullPolicy: IfNotPresent
        command: ["python3.8","-u","-m","flask","run","-h","0.0.0.0","-p","9999"]
        ports:
        - containerPort: 9999
          protocol: TCP
        volumeMounts:
        - name: grafana-alert-log
          mountPath: /opt/grafanaAlert/log
        readinessProbe:
          tcpSocket: 
            port: 9999
        livenessProbe:
          tcpSocket: 
            port: 9999
        resources:    
          limits:   
            cpu: 1
            memory: 100Mi
          requests:     
            cpu: 100m
            memory: 10Mi
      volumes:
      - name: grafana-alert-log
        hostPath:
          path: /var/log/grafana-alert
          type: Directory
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: role
                    operator: In
                    values:
                      - removable
      dnsPolicy: ClusterFirst
      restartPolicy: Always

2. DaemonSet

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

DaemonSet 除了不用设置 replicas,其他的与 Deployment 一致

yaml 模板

apiVersion: apps/v1                # 必填,版本号
kind: DaemonSet                    # 必填,资源类型
metadata:                          # 必填,元数据
  name: <name>-ds                  # 必填,资源名称
  namespace: <namespace>           # Pod所属的命名空间
  labels:                          # 自定义标签
    - name: string                 # 自定义标签名字<key: value>
spec:                              # 必填,部署的详细定义
  selector:                        # 必填,标签选择
    matchLabels:                   # 必填,标签匹配
      name: <name>                 # 必填,通过此标签匹配对应pod<key: value>
  template:                        # 必填,应用容器模版定义
    metadata: 
      labels: 
        name: <name>               # 必填,与上面matchLabels的标签相同
    spec: 
      containers:                  # 此处参考pod的containers

yaml 示例

监控组件 node-exporter 部署示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: node-exporter-ds
  name: node-exporter-ds
  namespace: test
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
      - args:
        - --web.listen-address=127.0.0.1:9100
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host/root
        - --collector.filesystem.ignored-mount-points=^/(dev|proc|sys|var/lib/docker/.+)($|/)
        - --collector.filesystem.ignored-fs-types=^(autofs|binfmt_misc|cgroup|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|sysfs|tracefs)$
        image: prometheus/node-exporter:v0.18.1
        name: node-exporter
        resources:
          limits:
            cpu: 250m
            memory: 180Mi
          requests:
            cpu: 102m
            memory: 180Mi
        volumeMounts:
        - mountPath: /host/proc
          name: proc
          readOnly: false
        - mountPath: /host/sys
          name: sys
          readOnly: false
        - mountPath: /host/root
          mountPropagation: HostToContainer
          name: root
          readOnly: true
      - args:
        - --logtostderr
        - --secure-listen-address=$(IP):9100
        - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
        - --upstream=http://127.0.0.1:9100/
        env:
        - name: IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        image: 172.16.140.21/prometheus/kube-rbac-proxy:v0.4.1
        name: kube-rbac-proxy
        ports:
        - containerPort: 9100
          hostPort: 9100
          name: https
        resources:
          limits:
            cpu: 20m
            memory: 60Mi
          requests:
            cpu: 10m
            memory: 20Mi
      hostNetwork: true
      hostPID: true
      nodeSelector:
        kubernetes.io/os: linux
      securityContext:
        runAsNonRoot: true
        runAsUser: 65534
      serviceAccountName: node-exporter
      tolerations:
      - operator: Exists
      volumes:
      - hostPath:
          path: /proc
        name: proc
      - hostPath:
          path: /sys
        name: sys
      - hostPath:
          path: /
        name: root

3. Job

yaml 模板

apiVersion: batch/v1                # 必填,版本号
kind: Job                           # 必填,资源类型
metadata:                           # 必填,元数据
  name: <name>-job                  # 必填,资源名称
  namespace: test                   # pod所属的命名空间
  labels:                           # 自定义标签
    name: string                    # 自定义标签名字<key: value>
spec:                               # 必填,部署的详细定义
  completions: int                  # 资源重复作业数,默认值: 1    
  parallelism: int                  # 资源并行作业数,默认值: 1
  backoffLimit: int                 # 资源失败重试次数,默认值:6
  activeDeadlineSecond: int         # 资源作业超时时间,默认0 永不超时
  ttlSecondsAfterFinished: int      # 任务执行完,多少秒自动删除,默认300
  template:                         # 必填,应用容器模板定义
    spec:
      containers:                   # 此处参考pod的containers
      - name: busybox
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        command: ["echo", "hello world"]
      restartPolicy: Never          # job类型资源重启策略必须为Never或者OnFailure

yaml 示例

以 busybox 镜像启动,输出 hello world 举例。记得将重启策略设置为 Never 或者 OnFailure

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-job
  namespace: test
  labels:
    name: hello-job
spec:
  template:
    spec:
      containers: 
      - name: busybox
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        command: ["echo", "hello world"]
      restartPolicy: Never

4. CronJob

yaml 模板

apiVersion: batch/v1                # 必填,版本号
kind: Job                           # 必填,资源类型
metadata:                           # 必填,元数据
  name: <name>-cj                   # 必填,资源名称
  namespace: test                   # pod所属的命名空间
  labels:                           # 自定义标签
    name: string                    # 自定义标签名字<key: value>
spec:                               # 必填,部署的详细定义
  schedule: "* * * * *"             # 必填,运行时间点
  concurrencyPolicy: [Allow 允许|Forbid 禁止|Replace 替换]  # 并发执行策略,默认允许
  failedJobHistoryLimit: int        # 为失败的任务执行保留的历史记录数,默认为1
  successfulJobsHistoryLimit: int   # 为成功的任务执行保留的历史记录数,默认为3。
  startingDeadlineSeconds: int      # 因各种原因缺乏执行作业的时间点所导致的启动作业错误的超时时长,会被记入错误历史记录。
  suspend: boolean                  # 是否挂起后续的任务执行,默认为false,对运行中的作业不会产生影响。
  jobTemplate:                      # 控制器模板,与template类似
    metedata:
      labels:                       # 自定义标签
        name: string                #自定义标签名字<key: value>
    spec:
      template:                     # 必填,应用容器模板定义
        spec:
          containers:               # 此处参考pod的containers
          - name: busybox
            image: busybox:latest
            imagePullPolicy: IfNotPresent
            command: ["echo", "hello world"]
          restartPolicy: Never      # job类型资源重启策略必须为Never或者OnFailure

yaml 示例

以 busybox 镜像启动,输出 hello world 举例。记得将重启策略设置为 Never 或者 OnFailure

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello-cj
  namespace: test
  labels:
    app: hello-cronjob
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    metadata:
      labels:
        app: hello-cronjob
    spec:
      template:
        spec:
          containers: 
          - name: busybox
            image: busybox:latest
            imagePullPolicy: IfNotPresent
            command: ["echo", "hello world"]
          restartPolicy: Never

5. StatefulSet

创建 StatefulSet 资源之前,先要保证集群中存在 StorageClass,并使用 headless service 暴露服务 StatefulSet 相较于Deployment,多了volumeClaimTemplates字段,即pvc存储的配置信。

yaml 模板

apiVersion: apps/v1                # 必填,版本号
kind: StatefulSet                  # 必填,资源类型
metadata:                          # 必填,元数据
  name: <name>-sts                 # 必填,资源名称
  namespace: <namespace>           # Pod所属的命名空间
spec:                              # 必填,部署的详细定义
  selector:                        # 必填,标签选择
    matchLabels:                   # 必填,标签匹配
      key: <value>                 # 必填,通过此标签匹配对应pod<key: value>
  serviceName: string              # Headless Service资源名称
  replicas: int                    # 副本数量
  template:                        # 必填,应用容器模版定义
    metadata:                      # 必填,元数据
      labels:                      # 标签
        key: <value>               # 必填,与上面matchLabels的标签相同
    spec: 
      containers:                  # 此处参考pod的containers
  volumeClaimTemplates:            # 必填,+pvc模板
    - metadata:       #必填,元数据
        name: <name>-depolyment    #必填,资源名称
      spec:
        accessModes: [ "ReadWriteOnce | ReadOnlyMany | ReadWriteMany" ] #必填,访问模式
        storageClassName: strint   # 存储类名,改为集群中已存在的
        resources:                 # 存储卷需要占用的资源量最小值
          requests:                # 请求空间大小
            storage: 1Gi # 空间大小值

yaml 示例

以 nginx 服务使用 nfs 共享存储为例

# 先定义了一个名为myapp-svc的Headless Service资源,用于为关联到的每个Pod资源创建DNS资源记录。
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  labels:
    app: myapp-svc
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp-pod
---
# 定义多个使用NFS存储后端的PV,空间大小为2GB,仅支持单路的读写操作。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfs/data1
    server: 172.17.0.2
---
# 定义了一个名为myapp的StatefulSet资源,它通过Pod模板创建了两个Pod资源副本,并基于volumeClaimTemplates(存储卷申请模板)向nfs存储类请求动态供给PV,从而为每个Pod资源提供大小为1GB的专用存储卷。
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp-sts
spec:
  selector:
    matchLabels:
      app: myapp-pod
  serviceName: myapp-svc
  replicas: 2
  template:
    metadata:
      labels:
        app: myapp-pod
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myapp-data
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: myapp-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 1Gi

三、服务与暴露

1. Service

ClusterIP

yaml 模板
apiVersion: v1                # 必填,版本号
kind: Service                 # 必填,资源类型
metadata:                     # 必填,元数据
  name: <name>-svc            # 必填,资源名称
  namespace: test             # 资源命名空间
spec:                         # 必填,资源详细定义
  type: ClusterIP             # 资源类型,默认ClusterIP
  selector:                   # 必填,标签选择
    key: <value>              # 必填,通过此标签匹配对应的资源
  ports:                      # 必填,服务暴露端端口列表
  - name: string              # 服务暴露名称
    port: int                 # 必填,服务监听端口号
    targetPort: int           # 必填,服务转发后端Pod端口号
    protocol: [TCP | UDP]     # 端口协议
  # 要使用的粘性会话的类型:
  # none 不使用(默认);
  # ClientIP 基于客户端IP地址识别客户端身份,把来自同一个源IP地址的请求始终调度至同一个Pod对象。
  sessionAffinity: [None | ClientIP]
  sessionAffinityConfig: int  # 会话保持的时长
yaml 示例

使用 ClusterIP 方式,将 myapp 的80端口暴露出去

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  namespace: test
spec:
  type: ClusterIP
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 80

NodePort

yaml 模板
apiVersion: v1                # 必填,版本号
kind: Service                 # 必填,资源类型
metadata:                     # 必填,元数据
  name: <name>-svc            # 必填,资源名称
  namespace: test             # 资源命名空间
spec:                         # 必填,资源详细定义
  type: NodePort              # 必填,资源类型
  selector:                   # 必填,标签选择
    key: <value>              # 必填,通过此标签匹配对应的资源
  ports:                      # 必填,服务暴露端端口列表
  - name: string              # 服务暴露名称
    port: int                 # 必填,服务监听端口号
    targetPort: int           # 必填,服务转发后端Pod端口号
    nodePort: int             # 必填,指定映射物理机端口号
    protocol: [TCP | UDP]     # 端口协议
  # 要使用的粘性会话的类型:
  # none 不使用(默认);
  # ClientIP 基于客户端IP地址识别客户端身份,把来自同一个源IP地址的请求始终调度至同一个Pod对象。
  sessionAffinity: [None | ClientIP]
  sessionAffinityConfig: int # 会话保持的时长
yaml 示例

使用 NodePort 方式,将 myapp 的80端口映射到物理机30001端口

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  namespace: test
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30001

2. Headless Services

yaml 模板

apiVersion: v1                # 必填,版本号
kind: Service                 # 必填,资源类型
metadata:                     # 必填,元数据
  name: <name>-svc            # 必填,资源名称
  namespace: test             # 资源命名空间
spec:                         # 必填,资源详细定义
  clusterIP: None             # 必填,指定clusterIp为none,使用headless
  selector:                   # 必填,标签选择
    key: <value>              # 必填,通过此标签匹配对应的资源
  ports:                      # 必填,服务暴露端端口列表
  - name: string              # 服务暴露名称
    port: int                 # 必填,服务监听端口号
    targetPort: int           # 必填,服务转发后端Pod端口号
    protocol: [TCP | UDP]     # 端口协议
  # 要使用的粘性会话的类型:
  # none 不使用(默认);
  # ClientIP 基于客户端IP地址识别客户端身份,把来自同一个源IP地址的请求始终调度至同一个Pod对象。
  sessionAffinity: [None | ClientIP]
  sessionAffinityConfig: int  # 会话保持的时长

yaml 示例

使用 Headless Service 方式,将 myapp 的80端口服务暴露出去

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  namespace: test
spec:
  clusterIP: None
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 80

3. Ingress(nginx)

yaml 模板

apiVersion: networking.k8s.io/v1      # 必填,版本号
kind: Ingress                         # 必填,资源类型
metadata:                             # 必填,元数据
  name: <name>-ingress                # 必填,资源名称
  labels:                             # 自定义标签
    name: string                      # 自定义标签名字<key: value>
spec:                                 # 必填,资源详细定义
  tls:                                # tls配置
  - hosts:
    - myapp.test.com                  # 访问地址
    secretName: string                # tls证书名称
  rules:                              # 定义当前Infress资源转发规则列表
  - host: myapp.test.com
    http:
      paths:
      - pathType: Prefix              # 指定应如何匹配Ingress路径
        path: "/"                     # 转发路径
        backend:                      # 转发后端
          service:
            name: string              # 转发后端名称
            port: 
              number: int             # 转发后端端口

yaml 示例

将 myapp-svc 服务配置为域名 myapp.test.com,并添加 tls 配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  labels:
    name: myapp-ingress
spec:
  tls:
  - hosts:
    - myapp.test.com
    secretName: myapp-tls-secret
  rules:
  - host: myapp.test.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: myapp-svc
            port: 
              number: 80

4. IngressRouter(traefik)

在 traefik v1 版本中,默认使用的都是 ingress,在v2版本中,引入了 Ingress route 的概念,他们实际的作用都是一样的,写法上略有不同,实际上,ingress 并不是 traefik 或者 nginx 定义的一个概念,是 k8s 定义的,但是 traefik 也用的是ingress这个概念,所以可以看到网上的大部分文档,在v1版本的时候使用 ingress 指定规则的话,需要在 metadata 字段指定注释即表明此 ingress 使用的是 traefik 控制器,在v2版本中,也可以使用 ingress,但是需要在配置文件中的 provider 字段添加 kubernetesIngress: “” 此处以traefik v2 IngressRouter为例。

yaml 模板

apiVersion: traefik.containo.us/v1alpha1      # 必填,版本号
kind: IngressRoute                            # 必填,资源类型
metadata:                                     # 必填,元数据
  name: <name>-ingress-tls                    # 必填,资源名称
  namespace: string                           # 资源命名空间
spec:                                         # 必填,资源详细定义
  routes:                                     # 定义当前Ingress资源的转发规则列表
  - kind: Rule                                # 必填,规则类型
    match: string                             # 必填,规则匹配表达式
    services:                                 # 必填,转发配置
    - name: string                            # 必填,转发后端目标
      port: int                               # 必填,转发后端端口
    middlewares:                              # 中间件配置(如BasicAuth)
  tls:                                        # tls证书配置
    options:                                  # 配置选项
      name: string                            # 配置选项名称
      namespace: string                       # 配置选项命名空间
    secretName: string                        # tls证书名称

yaml 示例

将 grafana-svc 服务配置为域名 grafana.test.com,并添加 tls 配置

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: grafana-ingress-tls
  namespace: grafana
spec:
  routes:
  - kind: Rule
    match: Host(`grafana.test.com`)
    services:
    - name: grafana-svc
      port: 3000
  tls:
    options:
      name: https-tlsoption
      namespace: default
    secretName: grafana-ingress-tls

四、存储

1. PersistentVolume

yaml 模板

apiVersion: v1                       # 必填,版本号
kind: PersistentVolume               # 必填,资源类型
metadata:                            # 必填,元数据
  name: <name>-pv                    # 必填,资源名称
  labels:                            # 资源标签
    key: value                       # 资源标签键值对 
spec:                                # 必填,资源详细定义
  capacity:                          # 必填,当前PV的容量
    storage: <int>Gi                 # 必填,pv容量大小值,单位Ki,Mi,Gi
  accessModes:                       # 必填,访问模式
    # ReadWriteOnce 仅可被单个节点读写挂载
    # ReadOnlyMany 可被多个节点同时只读挂载
    # ReadWriteMany 可被多个节点同时读写挂载
    - ReadWriteMany
  # 必填,PV空间被释放时的处理机制:
  # Retain 保持不动,由管理员随后手动回收
  # Recycle 空间回收,即删除存储卷目录下的所有文件(包括子目录和隐藏文件)
  # Delete 删除存储卷,仅部分云端存储系统支持
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: string           # 当前PV所属的StorageClass的名称;默认为空值,即不属于任何StorageClass。
  mountOptions:                      # 挂载选项组成的列表
    - hard
    - nfsvers=4.1
  nfs:
    path: path                       # nfs共享目录
    server: XXX.XXX.XXX.XXX          # nfs服务器地址
  volumeMode: Filesystem             # 卷模型,用于指定此卷可被用作文件系统还是裸格式的块设备;默认为Filesystem。

yaml 示例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /nfs
    server: 172.17.0.2

2. PersistentVolumeClaim

yaml 模板

apiVersion: v1                   # 必填,版本号
kind: PersistentVolumeClaim      # 必填,资源类型
metadata:                        # 必填,元数据
  name: <name>-pvc               # 必填,资源名称
  namespace: test                # 资源命名空间
spec:                            # 必填,资源详细定义
  accessModes:                   # 必填,访问模式
    # ReadWriteOnce 仅可被单个节点读写挂载
    # ReadOnlyMany 可被多个节点同时只读挂载
    # ReadWriteMany 可被多个节点同时读写挂载
    - ReadWriteMany
  storageClassName: string       # 必填,所依赖的存储类的名称。
  volumeMode: Filesystem         # 卷模型,用于指定此卷可被用作文件系统还是裸格式的块设备;默认为Filesystem。
  resources:                     # 必填,当前PVC存储卷需要占用的资源量最小值 
    requests:                    # 必填,pvc请求空间大小
      storage: 5Gi               # 必填,空间大小值如1Gi
  selector:                      # 绑定时对PV应用的标签选择器,用于挑选要绑定的PV
    matchLabels:                 # 标签选择器
      release: stable            # key-value标签

yaml 示例

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  namespace: test
spec:
  resources:
    requests:
      storage: 5Gi
  storageClassName: nfs
  accessModes:
    - ReadWriteOnce
  selector:
    matchLabels:
      release: stable

3. StorageClass

如果集群启用了RBAC,则必须为 provisioner授权,k8s1.6+默认开启。

yaml 模板

apiVersion: storage.k8s.io/v1   # 必填,版本号
kind: StorageClass              # 必填,资源类型
metadata:                       # 必填,元数据
  name: <name>-sc               # 必填,资源名称
provisioner: string             # 必填,这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:                     # 存储类参数

yaml 示例

以 nfs 共享存储为例

apiVersion: storage.k8s.io/v1 
kind: StorageClass
metadata:
  name: nfs-sc
provisioner: nfs-storage
parameters:
  archiveOnDelete: "false"

五、配置信息

1. ConfigMap

yaml 模板

apiVersion: v1        # 必填,版本号
kind: ConfigMap       # 必填,资源类型
metadata:             # 必填,元数据
  name: <name>-cm     # 必填,资源名称
  namespace: string   # 资源命名空间
data:                 # 必填,保存的数据信息
  key: value          # 数据信息

yaml 示例

创建 ConfigMap,保存两组信息:log_level 为 INFO,log_file 为 /var/log/test.log

apiVersion: v1
kind: ConfigMap
metadata:
  name: myapp-cm
  namespace: test
data:
  log_level: INFO
  log_file: /var/log/test.log

2. Secret

yaml 模板

apiVersion: v1       # 必填,版本号
kind: Secret         # 必填,资源类型
metadata:            # 必填,元数据
  name: <name>-cm    # 必填,资源名称
  namespace: string  # 资源命名空间
# 必填,secret数据类型标识:
# Opaque:base64 编码格式的 Secret,用来存储密码、密钥等
# kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息
# kubernetes.io/service-account-token:用于被serviceaccount引用,serviceaccout创建时Kubernetes会默认创建对应的secret
type: Opaque
data:                # 必填,保存的数据信息
  key: value         # 数据信息(value为base64编码后的数据)

Secret 资源包含2个键值对: datastringDatadata 字段用来存储 base64 编码的任意数据;提供 stringData 字段是为了方便,它允许 Secret 使用未编码的字符串。如下示例

yaml 示例

创建 Secret,保存两组信息:username 为 aluo,password 为 pass432。

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  username: aluo
  password: pass432

原文链接

kubernetes yaml 模板与示例-崔亮的博客 (cuiliangblog.cn)