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 :
- Một cụm Kubernetes đang hoạt động chạy trên DigitalOcean, được cài đặt thông qua StackPointCloud , bạn có thể thực hiện điều này theo hướng dẫn Bắt đầu với Kubernetes .
- Ứng dụng web mẫu được giới thiệu trong hướng dẫn Triển khai và Mở rộng Microservices trong Kubernetes , dựa trên Node.js và MongoDB được mở rộng để mang lại tính khả dụng cao cho database . Để biết chi tiết về thiết kế ứng dụng, hãy tham khảo hướng dẫn Xây dựng ứng dụng được chứa trong thùng .
- Một account Docker Hub đang hoạt động để lưu trữ Docker image cho ứng dụng.
- Máy local có cài đặt Git
- Nếu bạn đang sử dụng macOS, hãy đảm bảo bạn đã cài đặt Homebrew .
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
OutputClient: &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
Outputvalues.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:
... # storageClass: "-" ...
Thay thế "-"
bằng "digitalocean"
, như thế này:
... 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.
OutputNAME: 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.
OutputNAME 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:
OutputNAME 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:
OutputMongoDB 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 :
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
.
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.
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:
Outputreplicaset "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.
OutputNAME 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
OutputNAME 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.
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
Outputreplicaset "web" scaled
Sau đó, bạn có thể chia tỷ lệ ứng dụng trở lại hai Pod.
- kubectl scale rs/web --replicas=2
Outputreplicaset "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
Outputpod "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:
OutputNAME 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
Outputreplicaset "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.
Các tin liên quan