IT 铁人赛 k8s 入门30天 -- day7 K8s YAML 设定档

前言

这章节将要来学习 kubectl 执行的设定档

理解每个设定的组成

还有细部内容

设定档的格式

设定档的格式是采用 yaml的格式

这种格式对於缩排要求很严格

因此要很注意每个元素所在的阶层位置

可以使用 yaml-validator 做检查避免错误

本文范例

本文以 nginx-deployment.yaml 这个档案来解说

内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 80

开头部份

apiVersion: apps/v1
kind: Deployment

这部份指定使用的 k8s api 版本

还有发布的类型 以 nginx-deployment.yaml 来说

就是 Deployment

所有关於 kind 跟 apiVersion 的部份都可以透过 k8s api 官方文件去查询

目前连结是采用 1.22 的版本

metadata

metadata:
  name: nginx-deployment
  labels:
    app: nginx

这部份是关於这个发布元件的标记内容

举例来说: 这个元件的名称, 还有用来查询的标记

specification

spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 80

这部份是用来指定要如何运行运行这个元件

也可以说是目标状态

举例来说: nginx-deployment.yaml 内

spec 指定要有一个 replicaSet

要采用 nginx: 1.16 作为 image

要注意的是, spec 的属性会随这 kind 不同而变

status

这部份由 k8s 自动产生

主要会分为目标状态跟实际状态

目标状态是由 spec 指定的状态来产生

实际运行时, k8s 会比较实际状态与目标状态的不同来做调整

而这个实际状态就是存在 etcd 的状态

整个 k8s 的运行状态都会存在 etcd

设定档储存位置

一般来说, 会与要发布的程序放在同一个资料夹

这样会比较方便管理

template

spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 80

在 spec 内有一个特别的属性 template

可以发现 template 有自己的 metadata 跟 spec

这边的 template 是一个 Pod 的蓝图

符合前面所说的 Deploymenet 管理 ReplicaSet

ReplicaSet 管理 Pod

label 以及 selector

在 k8s 设定档里, label 就是用来标记元件

透过这些标记, 可以用来识别不同元件与建立连结

在 k8s 设定档理, selector 可以用来根据 label 选择要配对的元件

举例来说:

在以下范例的 nginx-deployment.yaml 跟 nginx-service.yaml

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 8080

nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

nginx-service 透过 selector 对应到 metadata 是 app: nginx 的 Pod

验证如下:

上图说明 nginx-service 的 endpoints 是在 172.17.0.4:80880

IP 的部份是 172.17.0.4

而查询 Pod 布署的 IP 也是 172.17.0.4

因此有成功的把 service 接到 pod 的上面

其他

透过以下指令可以把当下 deployment 状态转出来成一个档案

kubectl get deployment $deployemnt_name -o yaml > $outputfile_name

而这个转换出来的档案除了原本之前所讲的设定档内容外

还会有许多由 k8s 产生出来的设定

比如状态等等

举例来说: 透过以下指令

kubectl get deployment nginx-deployment -o yaml > nginx-deployment-result.yaml

产生出来的档案如下

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "2"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-deployment","namespace":"default"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.16","name":"nginx","ports":[{"containerPort":8080}]}]}}}}
  creationTimestamp: "2021-09-11T17:00:33Z"
  generation: 4
  labels:
    app: nginx
  name: nginx-deployment
  namespace: default
  resourceVersion: "109348"
  uid: 6a79a2f9-d8f3-43dc-b919-793839d4bf00
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.16
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2021-09-11T17:01:42Z"
    lastUpdateTime: "2021-09-11T17:01:42Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2021-09-11T17:00:34Z"
    lastUpdateTime: "2021-09-13T09:46:42Z"
    message: ReplicaSet "nginx-deployment-f4b7bbcbc" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 4
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

这样的档案如果要用来做 apply, 必须要删除 k8s 自动产生的部份

否则会报错


<<:  Android Studio初学笔记-Day6-EditText

>>:  从零开始的8-bit迷宫探险【Level 13】主角总是孤独的

swift IQKeyboardManager - 铁人29

在开发 ios app 时,很常发现使用键盘跳出会盖住你的 UITextField 或 UIText...

[13th][Day12] struct

Day8 go 的变数有着各式各样的型态: int float string pointer ......

使用 OpenTelemetry api 自订义内容

Resources 在 OpenTelemetry 中,服务由资源描述,资源是在应用程序启动期间初始...

[ 卡卡 DAY 30 ] - React Native codepush iOS 热更新

第一次认识 React Native 就是因为热更新 所以怎麽可以不介绍大家一下呢~ AppCen...

我们的基因体时代-AI, Data和生物资讯 Day23- 基因注释资料在Bioconductor中视觉化之呈现:Gviz

上一篇我们的基因体时代-AI, Data和生物资讯 Day22- 基因注释资料在Bioconduct...