Chuỗi hội thảo trên web: Xây dựng khối để thực hiện CI / CD với Kubernetes
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 Cloud Native để 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ụ Cloud Native, lưới dịch vụ và 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 đầu tiên của loạt bài, Xây dựng khối để thực hiện CI / CD với Kubernetes.
Nếu bạn đang bắt đầu với vùng chứa , bạn có thể sẽ muốn biết cách tự động hóa việc xây dựng, thử nghiệm và triển khai. Bằng cách sử dụng phương pháp Cloud Native cho các quy trình này, bạn có thể tận dụng các API cơ sở hạ tầng phù hợp để đóng gói và triển khai các ứng dụng theo cách tự động.
Hai khối xây dựng để thực hiện tự động hóa bao gồm hình ảnh vùng chứa và bộ điều phối containers . Trong khoảng hơn một năm trở lại đây, Kubernetes đã trở thành lựa chọn mặc định cho dàn nhạc containers . Trong bài viết đầu tiên của loạt bài CI / CD với Kubernetes , bạn sẽ:
- Xây dựng containers images bằng Docker , Buildah và Kaniko .
 - Cài đặt một cụm Kubernetes với Terraform và tạo Triển khai và Dịch vụ .
 - Mở rộng chức năng của một cụm Kubernetes với Tài nguyên tùy chỉnh .
 
Đến cuối hướng dẫn này, bạn sẽ có các containers images được xây dựng bằng Docker, Buildah và Kaniko, và một cụm Kubernetes với Triển khai, Dịch vụ và Tài nguyên tùy chỉnh.
Các bài viết trong tương lai của loạt bài này sẽ đề cập đến các chủ đề liên quan: quản lý gói cho Kubernetes, các công cụ CI / CD như Jenkins X và Spinnaker , Services Meshes và GitOps.
Yêu cầu
- Server Ubuntu 16.04 có account user không phải root. Làm theo hướng dẫn Cài đặt server ban đầu với Ubuntu 16.04 của ta để được hướng dẫn.
 - Docker được cài đặt trên server của bạn. Vui lòng làm theo Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 16.04 để biết hướng dẫn cài đặt.
 -  Một tài khoản Docker Hub . Để biết tổng quan về cách bắt đầu với Docker Hub, vui lòng xem các hướng dẫn sau .
 - Một account DigitalOcean và mã thông báo truy cập cá nhân. Vui lòng tham khảo các hướng dẫn này để nhận mã thông báo truy cập của bạn.
 - Làm quen với containers và Docker. Vui lòng tham khảo Chuỗi hội thảo trên web: Bắt đầu với Container để biết thêm chi tiết.
 - Quen thuộc với các khái niệm Kubernetes. Vui lòng tham khảo Giới thiệu về Kubernetes để biết thêm chi tiết.
 
Bước 1 - Xây dựng containers images bằng Docker và Buildah
Containers images là một thực thể độc lập với mã ứng dụng, thời gian chạy và các phần phụ thuộc của riêng nó mà bạn có thể sử dụng để tạo và chạy containers . Bạn có thể sử dụng các công cụ khác nhau để tạo containers images và trong bước này, bạn sẽ xây dựng containers với hai trong số chúng: Docker và Buildah.
Xây dựng containers images bằng Dockerfiles
 Docker xây dựng  containers images   của bạn tự động bằng cách đọc hướng dẫn từ Dockerfile, một file  văn bản bao gồm các lệnh cần thiết để lắp ráp  containers images  . Sử dụng lệnh docker image build , bạn có thể tạo một bản dựng tự động sẽ thực thi các hướng dẫn dòng lệnh được cung cấp trong Dockerfile.Khi xây dựng hình ảnh, bạn cũng sẽ chuyển ngữ cảnh xây dựng bằng Dockerfile, chứa tập hợp các file  cần thiết để tạo môi trường và chạy ứng dụng trong  containers images  .
 Thông thường, bạn sẽ tạo một folder  dự án cho Dockerfile  của bạn  và xây dựng ngữ cảnh. Tạo một folder  có tên demo để bắt đầu:
- mkdir demo 
 - cd demo 
 
Tiếp theo, tạo một Dockerfile bên trong folder  demo :
- nano Dockerfile 
 
Thêm nội dung sau vào file :
FROM ubuntu:16.04  LABEL MAINTAINER neependra@cloudyuga.guru  RUN apt-get update \     && apt-get install -y nginx \     && apt-get clean \     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \     && echo "daemon off;" >> /etc/nginx/nginx.conf  EXPOSE 80 CMD ["nginx"] Dockerfile này bao gồm một tập hợp các hướng dẫn sẽ xây dựng một hình ảnh để chạy Nginx. Trong quá trình xây dựng, ubuntu:16.04 sẽ hoạt động như hình ảnh cơ sở và gói nginx sẽ được cài đặt. Sử dụng lệnh CMD , bạn cũng đã  cấu hình  nginx làm lệnh mặc định khi containers  bắt đầu.
 Tiếp theo, bạn sẽ xây dựng  containers images   bằng lệnh docker image build , sử dụng folder  hiện tại (.) Làm bối cảnh xây dựng. Chuyển tùy chọn -t vào lệnh này đặt tên cho hình ảnh nkhare/nginx:latest :
