79. Labels, Selectors and Annotations


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:
    environment: production
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

我們可以在 kubernetes object 上貼上標籤 (labels) 用於分類。使用 kubectl get pod --selector <key>=<value> 可以篩選。

最後 Annotation 就是有點像註解的東西,給人看的 例如: build version, on call 電話號碼 之類的。label 可以幫助我們 select object,annotation 則否。


82. Rolling Updates & Rollbacks in Deployments


這邊主要介紹 rolling update strategy 是怎麼樣的概念,當我們部屬一個 deployment 就會觸發 rollout,可以透過 kubectl rollout status deployment <name> 查看 rollout 狀態。


rollout_status_0

▲ log 由上至下。 kubectl rollout history 可以查看歷史。


rolling_update_strategy


Kubernetes 預設使用 rolling update 策略 (strategy) 來更新 pod,比起 recreate 後者能夠確保服務不被中斷。
kubectl describe deployments.apps rollout-test 能夠找到 RollingUpdateStrategy: 25% max unavailable, 25% max surge


describe_deployment


rolling update

首先 kubectl create deployment nginx-rollout --image=nginx:1.20.1 --replicas=5


nginx_rollout_0

kubectl rollout status 顯示完成


nginx_rollout_1

Events 顯示 scale up replica set 75c585fb66 to 5


接著我們升級 nginx -> 1.21


nginx_rollout_2

▲ 我們以 藍色代表新的 replica set
scale up replica set 59b5b5c6bd to 2
scale down replica set 75c585fb66 to 4
scale up replica set 59b5b5c6bd to 3
scale down replica set 75c585fb66 to 3
scale up replica set 59b5b5c6bd to 4
scale down replica set 75c585fb66 to 2
scale up replica set 59b5b5c6bd to 5 (達標)
scale down replica set 75c585fb66 to 1
(combined from similar events): Scaled down replica set 75c585fb66 to 0


nginx_rollout_3

▲ 示意圖


rollback

反悔了,來個 rollback 時光倒轉一下吧! kubectl rollout undo deployment nginx-rollout


rollback_0

▲ 舊的 replicaset 又有東西囉~


sum

▲ 總結


83. Updating a Deployment


rollout_revision_0

▲ 使用 --revision= 可以查看指定 revision


rollout_record_0

▲ 在 create/edit deployment 的時候使用 --record,可以把當次使用的命令紀錄到 CAUSE 欄位。



86. Jobs


Tips:

1
2
3
4
5
6
## kubectl create job NAME --image=image [--from=cronjob/name] -- [COMMAND] [args...] [options]
kubectl create job fast-job --image=centos:7 $dry -- sh -c "echo Hi" > fast-job.yml

# Pod way
## kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>
kubectl run pod6 --image=busybox:1.31.0 $dry --command -- sh -c "touch /tmp/ready && sleep 1d" > 6.yaml

Jobs 就像 Linux 的 at 一樣,負責執行一次性工作 (參考資料: 小信豬 [Kubernetes] Job, CronJob & TTL Controller Overview)

我們直接 hands-on ~ 建立一個 pod 使用 perl 計算圓周率小數點後一位 (???)


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: pi-pod
  name: pi-pod
spec:
  containers:
  - image: perl
    name: pi-pod
    command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2)"]

接著用 kubectl get pod pi-pod 觀察 pod 的變化


pi_pod_0

▲ 狀態從 ContainerCreating -> Complete -> CrashLoopBackOff (Restart:1),好像哪裡怪怪的… 都 Complete 了怎麼會有 restart 呢?


其實這跟 Kubernetes 預設的 restartPolicy 有關。當 K8s 偵測到 pod 裡面的 container failed/exited 就會很熱心地去 restart 人家~


pi_pod_1

▲ 同場加映,昨天我用 --image=hello-world 建立的 pod 已經 restart 356 次了 XD 因為 hello-world 這個 image 只做一件事情: 顯示 Hello World 後 Exited (0)
然後就被 Kubernetes 一直 restart 惹 QQ


上面的例子讓我們知道一件事: Pod 不適合跑一次性的工作
可是你可能會想說: 那把 restartPolicy: Never 就好了呀~ No no no! Job 能夠幫我們做更多事 :)

我們在來把剛剛的 pod 改成 job:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: batch/v1
kind: Job
metadata:
  name: pi-job
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - image: perl
        name: pi-job
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2)"]
      restartPolicy: Never

pi_job_0

▲ 當 job 執行完成後 STATUS 會變成 Complete 不會被 K8s 一直雞婆 restart


job 同時可以執行多次、同時執行 (parallelism)


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
apiVersion: batch/v1
kind: Job
metadata:
  name: pi-job
spec:
  completions: 50
  parallelism: 2
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - image: perl
        name: pi-job
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2)"]
      restartPolicy: Never

pi_job_1

▲ 目標完成: 50,同時執行: 3


backoffLimit

Job.spec.backoffLimit 預設值是 6,這個設定值定義當 pod failed 幾次之後就終止此 Job


87. CronJob

就跟 Linux 的 cronjob 一樣,定時執行。比較特別的是 CronJob 有三個 spec:

  1. CronJob
  2. Job
  3. Pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure