Thứ tư, 11/04/2018 | 00:00 GMT+7

Chuỗi hội thảo trên web: Triển khai các dịch vụ hữu ích trong Kubernetes

Bài viết này bổ sung chuỗi hội thảo trên web về triển khai và quản lý dung lượng công việc được chứa trong cloud . Loạt bài này bao gồm các yếu tố cần thiết của containers , bao gồm quản lý vòng đời của containers , triển khai các ứng dụng đa containers , mở rộng dung lượng công việc và làm việc với Kubernetes. Nó cũng nêu bật các phương pháp hay nhất để chạy các ứng dụng trạng thái.

Hướng dẫn này bao gồm các khái niệm và lệnh trong phiên thứ năm của loạt bài, Triển khai Dịch vụ Trạng thái trong Kubernetes.

Kubernetes là một công cụ điều phối containers open-souce để quản lý các ứng dụng được chứa trong containers . Trong các phần trước của loạt bài này, bạn đã tìm hiểu các khối xây dựng của Kubernetes và các container đóng gói dưới dạng Kubernetes ReplicaSets. Trong khi ReplicaSets đảm bảo tính khả dụng của các Pod không trạng thái, chúng không thể được sử dụng với dung lượng công việc trạng thái như cụm database .

Mặc dù có thể dễ dàng đóng gói, triển khai, quản lý và mở rộng quy mô các ứng dụng root cloud hiện đại trong Kubernetes, nhưng việc triển khai và quản lý dung lượng công việc truyền thống như database và hệ thống quản lý nội dung trong một môi trường được chứa đựng đòi hỏi một cách tiếp cận khác. StatefulSets mang lại sự linh hoạt của Kubernetes ReplicaSet cho dung lượng công việc trạng thái.

Trong phần cuối cùng của loạt bài hướng dẫn này, bạn sẽ triển khai MongoDB ReplicaSet rất sẵn có trong Kubernetes dưới dạng StatefulSet bằng cách sử dụng Helm , một trình quản lý gói open-souce phổ biến cho Kubernetes.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần :

Bước 1 - Cài đặt Helm Client trên Máy phát triển

Với Helm, administrator có thể triển khai các ứng dụng Kubernetes phức tạp chỉ với một lệnh duy nhất. Các ứng dụng được đóng gói dưới dạng Biểu đồ xác định, cài đặt và nâng cấp các ứng dụng Kubernetes. Biểu đồ cung cấp sự trừu tượng về các đối tượng Kubernetes như Pods, Deployments và Services.

Helm có hai thành phần - server và client . Phía server của Helm chạy trong Kubernetes dưới dạng một Dịch vụ được gọi là Tiller. Máy khách là một công cụ dòng lệnh tương tác với Tiller.

Vì bạn sẽ triển khai Biểu đồ Helm MongoDB ReplicaSet, bạn cần CLI nói chuyện với Tiller, thành phần phía server của Helm. StackPointCloud, mà bạn đã sử dụng để cài đặt Kubernetes trên DigitalOcean, được cài đặt sẵn Tiller.

Lưu ý : Các hướng dẫn này dành cho macOS. Nếu bạn đang sử dụng hệ điều hành khác, vui lòng tham khảo hướng dẫn cài đặt Helm .

Giả sử bạn đã cài đặt và cấu hình Homebrew trên máy Mac, hãy chạy lệnh sau để cài đặt Helm:

  • brew install kubernetes-helm
Output
==> Downloading https://homebrew.bintray.com/bottles/kubernetes-helm-2.8.2.high_sierra.bottle.tar.gz ... ==> Summary 🍺 /usr/local/Cellar/kubernetes-helm/2.8.2: 50 files, 121.7MB

Sau khi Helm được cài đặt, hãy xác minh bạn có thể chạy nó bằng cách kiểm tra version hiện tại của nó.

  • helm version
Output
Client: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}

Điều này xác nhận client đã được cài đặt đúng cách và có thể nói chuyện với Tiller.

Trong bước tiếp theo, ta sẽ sử dụng Helm để triển khai MongoDB ReplicaSet trong Kubernetes.

Bước 2 - Triển khai MongoDB ReplicaSet trong Kubernetes

StorageClass trong Kubernetes cung cấp một cách để administrator mô tả "các lớp" lưu trữ mà họ cung cấp. Ví dụ: khi user yêu cầu một dung lượng lưu trữ, StorageClass sẽ xác định lớp backend lưu trữ nào được cung cấp từ họ. Các lớp có thể bao gồm HDD tiêu chuẩn và SSD nhanh hơn. Đằng sau mức thấp , StorageClass tương tác với cơ sở hạ tầng bên dưới, chẳng hạn như API của nhà cung cấp cloud , để cung cấp dung lượng lưu trữ.

Vì bạn cần dung lượng lưu trữ liên tục để lưu trữ dữ liệu MongoDB, bạn có thể cần đính kèm dung lượng Lưu trữ khối DigitalOcean vào một nút công nhân và trỏ MongoDB Pod để sử dụng dung lượng lưu trữ cho liên tục.

Trong trường hợp này, StorageClass hoạt động như giao diện giữa Pod và dịch vụ lưu trữ khối DigitalOcean. Khi bạn yêu cầu một dung lượng lưu trữ khối, StorageClass nói chuyện với trình điều khiển được cấu hình sẵn để biết cách phân bổ dung lượng lưu trữ khối.

StackPointCloud cài đặt trình điều khiển lưu trữ DigitalOcean và đăng ký StorageClass với Kubernetes trong quá trình cài đặt . Điều này giúp ta tiết kiệm từ các bước liên quan đến cài đặt và cấu hình trình điều khiển và StorageClass.

Trước khi ta triển khai cụm MongoDB, hãy đảm bảo StorageClass cho dung lượng DigitalOcean được cấu hình :

  • kubectl get storageclass

Đầu ra xác nhận StorageClass đã được cấu hình và sẵn sàng.

[secondary_label Output NAME                     PROVISIONER                            AGE digitalocean (default)   digitalocean/flex-volume-provisioner   1d 

Tiếp theo, bạn sẽ cấu hình và triển khai MongoDB ReplicaSet dựa trên DigitalOcean StorageClass.

Tạo một folder mới cho dự án của bạn và chuyển sang folder mới:

  • mkdir ~/mongo-rs
  • cd ~/mongo-rs

Sao chép repository Biểu đồ Helm từ GitHub:

  • git clone https://github.com/kubernetes/charts.git

Điều hướng đến folder MongoDB ReplicaSet ( charts/stable/mongodb-replicaset/ ) và xác minh file giá values.yaml tồn tại.

  • cd charts/stable/mongodb-replicaset/
  • ls values.yaml
Output
values.yaml

Tệp này chứa các thông số và cấu hình cho biểu đồ. Bạn cần sửa đổi file này để cấu hình MongoDB ReplicaSet để sử dụng DigitalOcean StorageClass.

Chỉnh sửa giá values.yaml :

  • nano values.yaml

Tìm và bỏ ghi chú phần sau:

giá trị.yaml
... # storageClass: "-"  ... 

Thay thế "-" bằng "digitalocean" , như thế này:

giá trị.yaml
... storageClass: "digitalocean" ... 

Lưu file và thoát khỏi editor .

Bây giờ chuyển đến folder ~/mongo-rs .

  • cd ~/mongo-rs

Đến đây bạn đã sẵn sàng triển khai MongoDB ReplicaSet cho cụm Kubernetes của bạn , được cung cấp bởi bộ nhớ khối của DigitalOcean. Chạy lệnh sau để chạy cụm database .

  • helm install --name=todo -f charts/stable/mongodb-replicaset/values.yaml stable/mongodb-replicaset

Trong lệnh trước, --name đề cập đến tên của biểu đồ Helm. Lựa chọn -f trỏ đến cài đặt cấu hình được lưu trữ trong các giá values.yaml .

Bạn sẽ thấy ngay kết quả xác nhận quá trình tạo biểu đồ đã bắt đầu.

Output
NAME: todo LAST DEPLOYED: Sat Mar 31 10:37:06 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE todo-mongodb-replicaset ClusterIP None <none> 27017/TCP 1s ==> v1beta1/StatefulSet NAME DESIRED CURRENT AGE todo-mongodb-replicaset 3 1 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE todo-mongodb-replicaset-0 0/1 Init:0/2 0 0s ==> v1/ConfigMap NAME DATA AGE todo-mongodb-replicaset 1 1s todo-mongodb-replicaset-tests 1 1s NOTES: 1. After the statefulset is created completely, one can check which instance is primary by running: $ for ((i = 0; i < 3; ++i)); do kubectl exec --namespace default todo-mongodb-replicaset-$i -- sh -c 'mongo --eval="printjson(rs.isMaster())"'; done 2. One can insert a key into the primary instance of the mongodb replica set by running the following: MASTER_POD_NAME must be replaced with the name of the master found from the previous step. $ kubectl exec --namespace default MASTER_POD_NAME -- mongo --eval="printjson(db.test.insert({key1: 'value1'}))" 3. One can fetch the keys stored in the primary or any of the slave nodes in the following manner. POD_NAME must be replaced by the name of the pod being queried. $ kubectl exec --namespace default POD_NAME -- mongo --eval="rs.slaveOk(); db.test.find().forEach(printjson)"

Bây giờ ta hãy chạy một loạt lệnh để theo dõi trạng thái của cụm.

Đầu tiên, hãy nhìn vào StatefulSet:

  • kubectl get statefulset

Lệnh này xác nhận MongoDB ReplicaSet được tạo dưới dạng Kubernetes StatefulSet.

Output
NAME DESIRED CURRENT AGE todo-mongodb-replicaset 3 2 2m

Bây giờ khám phá các Pods:

  • kubectl get pods

Số lượng các Group và quy ước đặt tên của chúng cho biết MongoDB ReplicaSet được cấu hình thành công:

Output
NAME READY STATUS RESTARTS AGE todo-mongodb-replicaset-0 1/1 Running 0 3m todo-mongodb-replicaset-1 1/1 Running 0 1m todo-mongodb-replicaset-2 1/1 Running 0 54s

Lưu ý mỗi Pod có một hậu tố kết thúc bằng một số thứ tự, đây là một đặc điểm khác biệt của StatefulSet.

Bây giờ hãy kiểm tra xem các cá thể MongoDB có đang giao tiếp với nhau hay không. Ta sẽ thực hiện điều này bằng cách chạy một lệnh trong shell MongoDB trong một trong các Group .

Sử dụng kubectl để chạy console mongo trên một trong các server :

  • kubectl exec -it todo-mongodb-replicaset-0 mongo

Sau khi kết nối, bạn sẽ thấy mình ở trong MongoDB shell:

Output
MongoDB shell version v3.6.3 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.6.3 Welcome to the MongoDB shell. For interactive help, type "help". ... 2018-03-31T05:08:20.239+0000 I CONTROL [initandlisten]

Kiểm tra cấu hình của ReplicaSet bằng lệnh sau:

  • rs.conf()

Đầu ra xác nhận có ba version MongoDB đang chạy dưới dạng ReplicaSet.

Output
{ "_id" : "rs0", "version" : 3, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "todo-mongodb-replicaset-0.todo-mongodb-replicaset.default.svc.cluster.local:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "todo-mongodb-replicaset-1.todo-mongodb-replicaset.default.svc.cluster.local:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "todo-mongodb-replicaset-2.todo-mongodb-replicaset.default.svc.cluster.local:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5abdb4f61d952afc4b0b8218") } }