- sudo docker image build -t nkhare/nginx:latest . 
 
Bạn sẽ thấy kết quả sau:
OutputSending build context to Docker daemon  49.25MB Step 1/5 : FROM ubuntu:16.04  ---> 7aa3602ab41e Step 2/5 : MAINTAINER neependra@cloudyuga.guru  ---> Using cache  ---> 552b90c2ff8d Step 3/5 : RUN apt-get update     && apt-get install -y nginx     && apt-get clean     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*     && echo "daemon off;" >> /etc/nginx/nginx.conf  ---> Using cache  ---> 6bea966278d8 Step 4/5 : EXPOSE 80  ---> Using cache  ---> 8f1c4281309e Step 5/5 : CMD ["nginx"]  ---> Using cache  ---> f545da818f47 Successfully built f545da818f47 Successfully tagged nginx:latest Hình ảnh của bạn hiện đã được xây dựng. Bạn có thể liệt kê các Docker image của bạn bằng lệnh sau:
- docker image ls 
 
OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE nkhare/nginx        latest              4073540cbcec        3 seconds ago       171MB ubuntu              16.04               7aa3602ab41e        11 days ago       Đến đây bạn  có thể sử dụng nkhare/nginx:latest image để tạo containers .
Xây dựng containers images với Project Atomic-Buildah
Buildah là một công cụ CLI, được phát triển bởi Project Atomic , để nhanh chóng xây dựng hình ảnh tuân theo Open Container Initiative ( OCI ) . OCI cung cấp thông số kỹ thuật cho thời gian chạy containers và hình ảnh trong nỗ lực chuẩn hóa các phương pháp hay nhất trong ngành.
 Buildah có thể tạo một hình ảnh từ một containers  đang hoạt động hoặc từ một Dockerfile. Nó có thể xây dựng hình ảnh hoàn toàn trong không gian  user  mà không cần daemon Docker và có thể thực hiện các hoạt động hình ảnh như build , list , push và tag . Trong bước này, bạn sẽ biên dịch Buildah từ nguồn và sau đó sử dụng nó để tạo  containers images  .
Để cài đặt Buildah, bạn cần các phụ thuộc , bao gồm các công cụ cho phép bạn quản lý các gói và bảo mật gói, trong số những thứ khác. Chạy các lệnh sau để cài đặt các gói này:
-  cd 
 -  sudo apt-get install software-properties-common 
 -  sudo add-apt-repository ppa:alexlarsson/flatpak 
 -  sudo add-apt-repository ppa:gophers/archive 
 -  sudo apt-add-repository ppa:projectatomic/ppa 
 -  sudo apt-get update 
 -  sudo apt-get install bats btrfs-tools git libapparmor-dev libdevmapper-dev libglib2.0-dev libgpgme11-dev libostree-dev libseccomp-dev libselinux1-dev skopeo-containers go-md2man 
 
 Vì bạn  sẽ biên dịch mã nguồn buildah để tạo gói của nó, bạn cũng  cần  cài đặt Go :
- sudo apt-get update 
 - sudo curl -O https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz 
 - sudo tar -xvf go1.8.linux-amd64.tar.gz 
 - sudo mv go /usr/local 
 - sudo echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile 
 - source ~/.profile 
 - go version  
 
Bạn sẽ thấy kết quả sau cho biết cài đặt thành công:
Outputgo version go1.8 linux/amd64  Đến đây bạn  có thể lấy mã nguồn buildah để tạo gói của nó, cùng với runc binary  runc . runc là việc triển khai thời gian chạy containers  OCI , bạn sẽ sử dụng thời gian này để chạy các containers  Buildah  của bạn .
 Chạy các lệnh sau để cài đặt runc và buildah :
- mkdir ~/buildah 
 - cd ~/buildah 
 - export GOPATH=`pwd` 
 - git clone https://github.com/containers/buildah ./src/github.com/containers/buildah 
 - cd ./src/github.com/containers/buildah 
 - make runc all TAGS="apparmor seccomp" 
 - sudo cp ~/buildah/src/github.com/opencontainers/runc/runc /usr/bin/. 
 - sudo apt install buildah  
 
Tiếp theo, tạo file  /etc/containers/registries.conf để  cấu hình  đăng ký containers  của bạn:
- sudo nano /etc/containers/registries.conf 
 
Thêm nội dung sau vào file để chỉ định đăng ký của bạn:
 # This is a system-wide configuration file used to # keep track of registries for various container backends. # It adheres to TOML format and does not support recursive # lists of registries.  # The default location for this configuration file is /etc/containers/registries.conf.  # The only valid categories are: 'registries.search', 'registries.insecure', # and 'registries.block'.  [registries.search] registries = ['docker.io', 'registry.fedoraproject.org', 'quay.io', 'registry.access.redhat.com', 'registry.centos.org']  # If you need to access insecure registries, add the registry's fully-qualified name. # An insecure registry is one that does not have a valid SSL certificate or only does HTTP. [registries.insecure] registries = []  # If you need to block pull access from a registry, uncomment the section below # and add the registries fully-qualified name. # # Docker only [registries.block] registries = [] Tệp cấu hình registries.conf chỉ định nhà đăng ký nào nên được tham khảo khi hoàn thành các tên hình ảnh không bao gồm phần đăng ký hoặc domain .
 Bây giờ hãy chạy lệnh sau để xây dựng hình ảnh, sử dụng repository  https://github.com/do-community/rsvpapp-webinar1 làm bối cảnh xây dựng. Kho lưu trữ này cũng chứa Dockerfile có liên quan:
- sudo buildah build-using-dockerfile -t rsvpapp:buildah github.com/do-community/rsvpapp-webinar1  
 
Lệnh này tạo một hình ảnh có tên rsvpapp:buildah từ Dockerfille có sẵn trong repository  lưu trữ https://github.com/do-community/rsvpapp-webinar1 .
Để liệt kê các hình ảnh, hãy sử dụng lệnh sau:
- sudo buildah images 
 
Bạn sẽ thấy kết quả sau:
OutputIMAGE ID             IMAGE NAME                                               CREATED AT             SIZE b0c552b8cf64         docker.io/teamcloudyuga/python:alpine                    Sep 30, 2016 04:39     95.3 MB 22121fd251df         localhost/rsvpapp:buildah                                Sep 11, 2018 14:34     114 MB Một trong những hình ảnh này là localhost/rsvpapp:buildah , mà bạn vừa tạo. Cái còn lại, docker.io/teamcloudyuga/python:alpine , là hình ảnh cơ sở từ Dockerfile.
Khi bạn đã xây dựng hình ảnh, bạn có thể đẩy nó vào Docker Hub. Điều này sẽ cho phép bạn lưu trữ nó để sử dụng trong tương lai. Trước tiên, bạn cần đăng nhập vào account Docker Hub của bạn từ dòng lệnh:
- docker login -u your-dockerhub-username -p your-dockerhub-password 
 
Sau khi đăng nhập thành công, bạn sẽ nhận được một file , ~/.docker/config.json , chứa thông tin đăng nhập Docker Hub của bạn. Sau đó, bạn có thể sử dụng file  đó với buildah để đẩy hình ảnh lên Docker Hub.
 Ví dụ: nếu bạn muốn đẩy hình ảnh vừa tạo, bạn có thể chạy lệnh sau, trích dẫn authfile và hình ảnh cần đẩy:
- sudo buildah push --authfile ~/.docker/config.json rsvpapp:buildah docker://your-dockerhub-username/rsvpapp:buildah 
 
Bạn cũng có thể đẩy hình ảnh kết quả vào trình Docker local bằng lệnh sau:
- sudo buildah push rsvpapp:buildah docker-daemon:rsvpapp:buildah 
 
Cuối cùng, hãy xem các Docker image mà bạn đã tạo:
- sudo docker image ls 
 
OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE rsvpapp             buildah             22121fd251df        4 minutes ago       108MB nkhare/nginx        latest              01f0982d91b8        17 minutes ago      172MB ubuntu              16.04               b9e15a5d1e1a        5 days ago          115MB Như mong đợi, bây giờ bạn sẽ thấy một hình ảnh mới, rsvpapp:buildah , đã được xuất bằng buildah .
Đến đây bạn đã có kinh nghiệm xây dựng containers images bằng hai công cụ khác nhau, Docker và Buildah. Hãy chuyển sang thảo luận về cách cài đặt một cụm containers với Kubernetes.
Bước 2 - Cài đặt Cụm Kubernetes trên DigitalOcean bằng kubeadm và Terraform
Có nhiều cách khác nhau để cài đặt Kubernetes trên DigitalOcean. Ví dụ: để tìm hiểu thêm về cách cài đặt Kubernetes với kubeadm , bạn có thể xem Cách tạo một cụm Kubernetes bằng Kubeadm trên Ubuntu 18.04 .
Vì loạt bài hướng dẫn này thảo luận về việc sử dụng phương pháp Cloud Native để phát triển ứng dụng, ta sẽ áp dụng phương pháp này khi cài đặt cụm của ta . Cụ thể, ta sẽ tự động hóa việc tạo cụm của bạn bằng kubeadm và Terraform , một công cụ giúp đơn giản hóa việc tạo và thay đổi cơ sở hạ tầng.
 Sử dụng mã thông báo truy cập cá nhân của bạn, bạn sẽ kết nối với DigitalOcean với Terraform để cung cấp 3  server . Bạn sẽ chạy các lệnh kubeadm bên trong các máy ảo này để tạo một cụm Kubernetes 3 nút chứa một nút chính và hai công nhân.
Trên server Ubuntu của bạn, hãy tạo một cặp khóa SSH , khóa này sẽ cho phép đăng nhập không cần password vào máy ảo của bạn:
- ssh-keygen -t rsa 
 
