簡體   English   中英

GKE Autopilot 有時會殺死 Pod 嗎?有沒有辦法為關鍵服務阻止它?

[英]Does GKE Autopilot sometimes kill Pods and is there a way to prevent it for Critical Services?

幾個小時以來,我一直在調試我們服務的 10 分鍾停機時間,我似乎找到了原因,但沒有找到原因。 我們在 kube.netes 中的 redis 部署宕機了一段時間,導致 django 和 redis 都無法訪問它。 這導致大量工作崗位流失。

redis 部署沒有任何事件,但這是重啟前后的第一批日志:

前: 在此處輸入圖像描述

后: 在此處輸入圖像描述

我還在底部附上了完整的 redis yml。 我們正在使用 GKE Autopilot,所以我猜是什么原因導致 pod 重新啟動? 資源使用率比要求低很多,CPU 和 memory 都在 1% 左右。不確定這里發生了什么。 我也找不到告訴 Autopilot 單獨保留特定部署的注釋

redis.yml:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-disk
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: gce-ssd
  resources:
    requests:
      storage: "2Gi"
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    app: redis
spec:
  ports:
    - port: 6379
      name: redis
  clusterIP: None
  selector:
    app: redis
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      volumes:
        - name: redis-volume
          persistentVolumeClaim:
            claimName: redis-disk
            readOnly: false
      terminationGracePeriodSeconds: 5
      containers:
        - name: redis
          image: redis:6-alpine
          command: ["sh"]
          args: ["-c", 'exec redis-server --requirepass "$REDIS_PASSWORD"']
          resources:
            requests:
              memory: "512Mi"
              cpu: "500m"
              ephemeral-storage: "1Gi"
          envFrom:
            - secretRef:
                name: env-secrets
          volumeMounts:
            - name: redis-volume
              mountPath: /data
              subPath: data

PersistentVolumeClaim是 kube.netes 中的一個object允許將存儲資源請求與其關聯的PersistentVolume部分完成的實際資源配置分離。

鑒於:

kube.netes將嘗試根據請求的存儲 class ( gce -ssd ) 為您動態提供適合底層基礎設施的持久磁盤,在您的情況下是Google Compute Engine 持久磁盤

該聲明將導致為您自動配置一個類似 SSD 的永久磁盤,並且一旦聲明被刪除(請求的 pod 由於縮減而被刪除),該卷將被銷毀

要克服此問題並避免丟失寶貴的數據,您應該有兩種選擇:

在 PersistentVolumeClaim 級別

為避免刪除 Pod 及其 PVC 后的數據丟失,您可以在 PVC object 上將persistentVolumeReclaimPolicy參數設置為Retain

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-disk
spec:
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: gce-ssd
  resources:
    requests:
      storage: "2Gi"

這允許將持久卷從 go 恢復到Released state,並且可以手動備份底層數據。

在存儲類級別

作為一般建議,您應該為您使用的StorageClassreclaimPolicy參數設置為Retain (默認為Delete ):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ssd
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
  reclaimPolicy: Retain
  replication-type: regional-pd
  volumeBindingMode: WaitForFirstConsumer

建議使用其他參數:

  • replication-type :應設置為regional-pd以允許區域復制
  • volumeBindingMode :設置為WaitForFirstConsumer以允許第一個消費者指定區域復制拓撲

您可以kube.netes文檔中閱讀有關上述所有StorageClass參數的更多信息

然后聲明具有相同存儲 class 名稱的PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: ssd-volume
spec:
  storageClassName: "ssd"
  capacity:
    storage: 2G
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    pdName: redis-disk

PersistentVolumeClaim只會聲明請求的StorageClass名稱:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ssd-volume-claim
spec:
  storageClassName: "ssd"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "2Gi"

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      volumes:
        - name: redis-volume
          persistentVolumeClaim:
            claimName: ssd-volume-claim
            readOnly: false

該對象聲明將防止任何故障或縮減操作破壞由集群管理員手動創建或使用動態配置動態創建的 PV。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM