Mục lục- 1. Tạo và triển khai nginx-daemonset.yaml
-
- Chỉnh sửa nginx-daemonset bằng lệnh edit để điều phối pod
-
- Sử dụng patch để cập nhật động tệp YAML của pod mà không cần tương tác
- 3.1 Chuyển đổi trường YAML cần thêm thành JSON
- 3.2 Sử dụng patch để cập nhật pod
-
- Các lệnh phổ biến của kubectl patch
Sử dụng kubectl patch để cập nhật đối tượng API
Giới thiệu:
Giả sử chúng ta đã triển khai một số Pod được quản lý bởi DaemonSet, nếu muốn ngăn chặn việc lập lịch đến một nút cụ thể, chúng ta có thể sử dụng
kubectl edit DaemonSet xxxđể thêm chính sách loại trừ nút, sau khi lưu và thoát khỏi chế độ edit, hệ thống sẽ tự động thực hiện thay đổi pod. Tuy nhiên đây là phương pháp tương tác, và sẽ trở nên bất tiện khi số lượng máy chủ trong cụm lớn, vì vậy chúng ta cần một lệnh duy nhất để hoàn thành việc lập lịch.spec: revisionHistoryLimit: 10 selector: matchLabels: app: nginx template: metadata: creationTimestamp: null labels: app: nginx spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: NotIn values: - node02 containers: - image: nginx:1.14.1 imagePullPolicy: IfNotPresent ..........
- Tạo và triển khai nginx-daemonset.yaml ==============================
tệp nginx-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.1
ports:
- containerPort: 80
Triển khai
kubectl apply -f nginx-daemonset.yaml
Kiểm tra
[root@master ~]#kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-daemonset-5ln28 1/1 Running 0 60s 10.244.1.3 node01
pod/nginx-daemonset-z86nn 1/1 Running 0 60s 10.244.2.3 node02
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 443/TCP 4d10h
[root@master ~]#kubectl get DaemonSet
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 2 2 2 2 2 9m58s
- Chỉnh sửa nginx-daemonset bằng lệnh edit để điều phối pod ====================================
Trường YAML được thêm vào có nghĩa là không cho phép pod lập lịch đến nút node02.
[root@master ~]#kubectl edit DaemonSet nginx-daemonset
...
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- node02
...
Kiểm tra
[root@master ~]#kubectl get pods,svc -o wide # pod đã bị đẩy khỏi node02
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-daemonset-xnfjq 1/1 Running 0 5m21s 10.244.1.4 node01
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 443/TCP 4d10h
- Sử dụng patch để cập nhật động tệp YAML của pod mà không cần tương tác ====================================
[Công cụ chuyển đổi YAML sang JSON](Công cụ trực tuyến chuyển đổi YAML sang JSON - ToolTT)
3.1 Chuyển đổi trường YAML cần thêm thành định dạng JSON
// Bắt đầu từ đây, loại bỏ các trường không cần thiết
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- node02
// -------------------------- //
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- node02
Định dạng JSON
{
"spec": {
"template": {
"spec": {
"affinity": {
"nodeAffinity": {
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{
"matchExpressions": [
{
"key": "kubernetes.io/hostname",
"operator": "NotIn",
"values": [
"node02"
]
}
]
}
]
}
}
}
}
}
}
}
// Định dạng nén
{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key": "kubernetes.io/hostname","operator": "NotIn","values": ["node02"]}]}]}}}}}}}
Kiểm tra pod hiện tại
# Xóa cấu hình thử nghiệm trước đó, áp dụng lại
[root@master ~]#kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-daemonset-6x6kw 1/1 Running 0 11s 10.244.2.6 node02
pod/nginx-daemonset-j58xv 1/1 Running 0 11s 10.244.1.8 node01
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 443/TCP 4d14h
3.2 Sử dụng patch để cập nhật pod
[root@master ~]#kubectl patch DaemonSet nginx-daemonset --patch '{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key": "kubernetes.io/hostname","operator": "NotIn","values": ["node02"]}]}]}}}}}}}'
daemonset.apps/nginx-daemonset patched
Kiểm tra kết quả
# Có thể thấy chỉ còn tồn tại pod trên nút node01
[root@master ~]#kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-d94fc 0/2 ContainerCreating 0 2s node01
[root@master ~]#kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-d94fc 2/2 Running 0 42s 10.244.1.7 node01
- Các lệnh phổ biến của kubectl patch =====================
Sử dụng patch để cập nhật nút Node
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
Sử dụng patch để cập nhật nút được xác định bởi loại và tên trong tệp node.json
kubectl patch -f node.json -p '{"spec":{"unschedulable":true}}'
Cập nhật ảnh container
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
hoặc
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'
Thiết lập IP bên ngoài cho dịch vụ
kubectl patch svc -n -p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.31.241"]}}'
Mã lệnh thực hiện cập nhật hàng loạt deployment với chính sách chống đồng vị trí
#!/bin/bash
APP_DEPLOYMENTS=($(kubectl get deploy -n zcm9 | grep -v -E "NAME|mysql|redis|task|zcache|net|minio|serverless" | awk '{print $1}'))
for ((j=0;j ./execute_update.sh