Thoát khỏi console MongoDB:

  • exit

Điều này cũng sẽ ngắt kết nối bạn với server từ xa của bạn.

Hãy chuyển đổi bánh răng và kiểm tra console DigitalOcean để biết dung lượng lưu trữ khối được liên kết với cụm. Đăng nhập vào account DigitalOcean của bạn và chọn tab Dung lượng :

 Control panel  hiển thị  dung lượng

Bạn có thể thấy rằng ba dung lượng 10GB mỗi khối được gắn vào các node công nhân Kubernetes. Mỗi Pod của MongoDB StatefulSet đang lưu trữ dữ liệu trong một trong các khối lưu trữ khối. Kích thước của 10GB được xác định trong các giá values.yaml trong phần values.yaml persistentVolume .

giá trị.yaml
persistentVolume:   enabled: true   ## mongodb-replicaset data Persistent Volume Storage Class   ## If defined, storageClassName: <storageClass>   ## If set to "-", storageClassName: "", which disables dynamic provisioning   ## If undefined (the default) or set to null, no storageClassName spec is   ##   set, choosing the default provisioner.  (gp2 on AWS, standard on   ##   GKE, AWS & OpenStack)   ##   storageClass: digitalocean   accessModes:     - ReadWriteOnce   size: 10Gi   annotations: {} 

Bạn đã cấu hình thành công một MongoDB ReplicaSet khả dụng cao đang chạy trong Kubernetes.

Bây giờ, hãy triển khai ứng dụng web nói chuyện với cụm MongoDB.

Bước 3 - Triển khai và mở rộng ứng dụng web trong Kubernetes

Hãy mở rộng ứng dụng ToDo Node.js mà ta đã sử dụng trong các phần trước của loạt bài hướng dẫn này để tận dụng lợi thế của cụm MongoDB.

Lưu ý : Bạn cũng có thể tạo containers images từ mã nguồn hoặc sử dụng trực tiếp file YAML trong file Kubernetes. Tham khảo hướng dẫn Triển khai và Mở rộng quy mô Microservices trong Kubernetes để biết các bước xây dựng hình ảnh và triển khai ứng dụng cho Kubernetes.

Bắt đầu bằng cách tạo một folder làm việc mới:

  • mkdir ~/web-app
  • cd ~/web-app

Sau đó sao chép kho ứng dụng ToDo có chứa mã và các tạo tác Kubernetes.

  • git clone https://github.com/janakiramm/todo.git

Chuyển sang folder todo-app/kubernetes chứa các file cấu hình Kubernetes.

  • cd todo-app/kubernetes

Mở file web-rs-ss.yaml trong editor .

  • nano web-rs-ss.yaml

Lưu ý phần env trên file YAML.

web-rs-ss.yaml
      containers:       - name: web          image: janakiramm/todo         env:           - name: "DBHOST"             value: "mongodb://todo-mongodb-replicaset-0.todo-mongodb-replicaset,todo-mongodb-replicaset-1.todo-mongodb-replicaset,todo-mongodb-replicaset-2.todo-mongodb-replicaset:27017"         ports:         - containerPort: 3000 

Điều này chuyển chuỗi kết nối database đến ứng dụng trong thời gian chạy dưới dạng một biến môi trường. Thay vì trỏ ứng dụng đến MongoDB Pod đơn giản, version này của ứng dụng sử dụng StatefulSet mà bạn đã tạo. Mỗi mục nhập trong phần value đề cập đến một trong các Group của MongoDB StatefulSet.

Sử dụng kubectl để triển khai ReplicaSet web cùng với Dịch vụ web

  • kubectl create -f web-rs-ss.yaml -f web-service.yaml

Bạn sẽ thấy rằng cả hai đều được tạo:

Output
replicaset "web" created service "web" created

Liệt kê lại các group :

  • kubectl get pods

Đến đây bạn thấy tất cả các Pod thuộc MongoDB và ứng dụng web.

