幾個(gè)你或許并不知道 Kubernetes 技巧
使用 PreStop 優(yōu)雅關(guān)閉 Pod
apiVersion: v1
kind: Pod
metadata:
name: graceful-shutdown-example
spec:
containers:
- name: sample-container
image: nginx
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 30 && nginx -s quit"]
PreStop 允許 Pod 在終止前執(zhí)行一個(gè)命令或者是腳本,使用它就可以在應(yīng)用退出前釋放一些資源,確保應(yīng)用可以優(yōu)雅退出。
比如可以在 Nginx 的 Pod 退出前將當(dāng)前的請(qǐng)求執(zhí)行完畢。
使用臨時(shí)容器調(diào)試 Pod
臨時(shí)容器可以不修改一個(gè)運(yùn)行的容器的前提下調(diào)試容器,可以很方便的調(diào)試一些生產(chǎn)環(huán)境的 bug,可以避免重啟應(yīng)用。
kubectl alpha debug -it podname --image=busybox --target=containername
生產(chǎn)環(huán)境謹(jǐn)慎使用,只有在當(dāng)前環(huán)境下無法排查問題的時(shí)候才使用。
基于自定義的 Metrics 自動(dòng)擴(kuò)容Pod
kubernetes 是提供了 HPA 機(jī)制可以跟進(jìn) CPU 內(nèi)存等標(biāo)準(zhǔn)數(shù)據(jù)進(jìn)行自動(dòng)擴(kuò)縮容,但有時(shí)我們需要根據(jù)自定義的數(shù)據(jù)進(jìn)行擴(kuò)縮容。
比如某個(gè)接口的延遲、隊(duì)列大小等。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: custom-metric-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: your-application
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: your_custom_metric
target:
type: AverageValue
averageValue: 10
用 Init Containers 配置啟動(dòng)腳本
初始化容器可以在應(yīng)用容器啟動(dòng)前運(yùn)行,我們可以使用它來初始化應(yīng)用需要的配置、等待依賴的服務(wù)啟動(dòng)完成等工作:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
比如這個(gè)初始化容器會(huì)等待 myservice 可用后才會(huì)啟動(dòng)應(yīng)用。
需要注意的是如果初始化容器會(huì)阻塞應(yīng)用啟動(dòng),所以要避免在初始化容器里執(zhí)行耗時(shí)操作。
Node 親和性調(diào)度
當(dāng)我們需要將某些應(yīng)用部署到硬件配置較高的節(jié)點(diǎn)時(shí)(比如需要 SSD 硬盤),就可以使用節(jié)點(diǎn)親和性來部署應(yīng)用:
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
containers:
- name: with-node-affinity
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
這個(gè) Pod 會(huì)被部署到有這個(gè) disktype=ssd 標(biāo)簽的 節(jié)點(diǎn)上。
動(dòng)態(tài)配置:ConfigMap 和 Secrets
ConfigMap 和 Secrets可以動(dòng)態(tài)注入到 Pod 中,避免對(duì)這些配置硬編碼。
ConfigMap 適合非敏感的數(shù)據(jù),Secrets 適合敏感的數(shù)據(jù)。
# ConfigMap Example
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
config.json: |
{
"key": "value",
"databaseURL": "http://mydatabase.example.com"
}
# Pod Spec using ConfigMap
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
這樣在應(yīng)用中就可以通過這路徑 /etc/config/config.json 讀取數(shù)據(jù)了。
當(dāng)然也可以把這些數(shù)據(jù)寫入到環(huán)境變量中。
以上這些個(gè)人技巧用的最多的是:
1. 臨時(shí)容器調(diào)試 Pod,特別是業(yè)務(wù)容器缺少一些命令時(shí)。
2. Init Container 等待依賴的服務(wù)啟動(dòng)完成。
3. Node 親和性調(diào)度。
4. ConfigMap 是基礎(chǔ)操作了。