K8s: Helm搭建mongodb集群(1)

发布于:2024-05-06 ⋅ 阅读:(26) ⋅ 点赞:(0)

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 的安装命令可能安装会报错,请使用 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.local
    
    To 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 -- bash
    
    Then, run the following command:
        mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
    
    To 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-mongo
        meta.helm.sh/release-namespace: default
      creationTimestamp: "2024-05-01T07:32:16Z"
      labels:
        app.kubernetes.io/component: mongodb
        app.kubernetes.io/instance: my-mongo
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: mongodb
        helm.sh/chart: mongodb-13.8.1
      name: my-mongo-mongodb
      namespace: default
      resourceVersion: "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.local
      
      To 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 -- bash
      
      Then, run the following command:
          mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
      
      To 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
  • $ 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:27017
          my-mongo-mongodb-1.my-mongo-mongodb-headless.default.svc.cluster.local:27017
      
      To 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 -- bash
      
      Then, 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          2m18s
    
    NAME                                        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   2m18s
    
    NAME                                        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>
      • 如果扩容缩容操作在云上,可以直接调整