k8s (三) 副本機制和其他控制器:部署托管的 pod


一、存活探針

Kubernetes 可以通過存活探針(liveness probe)檢查容器是否還在運行。 可以為 pod 中的每個容器單獨指定存活探針。如果探測失敗,Kubernetes 將定期執行探針並重新啟動容器。Kubernetes 有以下三種探測容器的機制:

  • HTTP GET 探針:對容器的 IP 地址執行 HTTP GET 請求。如果探測器收到響應,並且響應狀態碼不代表錯誤(響應狀態碼是2xx或3xx),則認為探測成功。如果服務器返回錯誤響應狀態碼或者根本沒有響應,那么探測就被認為是失敗的,容器將被重新啟動。
  • TCP套接字探針:嘗試與容器指定端口建立 TCP 連接。如果連接成功建立,則探測成功。否則,容器重新啟動。
  • Exec探針:在容器內執行任意命令,並檢查命令的退出狀態碼。如果狀態碼是 0 則探測成功。所有其他狀態碼都被認為失敗。

1.1. 創建基於 HTTP 的存活探針

將存活探針添加到 pod (kubia-liveness-probe.yaml):

apiVersion: v1
kind: Pod
metadata:
  name: kubia-liveness
spec:
  containers:
  - image: luksa/kubia-unhealthy
    name: kubia
    livenessProbe:
      httpGet:
        path: /
        port: 8080
      initialDelaySeconds: 15 # 等待 15 秒后才進行第一次探測

luksa/kubia-unhealthy 這個鏡像是為了演示存活探針:在第五個請求之后,返回 HTTP 狀態碼 500:

const http = require('http');
const os = require('os');

console.log("Kubia server starting...");

var requestCount = 0;

var handler = function(request, response) {
  console.log("Received request from " + request.connection.remoteAddress);
  requestCount++;
  if (requestCount > 5) {
    response.writeHead(500);
    response.end("I'm not well. Please restart me!");
    return;
  }
  response.writeHead(200);
  response.end("You've hit " + os.hostname() + "\n");
};

var www = http.createServer(handler);
www.listen(8080);

1.2. 使用存活探針

創建 pod:

kubectl create -f kubia-liveness-probe.yaml

查看 pod:

kubectl get pod kubia-liveness

容器啟動后,多次執行查看命令,可以看到 RESTARTS > 1

查看 pod 重啟原因:

kubectl describe pod kubia-liveness

二、 ReplicaSet

我們在前面創建的基本都是未托管的 pod,可以使用控制器創建托管的 pod,可以保證 pod 不管因任何原因消失,都會自動創建替代 pod。最初 ReplicationController 是用於復制和在異常時重新調度節點的唯一組件, 后來又引入了 ReplicaSet, 而 ReplicationController 最終也將被棄用。

注:通常我們不會直接創建 ReplicaSet 或 ReplicationController,而是在創建更高層級的 Deployment 資源時自動創建他們。

2.1. 創建 RelicaSet

kubia-replicaset.yaml:

apiVersion: apps/v1 # 不是 v1 版本 API 的一部分,屬於 apps API 組的 v1 版本
kind: ReplicaSet
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    matchLabels:
      app: kubia # matchLabels 選擇器
  template:
    metadata:
      labels:
        app: kubia # 標簽
    spec:
      containers:
      - name: kubia
        image: luksa/kubia

創建:

kubectl create -f kubia-replicaset.yaml

查看:

kubectl get rs # rs 是 replicaset 的簡寫

刪除:

kubectl delete rs kubia

2.2. ReplicaSet 的標簽選擇器

  • In: Label 的值必須與其中一個指定的 values 匹配。
  • NotIn: Label 的值與任何指定的 values 不匹配。
  • Exists: pod 必須包含一個指定名稱的標簽。使用此運算符時,不應指定 values 字段。
  • DoesNotExist: pod 不得包含有指定名稱的標簽。values屬性不得指定。

如果指定了多個表達式,則所有這些表達式都必須為 true 才能使選擇器與 pod 匹配。如果同時指定 matchLabels 和 matchExpressions, 則所有標簽都必須匹配,並且所有表達式必須計算為 true 以使該 pod 與選擇器匹配。

示例:

... ...
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
         - kubia
... ...

三、DaemonSet

Replicationcontroller 和 ReplicaSet 都用於在 Kubernetes 集群上運行部署特定數量的 pod(隨機分布在集群上)。DaemonSet 則可以實現在每個節點或者指定的節點上運行一個 pod。適用於比如 pod 執行系統級別的與基礎結構相關的操作,例如,希望在每個節點上運行日志收集器和資源監控器;另一個典型的例子是 Kubernetes 自己的 kube-proxy 進程,它需要運行在所有節點上才能使服務工作。

DaemonSet 配置示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ssd-monitor
spec:
  selector:
    matchLabels:
      app: ssd-monitor
  template:
    metadata:
      labels:
        app: ssd-monitor
    spec:
      nodeSelector:
        disk: ssd # 選擇標簽 disk=ssd 的 node
      containers:
      - name: main
        image: luksa/ssd-monitor

四、執行單個任務的 pod

4.1. 創建 job

apiVersion: batch/v1 # Job 屬於 batch API 組
kind: Job
metadata:
  name: batch-job
spec:
  template:
    metadata:
      labels:
        app: batch-job
    spec:
      restartPolicy: OnFailure # Job 不能使用 Always 為默認的重啟啟動策略,應該為 OnFailure 或 Never
      containers:
      - name: main
        image: luksa/batch-job

查看:

kubectl get jobs

kubectl get pods

4.2. 在 Job 中運行多個 pod 實例

順序運行:

... ...
metadata:
  name: multi-completion-batch-job
spec:
  completions: 5 # 此作業順序運行 5 個 pod
... ...

並行運行:

... ...
metadata:
  name: multi-completion-batch-job
spec:
  completions: 5 # 這項任務必須確保 5 個 pod 成功完成
  parallelism: 2 # 最多 2 個 pod 可以並行運行
... ...

可以在 job 運行的時候 更改 parallelism 屬性,縮放 job:

kubectl scale job multi-completion-batch-job --replicas 3

其他屬性:

  • activeDeadlineSeconds:限制 pod的時間,如果 pod 運行時間超過此時間,系統將嘗試終止 pod, 並將 Job 標記為失敗。
  • spec.backoffLimit:Job 在被標記為失敗之前重試的次數,默認值為 6

4.3. CronJob

apiVersion: batch/v1
kind: CronJob
metadata:
  name: batch-job-every-fifteen-minutes
spec:
  schedule: "0,15,30,45 * * * *" # cron 表達式
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: periodic-batch-job
        spec:
          restartPolicy: OnFailure
          containers:
          - name: main
            image: luksa/batch-job


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM