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