Bạn sẽ thấy kết quả sau:
OutputGenerating public/private rsa key pair. Enter file in which to save the key (~/.ssh/id_rsa):  Nhấn ENTER để lưu cặp khóa trong ~/.ssh trong thư ~/.ssh của bạn hoặc nhập một điểm đến khác.
Tiếp theo, bạn sẽ thấy dấu nhắc sau:
OutputEnter passphrase (empty for no passphrase):  Trong trường hợp này, nhấn ENTER mà không cần password  để kích hoạt đăng nhập không cần password  vào  các node  của bạn.
Bạn sẽ thấy xác nhận cặp khóa của bạn đã được tạo:
OutputYour identification has been saved in ~/.ssh/id_rsa. Your public key has been saved in ~/.ssh/id_rsa.pub. The key fingerprint is: SHA256:lCVaexVBIwHo++NlIxccMW5b6QAJa+ZEr9ogAElUFyY root@3b9a273f18b5 The key's randomart image is: +---[RSA 2048]----+ |++.E ++o=o*o*o   | |o   +..=.B = o   | |.    .* = * o    | | .   =.o + *     | |  . . o.S + .    | |   . +.    .     | |    . ... =      | |        o= .     | |       ...       | +----[SHA256]-----+ Nhận public key của bạn bằng cách chạy lệnh sau, lệnh này sẽ hiển thị nó trong terminal của bạn:
- cat ~/.ssh/id_rsa.pub 
 
Thêm khóa này vào account DigitalOcean của bạn theo các hướng dẫn sau .
Tiếp theo, cài đặt Terraform:
- sudo apt-get update 
 - sudo apt-get install unzip 
 - wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip 
 - unzip terraform_0.11.7_linux_amd64.zip 
 - sudo mv terraform /usr/bin/. 
 - terraform version 
 
Bạn sẽ thấy kết quả xác nhận cài đặt Terraform của bạn :
OutputTerraform v0.11.7 Tiếp theo, chạy các lệnh sau để cài đặt kubectl , một công cụ CLI sẽ giao tiếp với cụm Kubernetes của bạn và để tạo folder  ~/.kube trong folder  chính của  user :
- sudo apt-get install apt-transport-https 
 - curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - 
 - sudo touch /etc/apt/sources.list.d/kubernetes.list  
 - echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list 
 - sudo apt-get update 
 - sudo apt-get install kubectl 
 - mkdir -p ~/.kube 
 
Tạo folder  ~/.kube sẽ cho phép bạn sao chép file  cấu hình vào vị trí này. Bạn sẽ làm được điều đó khi chạy tập lệnh  cài đặt  Kubernetes sau trong phần này. Theo mặc định, kubectl CLI tìm kiếm file  cấu hình trong folder  ~/.kube để truy cập cụm.
Tiếp theo, sao chép kho dự án mẫu cho hướng dẫn này, chứa các tập lệnh Terraform để cài đặt cơ sở hạ tầng:
- git clone https://github.com/do-community/k8s-cicd-webinars.git 
 
Đi tới folder tập lệnh Terrafrom:
- cd k8s-cicd-webinars/webinar1/2-kubernetes/1-Terraform/ 
 
Lấy dấu fingerprint của public key SSH của bạn:
- ssh-keygen -E md5 -lf ~/.ssh/id_rsa.pub | awk '{print $2}' 
 
Bạn sẽ thấy kết quả như sau, với phần được đánh dấu đại diện cho khóa của bạn:
OutputMD5:dd:d1:b7:0f:6d:30:c0:be:ed:ae:c7:b9:b8:4a:df:5e Lưu ý khóa của bạn sẽ khác với những gì được hiển thị ở đây.
Lưu dấu fingerprint vào một biến môi trường để Terraform có thể sử dụng nó:
- export FINGERPRINT=dd:d1:b7:0f:6d:30:c0:be:ed:ae:c7:b9:b8:4a:df:5e 
 
Tiếp theo, xuất mã thông báo truy cập cá nhân DO của bạn:
- export TOKEN=your-do-access-token 
 
Bây giờ hãy xem ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terraform/ folder  dự án:
- ls 
 
Outputcluster.tf  destroy.sh  files outputs.tf  provider.tf  script.sh Thư mục này chứa các tập lệnh và file cấu hình cần thiết để triển khai cụm Kubernetes của bạn với Terraform.
 Thực thi tập lệnh script.sh để kích hoạt  cài đặt  cụm Kubernetes:
- ./script.sh 
 
Khi quá trình thực thi tập lệnh hoàn tất, kubectl sẽ được  cấu hình  để sử dụng cụm Kubernetes mà bạn đã tạo.
 Liệt kê  các node  cụm bằng cách sử dụng kubectl get nodes :
- kubectl get nodes 
 
