Sử dụng kubectl patch để cập nhật không tương tác các tệp YAML trong Kubernetes

Mục lục- 1. Tạo và triển khai nginx-daemonset.yaml

    1. Chỉnh sửa nginx-daemonset bằng lệnh edit để điều phối pod
    1. 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
    1. 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 
     ..........

  1. 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

  1. 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

  1. 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


  1. 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

Thẻ: Kubernetes Kubectl patch yaml JSON

Đăng vào ngày 13 tháng 6 lúc 19:49