[英]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
部分完成的實際資源配置分離。
鑒於:
PersistentVolume
objectkube.netes將嘗試根據請求的存儲 class ( gce -ssd ) 為您動態提供適合底層基礎設施的持久磁盤,在您的情況下是Google Compute Engine 持久磁盤。
該聲明將導致為您自動配置一個類似 SSD 的永久磁盤,並且一旦聲明被刪除(請求的 pod 由於縮減而被刪除),該卷將被銷毀。
要克服此問題並避免丟失寶貴的數據,您應該有兩種選擇:
為避免刪除 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,並且可以手動備份底層數據。
作為一般建議,您應該為您使用的StorageClass
將reclaimPolicy
參數設置為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.