以下是一个k8s上部署mongodb的简单例子
创建了一个mongodb的namespace, 创建了SA, clusterrole,名为mongo的服务, 名为mongo的3个有状态副本
mongo.yaml
# mongo.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mongodb
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: mongo
namespace: mongodb
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: mongo
subjects:
- kind: ServiceAccount
name: mongo
namespace: mongodb
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: Service
metadata:
name: mongo
namespace: mongodb
labels:
name: mongo
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
role: mongo
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo
namespace: mongodb
spec:
serviceName: mongo
replicas: 3
selector:
matchLabels:
role: mongo
environment: staging
template:
metadata:
labels:
role: mongo
environment: staging
replicaset: MainRepSet
spec:
affinity:
podAntiAffinity: # 添加 Pod 反亲和性,将副本打散在不同的节点
preferredDuringSchedulingIgnoredDuringExecution: # 软策略
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: replicaset
operator: In
values:
- MainRepSet
topologyKey: kubernetes.io/hostname
terminationGracePeriodSeconds: 10
serviceAccountName: mongo
containers:
- name: mongo
image: mongo:4.4
command:
- mongod
- "--wiredTigerCacheSizeGB"
- "0.25"
- "--bind_ip"
- "0.0.0.0"
- "--replSet"
- MainRepSet
#- "--smallfiles"
#- "--noprealloc"
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-data
mountPath: /data/db
resources:
requests:
cpu: 1
memory: 2Gi
- name: mongo-sidecar
image: cvallance/mongo-k8s-sidecar
env:
- name: MONGO_SIDECAR_POD_LABELS
value: "role=mongo,environment=staging"
- name: KUBE_NAMESPACE
value: "mongo"
- name: KUBERNETES_MONGO_SERVICE_NAME
value: "mongo"
volumeClaimTemplates:
- metadata:
name: mongo-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: openebs-hostpath # 提供一个可用的 Storageclass
resources:
requests:
storage: 30Gi
3个pod启动以后, 进入其中一个pod,然后执行集群创建命令
kubectl -n mongodb exec -it mongo-0 -- mongo
rs.status() #查看集群状态
#创建集群
config = { _id:"MainRepSet", members:[
{_id:0,host:"mongo-0.mongo.mongodb.svc.cluster.local:27017",priority:90},
{_id:1,host:"mongo-1.mongo.mongodb.svc.cluster.local:27017",priority:80},
{_id:2,host:"mongo-2.mongo.mongodb.svc.cluster.local:27017",priority:70}
]
}
rs.initiate(config);
rs.status() #查看集群状态
优化
set -o errexit
set -o pipefail
set -o nounset
echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
设置或修改密码
#查看数据库
show dbs
#切换admin库
use admin
#创建管理员账户,用于管理账号,不能进行关闭数据库
db.createUser({ user: "admin", pwd: "password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
#创建root,超级管理员root,可关闭数据库
db.createUser({user: "root",pwd: "password", roles: [ { role: "root", db: "admin" } ]})
#创建用户自己的数据库的管理角色,一定要切换到所在数据库上去创建用户,不然创建的用户还是属于admin。
use yourdatabase
db.createUser({user: "user",pwd: "password",roles: [ { role: "dbOwner", db: "yourdatabase" } ]})
#查看用户
show users
#删库用户
use admin
db.auth("admin","password")
#删除单个用户
db.system.users.remove({user:"XXXXXX"})
#删除所有用户
db.system.users.remove({}
#连接字符串
mongodb://username:password@ip:port/database
mongodb://username:password@ip0:port,ip1:port,ip2:port/database?replicaSet=MainRepSet
springboot 在nacos中的配置
mongodb:
uri: mongodb://mongo-0.mongo.mongodb.svc.cluster.local:27017,mongo-1.mongo.mongodb.svc.cluster.local:27017,mongo-2.mongo.mongodb.svc.cluster.local:27017/database?replicaSet=MainRepSet
auto-index-creation: true # 默认为false,即不会自动创建索引