Chuỗi hội thảo trên web: Quản lý gói Kubernetes với Helm và CI / CD với Jenkins X
Chuỗi hội thảo trên web
Bài viết này bổ sung một loạt hội thảo trên web về làm CI / CD với Kubernetes . Loạt bài thảo luận về cách thực hiện phương pháp tiếp cận root cloud để xây dựng, thử nghiệm và triển khai ứng dụng, bao gồm quản lý phát hành, công cụ root cloud , lưới dịch vụ và các công cụ CI / CD được dùng với Kubernetes. Nó được thiết kế để giúp các nhà phát triển và doanh nghiệp quan tâm đến việc tích hợp các phương pháp hay nhất về CI / CD với Kubernetes vào quy trình làm việc của họ.
Hướng dẫn này bao gồm các khái niệm và lệnh từ phiên thứ hai của loạt bài, Quản lý gói Kubernetes với Helm và CI / CD với Jenkins X.
 Cảnh báo: Các quy trình trong hướng dẫn này chỉ nhằm  mục đích demo . Do đó, họ không tuân theo các phương pháp tốt nhất và các biện pháp bảo mật cần thiết cho việc triển khai sẵn sàng production .
 
Để giảm lỗi và tổ chức sự phức tạp khi triển khai ứng dụng, hệ thống CI / CD phải bao gồm công cụ mạnh mẽ để quản lý / triển khai gói và đường ống với kiểm tra tự động. Nhưng trong các môi trường production hiện đại, sự phức tạp ngày càng tăng của cơ sở hạ tầng dựa trên cloud có thể gây ra các vấn đề trong việc kết hợp một môi trường CI / CD tin cậy . Hai công cụ dành riêng cho Kubernetes được phát triển để giải quyết vấn đề này là trình quản lý gói Helm và công cụ tự động hóa đường ống Jenkins X.
Helm là trình quản lý gói được thiết kế đặc biệt cho Kubernetes, được duy trì bởi Cloud Native Computing Foundation (CNCF) phối hợp với Microsoft, Google, Bitnami và cộng đồng người đóng góp Helm. Ở cấp độ cao, nó hoàn thành các mục tiêu giống như các trình quản lý gói hệ thống Linux như APT hoặc YUM: quản lý việc cài đặt các ứng dụng và phụ thuộc đằng sau mức thấp và che giấu sự phức tạp khỏi user . Nhưng với Kubernetes, nhu cầu về kiểu quản lý này thậm chí còn rõ ràng hơn: Việc cài đặt ứng dụng đòi hỏi sự phức tạp và tẻ nhạt của các file YAML và việc nâng cấp hoặc quay lại các bản phát hành có thể từ khó đến không thể. Để giải quyết vấn đề này, Helm chạy trên Kubernetes và đóng gói các ứng dụng thành các tài nguyên được cấu hình sẵn gọi là biểu đồ , user có thể quản lý bằng các lệnh đơn giản, giúp quá trình chia sẻ và quản lý ứng dụng thân thiện hơn.
Jenkins X là một công cụ CI / CD được sử dụng để tự động hóa đường ống production và môi trường cho Kubernetes. Sử dụng Docker image , biểu đồ Helm và công cụ đường ống Jenkins, Jenkins X có thể tự động quản lý các bản phát hành và version cũng như quảng bá ứng dụng giữa các môi trường trên GitHub.
Trong bài viết thứ hai của loạt bàiCI / CD với Kubernetes , bạn sẽ xem trước hai công cụ này bằng cách:
Quản lý, tạo và triển khai các gói Kubernetes với Helm.
Xây dựng đường ống CI / CD với Jenkins X.
Mặc dù nhiều nền tảng Kubernetes có thể sử dụng Helm và Jenkins X, trong hướng dẫn này, bạn sẽ chạy một cụm Kubernetes mô phỏng, được cài đặt trong môi trường local của bạn. Để làm điều này, bạn sẽ sử dụng Minikube , một chương trình cho phép bạn dùng thử các công cụ Kubernetes trên máy của riêng mình mà không cần phải cài đặt một cụm Kubernetes thực sự.
Đến cuối hướng dẫn này, bạn sẽ có hiểu biết cơ bản về cách các công cụ root Kubernetes này có thể giúp bạn triển khai hệ thống CI / CD cho ứng dụng cloud của bạn .
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
Server Ubuntu 16.04 có RAM 16 GB trở lên. Vì hướng dẫn này chỉ dành cho mục đích demo , các lệnh được chạy từ account root . Lưu ý các quyền không bị hạn chế của account này không tuân theo các phương pháp hay nhất dành cho production và có thể ảnh hưởng đến hệ thống của bạn. Vì lý do này, bạn nên làm theo các bước sau trong môi trường thử nghiệm như máy ảo hoặc DigitalOcean Server .
Tài khoản GitHub và mã thông báo API GitHub . Hãy nhớ ghi lại mã thông báo API này để bạn có thể nhập mã này trong phần Jenkins X của hướng dẫn này.
Quen thuộc với các khái niệm Kubernetes. Vui lòng tham khảo bài viết Giới thiệu về Kubernetes để biết thêm chi tiết.
Bước 1 - Tạo Cụm Kubernetes local với Minikube
Trước khi cài đặt Minikube, bạn sẽ phải cài đặt các phụ thuộc của nó, bao gồm công cụ dòng lệnh Kubernetes kubectl , socat chuyển tiếp dữ liệu hai chiều và chương trình containers Docker .
 Trước tiên, hãy  đảm bảo  trình quản lý gói  của hệ thống  có thể truy cập các gói qua HTTPS với apt-transport-https :
- apt-get update 
 - apt-get install apt-transport-https 
 
Tiếp theo, đảm bảo download kubectl hợp lệ, hãy thêm khóa GPG cho repository chính thức của Google vào hệ thống của bạn:
- curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - 
 
Khi bạn đã thêm khóa GPG, hãy tạo file  /etc/apt/sources.list.d/kubernetes.list bằng cách mở nó trong editor  của bạn:
- nano /etc/apt/sources.list.d/kubernetes.list 
 
Khi file này được mở, hãy thêm dòng sau:
deb http://apt.kubernetes.io/ kubernetes-xenial main Điều này sẽ hiển thị cho hệ thống của bạn nguồn để  download  kubectl. Khi bạn đã thêm dòng, hãy lưu và thoát khỏi file . Với editor  nano, bạn có thể thực hiện việc này bằng cách nhấn CTRL+X , nhập y và nhấn ENTER .
 Cuối cùng, cập nhật danh sách nguồn cho APT và cài đặt kubectl , socat và docker.io :
- apt-get update 
 - apt-get install -y kubectl socat docker.io 
 
Lưu ý: Để Minikube mô phỏng một cụm Kubernetes, bạn phải  download  gói docker.io thay vì bản phát hành docker.io docker-ce mới hơn. Đối với các môi trường sẵn sàng production , docker-ce sẽ là lựa chọn thích hợp hơn, vì nó được duy trì tốt hơn trong repository  lưu trữ Docker chính thức.
  Đến đây bạn  đã cài đặt kubectl, bạn có thể tiến hành cài đặt Minikube . Đầu tiên, sử dụng curl để  download  file  binary  của chương trình:
- curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.28.0/minikube-linux-amd64 
 
Tiếp theo, thay đổi quyền truy cập của file bạn vừa download để hệ thống của bạn có thể thực thi nó:
- chmod +x minikube 
 
Cuối cùng, sao chép file  minikube vào đường dẫn thực thi tại /usr/local/bin/ và xóa file  root  khỏi folder  chính của bạn:
- cp minikube /usr/local/bin/ 
 - rm minikube 
 
Với Minikube được cài đặt trên máy của bạn, bây giờ bạn có thể khởi động chương trình. Để tạo một cụm Minikube Kubernetes, hãy sử dụng lệnh sau:
- minikube start --vm-driver none 
 
Cờ --vm-driver none hướng dẫn Minikube chạy Kubernetes trên  server  local  bằng cách sử dụng các containers  thay vì máy ảo. Chạy Minikube theo cách này  nghĩa là  bạn không cần  download  trình điều khiển máy ảo, nhưng cũng  nghĩa là   server  Kubernetes API sẽ chạy không an toàn dưới dạng root.
 Cảnh báo: Vì  server  API có  quyền  root sẽ có quyền truy cập không giới hạn vào  server  local , bạn không nên chạy Minikube bằng cách sử dụng trình điều khiển none trên các máy trạm cá nhân.
Đến đây bạn đã khởi động Minikube, hãy kiểm tra đảm bảo rằng cụm của bạn đang chạy bằng lệnh sau:
- minikube status 
 
Bạn sẽ nhận được kết quả sau, với địa chỉ IP của bạn thay cho your_IP_address :
minikube: Running cluster: Running kubectl: Correctly Configured: pointing to minikube-vm at your_IP_address Đến đây bạn đã cài đặt cụm Kubernetes mô phỏng của bạn bằng Minikube, bạn có thể có được kinh nghiệm với quản lý gói Kubernetes bằng cách cài đặt và cấu hình trình quản lý gói Helm trên đầu cụm của bạn.
Bước 2 - Cài đặt Trình quản lý gói Helm trên Cụm của bạn
 Để điều phối việc cài đặt các ứng dụng trên cụm Kubernetes của bạn, bây giờ bạn sẽ cài đặt trình quản lý gói Helm. Helm bao gồm một helm khách hàng mà chạy ngoài cụm và tiller  server  quản lý version  ứng dụng từ bên trong cluster. Bạn sẽ phải cài đặt và  cấu hình  cả hai để chạy Helm thành công trên cụm  của bạn .
 Để cài đặt các file  binary  Helm , trước tiên hãy sử dụng curl để  download   lệnh cài đặt  sau từ repository  Helm GitHub chính thức vào một file  mới có tên get_helm.sh :
- curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh 
 
Vì tập lệnh này yêu cầu quyền truy cập root, hãy thay đổi quyền của get_helm.sh để chủ sở hữu của file  (trong trường hợp này là root) có thể đọc, ghi và thực thi nó:
- chmod 700 get_helm.sh 
 
Bây giờ, hãy thực thi tập lệnh:
- ./get_helm.sh 
 
Khi tập lệnh kết thúc, bạn sẽ cài đặt helm vào /usr/local/bin/helm và cài đặt tiller vào /usr/local/bin/tiller .
 Mặc dù tiller hiện đang được cài đặt, nó chưa có  role  chính xác và cho phép truy cập vào các nguồn lực cần thiết trong cluster Kubernetes của bạn. Để gán các  role  và quyền này cho tiller , bạn sẽ phải tạo một tài khoản dịch vụ có tên tiller . Trong Kubernetes, account  dịch vụ đại diện cho danh tính cho các quy trình chạy trong một  group . Sau khi quy trình được xác thực thông qua account  dịch vụ, quy trình đó có thể liên hệ với  server  API và truy cập tài nguyên cụm. Nếu một  group  không được chỉ định một account  dịch vụ cụ thể, nó sẽ nhận account  dịch vụ mặc định. Bạn cũng sẽ phải tạo một điều khiển truy cập dựa trên  role  cai trị (RBAC) mà cho phép các tiller account  dịch vụ.
 Trong Kubernetes RBAC API, một  role  chứa các  luật  xác định một tập hợp các quyền. Một  role  có thể được xác định với phạm vi namespace hoặc cluster và chỉ có thể cấp quyền truy cập vào tài nguyên trong một không gian tên duy nhất. ClusterRole có thể tạo các quyền giống nhau ở cấp độ của một cụm, cấp quyền truy cập vào các tài nguyên trong phạm vi cụm như  các node  và các tài nguyên có không gian tên như  group . Để chỉ định đúng  role  của account  dịch vụ tiller đất, hãy tạo một file  YAML có tên rbac_helm.yaml và mở nó trong editor  của bạn:
- nano rbac_helm.yaml 
 
Thêm các dòng sau vào file  để  cấu hình  account  dịch vụ tiller :
apiVersion: v1 kind: ServiceAccount metadata:   name: tiller   namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata:   name: tiller roleRef:   apiGroup: rbac.authorization.k8s.io   kind: ClusterRole   name: cluster-admin subjects:   - kind: ServiceAccount     name: tiller     namespace: kube-system    - kind: User     name: "admin"     apiGroup: rbac.authorization.k8s.io    - kind: User     name: "kubelet"     apiGroup: rbac.authorization.k8s.io    - kind: Group     name: system:serviceaccounts     apiGroup: rbac.authorization.k8s.io Trong  file  trước, ServiceAccount cho phép người tiller quá trình để truy cập apiserver như một account  dịch vụ chứng thực. ClusterRole trao quyền nhất định để một  role , và ClusterRoleBinding chuyển nhượng mà vai một danh sách các subjects , bao gồm tiller account  dịch vụ, admin và kubelet  user , và các system:serviceaccounts  group .
 Tiếp theo, triển khai cấu hình trong rbac_helm.yaml bằng lệnh sau:
- kubectl apply -f rbac_helm.yaml  
 
Với tiller cấu hình triển khai, bây giờ bạn có thể khởi tạo Helm với --service-acount cờ để sử dụng account  dịch vụ bạn chỉ cần  cài đặt :
- helm init --service-account tiller  
 
Bạn sẽ nhận được kết quả sau, đại diện cho quá trình khởi tạo thành công:
OutputCreating /root/.helm Creating /root/.helm/repository Creating /root/.helm/repository/cache Creating /root/.helm/repository/local Creating /root/.helm/plugins Creating /root/.helm/starters Creating /root/.helm/cache/archive Creating /root/.helm/repository/repositories.yaml Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com Adding local repo with URL: http://127.0.0.1:8879/charts $HELM_HOME has been configured at /root/.helm.  Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.  Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy. To prevent this, run `helm init` with the --tiller-tls-verify flag. For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation Happy Helming! Điều này tạo ra một tiller pod trong kube-system không gian tên. Nó cũng tạo repository mặc định  .helm trong folder  $HOME của bạn và  cấu hình  repository  biểu đồ ổn định Helm mặc định tại https://kubernetes-charts.storage.googleapis.com và repository  Helm local  tại http://127.0.0.1:8879/charts .
 Để chắc chắn rằng tiller pod đang chạy trong kube-system namespace, nhập lệnh sau:
- kubectl --namespace kube-system get pods 
 
Trong danh sách  group  của bạn, tiller-deploy sẽ xuất hiện,  như trong  kết quả sau:
OutputNAME                                    READY   STATUS    RESTARTS   AGE etcd-minikube                           1/1     Running   0          2h kube-addon-manager-minikube             1/1     Running   0          2h kube-apiserver-minikube                 1/1     Running   0          2h kube-controller-manager-minikube        1/1     Running   0          2h kube-dns-86f4d74b45-rjql8               3/3     Running   0          2h kube-proxy-dv268                        1/1     Running   0          2h kube-scheduler-minikube                 1/1     Running   0          2h kubernetes-dashboard-5498ccf677-wktkl   1/1     Running   0          2h storage-provisioner                     1/1     Running   0          2h tiller-deploy-689d79895f-bggbk          1/1     Running   0          5m Nếu trạng thái của hộp tiller là Running , giờ đây nó có thể quản lý các ứng dụng Kubernetes từ bên trong cụm của bạn thay mặt cho Helm.
Để đảm bảo toàn bộ ứng dụng Helm đang hoạt động, hãy tìm kiếm repository Helm cho một ứng dụng như MongoDB:
- helm search mongodb 
 
Trong kết quả , bạn sẽ thấy danh sách các ứng dụng có thể có phù hợp với cụm từ tìm kiếm của bạn:
OutputNAME                                    CHART VERSION   APP VERSION     DESCRIPTION stable/mongodb                          5.4.0           4.0.6           NoSQL document-oriented database that stores JSON-like do... stable/mongodb-replicaset               3.9.0           3.6             NoSQL document-oriented database that stores JSON-like do... stable/prometheus-mongodb-exporter      1.0.0           v0.6.1          A Prometheus exporter for MongoDB metrics stable/unifi                            0.3.1           5.9.29          Ubiquiti Network's Unifi Controller Đến đây bạn đã cài đặt Helm trên cụm Kubernetes của bạn , bạn có thể tìm hiểu thêm về trình quản lý gói bằng cách tạo biểu đồ Helm mẫu và triển khai ứng dụng từ nó.
Bước 3 - Tạo biểu đồ và triển khai ứng dụng với Helm
 Trong trình quản lý gói Helm, các gói riêng lẻ được gọi là biểu đồ . Trong biểu đồ, một tập hợp các file  xác định một ứng dụng, có thể khác nhau về độ phức tạp từ một  group  đến một ứng dụng có cấu trúc, đầy đủ. Bạn có thể  download  biểu đồ từ repository  Helm hoặc bạn có thể sử dụng lệnh helm create Helm để tạo biểu đồ  của bạn .
 Để kiểm tra các khả năng của Helm, hãy tạo một biểu đồ Helm mới có tên demo bằng lệnh sau:
- helm create demo 
 
Trong folder  chính của bạn, bạn sẽ tìm thấy một folder  mới được gọi là demo , trong đó bạn có thể tạo và chỉnh sửa các mẫu biểu đồ của riêng mình.
 Di chuyển vào folder  demo và sử dụng ls để liệt kê nội dung của nó:
- cd demo 
 - ls 
 
Bạn sẽ tìm thấy các file  và folder  sau trong demo :
charts  Chart.yaml  templates  values.yaml Sử dụng editor  của bạn, mở file  Chart.yaml :
- nano Chart.yaml 
 
Bên trong, bạn sẽ tìm thấy các nội dung sau:
apiVersion: v1 appVersion: "1.0" description: A Helm chart for Kubernetes name: demo version: 0.1.0 Trong file  Chart.yaml này, bạn sẽ tìm thấy các trường như apiVersion , phải luôn là v1 , description cung cấp thông tin bổ sung về demo là gì, name của biểu đồ và số version mà Helm sử dụng làm điểm đánh dấu phát hành. Khi bạn kiểm tra xong file , hãy đóng editor  của bạn.
 Tiếp theo, mở file  giá values.yaml :
- nano values.yaml 
 
Trong file này, bạn sẽ tìm thấy các nội dung sau:
# Default values for demo. # This is a YAML-formatted file. # Declare variables to be passed into your templates.  replicaCount: 1  image:   repository: nginx   tag: stable   pullPolicy: IfNotPresent  nameOverride: "" fullnameOverride: ""  service:   type: ClusterIP   port: 80  ingress:   enabled: false   annotations: {}     # kubernetes.io/ingress.class: nginx     # kubernetes.io/tls-acme: "true"   paths: []   hosts:     - chart-example.local   tls: []   #  - secretName: chart-example-tls   #    hosts:   #      - chart-example.local  resources: {}   # We usually recommend not to specify default resources and to leave this as a conscious   # choice for the user. This also increases chances charts run on environments with little   # resources, such as Minikube. If you do want to specify resources, uncomment the following   # lines, adjust them as necessary, and remove the curly braces after 'resources:'.   # limits:   #  cpu: 100m   #  memory: 128Mi   # requests:   #  cpu: 100m   #  memory: 128Mi  nodeSelector: {}  tolerations: []  affinity: {} Bằng cách thay đổi nội dung của giá values.yaml , các nhà phát triển biểu đồ có thể cung cấp các giá trị mặc định cho ứng dụng được xác định trong biểu đồ, kiểm soát số lượng bản sao, cơ sở hình ảnh, truy cập xâm nhập, quản lý bí mật, values.yaml  User  biểu đồ có thể cung cấp giá trị của riêng họ cho các thông số này bằng file  YAML tùy chỉnh bằng cách sử dụng helm install . Khi  user  cung cấp các giá trị tùy chỉnh, các giá trị này sẽ overrides  các giá trị trong file  giá values.yaml của biểu đồ.
 Đóng file  giá values.yaml và liệt kê nội dung của folder  templates bằng lệnh sau:
- ls templates 
 
Tại đây, bạn sẽ tìm thấy các mẫu cho các file khác nhau có thể kiểm soát các khía cạnh khác nhau của biểu đồ của bạn:
deployment.yaml  _helpers.tpl  ingress.yaml  NOTES.txt  service.yaml  tests  Đến đây bạn  đã khám phá biểu đồ demo , bạn có thể thử nghiệm cài đặt biểu đồ Helm bằng cách cài đặt demo . Quay lại folder  chính của bạn bằng lệnh sau:
- cd 
 
Cài đặt biểu đồ Helm demo dưới tên web với helm install :
- helm install --name web ./demo 
 