OutputNAME                STATUS    ROLES     AGE       VERSION k8s-master-node     Ready     master    2m        v1.10.0 k8s-worker-node-1   Ready     <none>    1m        v1.10.0 k8s-worker-node-2   Ready     <none>    57s       v1.10.0  Đến đây bạn  có một nút chính và hai nút công nhân ở trạng thái Ready .
Với một cụm Kubernetes được cài đặt , giờ đây bạn có thể khám phá một tùy chọn khác để xây dựng containers images : Kaniko từ Google .
Bước 3 - Xây dựng containers images với Kaniko
 Trước đó trong hướng dẫn này, bạn đã tạo  containers images   bằng Dockerfiles và Buildah. Nhưng điều gì sẽ xảy ra nếu bạn có thể xây dựng  containers images   trực tiếp trên Kubernetes? Có nhiều cách để chạy lệnh docker image build docker bên trong Kubernetes, nhưng đây không phải là công cụ Kubernetes bản địa. Bạn sẽ phải phụ thuộc vào daemon Docker để xây dựng hình ảnh và nó  cần  chạy trên một trong các Pod trong cụm.
Một công cụ có tên Kaniko cho phép bạn xây dựng các containers images bằng Dockerfile trên một cụm Kubernetes hiện có. Trong bước này, bạn sẽ xây dựng một containers images bằng Dockerfile bằng Kaniko. Sau đó, bạn sẽ đẩy hình ảnh này đến Docker Hub.
 Để đưa hình ảnh của bạn lên Docker Hub, bạn cần phải chuyển thông tin đăng nhập của Docker Hub cho Kaniko. Ở bước trước, bạn đã đăng nhập vào Docker Hub và tạo file  ~/.docker/config.json bằng thông tin đăng nhập  của bạn . Hãy sử dụng file  cấu hình này để tạo một đối tượng Kubernetes ConfigMap để lưu trữ thông tin đăng nhập bên trong cụm Kubernetes. Đối tượng ConfigMap được sử dụng để lưu trữ các thông số cấu hình, tách chúng khỏi ứng dụng của bạn.
 Để tạo docker-config được gọi là docker docker-config bằng file  ~/.docker/config.json , hãy chạy lệnh sau:
- sudo kubectl create configmap docker-config --from-file=$HOME/.docker/config.json 
 
Tiếp theo, bạn có thể tạo file  định nghĩa Pod có tên pod-kaniko.yml trong folder  ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terraform/ (mặc dù nó có thể đi bất cứ đâu).
 Trước tiên, hãy  đảm bảo  bạn đang ở trong folder  ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terraform/ :
- cd ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terraform/ 
 
Tạo file  pod-kaniko.yml :
- nano pod-kaniko.yml 
 
Thêm nội dung sau vào file  để chỉ định điều gì sẽ xảy ra khi bạn triển khai Pod  của bạn . Đảm bảo thay thế your-dockerhub-username trong trường args của Pod bằng tên  user  Docker Hub  của bạn : 
apiVersion: v1 kind: Pod metadata:   name: kaniko spec:   containers:   - name: kaniko     image: gcr.io/kaniko-project/executor:latest     args: ["--dockerfile=./Dockerfile",             "--context=/tmp/rsvpapp/",             "--destination=docker.io/your-dockerhub-username/rsvpapp:kaniko",             "--force" ]     volumeMounts:       - name: docker-config         mountPath: /root/.docker/       - name: demo         mountPath: /tmp/rsvpapp   restartPolicy: Never   initContainers:     - image: python       name: demo       command: ["/bin/sh"]       args: ["-c", "git clone https://github.com/do-community/rsvpapp-webinar1.git /tmp/rsvpapp"]        volumeMounts:       - name: demo         mountPath: /tmp/rsvpapp   restartPolicy: Never   volumes:     - name: docker-config       configMap:         name: docker-config     - name: demo       emptyDir: {} Tệp cấu hình này mô tả những gì sẽ xảy ra khi Pod của bạn được triển khai. Đầu tiên, vùng chứa Init sẽ sao chép repository  Git với Dockerfile, https://github.com/do-community/rsvpapp-webinar1.git , thành một tập chia sẻ được gọi là demo . Vùng chứa Init chạy trước containers  ứng dụng và  được dùng  để chạy các tiện ích hoặc  các việc  khác không mong muốn chạy từ containers  ứng dụng của bạn. kaniko chứa ứng dụng của bạn, kaniko , sau đó sẽ xây dựng hình ảnh bằng Dockerfile và đẩy hình ảnh kết quả đến Docker Hub, sử dụng thông tin đăng nhập bạn đã chuyển cho docker docker-config  dung lượng  ConfigMap.
 Để triển khai kaniko pod, hãy chạy lệnh sau:
- kubectl apply -f pod-kaniko.yml  
 
Bạn sẽ thấy xác nhận sau:
Outputpod/kaniko created Nhận danh sách các group :
- kubectl get pods 
 
Bạn sẽ thấy danh sách sau:
OutputNAME      READY     STATUS     RESTARTS   AGE kaniko    0/1       Init:0/1   0          47s Chờ một vài giây, sau đó chạy lại kubectl get pods để cập nhật trạng thái:
- kubectl get pods 
 
Bạn sẽ thấy như sau:
OutputNAME      READY     STATUS    RESTARTS   AGE kaniko    1/1       Running   0          1m Cuối cùng, chạy kubectl get pods    để cập nhật trạng thái cuối cùng:
- kubectl get pods 
 
