本文主要是介绍K8s: Helm搭建mongodb集群(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
mongodb 集群搭建
- mongdb 部署前 需要创建 pvc, pv 和 sc,如果在云上会自动创建
- helm 应用中心: https://artifacthub.io
1 )Helm 安装 mongodb
A. 无本地存储配置,重启数据消失
- 在 https://artifacthub.io/packages/helm/bitnami/mongodb?modal=install 这个界面弹出的窗口中
- $
helm repo add bitnami https://charts.bitnami.com/bitnami
- 这样就添加了这个源,通过 $
helm repo ls
- 这样就添加了这个源,通过 $
- $
helm install my-mongodb bitnami/mongodb --version 13.8.1
- $
- 上面的 helm install 命令是官网提供的最简单的,在安装的时候可以配置一些参数
- 如:$
helm install my-mongo bitnami/mongodb --version 13.8.1 --set persistence.enabled=false,auth.rootPassword="123456_mongodb"
- 文档:https://artifacthub.io/packages/helm/bitnami/mongodb#mongodb-parameters
- 不同的参数,使用
,
分隔
- 如:$
- 注意,低版本的 helm 的安装命令可能安装会报错,请使用 helm-v3.11.1 以上版本
- 执行
install
命令后,会输出以下命令NAME: my-mongo LAST DEPLOYED: Wed May 1 15:32:14 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mongodb CHART VERSION: 13.8.1 APP VERSION: 6.0.4** Please be patient while the chart is being deployed **MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster:my-mongo-mongodb.default.svc.cluster.localTo get the root password run:export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)To connect to your database, create a MongoDB® client container:kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.4-debian-11-r10 --command -- bashThen, run the following command:mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORDTo connect to your database from outside the cluster execute the following commands:kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 &mongosh --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD
- 上面提示中,让我们把密码设置成当前节点的环境变量
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)
- 执行上面一行写入环境变量
- 其中这里
kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d
- 可以看到密码是上面设置的: 123456_mongodb
- $
printenv | grep MON
这样也可以看到环境变量中设置的密码MONGODB_ROOT_PASSWORD=123456_mongodb
- 通过上面给的这个命令
- $
kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image bitnami/mongodb:6.0.4-debian-11-r10 --command -- bash
If you don't see a command prompt, try pressing enter. I have no name!@my-mongo-mongodb-client:/$
- 这里,可以开启一个mongodb的客户端
- 注意,这里的镜像
docker.io/bitnami/mongodb:6.0.4-debian-11-r10
需要提前pull下 - 这个 docker.io 可能会有网络问题,参考 $
docker pull bitnami/mongodb:6.0.4-debian-11-r10
- $
- 通过上面的命令来进入数据库,注意这里, -p 后面基本没用,还得重新输入密码,因为安全性问题被高版本禁了
- $
mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
- 输入密码,这时候就已经连接进入 mongodb 数据库了,可以进行操作了
- 注意,这个pod如果一段时间不操作,会自动退出
- $
- $
kubectl get all | grep my-mongo
从这里可以看出,它是一个 deployment 而不是 StatefulSets- 因此,它不会存储任何状态,退出后,数据就丢了
- 从外部访问它,上面也提示了命令,进行转发
- $
kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 --address 0.0.0.0
Forwarding from 0.0.0.0:27017 -> 27017
- 注意,如果是云上转发,安全组需要配置入站规则
- 这时候,外部即可访问,通过node节点的ip加端口加用户名和密码
- 当然此作为简单示例,没有接入 Ingress 网络
- $
- 查看 deployment $
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE my-mongo-mongodb 1/1 1 1 3h55m
- 重新部署 $
kubectl rollout restart deployment my-mongo-mongodb
deployment.apps/my-mongo-mongodb restarted
- 并且重新 port-forward 转发 $
kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 --address 0.0.0.0
- 发现数据丢失了 …
- 查看密码 $
kubectl get secret | grep my-mongo-mongodb
my-mongo-mongodb Opaque 1 4h9m my-mongo-mongodb-token-89wcr kubernetes.io/service-account-token 3 4h9m
- $
kubectl get secret my-mongo-mongodb -o yaml
apiVersion: v1 data:mongodb-root-password: MTIzNDU2X21vbmdvZGI= kind: Secret metadata:annotations:meta.helm.sh/release-name: my-mongometa.helm.sh/release-namespace: defaultcreationTimestamp: "2024-05-01T07:32:16Z"labels:app.kubernetes.io/component: mongodbapp.kubernetes.io/instance: my-mongoapp.kubernetes.io/managed-by: Helmapp.kubernetes.io/name: mongodbhelm.sh/chart: mongodb-13.8.1name: my-mongo-mongodbnamespace: defaultresourceVersion: "307736"uid: b0ef31fe-60cc-46a3-8bc6-510692b96d8d type: Opaque
- 可以看到,密码被base64加密了
- 现在需要重新安装有存储的,把之前的卸载了
- $
kubectl uninstall my-mongo
- 这样会同步删除其他相关的附带配置, 使用 delete 是删不干净的
- $
- 无本地存储配置,重启数据消失
B.搭建 mongodb 有本地存储,重启数据保留
- 在安装的时候和上述有区别, 直接安装是不会成功的,需要配置 PVC
- persistence.size 默认是8Gi, 如果在云上可能是10的倍数
- $
helm install my-mongo bitnami/mongodb --version 13.8.1 --set persistence.size=10Gi,auth.rootPassword="123456_mongodb"
- 这时候会自动创建 pvc
NAME: my-mongo LAST DEPLOYED: Thu May 2 08:59:53 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mongodb CHART VERSION: 13.8.1 APP VERSION: 6.0.4** Please be patient while the chart is being deployed **MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster:my-mongo-mongodb.default.svc.cluster.localTo get the root password run:export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)To connect to your database, create a MongoDB® client container:kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.4-debian-11-r10 --command -- bashThen, run the following command:mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORDTo connect to your database from outside the cluster execute the following commands:kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 &mongosh --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD
- 注意,这里如果在云上,会自动创建 pvc, pv, storage class, 以及云硬盘, 在本地的话,需要自己处理
- 参考: https://blog.csdn.net/Tyro_java/article/details/138157501
- 这时候会自动创建 pvc
- $
kubectl get pvc
验证获取 pvc - 上面提示的命令,都执行以下,进行开启终端和进行连接
- 以及参考上面无存储的进行转发处理,在外部进行客户端的连接, 以及重启后验证数据是否丢失
- 如果在云上,端口这块,要配置安全组规则
- 注意,
uninstall
执行的时候,存储也会丢失,注意提前备份 - 更多的配置,参考文档
2 )Helm 搭建mongodb集群
- $
helm install my-mongo bitnami/mongodb --version 13.8.1 --set architecture="replicaset",persistence.size=10Gi,auth.rootPassword="123456_mongodb"
- 注意, 这里添加了
architecture="replicaset",
默认值是 standalone - 这样就可以设置成主从数据库了
NAME: my-mongo LAST DEPLOYED: Thu May 2 13:46:04 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mongodb CHART VERSION: 13.8.1 APP VERSION: 6.0.4** Please be patient while the chart is being deployed **MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster:my-mongo-mongodb-0.my-mongo-mongodb-headless.default.svc.cluster.local:27017my-mongo-mongodb-1.my-mongo-mongodb-headless.default.svc.cluster.local:27017To get the root password run:export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)To connect to your database, create a MongoDB® client container:kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.4-debian-11-r10 --command -- bashThen, run the following command:mongosh admin --host "my-mongo-mongodb-0.my-mongo-mongodb-headless.default.svc.cluster.local:27017,my-mongo-mongodb-1.my-mongo-mongodb-headless.default.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
- 注意, 这里添加了
- $
kubectl get all
NAME READY STATUS RESTARTS AGE pod/my-mongo-mongodb-0 1/1 Running 0 2m18s pod/my-mongo-mongodb-arbiter-0 1/1 Running 0 2m18sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 6d2h service/my-mongo-mongodb-arbiter-headless ClusterIP None <none> 27017/TCP 2m18s service/my-mongo-mongodb-headless ClusterIP None <none> 27017/TCP 2m18sNAME READY AGE statefulset.apps/my-mongo-mongodb 2/2 2m18s statefulset.apps/my-mongo-mongodb-arbiter 1/1 2m18s
- 可以看到是 statefulset 而非 deployment
- 这里 Arbiter永远是Arbiter,Arbiter 节点只参与投票,不能被选为 Primary,并且不从 Primary 同步数据
- 而Primary可能退下来成为Secondary,而Secondary可能在选举期间成为Primary
- 过一会儿 $
kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-mongo-mongodb-0 1/1 Running 0 7m15s 10.244.1.90 node1.k8s <none> <none> my-mongo-mongodb-1 1/1 Running 0 7m05s 10.244.1.91 node1.k8s <none> <none> my-mongo-mongodb-arbiter-0 1/1 Running 0 7m15s 10.244.1.89 node1.k8s <none> <none>
- 可以看到,现在已经有2个节点,以及一个选举节点
- 按照上面提示给出的命令进行配置环境变量,以及客户端不再赘述
- 要连接这个集群上面也给出了命令提示
mongosh admin --host "my-mongo-mongodb-0.my-mongo-mongodb-headless.default.svc.cluster.local:27017,my-mongo-mongodb-1.my-mongo-mongodb-headless.default.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
- 这里是主从的集群,有2个库,my-mongo-mongodb-0 和 my-mongo-mongodb-1
- 如果一台挂掉,另一台还会继续提供服务
- 如果想要连接一台,就把其中的一台给去掉
- 选择其中之一进行连接,你就会知道,连接的是主节点还是从节点
- 如果在从节点执行查询前,还需要设置查询的权限, 执行 $
rs.secondaryOk()
- 关于扩容和缩容
- 扩容 $
kubectl scale statefulset <statefulset-name> --replicas=<new-replica-count> -n <namespace>
- 缩容 $
kubectl scale statefulset <statefulset-name> --replicas=<new-replica-count> -n <namespace>
- 如果扩容缩容操作在云上,可以直接调整
- 扩容 $
这篇关于K8s: Helm搭建mongodb集群(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!