Cách quản lý cấu hình Kubernetes của bạn với Kustomize
Việc triển khai các ứng dụng cho Kubernetes đôi khi có thể cảm thấy rườm rà. Bạn triển khai một số Pods , được hỗ trợ bởi một triển khai , với khả năng tiếp cận định nghĩa trong một dịch vụ . Tất cả các tài nguyên này đều yêu cầu file YAML để có định nghĩa và cấu hình phù hợp.Trên hết, ứng dụng của bạn có thể cần giao tiếp với database , quản lý nội dung web hoặc đặt độ dài của việc ghi log . Hơn nữa, các thông số này có thể cần khác nhau tùy thuộc vào môi trường mà bạn đang triển khai. Tất cả những điều này có thể dẫn đến cơ sở mã rộng rãi của các định nghĩa YAML, mỗi định nghĩa có một hoặc hai dòng thay đổi khó xác định.
Kustomize là một công cụ quản lý cấu hình open-souce được phát triển để giúp giải quyết những mối quan tâm này. Kể từ Kubernetes 1.14, kubectl
hỗ trợ đầy đủ các file kustomization
và kustomization
.
Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng web nhỏ và sau đó sử dụng Kustomize để quản lý dải cấu hình của bạn . Bạn sẽ triển khai ứng dụng của bạn tới môi trường phát triển và production với các cấu hình khác nhau. Bạn cũng sẽ xếp lớp các cấu hình biến này bằng cách sử dụng các cơ sở và lớp phủ của Kustomize để mã của bạn dễ đọc hơn và do đó dễ bảo trì hơn.
Yêu cầu
Đối với hướng dẫn này, bạn cần :
- Một cụm Kubernetes 1.14+ với cấu hình kết nối của bạn được đặt làm mặc định
kubectl
. Để tạo một cụm Kubernetes trên DigitalOcean, hãy đọc Phần khởi động nhanh Kubernetes của ta . Để kết nối với cụm, hãy đọc Cách kết nối với một cụm DigitalOcean Kubernetes . -
kubectl
được cài đặt trên máy local của bạn. Làm theo hướng dẫn này để bắt đầu với Kubernetes: Akubectl
Cheat Sheet để cài đặt nó.
Bước 1 - Triển khai ứng dụng của bạn mà không cần Kustomize
Trước khi triển khai ứng dụng của bạn với Kustomize, trước tiên bạn sẽ triển khai ứng dụng theo cách truyền thống hơn. Trong trường hợp này, bạn sẽ triển khai version phát triển của sammy-app
— một sammy-app
web tĩnh được lưu trữ trên Nginx . Bạn sẽ lưu trữ nội dung web của bạn dưới dạng dữ liệu trong Sơ đồ cấu hình , mà bạn sẽ gắn trên Pod trong Triển khai. Mỗi file này sẽ yêu cầu một file YAML riêng biệt mà bây giờ bạn sẽ tạo.
Đầu tiên, tạo một folder cho ứng dụng của bạn và tất cả các file cấu hình của nó. Đây là nơi bạn sẽ chạy tất cả các lệnh trong hướng dẫn này.
Tạo một folder mới trong folder chính của bạn và chuyển bên trong:
- mkdir ~/sammy-app && cd ~/sammy-app
Bây giờ hãy sử dụng editor bạn muốn để tạo và mở file có tên configmap.yml
:
- nano configmap.yml
Thêm nội dung sau:
--- apiVersion: v1 kind: ConfigMap metadata: name: sammy-app namespace: default data: body: > <html> <style> body { background-color: #222; } p { font-family:"Courier New"; font-size:xx-large; color:#f22; text-align:center; } </style> <body> <p>DEVELOPMENT</p> </body> </html>
Đặc tả này tạo một đối tượng ConfigMap mới. Bạn đang đặt tên cho nó là sammy-app
và lưu một số nội dung web HTML bên trong data:
Lưu và đóng file .
Bây giờ, hãy tạo và mở file thứ hai có tên là deployment.yml
:
- nano deployment.yml
Thêm nội dung sau:
--- apiVersion: apps/v1 kind: Deployment metadata: name: sammy-app namespace: default labels: app: sammy-app spec: replicas: 1 selector: matchLabels: app: sammy-app template: metadata: labels: app: sammy-app spec: containers: - name: server image: nginx:1.17 volumeMounts: - name: sammy-app mountPath: /usr/share/nginx/html ports: - containerPort: 80 protocol: TCP resources: requests: cpu: 100m memory: "128M" limits: cpu: 100m memory: "256M" env: - name: LOG_LEVEL value: "DEBUG" volumes: - name: sammy-app configMap: name: sammy-app items: - key: body path: index.html
Đặc tả này tạo một đối tượng Triển khai mới. Bạn đang thêm tên và nhãn của sammy-app
, đặt số lượng bản sao thành 1
và chỉ định đối tượng để sử dụng containers images Nginx version 1.17. Bạn cũng đang đặt cổng của containers thành 80
, xác định các yêu cầu và giới hạn của cpu và bộ nhớ, đồng thời đặt mức ghi log của bạn thành DEBUG
.
Lưu và đóng file .
Bây giờ triển khai hai file này vào cụm Kubernetes của bạn. Để tạo nhiều Đối tượng từ stdin
, hãy chuyển lệnh cat
sang kubectl
:
- cat configmap.yml deployment.yml | kubectl apply -f -
Chờ một chút rồi sử dụng kubectl
để kiểm tra trạng thái ứng dụng của bạn:
- kubectl get pods -l app=sammy-app
Cuối cùng bạn sẽ thấy một Pod với ứng dụng của bạn đang chạy và 1/1
chứa trong cột READY
:
OutputNAME READY STATUS RESTARTS AGE sammy-app-56bbd86cc9-chs75 1/1 Running 0 8s
Pod của bạn đang chạy và được hỗ trợ bởi một Triển khai, nhưng bạn vẫn không thể truy cập ứng dụng của bạn . Trước tiên, bạn cần thêm một Dịch vụ.
Tạo và mở file YAML thứ ba có tên là service.yml
:
- nano service.yml
Thêm nội dung sau:
--- apiVersion: v1 kind: Service metadata: name: sammy-app labels: app: sammy-app spec: type: LoadBalancer ports: - name: sammy-app-http port: 80 protocol: TCP targetPort: 80 selector: app: sammy-app
Đặc tả này tạo một đối tượng Dịch vụ mới có tên là sammy-app
. Đối với hầu hết các nhà cung cấp cloud , việc đặt spec.type
thành LoadBalancer
sẽ cung cấp một bộ cân bằng tải . Ví dụ: DigitalOcean Managed Kubernetes (DOKS) , sẽ cung cấp DigitalOcean LoadBalancer để cung cấp ứng dụng của bạn trên Internet. spec.ports
sẽ nhắm đến đến cổng TCP
80
cho bất kỳ Pod nào có nhãn sammy-app
.
Lưu và đóng file .
Bây giờ, hãy triển khai Dịch vụ cho cụm Kubernetes của bạn:
- kubectl apply -f service.yml
Chờ một chút rồi sử dụng kubectl
để kiểm tra trạng thái ứng dụng của bạn:
- kubectl get services -w
Cuối cùng, một IP công cộng sẽ xuất hiện cho Dịch vụ của bạn trong cột EXTERNAL-IP
. Một IP duy nhất sẽ xuất hiện ở vị trí của your_external_ip
:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 7h26m sammy-app LoadBalancer 10.245.186.235 <pending> 80:30303/TCP 65s sammy-app LoadBalancer 10.245.186.235 your_external_ip 80:30303/TCP 2m29s
Sao chép địa chỉ IP xuất hiện và nhập vào trình duyệt web . Bạn sẽ thấy version DEVELOPMENT
của ứng dụng của bạn .
Từ terminal của bạn, nhập CTRL + C
để ngừng xem Dịch vụ của bạn.
Trong bước này, bạn đã triển khai version phát triển của sammy-app
cho Kubernetes. Trong Bước 2 và 3, bạn sẽ sử dụng Kustomize để triển khai lại version phát triển của sammy-app
và sau đó triển khai version production với các cấu hình hơi khác một chút. Sử dụng quy trình làm việc mới này, bạn sẽ thấy Kustomize có thể quản lý các thay đổi cấu hình và đơn giản hóa quy trình phát triển của bạn tốt như thế nào.
Bước 2 - Triển khai ứng dụng của bạn với Kustomize
Trong bước này, bạn sẽ triển khai cùng một ứng dụng, nhưng ở dạng mà Kustomize mong đợi thay vì cách Kubernetes mặc định.
Hệ thống file của bạn hiện giống như sau:
sammy-app/ ├── configmap.yml ├── deployment.yml └── service.yml
Để làm cho ứng dụng này có thể triển khai với Kustomize, bạn cần thêm một file , kustomization.yml
. Làm như vậy ngay bây giờ:
- nano kustomization.yml
Ở mức tối thiểu, file này phải chỉ định tài nguyên nào cần quản lý khi chạy kubectl
với tùy chọn -k
, tùy chọn này sẽ hướng kubectl
xử lý file kustomization
.
Thêm nội dung sau:
--- resources: - configmap.yml - deployment.yml - service.yml
Lưu và đóng file .
Bây giờ, trước khi triển khai lại, hãy xóa tài nguyên Kubernetes hiện có của bạn khỏi Bước 1:
- kubectl delete deployment/sammy-app service/sammy-app configmap/sammy-app
Và triển khai chúng , nhưng lần này với Kustomize:
- kubectl apply -k .
Thay vì cung cấp tùy chọn -f
cho kubectl
để hướng Kubernetes tạo tài nguyên từ một file , bạn cung cấp -k
và một folder (trong trường hợp này .
Biểu thị folder hiện tại). Điều này hướng dẫn kubectl
sử dụng Kustomize và kiểm tra kustomization.yml
của thư kustomization.yml
.
Điều này tạo ra tất cả ba tài nguyên: Bản đồ cấu hình, Triển khai và Dịch vụ. Sử dụng lệnh get pods
để kiểm tra việc triển khai của bạn:
- kubectl get pods -l app=sammy-app
Bạn sẽ lại thấy một Pod với ứng dụng của bạn đang chạy và 1/1
chứa trong cột READY
.
Bây giờ chạy lại lệnh get services
. Bạn cũng sẽ thấy Dịch vụ của bạn với EXTERNAL-IP
có thể truy cập :
- kubectl get services -l app=sammy-app
Đến đây bạn đang sử dụng thành công Kustomize để quản lý cấu hình Kubernetes của bạn . Trong bước tiếp theo, bạn sẽ triển khai sammy-app
để production với một cấu hình hơi khác. Bạn cũng sẽ sử dụng Kustomize để quản lý các biến thể này.
Bước 3 - Quản lý sự khác biệt của ứng dụng với Kustomize
Các file cấu hình cho tài nguyên Kubernetes có thể bắt đầu tràn lan khi bạn bắt đầu xử lý nhiều loại tài nguyên, đặc biệt khi có sự khác biệt nhỏ giữa các môi trường (ví dụ như phát triển so với production ). Bạn có thể có một deployment-development.yml
và deployment-production.yml
xuất.yml thay vì chỉ có một deployment.yml
. Tình hình cũng có thể tương tự đối với tất cả các tài nguyên khác của bạn.
Hãy tưởng tượng điều gì có thể xảy ra khi version mới của hình ảnh Nginx Docker được phát hành và bạn muốn bắt đầu sử dụng nó. Có lẽ bạn kiểm tra version mới trong deployment-development.yml
và muốn tiếp tục, nhưng sau đó bạn quên cập nhật deployment-production.yml
với version mới. Đột nhiên, bạn đang chạy một version Nginx đang phát triển khác với version đang production . Những lỗi cấu hình nhỏ như thế này có thể nhanh chóng phá vỡ ứng dụng của bạn.
Kustomize có thể đơn giản hóa rất nhiều các vấn đề quản lý này. Lưu ý bây giờ bạn có một hệ thống file với các file cấu hình Kubernetes và kustomization.yml
:
sammy-app/ ├── configmap.yml ├── deployment.yml ├── kustomization.yml └── service.yml
Hãy tưởng tượng rằng bây giờ bạn đã sẵn sàng triển khai sammy-app
để production . Bạn cũng đã quyết định rằng version production của ứng dụng của bạn sẽ khác với version phát triển của nó theo những cách sau:
-
replicas
sẽ tăng từ1
lên3
. -
requests
tài nguyên containers sẽ tăng từ100m
CPU và bộ nhớ128M
lên250m
CPU và bộ nhớ256M
. -
limits
tài nguyên containers sẽ tăng từ CPU100m
và bộ nhớ256M
lên1
CPU và bộ nhớ1G
. - biến môi trường
LOG_LEVEL
sẽ thay đổi từDEBUG
thànhINFO
. - Dữ liệu ConfigMap sẽ thay đổi để hiển thị nội dung web hơi khác.
Để bắt đầu, hãy tạo một số folder mới để sắp xếp mọi thứ theo cách dành riêng cho Kustomize:
- mkdir base
Điều này sẽ giữ cấu hình "mặc định" của bạn — cơ sở của bạn. Trong ví dụ của bạn, đây là version phát triển của sammy-app
.
Bây giờ hãy di chuyển cấu hình hiện tại của bạn trong sammy-app/
vào folder này:
- mv configmap.yml deployment.yml service.yml kustomization.yml base/
Sau đó, tạo một folder mới cho cấu hình production của bạn. Kustomize gọi đây là lớp phủ . Hãy nghĩ về các lớp phủ như các lớp trên cùng của lớp nền — chúng luôn yêu cầu lớp nền để hoạt động:
- mkdir -p overlays/production
Tạo một file kustomization.yml
khác để xác định lớp phủ production của bạn:
- nano overlays/production/kustomization.yml
Thêm nội dung sau:
--- bases: - ../../base patchesStrategicMerge: - configmap.yml - deployment.yml
Tệp này sẽ chỉ định base
cho lớp phủ và chiến lược Kubernetes sẽ sử dụng để vá tài nguyên . Trong ví dụ này, bạn sẽ chỉ định một bản vá kiểu hợp nhất chiến lược để cập nhật các tài nguyên Sơ đồ cấu hình và Triển khai.
Lưu và đóng file .
Và cuối cùng, thêm mới deployment.yml
và configmap.yml
file vào overlays/production/
folder .
Trước tiên, hãy tạo file deployment.yml
mới:
- nano overlays/production/deployment.yml
Thêm phần sau vào file của bạn. Các phần được đánh dấu biểu thị những thay đổi từ cấu hình phát triển của bạn:
--- apiVersion: apps/v1 kind: Deployment metadata: name: sammy-app namespace: default spec: replicas: 3 template: spec: containers: - name: server resources: requests: cpu: 250m memory: "256M" limits: cpu: 1 memory: "1G" env: - name: LOG_LEVEL value: "INFO"
Lưu ý nội dung của deployment.yml
mới này. Nó chỉ chứa các trường TypeMeta
được sử dụng để xác định tài nguyên đã thay đổi (trong trường hợp này là Triển khai ứng dụng của bạn) và chỉ đủ các trường còn lại để bước vào cấu trúc lồng nhau để chỉ định giá trị trường mới, ví dụ: yêu cầu tài nguyên containers và Hạn mức.
Lưu và đóng file .
Bây giờ, hãy tạo một configmap.yml
mới cho lớp phủ production của bạn:
nano /overlays/production/configmap.yml
Thêm nội dung sau:
--- apiVersion: v1 kind: ConfigMap metadata: name: sammy-app namespace: default data: body: > <html> <style> body { background-color: #222; } p { font-family:"Courier New"; font-size:xx-large; color:#22f; text-align:center; } </style> <body> <p>PRODUCTION</p> </body> </html>
Ở đây bạn đã thay đổi văn bản để hiển thị PRODUCTION
thay vì DEVELOPMENT
. Lưu ý bạn cũng đã thay đổi màu văn bản từ màu đỏ #f22
thành màu xanh lam #22f
. Hãy cân nhắc xem có thể khó khăn như thế nào để xác định vị trí và theo dõi những thay đổi nhỏ như vậy nếu bạn không sử dụng công cụ quản lý cấu hình như Kustomize.
Cấu trúc folder của bạn bây giờ trông giống như sau:
sammy-app/ ├── base │ ├── configmap.yml │ ├── deployment.yml │ ├── kustomization.yml │ └── service.yml └── overlays └── production ├── configmap.yml ├── deployment.yml └── kustomization.yml
Bạn đã sẵn sàng triển khai bằng cách sử dụng cấu hình cơ sở của bạn . Trước tiên, hãy xóa các tài nguyên hiện có:
- kubectl delete deployment/sammy-app service/sammy-app configmap/sammy-app
Triển khai cấu hình cơ sở của bạn tới Kubernetes:
- kubectl apply -k base/
Kiểm tra việc triển khai của bạn:
- kubectl get pods,services -l app=sammy-app
Bạn sẽ thấy cấu hình cơ sở dự kiến, với version phát triển hiển thị trên EXTERNAL-IP
của Dịch vụ:
OutputNAME READY STATUS RESTARTS AGE pod/sammy-app-5668b6dc75-rwbtq 1/1 Running 0 21s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/sammy-app LoadBalancer 10.245.110.172 your_external_ip 80:31764/TCP 7m43s
Bây giờ hãy triển khai cấu hình production của bạn:
- kubectl apply -k overlays/production/
Kiểm tra lại việc triển khai của bạn:
- kubectl get pods,services -l app=sammy-app
Bạn sẽ thấy cấu hình production
dự kiến, với version production hiển thị trên EXTERNAL-IP
của Dịch vụ:
OutputNAME READY STATUS RESTARTS AGE pod/sammy-app-86759677b4-h5ndw 1/1 Running 0 15s pod/sammy-app-86759677b4-t2dml 1/1 Running 0 17s pod/sammy-app-86759677b4-z56f8 1/1 Running 0 13s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/sammy-app LoadBalancer 10.245.110.172 your_external_ip 80:31764/TCP 8m59s
Lưu ý trong cấu hình production có tổng cộng 3 Group thay vì 1. Bạn có thể xem tài nguyên Triển khai để xác nhận những thay đổi ít rõ ràng hơn cũng đã có hiệu lực:
- kubectl get deployments -l app=sammy-app -o yaml
Truy cập your_external_ip
trong trình duyệt để xem version production của trang web .
Bạn hiện đang sử dụng Kustomize để quản lý phương sai ứng dụng. Nghĩ lại đến một trong những vấn đề ban đầu của bạn, nếu bây giờ bạn muốn thay đổi version hình ảnh Nginx, bạn sẽ chỉ cần phải sửa đổi deployment.yml
tại các cơ sở, và lớp của bạn mà sử dụng mà cơ sở cũng sẽ nhận được rằng sự thay đổi qua Kustomize. Điều này giúp đơn giản hóa đáng kể quy trình phát triển của bạn, cải thiện khả năng đọc và giảm khả năng xảy ra lỗi.
Kết luận
Trong hướng dẫn này, bạn đã xây dựng một ứng dụng web nhỏ và triển khai nó cho Kubernetes. Sau đó, bạn đã sử dụng Kustomize để đơn giản hóa việc quản lý cấu hình ứng dụng của bạn cho các môi trường khác nhau. Bạn đã tổ chức lại một tập hợp các file YAML gần như trùng lặp thành một mô hình nhiều lớp. Điều này sẽ giảm lỗi, giảm cấu hình thủ công và giữ cho công việc của bạn dễ nhận biết và dễ bảo trì hơn.
Tuy nhiên, điều này chỉ làm xước bề mặt của những gì Kustomize cung cấp. Có hàng tá ví dụ chính thức và nhiều tài liệu kỹ thuật chuyên sâu để khám phá nếu bạn muốn tìm hiểu thêm.
Các tin liên quan