部署步骤
详细拆解 k8s
部署 mongodb
副本集(Replica-Set
)模式相关服务的执行步骤。
1. Secret
apiVersion: v1
kind: Secret
metadata:name: mongodb-secret
type: Opaque
data:mongo-root-username: <base64-encoded-username>mongo-root-password: <base64-encoded-password>
- 优化建议:确保 和 已经正确编码为 Base64 格式。
- 解释:Secret 用于存储敏感信息,如用户名和密码,以保护这些信息不被直接暴露。
2. ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:name: mongodb-init
data:init-mongo.js: |rs.initiate({_id : "rs0",members: [{ _id: 0, host: "mongodb-replica-set-0.mongodb-replica-set:27017" },{ _id: 1, host: "mongodb-replica-set-1.mongodb-replica-set:27017" },{ _id: 2, host: "mongodb-replica-set-2.mongodb-replica-set:27017" }]})
- 优化建议:确保
init-mongo.js
脚本中的主机名和端口与StatefulSet
中的配置一致。 - 解释:
ConfigMap
用于存储配置文件或脚本,这里用于初始化MongoDB
的副本集。
3. StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mongodb-replica-set
spec:serviceName: "mongodb-replica-set"replicas: 3selector:matchLabels:app: mongodb-replica-settemplate:metadata:labels:app: mongodb-replica-setspec:containers:- name: mongodbimage: mongo:7.0.14ports:- containerPort: 27017volumeMounts:- name: mongodb-datamountPath: /data/db- name: mongodb-init-scriptsmountPath: /docker-entrypoint-initdb.denv:- name: MONGO_INITDB_ROOT_USERNAMEvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-username- name: MONGO_INITDB_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-password- name: MONGO_REPLICA_SET_NAMEvalue: rs0volumeClaimTemplates:- metadata:name: mongodb-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 20Givolumes:- name: mongodb-init-scriptsconfigMap:name: mongodb-init
- 优化建议:
- 确保
volumeClaimTemplates
中的存储请求大小(storage: 20Gi
)符合实际需求。 - 确保
image: mongo:7.0.14
是否最新的稳定版本。
- 确保
- 解释:
StatefulSet
用于管理有状态的应用程序,如MongoDB
副本集。它确保每个Pod
有一个唯一的标识符,并且可以持久化存储数据。
4. Service for MongoDB
apiVersion: v1
kind: Service
metadata:name: mongodb-replica-set
spec:ports:- port: 27017targetPort: 27017clusterIP: Noneselector:app: mongodb-replica-set
- 优化建议:确保
clusterIP: None
,这表示这是一个Headless Service
,适用于StatefulSet
。 - 解释:
Service
用于定义如何访问Pod
,Headless Service
不会分配集群IP
,而是通过DNS
解析Pod
的IP
地址。
5. Deployment for Mongo Express
apiVersion: apps/v1
kind: Deployment
metadata:name: mongo-express
spec:replicas: 1selector:matchLabels:app: mongo-expresstemplate:metadata:labels:app: mongo-expressspec:containers:- name: mongo-expressimage: mongo-express:1.0.2-20-alpine3.19ports:- containerPort: 8081env:- name: ME_CONFIG_MONGODB_URLvalue: "mongodb://<username>:<password>@mongodb-replica-set-0.mongodb-replica-set:27017,mongodb-replica-set-1.mongodb-replica-set:27017,mongodb-replica-set-2.mongodb-replica-set:27017/?replicaSet=rs0"- name: ME_CONFIG_MONGODB_ENABLE_ADMINvalue: "true"- name: ME_CONFIG_MONGODB_ADMINUSERNAMEvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-username- name: ME_CONFIG_MONGODB_ADMINPASSWORDvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-password
- 优化建议:
- 确保
ME_CONFIG_MONGODB_URL
中的<username>
和<password>
替换为实际的用户名和密码。 - 确保
image: mongo-express:1.0.2-20-alpine3.19
是最新的稳定版本。
- 确保
- 解释:
Deployment
用于管理无状态的应用程序,如Mongo Express
,它提供了一个Web
界面来管理和监控MongoDB
。
6. Service for Mongo Express
apiVersion: v1
kind: Service
metadata:name: mongo-express
spec:ports:- port: 8081targetPort: 8081selector:app: mongo-expresstype: LoadBalancer
- 优化建议:确保
type: LoadBalancer
符合你的环境要求,如果你在本地开发环境中,可能需要改为NodePort
。 - 解释:
Service
用于定义如何访问mongo-express
,LoadBalancer
类型通常用于云环境中,提供外部访问。
应用配置
可将上述内容保存为一个文件(例如:k8s-mongodb-replicaset.yaml
),然后使用以下命令将其应用到 Kubernetes
集群中:
kubectl apply -f k8s-mongodb-replicaset.yaml
这样,你就可以在 Kubernetes
中部署一个高可用的 MongoDB
副本集和一个用于管理和监控的 Mongo Express
。
总结
Secret
和ConfigMap
确保了敏感信息和初始化脚本的安全性和正确性。StatefulSet
和Service
确保了MongoDB
副本集(Replica-Set
)的高可用性和数据持久化。Deployment
和Service
确保了Mongo Express
的正常运行和外部访问。