部署步骤
详细拆解 k8s 部署 mongodb 副本集(Replica-Set)模式相关服务的执行步骤。
1. Secret
yaml
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
yaml
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
yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb-replica-set
spec:
serviceName: "mongodb-replica-set"
replicas: 3
selector:
matchLabels:
app: mongodb-replica-set
template:
metadata:
labels:
app: mongodb-replica-set
spec:
containers:
- name: mongodb
image: mongo:7.0.14
ports:
- containerPort: 27017
volumeMounts:
- name: mongodb-data
mountPath: /data/db
- name: mongodb-init-scripts
mountPath: /docker-entrypoint-initdb.d
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-password
- name: MONGO_REPLICA_SET_NAME
value: rs0
volumeClaimTemplates:
- metadata:
name: mongodb-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
volumes:
- name: mongodb-init-scripts
configMap:
name: mongodb-init
- 优化建议:
- 确保
volumeClaimTemplates中的存储请求大小(storage: 20Gi)符合实际需求。 - 确保
image: mongo:7.0.14是否最新的稳定版本。
- 确保
- 解释:
StatefulSet用于管理有状态的应用程序,如MongoDB副本集。它确保每个Pod有一个唯一的标识符,并且可以持久化存储数据。
4. Service for MongoDB
yaml
apiVersion: v1
kind: Service
metadata:
name: mongodb-replica-set
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
app: mongodb-replica-set
- 优化建议:确保
clusterIP: None,这表示这是一个Headless Service,适用于StatefulSet。 - 解释:
Service用于定义如何访问Pod,Headless Service不会分配集群IP,而是通过DNS解析Pod的IP地址。
5. Deployment for Mongo Express
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-express
spec:
replicas: 1
selector:
matchLabels:
app: mongo-express
template:
metadata:
labels:
app: mongo-express
spec:
containers:
- name: mongo-express
image: mongo-express:1.0.2-20-alpine3.19
ports:
- containerPort: 8081
env:
- name: ME_CONFIG_MONGODB_URL
value: "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_ADMIN
value: "true"
- name: ME_CONFIG_MONGODB_ADMINUSERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: ME_CONFIG_MONGODB_ADMINPASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: 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
yaml
apiVersion: v1
kind: Service
metadata:
name: mongo-express
spec:
ports:
- port: 8081
targetPort: 8081
selector:
app: mongo-express
type: LoadBalancer
- 优化建议:确保
type: LoadBalancer符合你的环境要求,如果你在本地开发环境中,可能需要改为NodePort。 - 解释:
Service用于定义如何访问mongo-express,LoadBalancer类型通常用于云环境中,提供外部访问。
应用配置
可将上述内容保存为一个文件(例如:k8s-mongodb-replicaset.yaml),然后使用以下命令将其应用到 Kubernetes 集群中:
bash
kubectl apply -f k8s-mongodb-replicaset.yaml
这样,你就可以在 Kubernetes 中部署一个高可用的 MongoDB 副本集和一个用于管理和监控的 Mongo Express。
总结
Secret和ConfigMap确保了敏感信息和初始化脚本的安全性和正确性。StatefulSet和Service确保了MongoDB副本集(Replica-Set)的高可用性和数据持久化。Deployment和Service确保了Mongo Express的正常运行和外部访问。