Bạn sẽ nhận được kết quả sau:
OutputNAME:   web LAST DEPLOYED: Wed Feb 20 20:59:48 2019 NAMESPACE: default STATUS: DEPLOYED  RESOURCES: ==> v1/Service NAME      TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)  AGE web-demo  ClusterIP  10.100.76.231  <none>       80/TCP   0s  ==> v1/Deployment NAME      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE web-demo  1        0        0           0          0s  ==> v1/Pod(related) NAME                       READY  STATUS             RESTARTS  AGE web-demo-5758d98fdd-x4mjs  0/1    ContainerCreating  0         0s   NOTES: 1. Get the application URL by running these commands:   export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=demo,app.kubernetes.io/instance=web" -o jsonpath="{.items[0].metadata.name}")   echo "Visit http://127.0.0.1:8080 to use your application"   kubectl port-forward $POD_NAME 8080:80 Trong  kết quả  này, bạn sẽ tìm thấy STATUS của ứng dụng, cùng với danh sách các tài nguyên có liên quan trong cụm của bạn.
 Tiếp theo, liệt kê các triển khai được tạo bởi biểu đồ Helm demo bằng lệnh sau:
- kubectl get deploy 
 
Điều này sẽ mang lại kết quả kết quả sẽ liệt kê các triển khai đang hoạt động của bạn:
OutputNAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE web-demo   1         1         1            1           4m Liệt kê các  group  của bạn bằng lệnh kubectl get pods sẽ hiển thị các  group  đang chạy ứng dụng web của bạn, trông giống như sau:
OutputNAME                        READY   STATUS    RESTARTS   AGE web-demo-5758d98fdd-nbkqd   1/1     Running   0          4m Để chứng minh cách những thay đổi trong biểu đồ Helm có thể phát hành các version  khác nhau của ứng dụng của bạn, hãy mở demo/values.yaml trong editor  của bạn và thay đổi replicaCount: thành 3 và image:tag: từ stable thành latest . Trong khối mã sau, bạn sẽ tìm thấy file  YAML trông như thế nào sau khi bạn sửa đổi xong nó, với các thay đổi được đánh dấu:
# Default values for demo. # This is a YAML-formatted file. # Declare variables to be passed into your templates.  replicaCount: 3  image:   repository: nginx   tag: latest   pullPolicy: IfNotPresent  nameOverride: "" fullnameOverride: ""  service:   type: ClusterIP   port: 80 . . . Lưu và thoát khỏi file .
 Trước khi bạn triển khai version  mới này của ứng dụng web , hãy liệt kê các bản phát hành Helm của bạn như hiện tại bằng lệnh sau:
- helm list 
 
Bạn sẽ nhận được kết quả sau, với một triển khai bạn đã tạo trước đó:
OutputNAME    REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE web     1               Wed Feb 20 20:59:48 2019        DEPLOYED        demo-0.1.0      1.0             default  Lưu ý  REVISION được liệt kê là 1 , cho thấy rằng đây là bản sửa đổi đầu tiên của ứng dụng web .
 Để triển khai ứng dụng web với các thay đổi mới nhất được thực hiện đối với demo/values.yaml , hãy nâng cấp ứng dụng bằng lệnh sau:
- helm upgrade web ./demo 
 
Bây giờ, hãy liệt kê lại các bản phát hành Helm:
- helm list 
 
Bạn sẽ nhận được kết quả sau:
OutputNAME    REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE web     2               Wed Feb 20 21:18:12 2019        DEPLOYED        demo-0.1.0      1.0             default  Lưu ý  REVISION đã thay đổi thành 2 , cho thấy rằng đây là bản sửa đổi thứ hai.
 Để tìm lịch sử của các bản phát hành Helm cho web , hãy sử dụng các bước sau:
- helm history web 
 
Điều này sẽ hiển thị cả hai bản sửa đổi của ứng dụng web :
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION 1               Wed Feb 20 20:59:48 2019        SUPERSEDED      demo-0.1.0      Install complete 2               Wed Feb 20 21:18:12 2019        DEPLOYED        demo-0.1.0      Upgrade complete Để khôi phục ứng dụng của bạn về bản sửa đổi 1 , hãy nhập lệnh sau:
- helm rollback web 1 
 
Điều này sẽ mang lại kết quả sau:
OutputRollback was a success! Happy Helming! Bây giờ, hiển thị lịch sử phát hành Helm:
- helm history web 
 
Bạn sẽ nhận được danh sách sau:
OutputREVISION        UPDATED                         STATUS          CHART           DESCRIPTION 1               Wed Feb 20 20:59:48 2019        SUPERSEDED      demo-0.1.0      Install complete 2               Wed Feb 20 21:18:12 2019        SUPERSEDED      demo-0.1.0      Upgrade complete 3               Wed Feb 20 21:28:48 2019        DEPLOYED        demo-0.1.0      Rollback to 1 Bằng cách quay lại ứng dụng web , bạn đã tạo bản sửa đổi thứ ba có cài đặt tương tự như bản sửa đổi 1 .  Lưu ý , bạn luôn có thể biết bản sửa đổi nào đang hoạt động bằng cách tìm mục DEPLOYED trong STATUS .
 Để chuẩn bị cho phần tiếp theo, hãy dọn dẹp khu vực thử nghiệm của bạn bằng cách xóa bản phát hành web của bạn bằng lệnh helm delete :
- helm delete web 
 
Kiểm tra lại lịch sử phát hành Helm:
- helm history web 
 
Bạn sẽ nhận được kết quả sau:
OutputREVISION        UPDATED                         STATUS          CHART           DESCRIPTION 1               Wed Feb 20 20:59:48 2019        SUPERSEDED      demo-0.1.0      Install complete 2               Wed Feb 20 21:18:12 2019        SUPERSEDED      demo-0.1.0      Upgrade complete 3               Wed Feb 20 21:28:48 2019        DELETED         demo-0.1.0      Deletion complete STATUS cho REVISION 3 đã thay đổi thành DELETED , cho biết rằng version  web được triển khai của bạn đã bị xóa. Tuy nhiên, mặc dù điều này không xóa bản phát hành, nhưng nó không xóa nó khỏi cửa hàng. Để xóa hoàn toàn bản phát hành, hãy chạy lệnh helm delete với cờ --purge .
- helm delete web --purge 
 
Trong bước này, bạn đã quản lý các bản phát hành ứng dụng trên Kubernetes bằng Helm. Nếu bạn muốn nghiên cứu thêm về Helm, hãy xem phần Giới thiệu về Helm, hướng dẫn Trình quản lý gói cho Kubernetes hoặc xem lại tài liệu Helm chính thức.
 Tiếp theo, bạn sẽ  cài đặt  và kiểm tra công cụ tự động hóa đường ống Jenkins X bằng cách sử dụng jx CLI để tạo một cụm Kubernetes sẵn sàng cho CI / CD.
