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: AkubectlCheat 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:
-  replicassẽ tăng từ1lên3.
-  requeststài nguyên containers sẽ tăng từ100mCPU và bộ nhớ128Mlên250mCPU và bộ nhớ256M.
-  limitstài nguyên containers sẽ tăng từ CPU100mvà bộ nhớ256Mlên1CPU và bộ nhớ1G.
-  biến môi trường LOG_LEVELsẽ thay đổi từDEBUGthà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
 