Output
NAME READY STATUS RESTARTS AGE todo-mongodb-replicaset-0 1/1 Running 0 26m todo-mongodb-replicaset-1 1/1 Running 0 24m todo-mongodb-replicaset-2 1/1 Running 0 23m web-t5zzk 1/1 Running 0 17s web-x6dh8 1/1 Running 0 17s Let’s check out the Kubernetes services ​```command kubectl get svc
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.3.0.1 <none> 443/TCP 1d todo-mongodb-replicaset ClusterIP None <none> 27017/TCP 27m web NodePort 10.3.0.167 <none> 3000:31201/TCP 14s

web Pods nói chuyện với cụm MongoDB thông qua Dịch vụ todo-mongodb-replicaset . Ứng dụng web có sẵn thông qua Dịch vụ web trên NodePort 31201 .

Truy cập cổng này trên bất kỳ nút công nhân nào sẽ hiển thị ứng dụng web.

Ứng dụng danh sách Todo trực tiếp

Bạn có thể mở rộng ứng dụng web bằng cách tăng số lượng Group trong ReplicaSet.

  • kubectl scale rs/web --replicas=10
Output
replicaset "web" scaled

Sau đó, bạn có thể chia tỷ lệ ứng dụng trở lại hai Pod.

  • kubectl scale rs/web --replicas=2
Output
replicaset "web" scaled

Bây giờ ta hãy chạy một số kiểm tra tính khả dụng.

Bước 4 - Kiểm tra MongoDB ReplicaSet để biết tính khả dụng cao

Một trong những lợi thế của việc chạy StatefulSet là dung lượng công việc có sẵn cao. Hãy kiểm tra điều này bằng cách xóa một trong các Pod trong MongoDB StatefulSet.

  • kubectl delete pod todo-mongodb-replicaset-2
Output
pod "todo-mongodb-replicaset-2" deleted

Kiểm tra số lượng Pod:

  • kubectl get pods

Bạn sẽ thấy rằng todo-mongodb-replicaset-2 đang kết thúc:

Output
NAME READY STATUS RESTARTS AGE todo-mongodb-replicaset-0 1/1 Running 0 33m todo-mongodb-replicaset-1 1/1 Running 0 32m todo-mongodb-replicaset-2 0/1 Terminating 0 31m web-t5zzk 1/1 Running 0 8m web-x6dh8 1/1 Running 0 8m

Trong vòng vài phút, bạn sẽ thấy Kubernetes khởi tạo một Pod khác để thay thế Pod đã bị xóa.

  • kubectl get pods

Bạn sẽ thấy todo-mongodb-replicaset-2 đang khởi tạo:

NAME                        READY     STATUS     RESTARTS   AGE todo-mongodb-replicaset-0   1/1       Running    0          34m todo-mongodb-replicaset-1   1/1       Running    0          33m todo-mongodb-replicaset-2   0/1       Init:0/2   0          29s web-t5zzk                   1/1       Running    0          8m web-x6dh8                   1/1       Running    0          8m 

Đến đây bạn biết mọi thứ đều hoạt động, bạn có thể dọn dẹp mọi thứ.

Xóa tất cả các đối tượng được tạo trong hướng dẫn này bằng các lệnh sau:

  • helm delete --purge todo
  • kubectl delete -f web-rs-ss.yaml -f web-service.yaml
Output
replicaset "web" deleted service "web" deleted

Để xóa chính cụm Kubernetes, hãy truy cập StackPointCloud và làm như vậy thông qua console của chúng.

Kết luận

Trong hướng dẫn này, bạn đã triển khai MonogDB ReplicaSet bền, liên tục, có tính khả dụng cao dưới dạng Kubernetes StatefulSet. Bạn cũng đã học cách truy cập StatefulSet từ các ứng dụng khác được triển khai trong cùng một cụm Kubernetes.


Tags:

Các tin liên quan