Thứ sáu, 21/08/2020 | 00:00 GMT+7

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

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 :

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:

~ / sammy-app / configmap.yml
--- 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:

~ / sammy-app / deploy.yml
--- 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 :

Output
NAME 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:

~ / sammy-app / service.yml
--- 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 :

Output
NAME 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 .

ứng dụng sammy đang được phát triể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:

~ / sammy-app / kustomization.yml
--- 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.ymldeployment-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ên 3 .
  • requests tài nguyên containers sẽ tăng từ 100m CPU và bộ nhớ 128M lên 250m CPU và bộ nhớ 256M .
  • limits tài nguyên containers sẽ tăng từ CPU 100m và bộ nhớ 256M lên 1 CPU và bộ nhớ 1G .
  • biến môi trường LOG_LEVEL sẽ thay đổi từ DEBUG thành INFO .
  • 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:

~ / sammy-app / overlays / production / kustomization.yml
--- 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.ymlconfigmap.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:

~ / sammy-app / overlays / production / deploy.yml
--- 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:

~ / sammy-app / overlays / production / configmap.yml
--- 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ụ:

Output
NAME 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ụ:

Output
NAME 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 .

ứng dụng sammy đang được production

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.


Tags:

Các tin liên quan