Kustomize cho phép bạn quản lý các tệp mẫu Kubernetes bằng cách sử dụng các tệp “kustomization” bằng cách khai báo. Nó cung cấp khả năng diễn đạt các tài nguyên Kubernetes “cơ bản” cho tài nguyên Kubernetes của bạn và sau đó áp dụng các thay đổi bằng cách sử dụng sự hợp thành, tùy chỉnh và dễ dàng thực hiện các thay đổi chéo qua nhiều tài nguyên.
Ví dụ, hãy xem tệp mẫu sau cho checkout
Deployment:
~/environment/eks-workshop/base-application/checkout/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: checkout
app.kubernetes.io/instance: checkout
app.kubernetes.io/component: service
template:
metadata:
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/name: checkout
app.kubernetes.io/instance: checkout
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
spec:
serviceAccountName: checkout
securityContext:
fsGroup: 1000
containers:
- name: checkout
envFrom:
- configMapRef:
name: checkout
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
image: "public.ecr.aws/aws-containers/retail-store-sample-checkout:0.4.0"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
resources:
limits:
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
volumeMounts:
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir:
medium: Memory
Tệp này đã được áp dụng trong bài lab Getting Started trước đó, nhưng giả sử chúng ta muốn mở rộng thành phần này theo chiều ngang bằng cách cập nhật trường replicas
sử dụng Kustomize. Thay vì cập nhật tệp YAML này thủ công, chúng ta sẽ sử dụng Kustomize để cập nhật trường spec/replicas
từ 1 thành 3.
Để làm điều này, chúng ta sẽ áp dụng kustomization sau.
Deployment/checkout
được cập nhật sau khi kustomization được áp dụngmodules/introduction/kustomize/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout
spec:
replicas: 3
Deployment/checkout
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
name: checkout
namespace: checkout
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: checkout
app.kubernetes.io/name: checkout
template:
metadata:
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/instance: checkout
app.kubernetes.io/name: checkout
spec:
containers:
- envFrom:
- configMapRef:
name: checkout
image: public.ecr.aws/aws-containers/retail-store-sample-checkout:0.4.0
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
name: checkout
ports:
- containerPort: 8080
name: http
protocol: TCP
resources:
limits:
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
volumeMounts:
- mountPath: /tmp
name: tmp-volume
securityContext:
fsGroup: 1000
serviceAccountName: checkout
volumes:
- emptyDir:
medium: Memory
name: tmp-volume
Bạn có thể tạo ra YAML Kubernetes cuối cùng áp dụng kustomization này bằng lệnh kubectl kustomize
, mà gọi kustomize
được gói kèm với CLI kubectl
:
$ kubectl kustomize ~/environment/eks-workshop/modules/introduction/kustomize
Điều này sẽ tạo ra nhiều tệp YAML, đại diện cho các tài nguyên cuối cùng bạn có thể áp dụng trực tiếp vào Kubernetes. Hãy minh họa điều này bằng cách chuyển dữ liệu đầu ra từ kustomize
trực tiếp sang kubectl apply
:
$ kubectl kustomize ~/environment/eks-workshop/modules/introduction/kustomize | kubectl apply -f -
namespace/checkout unchanged
serviceaccount/checkout unchanged
configmap/checkout unchanged
service/checkout unchanged
service/checkout-redis unchanged
deployment.apps/checkout configured
deployment.apps/checkout-redis unchanged
Bạn sẽ nhận thấy một số tài nguyên liên quan đến checkout
“unchanged”, với deployment.apps/checkout
được “cấu hình”. Điều này là có chủ ý — chúng ta chỉ muốn áp dụng các thay đổi vào deployment
của checkout
. Điều này xảy ra vì lệnh trước đó thực sự áp dụng hai tệp: deployment.yaml
của Kustomize mà chúng ta đã thấy ở trên, cũng như tệp kustomization.yaml
sau đây khớp với tất cả các tệp trong thư mục ~/environment/eks-workshop/base-application/checkout
. Trường patches
chỉ định tệp cụ thể cần được vá:
~/environment/eks-workshop/modules/introduction/kustomize/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../../base-application/checkout
patches:
- path: deployment.yaml
Để kiểm tra xem số bản sao đã được cập nhật, chạy lệnh sau:
$ kubectl get pod -n checkout -l app.kubernetes.io/component=service
NAME READY STATUS RESTARTS AGE
checkout-585c9b45c7-c456l 1/1 Running 0 2m12s
checkout-585c9b45c7-b2rrz 1/1 Running 0 2m12s
checkout-585c9b45c7-xmx2t 1/1 Running 0 40m
Thay vì sử dụng sự kết hợp của kubectl kustomize
và kubectl apply
, chúng ta có thể thực hiện cùng một việc với kubectl apply -k <thư_mục_kustomization>
(chú ý cờ -k
thay vì -f
). Phương pháp này được sử dụng trong khóa học này để làm cho việc áp dụng các thay đổi vào các tệp mẫu dễ dàng hơn, trong khi rõ ràng hiển thị các thay đổi cần được áp dụng.
Hãy thử:
$ kubectl apply -k ~/environment/eks-workshop/modules/introduction/kustomize
Để đặt lại các tệp mẫu ứng dụng về trạng thái ban đầu của chúng, bạn có thể đơn giản áp dụng bộ tệp mẫu ban đầu:
$ kubectl apply -k ~/environment/eks-workshop/base-application
Mẫu khác bạn sẽ thấy được sử dụng trong một số bài lab có dạng như sau:
$ kubectl kustomize ~/environment/eks-workshop/base-application \
| envsubst | kubectl apply -f-
Điều này sử dụng envsubst
để thay thế các nơi giữ chỗ biến môi trường trong các tệp mẫu Kubernetes bằng các giá trị thực tế dựa trên môi trường cụ thể của bạn. Ví dụ trong một số tệp mẫu, chúng ta cần tham chiếu đến tên cụm EKS với $EKS_CLUSTER_NAME
hoặc khu vực AWS với $AWS_REGION
.
Bây giờ bạn đã hiểu cách Kustomize hoạt động, tiến hành module Cơ bản.
Để tìm hiểu thêm về Kustomize, bạn có thể tham khảo tài liệu chính thức của Kubernetes.