OutputNAME      READY     STATUS      RESTARTS   AGE kaniko    0/1       Completed   0          2m Chuỗi kết quả này cho bạn biết rằng containers  Init đã chạy, sao chép repository  GitHub bên trong ổ đĩa demo . Sau đó, quá trình xây dựng Kaniko đã chạy và cuối cùng đã hoàn thành.
Kiểm tra log của group :
- kubectl logs kaniko 
 
Bạn sẽ thấy kết quả sau:
Outputtime="2018-08-02T05:01:24Z" level=info msg="appending to multi args docker.io/your-dockerhub-username/rsvpapp:kaniko" time="2018-08-02T05:01:24Z" level=info msg="Downloading base image nkhare/python:alpine" . . . ime="2018-08-02T05:01:46Z" level=info msg="Taking snapshot of full filesystem..." time="2018-08-02T05:01:48Z" level=info msg="cmd: CMD" time="2018-08-02T05:01:48Z" level=info msg="Replacing CMD in config with [/bin/sh -c python rsvp.py]" time="2018-08-02T05:01:48Z" level=info msg="Taking snapshot of full filesystem..." time="2018-08-02T05:01:49Z" level=info msg="No files were changed, appending empty layer to config." 2018/08/02 05:01:51 mounted blob: sha256:bc4d09b6c77b25d6d3891095ef3b0f87fbe90621bff2a333f9b7f242299e0cfd 2018/08/02 05:01:51 mounted blob: sha256:809f49334738c14d17682456fd3629207124c4fad3c28f04618cc154d22e845b 2018/08/02 05:01:51 mounted blob: sha256:c0cb142e43453ebb1f82b905aa472e6e66017efd43872135bc5372e4fac04031 2018/08/02 05:01:51 mounted blob: sha256:606abda6711f8f4b91bbb139f8f0da67866c33378a6dcac958b2ddc54f0befd2 2018/08/02 05:01:52 pushed blob sha256:16d1686835faa5f81d67c0e87eb76eab316e1e9cd85167b292b9fa9434ad56bf 2018/08/02 05:01:53 pushed blob sha256:358d117a9400cee075514a286575d7d6ed86d118621e8b446cbb39cc5a07303b 2018/08/02 05:01:55 pushed blob sha256:5d171e492a9b691a49820bebfc25b29e53f5972ff7f14637975de9b385145e04 2018/08/02 05:01:56 index.docker.io/your-dockerhub-username/rsvpapp:kaniko: digest: sha256:831b214cdb7f8231e55afbba40914402b6c915ef4a0a2b6cbfe9efb223522988 size: 1243 Từ log , bạn có thể thấy rằng containers  kaniko xây dựng hình ảnh từ Dockerfile và đẩy nó vào account  Docker Hub của bạn.
  Đến đây bạn  có thể kéo  Docker image . Hãy nhớ thay thế your-dockerhub-username của bạn bằng your-dockerhub-username Docker Hub của bạn:
- docker pull your-dockerhub-username/rsvpapp:kaniko 
 
Bạn sẽ thấy xác nhận về việc kéo:
Outputkaniko: Pulling from your-dockerhub-username/rsvpapp c0cb142e4345: Pull complete  bc4d09b6c77b: Pull complete  606abda6711f: Pull complete  809f49334738: Pull complete  358d117a9400: Pull complete  5d171e492a9b: Pull complete  Digest: sha256:831b214cdb7f8231e55afbba40914402b6c915ef4a0a2b6cbfe9efb223522988 Status: Downloaded newer image for your-dockerhub-username/rsvpapp:kaniko Đến đây bạn đã xây dựng thành công một cụm Kubernetes và tạo các hình ảnh mới từ bên trong cụm. Hãy chuyển sang thảo luận về Triển khai và Dịch vụ .
Bước 4 - Tạo Triển khai và Dịch vụ Kubernetes
 Kubernetes Deployments cho phép bạn chạy các ứng dụng  của bạn . Việc triển khai chỉ định trạng thái mong muốn cho  Group  của bạn, đảm bảo tính nhất quán trên các đợt phát hành của bạn. Trong bước này, bạn sẽ tạo ra một Nginx  file  triển khai gọi deployment.yml trong ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terraform/ folder  để tạo ra một triển khai Nginx.
Đầu tiên, hãy mở file :
- nano deployment.yml 
 
Thêm cấu hình sau vào file để xác định Triển khai Nginx của bạn:
apiVersion: apps/v1 kind: Deployment metadata:   name: nginx-deployment   labels:     app: nginx spec:   replicas: 3   selector:     matchLabels:       app: nginx   template:     metadata:       labels:         app: nginx     spec:       containers:       - name: nginx         image: nginx:1.7.9         ports:         - containerPort: 80  Tệp này xác định Triển khai có tên nginx-deployment tạo ra ba  group , mỗi  group  chạy một containers  nginx trên cổng 80 .
Để triển khai Deployment, hãy chạy lệnh sau:
- kubectl apply -f deployment.yml 
 
Bạn sẽ thấy xác nhận Triển khai đã được tạo:
Outputdeployment.apps/nginx-deployment created Liệt kê các triển khai của bạn:
- kubectl get deployments 
 
OutputNAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE nginx-deployment   3         3         3            3           29s Bạn có thể thấy rằng Triển khai triển khai nginx-deployment đã được tạo và số lượng  Group  mong muốn và hiện tại là như nhau: 3 .
Để liệt kê các Group mà Triển khai đã tạo, hãy chạy lệnh sau:
- kubectl get pods 
 
OutputNAME                                READY     STATUS      RESTARTS   AGE kaniko                              0/1       Completed   0          9m nginx-deployment-75675f5897-nhwsp   1/1       Running     0          1m nginx-deployment-75675f5897-pxpl9   1/1       Running     0          1m nginx-deployment-75675f5897-xvf4f   1/1       Running     0          1m Bạn có thể thấy từ kết quả này số lượng Group mong muốn đang chạy.
Để triển khai ứng dụng bên trong và bên ngoài, bạn cần tạo một đối tượng Kubernetes được gọi là Dịch vụ . Mỗi Dịch vụ chỉ định một ServiceType , xác định cách dịch vụ được hiển thị. Trong ví dụ này, ta sẽ sử dụng NodePort ServiceType, hiển thị Dịch vụ trên một cổng tĩnh trên mỗi nút.
 Để thực hiện việc này, hãy tạo một file , service.yml , trong folder  ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terrafrom/ :
- nano service.yml 
 
Thêm nội dung sau để xác định Dịch vụ của bạn:
kind: Service apiVersion: v1 metadata:   name: nginx-service spec:   selector:     app: nginx   type: NodePort   ports:   - protocol: TCP     port: 80     targetPort: 80     nodePort: 30111 Các cài đặt này xác định Dịch vụ, nginx-service và chỉ định rằng nó sẽ  nhắm đến  đến cổng 80 trên Pod của bạn. nodePort xác định cổng mà ứng dụng sẽ chấp nhận lưu lượng bên ngoài.
Để triển khai Dịch vụ, hãy chạy lệnh sau:
- kubectl apply -f service.yml 
 
Bạn sẽ thấy xác nhận:
Outputservice/nginx-service created Liệt kê các Dịch vụ:
- kubectl get service 
 
Bạn sẽ thấy danh sách sau:
OutputNAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        5h nginx-service   NodePort    10.100.98.213   <none>        80:30111/TCP   7s Dịch vụ của bạn, nginx-service , được hiển thị trên cổng 30111 và bây giờ bạn có thể truy cập nó trên bất kỳ IP công cộng nào của nút. Ví dụ:  chuyển  đến http:// node_1_ip :30111 hoặc http:// node_2_ip :30111 sẽ đưa bạn đến trang chào mừng tiêu chuẩn của Nginx.
Sau khi bạn đã kiểm tra Triển khai, bạn có thể xóa cả Triển khai và Dịch vụ:
- kubectl delete deployment nginx-deployment 
 - kubectl delete service nginx-service 
 
Các lệnh này sẽ xóa Triển khai và Dịch vụ bạn đã tạo.
Đến đây bạn đã làm việc với Triển khai và Dịch vụ, hãy chuyển sang tạo Tài nguyên tùy chỉnh.
Bước 5 - Tạo tài nguyên tùy chỉnh trong Kubernetes
Kubernetes cung cấp các chức năng và tính năng hạn chế nhưng sẵn sàng production . Tuy nhiên, có thể mở rộng các dịch vụ của Kubernetes bằng cách sử dụng tính năng Tài nguyên tùy chỉnh của nó. Trong Kubernetes, một tài nguyên là một điểm cuối trong Kubernetes API lưu trữ một tập hợp các đối tượng API. Ví dụ: một tài nguyên Pod chứa một tập hợp các đối tượng Pod. Với Tài nguyên tùy chỉnh, bạn có thể thêm các dịch vụ tùy chỉnh cho mạng, lưu trữ và hơn thế nữa. Những bổ sung này có thể được tạo hoặc xóa bất kỳ lúc nào.
Ngoài việc tạo các đối tượng tùy chỉnh, bạn cũng có thể sử dụng các bộ điều khiển phụ của thành phần Bộ điều khiển Kubernetes trong mặt phẳng điều khiển đảm bảo rằng trạng thái hiện tại của các đối tượng của bạn bằng với trạng thái mong muốn. Bộ điều khiển Kubernetes có các bộ điều khiển phụ cho các đối tượng được chỉ định. Ví dụ: ReplicaSet là một bộ điều khiển phụ đảm bảo số lượng Pod mong muốn vẫn nhất quán. Khi bạn kết hợp Tài nguyên tùy chỉnh với Bộ điều khiển, bạn sẽ nhận được một API khai báo thực sự cho phép bạn chỉ định trạng thái mong muốn của tài nguyên của bạn .
Trong bước này, bạn sẽ tạo một Tài nguyên tùy chỉnh và các đối tượng liên quan.
 Để tạo Tài nguyên tùy chỉnh, trước tiên hãy tạo một file  có tên crd.yml trong folder  ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terrafrom/ :
- nano crd.yml 
 
