MongoDB Chart Helm

Prometheus, một dự án CNCF, là một hệ thống giám sát dịch vụ và hệ thống. Nó thu thập các số liệu từ các mục tiêu được định cấu hình ở các khoảng thời gian nhất định, đánh giá các biểu thức quy tắc, hiển thị kết quả và có thể kích hoạt cảnh báo nếu một số điều kiện được coi là đúng

Biểu đồ này khởi động quá trình triển khai Prometheus trên cụm Kubernetes bằng trình quản lý gói Helm

Trong câu chuyện này, tôi sẽ thảo luận về cách triển khai MongoDB trên cụm Kubernetes bằng cách sử dụng biểu đồ helm và biểu đồ vanilla. Ngoài ra các vấn đề tôi gặp phải trong mỗi cách tiếp cận

giả định

Tôi giả định rằng cụm Kubernetes đã được triển khai trên AWS. Tôi chưa thử trên đám mây khác, nhưng tôi nghĩ rằng việc thay đổi Lớp lưu trữ theo nhà cung cấp đám mây (GCP hoặc AZURE) sẽ thực hiện công việc

điều kiện tiên quyết

Thật tuyệt vời nếu bạn biết mọi chi tiết cơ bản về Kubernetes và biểu đồ helm nhưng cần phải hiểu các khái niệm được đưa ra bên dưới để hiểu rõ hơn về nguyên tắc triển khai

  • Statefulsets
  • Bản sao MongoDB
Hướng dẫn triển khai

Trong quá trình nghiên cứu về cách triển khai MongoDB trên cụm Kubernetes, tôi đã tìm thấy hai cách tiếp cận

1- Bản kê khai vani

2- Biểu đồ lãnh đạo MongoDB

1- Bản kê khai vani

Tôi đã tìm thấy một bản kê khai vanilla sử dụng để triển khai MongoDB. Tôi sẽ không giải thích chi tiết cách tiếp cận này vì liên kết tôi cung cấp khá toàn diện. Mặc dù tôi sẽ mô tả ngắn gọn các vấn đề mà tôi gặp phải khi sử dụng phương pháp này

Hãy cẩn thận

  • Thay đổi quy mô các tập trạng thái sẽ tăng số lượng yêu cầu khối lượng liên tục (PVC) nhưng giảm quy mô sẽ không xóa PVC vì nó yêu cầu người dùng sao chép dữ liệu và xóa PVC theo cách thủ công
  • Các thành viên của ReplicaSet không chia sẻ dữ liệu với nhau do cấu hình không hợp lệ. Tôi đã giải quyết vấn đề này bằng cách khởi tạo lại cấu hình sao chép. Sử dụng lệnh dưới đây để làm điều đó
rs.initiate({ 
_id : "rs0",
members: [
{ _id: 0, host: "mongo-0.mongo:27017" },
{ _id: 1, host: "mongo-1.mongo:27017" },
{ _id: 2, host: "mongo-2.mongo:27017"}
]
})

Trong cấu hình trên, chúng ta chỉ cần gán cho mỗi host một id, một trong số chúng sẽ đóng vai trò là

$ rs.conf()# Output
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongo-0.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo-1.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo-2.mongo: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" : 60000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ccfd17a79b0a49ce7ee22fa")
}
}
3 trong khi những cái khác đóng vai trò là
$ rs.conf()# Output
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongo-0.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo-1.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo-2.mongo: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" : 60000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ccfd17a79b0a49ce7ee22fa")
}
}
4

Để kiểm tra xem cấu hình đã được khởi tạo thành công hay chưa, hãy sử dụng lệnh được cung cấp bên dưới trong vỏ mongo của nút chính

$ rs.conf()# Output
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongo-0.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo-1.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo-2.mongo: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" : 60000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ccfd17a79b0a49ce7ee22fa")
}
}

Mặc dù cách khắc phục này sẽ giải quyết vấn đề trên nhưng nó không phải là giải pháp khả thi vì chúng ta cần thực hiện việc này theo cách thủ công, sẽ rất đau đầu khi chúng ta tăng số lượng nút trong bộ bản sao MongoDB. Một vấn đề GitHub đã được tạo ra liên quan đến vấn đề này từ nhiều tháng trước nhưng nó vẫn còn mở

  • Một blog giải thích các vấn đề khác trong phương pháp triển khai này

Tôi khuyên bạn không nên sử dụng phương pháp này

2- Biểu đồ lãnh đạo MongoDB

Trong phương pháp này, chúng tôi sẽ triển khai MongoDB bằng cách sử dụng biểu đồ helm của nó

  • Trước hết, chúng ta cần tạo một lớp lưu trữ. Bảng kê khai lớp lưu trữ được đưa ra dưới đây
apiVersion: storage.k8s.io/v1beta1  
kind: StorageClass
metadata:
name:
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2

Tạo một lớp lưu trữ bằng cách sử dụng lệnh dưới đây

$ sudo kubectl apply -f .yaml

Để xác thực xem lớp lưu trữ có được tạo hay không, hãy sử dụng lệnh được cung cấp bên dưới

