Thứ sáu, 21/09/2018 | 00:00 GMT+7

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 , BuildahKaniko .
  • Cài đặt một cụm Kubernetes với Terraform và tạo Triển khaiDị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 XSpinnaker , Services Meshes và GitOps.

Yêu cầu

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 :

~ / demo / Dockerfile
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:

Output
Sending 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
Output
REPOSITORY 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 , pushtag . 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:

Output
go 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 runcbuildah :

  • 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:

/etc/containers/registries.conf
 # 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:

Output
IMAGE 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
Output
REPOSITORY 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:

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

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

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

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

Output
MD5: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
Output
cluster.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
Output
NAME 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 :

~ / k8s-cicd-webinar / webinar1 / 2-kubernetes / 1-Terraform / pod-kaniko.yaml
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:

Output
pod/kaniko created

Nhận danh sách các group :

  • kubectl get pods

Bạn sẽ thấy danh sách sau:

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

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

Output
time="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:

Output
kaniko: 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 khaiDị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:

~ / k8s-cicd-webinars / webinar1 / 2-kubernetes / 1-Terraform / deploy.yml
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:

Output
deployment.apps/nginx-deployment created

Liệt kê các triển khai của bạn:

  • kubectl get deployments
Output
NAME 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
Output
NAME 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:

~ / k8s-cicd-webinar / webinar1 / 2-kubernetes / 1-Terrafrom / service.yml
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:

Output
service/nginx-service created

Liệt kê các Dịch vụ:

  • kubectl get service

Bạn sẽ thấy danh sách sau:

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

~ / k8s-cicd-webinar / webinar1 / 2-kubernetes / 1-Terrafrom / crd.yml
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:

Output
customresourcedefinition.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:

Output
HTTP/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:

~ / k8s-cicd-webinar / webinar1 / 2-kubernetes / 1-Terrafrom / webinar.yml
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:

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

Output
webinar.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:

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


Tags:

Các tin liên quan