Thêm Định nghĩa tài nguyên tùy chỉnh (CRD) sau:
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata:   name: webinars.digitalocean.com spec:   group: digitalocean.com   version: v1   scope: Namespaced   names:     plural: webinars     singular: webinar     kind: Webinar     shortNames:     - wb Để triển khai CRD được xác định trong crd.yml , hãy chạy lệnh sau:
- kubectl create -f crd.yml  
 
Bạn sẽ thấy xác nhận tài nguyên đã được tạo:
Outputcustomresourcedefinition.apiextensions.k8s.io/webinars.digitalocean.com created Tệp crd.yml đã tạo một đường dẫn tài nguyên RESTful mới: /apis/digtialocean.com/v1/namespaces/*/webinars .  Đến đây bạn  có thể tham khảo đối tượng của bạn sử dụng webinars , webinar , Webinar , và wb , như bạn liệt kê chúng trong names phần của CustomResourceDefinition . Bạn có thể kiểm tra tài nguyên RESTful bằng lệnh sau:
- kubectl proxy & curl 127.0.0.1:8001/apis/digitalocean.com 
 
Lưu ý: Nếu bạn đã làm theo hướng dẫn  cài đặt   server  ban đầu trong  yêu cầu , thì bạn  cần  cho phép lưu lượng truy cập vào cổng 8001 để kiểm tra này hoạt động. Kích hoạt lưu lượng truy cập vào cổng này bằng lệnh sau:
- sudo ufw allow 8001 
 
Bạn sẽ thấy kết quả sau:
OutputHTTP/1.1 200 OK Content-Length: 238 Content-Type: application/json Date: Fri, 03 Aug 2018 06:10:12 GMT  {     "apiVersion": "v1",      "kind": "APIGroup",      "name": "digitalocean.com",      "preferredVersion": {         "groupVersion": "digitalocean.com/v1",          "version": "v1"     },      "serverAddressByClientCIDRs": null,      "versions": [         {             "groupVersion": "digitalocean.com/v1",              "version": "v1"         }     ] } Tiếp theo, tạo đối tượng để sử dụng Tài nguyên tùy chỉnh mới bằng cách mở file  có tên webinar.yml :
- nano webinar.yml 
 
Thêm nội dung sau để tạo đối tượng:
apiVersion: "digitalocean.com/v1" kind: Webinar metadata:   name: webinar1 spec:   name: webinar   image: nginx Chạy lệnh sau để đẩy những thay đổi này vào cụm:
- kubectl apply -f webinar.yml  
 
Bạn sẽ thấy kết quả sau:
Outputwebinar.digitalocean.com/webinar1 created  Như vậy,  bạn có thể quản lý các đối tượng webinar  của bạn  bằng kubectl . Ví dụ:
- kubectl get webinar 
 
OutputNAME       CREATED AT webinar1   21s  Đến đây bạn  có một đối tượng được gọi là webinar1 . Nếu có một Bộ điều khiển, nó sẽ chặn việc tạo đối tượng và thực hiện bất kỳ hoạt động xác định nào.
Xóa định nghĩa tài nguyên tùy chỉnh
Để xóa tất cả các đối tượng cho Tài nguyên tùy chỉnh của bạn, hãy sử dụng lệnh sau:
- kubectl delete webinar --all 
 
Bạn sẽ thấy:
Outputwebinar.digitalocean.com "webinar1" deleted Xóa chính Tài nguyên tùy chỉnh:
- kubectl delete crd webinars.digitalocean.com 
 
Bạn sẽ thấy xác nhận nó đã bị xóa:
Outputcustomresourcedefinition.apiextensions.k8s.io "webinars.digitalocean.com" deleted Sau khi xóa, bạn sẽ không có quyền truy cập vào điểm cuối API mà bạn đã thử nghiệm trước đó bằng lệnh curl .
Trình tự này là phần giới thiệu về cách bạn có thể mở rộng các chức năng của Kubernetes mà không cần sửa đổi mã Kubernetes của bạn.
Bước 6 - Xóa cụm Kubernetes
 Để tự hủy cụm Kubernetes, bạn có thể sử dụng tập lệnh destroy.sh từ folder  ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terrafrom . Đảm bảo rằng bạn đang ở trong folder  này:
- cd ~/k8s-cicd-webinars/webinar1/2-kubernetes/1-Terrafrom 
 
Chạy tập lệnh:
- ./destroy.sh 
 
Bằng cách chạy tập lệnh này, bạn sẽ cho phép Terraform giao tiếp với API DigitalOcean và xóa các server trong cụm của bạn.
Kết luận
Trong hướng dẫn này, bạn đã sử dụng các công cụ khác nhau để tạo containers images . Với những hình ảnh này, bạn có thể tạo containers trong bất kỳ môi trường nào. Bạn cũng cài đặt một cụm Kubernetes bằng Terraform và tạo các đối tượng Triển khai và Dịch vụ để triển khai và hiển thị ứng dụng của bạn. Ngoài ra, bạn đã mở rộng chức năng của Kubernetes bằng cách xác định Tài nguyên tùy chỉnh.
Đến đây bạn đã có một nền tảng vững chắc để xây dựng môi trường CI / CD trên Kubernetes, mà ta sẽ khám phá trong các bài viết sau.
Các tin liên quan