$ sudo kubectl get storageclasses# outputNAME                              PROVISIONER             AGE
kubernetes.io/aws-ebs 1d
  • Vì chúng ta đang sử dụng MongoDB Helm Releases nên nó yêu cầu Helm Operator phải được triển khai trong cụm
  • Bây giờ chúng tôi triển khai các bộ trạng thái MongoDB bằng biểu đồ helm của nó
apiVersion: flux.weave.works/v1beta1
kind: HelmRelease
metadata:
name: mongodb-deployment
namespace:
spec:
releaseName: mongodb-deployment
chart:
repository: https://kubernetes-charts.storage.googleapis.com
name: mongodb
version: 5.17.0
values: # headless service configs
service:
clusterIP: None
port: 27017

# mongodb replica set configuration
replicaSet:
replicas:
secondary: 1
pdb:
minAvailable:
primary: 1
enabled: true
name: mongo

# mongodb k8s pods labels
podLabels:
role: mongo
environment: test
# mongodb persistence configurations
persistence:
mountPath: /bitnami/mongodb
enabled: true
storageClass: ""
accessMode:
- "ReadWriteOnce"
size: Gi

Để triển khai bản phát hành mongo helm, hãy sử dụng lệnh được cung cấp bên dưới

________số 8

replace the with the namespace name in which you want to deploy MongoDB.

Để kiểm tra xem tập trạng thái có được tạo hay không, hãy sử dụng lệnh được cung cấp bên dưới

$ sudo kubectl get statefulsets -n # resultNAME                              DESIRED        CURRENT     AGE--arbiter    1               1        1m--primary    1               1        1m--secondary  1               1        1m

Để kiểm tra xem các nhóm có đang chạy không

$ rs.conf()# Output
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongo-0.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo-1.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo-2.mongo: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" : 60000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ccfd17a79b0a49ce7ee22fa")
}
}
0

Khi chúng tôi biết rằng các bộ và nhóm trạng thái đang chạy, chúng tôi sẽ cố gắng truy cập cơ sở dữ liệu

Sao chép tên của nhóm có từ khóa chính trong đó và chạy lệnh được cung cấp bên dưới

$ rs.conf()# Output
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongo-0.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo-1.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo-2.mongo: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" : 60000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ccfd17a79b0a49ce7ee22fa")
}
}
1

ở trên sẽ tạo một phiên với nút chính của bộ bản sao MongoDB, hãy chạy lệnh được cung cấp bên dưới để truy cập mongo CLI

$ rs.conf()# Output
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongo-0.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo-1.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo-2.mongo: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" : 60000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ccfd17a79b0a49ce7ee22fa")
}
}
0

Để kiểm tra bộ bản sao MongoDB đã được cấu hình đúng chưa. Chạy lệnh được đưa ra dưới đây trong vỏ mongo

$ rs.conf()# Output
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongo-0.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo-1.mongo:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo-2.mongo: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" : 60000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ccfd17a79b0a49ce7ee22fa")
}
}
1

Đầu ra có thể thay đổi dựa trên cấu hình của bạn nhưng nó phải bao gồm tất cả các nút là một phần của bộ bản sao

Hãy cẩn thận

Như chúng ta đều biết rằng không tồn tại xứ sở của kỳ lân và kẹo mút. Có một số cảnh báo mà tôi muốn chia sẻ với bạn được đưa ra dưới đây

Helm có bị phản đối không?

helm/charts không được dùng nữa và sẽ hết hiệu lực trước ngày 13 tháng 11 năm 2020 . Vì lý do này, nhóm datawire đã lấy lại quyền sở hữu biểu đồ này. Ambassador Chart hiện được lưu trữ tại datawire/ambassador-chart.

Helm có còn được sử dụng không?

Bạn vẫn có thể sử dụng helm để tạo tệp kê khai yaml dưới dạng trình tạo tĩnh. Ngoài ra, điều này bỏ qua những gì Helm giỏi. Nếu bạn là nhà phát triển của một dự án công cộng và muốn người dùng của bạn dễ dàng cài đặt ứng dụng k8s của bạn, thì một lệnh gói helm đơn giản rất hấp dẫn

Biểu đồ trong Helm là gì?

Helm sử dụng định dạng đóng gói được gọi là biểu đồ. Biểu đồ là tập hợp các tệp mô tả tập tài nguyên Kubernetes có liên quan . Một biểu đồ duy nhất có thể được sử dụng để triển khai thứ gì đó đơn giản, chẳng hạn như nhóm ghi nhớ hoặc thứ gì đó phức tạp, chẳng hạn như ngăn xếp ứng dụng web đầy đủ với máy chủ HTTP, cơ sở dữ liệu, bộ đệm, v.v.

Biểu đồ MongoDB là gì?

MongoDB Charts là công cụ để tạo các biểu diễn trực quan cho dữ liệu MongoDB của bạn . Trực quan hóa dữ liệu là một thành phần quan trọng để cung cấp hiểu biết rõ ràng về dữ liệu của bạn, làm nổi bật mối tương quan giữa các biến và giúp dễ dàng phân biệt các mẫu và xu hướng trong tập dữ liệu của bạn.