K8S 搭建 mongo 4.4 集群, 无密码认证 (后端存储为 阿里云 NAS 和 ceph)

mkdir -p /data/yaml/defalut/mongo
cd /data/yaml/defalut/mongo

这是购买的阿里云的nas服务,配置 StorageClass
sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas-mongo
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
  volumeAs: subpath
  server: "214ce4b610-quv89.cn-shenzhen.nas.aliyuncs.com:/default/mongo/"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain

sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  selector:
    matchLabels:
      app: mongodb
  serviceName: mongo
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: mongodb
        imagePullPolicy: IfNotPresent
        image: mongo:4.4
        command:
          - sh
          - -c
          - mongod --replSet rs --bind_ip_all  --wiredTigerCacheSizeGB 12
        env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name : TZ
          value: "Asia/Shanghai"
        resources:
          requests:
            cpu: 500m
            memory: 2048Mi
          limits:
            cpu: 2500m
            memory: 12Gi
        ports:
        - containerPort: 27017
          name: tcp
        livenessProbe:
          tcpSocket:
            port: 27017
          initialDelaySeconds: 180
          periodSeconds: 60
        volumeMounts:
        - mountPath: /data/db
          name: data
        - mountPath: /etc/localtime
          name: time-data
      volumes:
      - name: time-data 
        hostPath: 
          path: /usr/share/zoneinfo/Asia/Shanghai
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "alicloud-nas-mongo"
      resources:
        requests:
          storage: 50Gi

配置 svc-headless
svc-headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    app: mongodb
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  ports:
    - port: 27017
      targetPort: 27017
  clusterIP: None
  selector:
    app: mongodb

部署

kubectl apply -f sc.yaml
kubectl apply -f sts.yaml
kubectl apply -f svc-headless.yaml

如果需要外部通过 nodeport 访问可以使用下面方法

cat mongodb-0-external.yaml
apiVersion: v1
kind: Service
metadata:
  name: mongodb-0-external
spec:
  type: NodePort
  ports:    
    - port: 27017
      protocol: TCP
      targetPort: 27017
      nodePort: 27017          # 改成对应的 nodPort ip
---
apiVersion: v1
kind: Endpoints
metadata:
  name: mongodb-0-external
subsets:  
  - addresses:      
      - ip: "172.16.33.12"     # 这个ip改成自己对应的 pod ip
    ports:      
      - port: 27017


cat mongodb-1-external.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-1-external
spec:
  type: NodePort
  ports:    
    - port: 27017
      protocol: TCP
      targetPort: 27017
      nodePort: 37017       # 改成对应的 nodPort ip
---
apiVersion: v1
kind: Endpoints
metadata:
  name: mongodb-1-external
subsets:  
  - addresses:      
      - ip: "172.16.86.168"  # 这个ip改成自己对应的 pod ip
    ports:      
      - port: 27017


cat mongodb-2-external.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-2-external
spec:
  type: NodePort
  ports:    
    - port: 27017
      protocol: TCP
      targetPort: 27017
      nodePort: 47017           # 改成对应的 nodPort ip
---
apiVersion: v1
kind: Endpoints
metadata:
  name: mongodb-2-external
subsets:  
  - addresses:      
      - ip: "172.16.86.177"     # 这个ip改成自己对应的 pod ip
    ports:      
      - port: 27017

配置集群

kubectl exec -it mongodb-0 -- /bin/bash

mongo

var config={
     _id:"rs",
     members:[
         {_id:0,host:"mongodb-0.mongo.default.svc.cluster.local:27017"},
         {_id:1,host:"mongodb-1.mongo.default.svc.cluster.local:27017"},
         {_id:2,host:"mongodb-2.mongo.default.svc.cluster.local:27017"}
]};

# 启动副本集
rs.initiate(config)

# 显示副本集配置对象
rs.conf()

# 查看副本集的当前状态
rs.status()

如果后端存储需要使用 ceph,可以参考 https://www.cnblogs.com/klvchen/p/14792030.html

posted @ 2021-09-28 17:00  klvchen  阅读(382)  评论(0编辑  收藏  举报