Bước 4 - Cài đặt Môi trường Jenkins X
 Với Jenkins X, bạn có thể tạo cụm Kubernetes  của bạn  từ đầu với các giải pháp tự động hóa đường ống và CI / CD được tích hợp sẵn. Bằng cách cài đặt công cụ jx CLI,  bạn có thể  quản lý hiệu quả các bản phát hành ứng dụng,  Docker image  và biểu đồ Helm, trong ngoài việc tự động quảng cáo các ứng dụng của bạn trên các môi trường trong GitHub.
 Vì bạn sẽ sử dụng jx để tạo cụm  của bạn , trước tiên bạn phải xóa cụm Minikube mà bạn đã có. Để thực hiện việc này, hãy sử dụng lệnh sau:
- minikube delete 
 
Thao tác này sẽ xóa cụm Kubernete mô phỏng local , nhưng sẽ không xóa các folder mặc định được tạo khi bạn cài đặt Minikube lần đầu. Để làm sạch chúng khỏi máy của bạn, hãy sử dụng các lệnh sau:
- rm -rf ~/.kube 
 - rm -rf ~/.minikube 
 - rm -rf /etc/kubernetes/* 
 - rm -rf /var/lib/minikube/* 
 
Khi bạn đã xóa hoàn toàn Minikube khỏi máy của bạn , bạn có thể chuyển sang cài đặt file binary Jenkins X.
 Trước tiên, hãy  download  file  jx nén từ kho lưu trữ Jenkins X GitHub chính thức bằng lệnh curl và  extract  nó bằng lệnh tar :
- curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.781/jx-linux-amd64.tar.gz | tar xzv  
 
Tiếp theo, di chuyển file  jx  download  đến đường dẫn thực thi tại /usr/local/bin :
- mv jx /usr/local/bin 
 
Jenkins X đi kèm với Docker Registry chạy bên trong cụm Kubernetes của bạn. Vì đây là một yếu tố nội bộ, các biện pháp bảo mật như certificate  tự ký có thể gây ra rắc rối cho chương trình. Để khắc phục điều này, hãy đặt Docker sử dụng các đăng ký không an toàn cho dải IP local . Để thực hiện việc này, hãy tạo file  /etc/docker/daemon.json và mở nó trong editor  của bạn:
- nano /etc/docker/daemon.json 
 
Thêm các nội dung sau vào file :
{   "insecure-registries" : ["0.0.0.0/0"] } Lưu và thoát khỏi file . Để những thay đổi này có hiệu lực, hãy khởi động lại dịch vụ Docker bằng lệnh sau:
- systemctl restart docker  
 
Để xác minh bạn đã cấu hình Docker với các đăng ký không an toàn, hãy sử dụng lệnh sau:
- docker info 
 
Ở cuối kết quả , bạn sẽ thấy dòng được đánh dấu sau:
OutputContainers: 0  Running: 0  Paused: 0  Stopped: 0 Images: 15 Server Version: 18.06.1-ce Storage Driver: overlay2  Backing Filesystem: extfs  Supports d_type: true  Native Overlay Diff: true  . . .  Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries:  0.0.0.0/0  127.0.0.0/8 Live Restore Enabled: false  Đến đây bạn  đã  download  Jenkins X và  cấu hình   register  Docker, hãy sử dụng công cụ jx CLI để tạo một cụm Minikube Kubernetes với khả năng CI / CD:
- jx create cluster minikube --cpu=5 --default-admin-password=admin --vm-driver=none --memory=13314 
 
Ở đây bạn đang tạo một cụm Kubernetes bằng Minikube, với cờ --cpu=5 để đặt 5 CPU và --memory=13314 để cung cấp cho cụm của bạn 13314 MB bộ nhớ. Vì Jenkins X là một chương trình mạnh mẽ nhưng lớn, các thông số kỹ thuật này sẽ  đảm bảo  Jenkins X hoạt động mà không gặp sự cố trong phần trình diễn này. Ngoài ra, bạn đang sử dụng --default-admin-password=admin để đặt password  Jenkins X làm admin và --vm-driver=none để  cài đặt  local  cụm, như bạn đã làm trong Bước 1.
Khi Jenkins X quay cụm của bạn, bạn sẽ nhận được nhiều dấu nhắc khác nhau vào các thời điểm khác nhau trong suốt quá trình đặt các thông số cho cụm của bạn và xác định cách nó sẽ giao tiếp với GitHub để quản lý môi trường production của bạn.
Đầu tiên, bạn sẽ nhận được dấu nhắc sau:
Output? disk-size (MB) 150GB Nhấn ENTER để tiếp tục. Tiếp theo, bạn sẽ  được yêu cầu  nhập tên bạn muốn sử dụng với git, địa chỉ email bạn muốn sử dụng với git và tên  user  GitHub của bạn. Nhập từng cái này khi  được yêu cầu , sau đó nhấn ENTER .
Tiếp theo, Jenkins X sẽ nhắc bạn nhập mã thông báo API GitHub của bạn:
OutputTo be able to create a repository on GitHub we need an API Token Please click this URL https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo  Then COPY the token and enter in into the form below:  ? API Token: Nhập mã thông báo của bạn tại đây hoặc tạo mã thông báo mới với các quyền thích hợp bằng cách sử dụng URL được đánh dấu trong khối mã trước đó.
Tiếp theo, Jenkins X sẽ hỏi:
Output? Do you wish to use GitHub as the pipelines Git server: (Y/n)  ? Do you wish to use your_GitHub_username as the pipelines Git user for GitHub server: (Y/n) Nhập Y cho cả hai câu hỏi.
Sau đó, Jenkins X sẽ nhắc bạn trả lời như sau:
Output? Select Jenkins installation type:   [Use arrows to move, type to filter] >Static Master Jenkins   Serverless Jenkins  ? Pick workload build pack:   [Use arrows to move, type to filter] > Kubernetes Workloads: Automated CI+CD with GitOps Promotion   Library Workloads: CI+Release but no CD Đối với phần trước, hãy chọn Static Master Jenkins và chọn Kubernetes Workloads: Automated CI+CD with GitOps Promotion cho phần sau. Khi  được yêu cầu  chọn tổ chức cho repository  môi trường của bạn, hãy chọn tên  user  GitHub của bạn.
Cuối cùng, bạn sẽ nhận được kết quả sau, xác minh cài đặt thành công và cung cấp password quản trị Jenkins X của bạn.
OutputCreating GitHub webhook for your_GitHub_username/environment-horsehelix-production for url http://jenkins.jx.your_IP_address.nip.io/github-webhook/  Jenkins X installation completed successfully           ********************************************************               NOTE: Your admin password is: admin          ********************************************************    Your Kubernetes context is now set to the namespace: jx To switch back to your original namespace use: jx namespace default For help on switching contexts see: https://jenkins-x.io/developing/kube-context/  To import existing projects into Jenkins:       jx import To create a new Spring Boot microservice:       jx create spring -d web -d actuator To create a new microservice from a quickstart: jx create quickstart Tiếp theo, sử dụng lệnh jx get để nhận danh sách các URL hiển thị thông tin về ứng dụng của bạn:
- jx get urls 
 
Lệnh này sẽ mang lại một danh sách tương tự như sau:
Name                      URL jenkins                   http://jenkins.jx.your_IP_address.nip.io jenkins-x-chartmuseum     http://chartmuseum.jx.your_IP_address.nip.io jenkins-x-docker-registry http://docker-registry.jx.your_IP_address.nip.io jenkins-x-monocular-api   http://monocular.jx.your_IP_address.nip.io jenkins-x-monocular-ui    http://monocular.jx.your_IP_address.nip.io nexus                     http://nexus.jx.your_IP_address.nip.io Bạn có thể sử dụng các URL để xem dữ liệu Jenkins X về môi trường CI / CD của bạn thông qua giao diện user bằng lệnh địa chỉ vào trình duyệt và nhập tên user và password của bạn. Trong trường hợp này, đây sẽ là " administrator " cho cả hai.
 Tiếp theo,  đảm bảo  rằng các account  dịch vụ trong không gian tên jx , jx-staging và jx-production có  quyền   administrator , hãy sửa đổi policy  RBAC của bạn bằng các lệnh sau:
- kubectl create clusterrolebinding jx-staging1 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-staging:expose --namespace=jx-staging 
 
- kubectl create clusterrolebinding jx-staging2 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-staging:default --namespace=jx-staging 
 
- kubectl create clusterrolebinding jx-production1 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-production:expose --namespace=jx-productions 
 
- kubectl create clusterrolebinding jx-production2 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-production:default --namespace=jx-productions 
 
- kubectl create clusterrolebinding jx-binding1 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx:expose --namespace=jx 
 
- kubectl create clusterrolebinding jx-binding2 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx:default --namespace=jx 
 
Đến đây bạn đã tạo cụm Kubernetes local của bạn với chức năng Jenkins X được tích hợp sẵn, bạn có thể chuyển sang tạo ứng dụng trên nền tảng để kiểm tra khả năng CI / CD của nó và trải nghiệm đường ống Jenkins X.
Bước 5 - Tạo ứng dụng thử nghiệm trong môi trường Jenkins X của bạn
Với môi trường Jenkins X của bạn được cài đặt trong cụm Kubernetes, giờ đây bạn đã có sẵn cơ sở hạ tầng CI / CD có thể giúp bạn tự động hóa quy trình thử nghiệm. Trong bước này, bạn sẽ thử điều này bằng cách cài đặt một ứng dụng thử nghiệm trong đường ống Jenkins X đang hoạt động.
Với mục đích demo , hướng dẫn này sẽ sử dụng ứng dụng RSVP mẫu do group CloudYuga tạo . Bạn có thể tìm thấy ứng dụng này, cùng với các tài liệu hội thảo trên web khác, tại kho lưu trữ DO-Community GitHub .
Đầu tiên, sao chép ứng dụng mẫu từ repository bằng lệnh sau:
- git clone https://github.com/do-community/rsvpapp.git 
 
Khi bạn đã nhân bản repository , hãy chuyển vào folder  rsvpapp và xóa các file  git:
- cd rsvpapp 
 - rm -r .git/ 
 
Để khởi tạo repository  git và dự án Jenkins X cho một ứng dụng mới, bạn có thể sử dụng jx create để bắt đầu lại từ đầu hoặc một mẫu hoặc jx import để nhập một ứng dụng hiện có từ một dự án local  hoặc repository  git. Đối với hướng dẫn này, hãy nhập ứng dụng RSVP mẫu bằng cách chạy lệnh sau từ trong folder  chính của ứng dụng:
- jx import 
 
Jenkins X sẽ nhắc bạn nhập tên user GitHub của bạn, cho dù bạn muốn khởi tạo git, thông báo commit , tổ chức của bạn và tên bạn muốn cho repository của bạn . Trả lời có để khởi tạo git, sau đó cung cấp phần còn lại của dấu nhắc với thông tin và tùy chọn GitHub cá nhân của bạn. Khi Jenkins X nhập ứng dụng, nó sẽ tạo biểu đồ Helm và file Jenkins trong folder chính của ứng dụng của bạn. Bạn có thể sửa đổi các biểu đồ này và Jenkinsfile theo yêu cầu của bạn.
 Vì ứng dụng RSVP mẫu chạy trên cổng 5000 của containers , hãy sửa đổi file  charts/rsvpapp/values.yaml để phù hợp với file  này. Mở charts/rsvpapp/values.yaml trong editor  của bạn:
- nano charts/rsvpapp/values.yaml 
 
Trong file  giá values.yaml này, hãy đặt service:internalPort: thành 5000 . Khi bạn đã thực hiện thay đổi này, file  của bạn sẽ trông giống như sau:
# Default values for python. # This is a YAML-formatted file. # Declare variables to be passed into your templates. replicaCount: 1 image:   repository: draft   tag: dev   pullPolicy: IfNotPresent service:   name: rsvpapp   type: ClusterIP   externalPort: 80   internalPort: 5000   annotations:     fabric8.io/expose: "true"     fabric8.io/ingress.annotations: "kubernetes.io/ingress.class: nginx" resources:   limits:     cpu: 100m     memory: 128Mi   requests:     cpu: 100m     memory: 128Mi ingress:   enabled: false Lưu và thoát khỏi file của bạn.
 Tiếp theo, thay đổi các charts/preview/requirements.yaml để phù hợp với ứng dụng của bạn. requirements.yaml là một file YAML trong đó các nhà phát triển có thể khai báo phụ thuộc bảng xếp hạng, cùng với vị trí của biểu đồ và version  mong muốn. Vì ứng dụng mẫu của  ta  sử dụng MongoDB cho mục đích database , bạn  cần  sửa đổi file  charts/preview/requirements.yaml cầu.yaml để liệt kê MongoDB như một phần phụ thuộc. Mở file  trong editor  của bạn bằng lệnh sau:
- nano charts/preview/requirements.yaml 
 
Chỉnh sửa file  bằng cách thêm mục nhập mongodb-replicaset sau mục nhập alias: cleanup , như được đánh dấu trong khối mã sau:
# !! File must end with empty line !! dependencies: - alias: expose   name: exposecontroller   repository: http://chartmuseum.jenkins-x.io   version: 2.3.92 - alias: cleanup   name: exposecontroller   repository: http://chartmuseum.jenkins-x.io   version: 2.3.92 - name: mongodb-replicaset   repository: https://kubernetes-charts.storage.googleapis.com/   version: 3.5.5    # !! "alias: preview" must be last entry in dependencies array !!   # !! Place custom dependencies above !! - alias: preview   name: rsvpapp   repository: file://../rsvpapp Ở đây bạn đã chỉ định biểu đồ mongodb-replicaset làm phụ thuộc cho biểu đồ preview .
 Tiếp theo, lặp lại quá trình này cho biểu đồ rsvpapp của bạn. Tạo file  charts/rsvpapp/requirements.yaml và mở nó trong editor  của bạn:
- nano charts/rsvpapp/requirements.yaml 
 
Khi file được mở, hãy thêm phần sau, đảm bảo có một dòng trống duy nhất trước và sau các dòng được điền:
 dependencies: - name: mongodb-replicaset   repository: https://kubernetes-charts.storage.googleapis.com/   version: 3.5.5   Đến đây bạn  đã chỉ định biểu đồ mongodb-replicaset làm phụ thuộc cho biểu đồ rsvpapp  của bạn .
 Tiếp theo, để kết nối các lối vào của ứng dụng RSVP mẫu vào backend MongoDB, thêm một MONGODB_HOST biến môi trường để bạn deployment.yaml  file  trong charts/rsvpapp/templates/ . Mở file  này trong editor  của bạn:
- nano charts/rsvpapp/templates/deployment.yaml 
 
Thêm các dòng được đánh dấu sau vào file , ngoài một dòng trống ở đầu file và hai dòng trống ở cuối file . Lưu ý các dòng trống này là bắt buộc để file YAML hoạt động:
 apiVersion: extensions/v1beta1 kind: Deployment metadata:   name: {{ template "fullname" . }}   labels:     draft: {{ default "draft-app" .Values.draft }}     chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec:   replicas: {{ .Values.replicaCount }}   template:     metadata:       labels:         draft: {{ default "draft-app" .Values.draft }}         app: {{ template "fullname" . }} {{- if .Values.podAnnotations }}       annotations: {{ toYaml .Values.podAnnotations | indent 8 }} {{- end }}     spec:       containers:       - name: {{ .Chart.Name }}         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"         env:         - name: MONGODB_HOST           value: "mongodb://{{.Release.Name}}-mongodb-replicaset-0.{{.Release.Name}}-mongodb-replicaset,{{.Release.Name}}-mongodb-replicaset-1.{{.Release.Name}}-mongodb-replicaset,{{.Release.Name}}-mongodb-replicaset-2.{{.Release.Name}}-mongodb-replicaset:27017"         imagePullPolicy: {{ .Values.image.pullPolicy }}         ports:         - containerPort: {{ .Values.service.internalPort }}         resources: {{ toYaml .Values.resources | indent 12 }}   Với những thay đổi này, Helm sẽ có thể triển khai ứng dụng của bạn với MongoDB làm database của nó.
 Tiếp theo, kiểm tra Jenkinsfile Jenkins được tạo bởi Jenkins X bằng cách mở file  từ folder  chính của ứng dụng của bạn:
- nano Jenkinsfile 
 
Jenkinsfile này xác định đường dẫn được kích hoạt mỗi khi bạn  commit  một version  ứng dụng  của bạn  vào repository  GitHub. Nếu bạn muốn tự động kiểm tra mã  của bạn  để các kiểm tra được kích hoạt mỗi khi đường ống được kích hoạt, bạn sẽ thêm kiểm tra vào tài liệu này.
 Để chứng minh điều này, hãy thêm một trường hợp thử nghiệm được tùy chỉnh bằng cách thay thế sh "python -m unittest" dưới stage('CI Build and push snapshot') và stage('Build Release') trong Jenkinsfile bằng các dòng được đánh dấu sau:
. . .   stages {     stage('CI Build and push snapshot') {       when {         branch 'PR-*'       }       environment {         PREVIEW_VERSION = "0.0.0-SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER"         PREVIEW_NAMESPACE = "$APP_NAME-$BRANCH_NAME".toLowerCase()         HELM_RELEASE = "$PREVIEW_NAMESPACE".toLowerCase()       }       steps {         container('python') {           sh "pip install -r requirements.txt"           sh "python -m pytest tests/test_rsvpapp.py"           sh "export VERSION=$PREVIEW_VERSION && skaffold build -f skaffold.yaml"           sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:$PREVIEW_VERSION"           dir('./charts/preview') {             sh "make preview"             sh "jx preview --app $APP_NAME --dir ../.."           }         }       }     }     stage('Build Release') {       when {         branch 'master'       }       steps {         container('python') {            // ensure we're not on a detached head           sh "git checkout master"           sh "git config --global credential.helper store"           sh "jx step git credentials"            // so we can retrieve the version in later steps           sh "echo \$(jx-release-version) > VERSION"           sh "jx step tag --version \$(cat VERSION)"           sh "pip install -r requirements.txt"           sh "python -m pytest tests/test_rsvpapp.py"           sh "export VERSION=`cat VERSION` && skaffold build -f skaffold.yaml"           sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:\$(cat VERSION)"         }       }     } . . . Với các dòng được thêm vào, đường ống Jenkins X sẽ cài đặt các phần phụ thuộc và thực hiện kiểm tra Python khi nào bạn commit thay đổi ứng dụng của bạn .
Đến đây bạn đã thay đổi ứng dụng RSVP mẫu, hãy commit và đẩy những thay đổi này lên GitHub bằng các lệnh sau:
- git add * 
 - git commit -m update 
 - git push 
 
Khi bạn đẩy những thay đổi này lên GitHub, bạn sẽ kích hoạt một bản dựng ứng dụng mới  của bạn . Nếu bạn mở giao diện  user  Jenkins bằng cách  chuyển  đến http://jenkins.jx. your_IP_address .nip.io và nhập "admin" cho tên  user  và password  của bạn, bạn sẽ tìm thấy thông tin về bản dựng mới  của bạn . Nếu bạn nhấp vào “Lịch sử xây dựng” từ menu ở phía bên trái của trang, bạn sẽ thấy lịch sử của các bản dựng đã  commit   của bạn . Nếu bạn nhấp vào biểu tượng màu xanh lam bên cạnh một bản dựng, sau đó chọn “Console Ouput” từ menu bên trái, bạn sẽ tìm thấy  kết quả  console  cho các bước tự động trong quy trình  của bạn . Di chuyển đến cuối  kết quả  này, bạn sẽ thấy thông báo sau:
Output. . . Finished: SUCCESS Điều này nghĩa là ứng dụng của bạn đã vượt qua các bài kiểm tra tùy chỉnh của bạn và hiện đã được triển khai thành công.
 Khi Jenkins X xây dựng bản phát hành ứng dụng, nó sẽ thúc đẩy ứng dụng đến môi trường staging . Để  xác minh  ứng dụng của bạn đang chạy, hãy liệt kê các ứng dụng đang chạy trên cụm Kubernetes của bạn bằng cách sử dụng lệnh sau:
- jx get app 
 
Bạn sẽ nhận được kết quả tương tự như sau:
OutputAPPLICATION STAGING PODS URL rsvpapp     0.0.2   1/1  http://rsvpapp.jx-staging.your_IP_address.nip.io Từ đó, bạn có thể thấy rằng Jenkins X đã triển khai ứng dụng của bạn trong môi trường jx-staging của bạn dưới dạng version  0.0.2 . Đầu ra cũng hiển thị URL mà bạn có thể sử dụng để truy cập ứng dụng  của bạn . Truy cập URL này sẽ hiển thị cho bạn ứng dụng RSVP mẫu: 
Tiếp theo, hãy kiểm tra hoạt động của ứng dụng của bạn bằng lệnh sau:
- jx get activity -f rsvpapp  
 
Bạn sẽ nhận được kết quả tương tự như sau:
OutputSTEP                                        STARTED      AGO DURATION STATUS your_GitHub_username/rsvpappv/master #1    3h42m23s    4m51s Succeeded Version: 0.0.1   Checkout Source                          3h41m52s       6s Succeeded   CI Build and push snapshot               3h41m46s          NotExecuted   Build Release                            3h41m46s      56s Succeeded   Promote to Environments                  3h40m50s    3m17s Succeeded   Promote: staging                         3h40m29s    2m36s Succeeded     PullRequest                            3h40m29s    1m16s Succeeded  PullRequest: https://github.com/your_GitHub_username/environment-horsehelix-staging/pull/1 Merge SHA: dc33d3747abdacd2524e8c22f0b5fbb2ac3f6fc7     Update                                 3h39m13s    1m20s Succeeded  Status: Success at: http://jenkins.jx.your_IP_address.nip.io/job/your_GitHub_username/job/environment-horsehelix-staging/job/master/2/display/redirect     Promoted                               3h39m13s    1m20s Succeeded  Application is at: http://rsvpapp.jx-staging.your_IP_address.nip.io   Clean up                                 3h37m33s       1s Succeeded your_GitHub_username/rsvpappv/master #2      28m37s    5m57s Succeeded Version: 0.0.2   Checkout Source                            28m18s       4s Succeeded   CI Build and push snapshot                 28m14s          NotExecuted   Build Release                              28m14s      56s Succeeded   Promote to Environments                    27m18s    4m38s Succeeded   Promote: staging                           26m53s     4m0s Succeeded     PullRequest                              26m53s     1m4s Succeeded  PullRequest: https://github.com/your_GitHub_username/environment-horsehelix-staging/pull/2 Merge SHA: 976bd5ad4172cf9fd79f0c6515f5006553ac6611     Update                                   25m49s    2m56s Succeeded  Status: Success at: http://jenkins.jx.your_IP_address.nip.io/job/your_GitHub_username/job/environment-horsehelix-staging/job/master/3/display/redirect     Promoted                                 25m49s    2m56s Succeeded  Application is at: http://rsvpapp.jx-staging.your_IP_address.nip.io   Clean up                                   22m40s       0s Succeeded Tại đây, bạn đang nhận được hoạt động Jenkins X cho ứng dụng RSVP bằng cách áp dụng bộ lọc với -f rsvpapp .
 Tiếp theo, liệt kê các  group  đang chạy trong không gian tên jx-staging bằng lệnh sau:
- kubectl get pod -n jx-staging 
 
Bạn sẽ nhận được kết quả tương tự như sau:
NAME                                 READY     STATUS    RESTARTS   AGE jx-staging-mongodb-replicaset-0      1/1       Running   0          6m jx-staging-mongodb-replicaset-1      1/1       Running   0          6m jx-staging-mongodb-replicaset-2      1/1       Running   0          5m jx-staging-rsvpapp-c864c4844-4fw5z   1/1       Running   0          6m Kết quả này cho thấy ứng dụng của bạn đang chạy trong không gian tên jx-staging , cùng với ba  group  của database  MongoDB  backend , tuân theo những thay đổi bạn đã thực hiện đối với file  YAML trước đó.
Đến đây bạn đã chạy một ứng dụng thử nghiệm thông qua đường ống Jenkins X, bạn có thể thử quảng bá ứng dụng này vào môi trường production .
Bước 6 - Quảng bá ứng dụng thử nghiệm của bạn lên một không gian tên khác
 Để kết thúc phần trình diễn này, bạn sẽ hoàn thành quy trình CI / CD bằng cách quảng bá ứng dụng RSVP mẫu vào không gian tên jx-production của bạn.
 Đầu tiên, sử dụng jx promote trong lệnh sau:
- jx promote rsvpapp --version=0.0.2 --env=production 
 
Điều này sẽ thúc đẩy ứng dụng rsvpapp đang chạy với version=0.0.2 vào  môi trường production . Trong suốt quá trình xây dựng, Jenkins X sẽ nhắc bạn nhập thông tin account  GitHub  của bạn . Trả lời những  dấu nhắc  này bằng phản hồi cá nhân của bạn khi chúng xuất hiện.
Sau khi khuyến mãi thành công, kiểm tra danh sách các ứng dụng:
- jx get app 
 
Bạn sẽ nhận được kết quả tương tự như sau:
OutputAPPLICATION STAGING PODS URL                                             PRODUCTION PODS URL rsvpapp     0.0.2   1/1  http://rsvpapp.jx-staging.your_IP_address.nip.io 0.0.2      1/1  http://rsvpapp.jx-production.your_IP_address.nip.io Với thông tin PRODUCTION này, bạn có thể  xác nhận  Jenkins X đã quảng bá rsvpapp cho  môi trường production . Để xác minh thêm, hãy truy cập URL production  http://rsvpapp.jx-production. your_IP_address .nip.io trong trình duyệt của bạn. Bạn sẽ thấy ứng dụng đang hoạt động, bây giờ sắp hết "sản xuất": 
 Cuối cùng, liệt kê các  group  của bạn trong không gian tên jx-production .
- kubectl get pod -n jx-production 
 
Bạn sẽ thấy rằng rsvpapp và các  group   backend  MongoDB đang chạy trong không gian tên này:
NAME                                     READY     STATUS    RESTARTS   AGE jx-production-mongodb-replicaset-0       1/1       Running   0          1m jx-production-mongodb-replicaset-1       1/1       Running   0          1m jx-production-mongodb-replicaset-2       1/1       Running   0          55s jx-production-rsvpapp-54748d68bd-zjgv7   1/1       Running   0          1m  Điều này cho thấy rằng bạn đã quảng bá thành công ứng dụng mẫu RSVP vào môi trường production của bạn , mô phỏng việc triển khai ứng dụng đã sẵn sàng production ở cuối đường ống CI / CD.
Kết luận
Trong hướng dẫn này, bạn đã sử dụng Helm để quản lý các gói trên một cụm Kubernetes được mô phỏng và tùy chỉnh biểu đồ Helm để đóng gói và triển khai ứng dụng của bạn . Bạn cũng cài đặt môi trường Jenkins X trên cụm Kubernetes của bạn và chạy ứng dụng mẫu thông qua đường dẫn CI / CD từ đầu đến cuối.
Đến đây bạn đã có kinh nghiệm với những công cụ này mà bạn có thể sử dụng khi xây dựng hệ thống CI / CD trên cụm Kubernetes của bạn . Nếu bạn muốn tìm hiểu thêm về Helm, hãy xem phần Giới thiệu về Helm, Trình quản lý gói dành cho Kubernetes và Cách cài đặt phần mềm trên Kubernetes Cluster với các bài viết về Trình quản lý gói Helm . Để khám phá thêm các công cụ CI / CD trên Kubernetes, bạn có thể đọc về lưới dịch vụ Istio trong hướng dẫn tiếp theo của loạt hội thảo trên web này.
Các tin liên quan

