部署步骤
详细拆解 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: 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
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
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
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
集群中:
kubectl apply -f k8s-mongodb-replicaset.yaml
这样,你就可以在 Kubernetes
中部署一个高可用的 MongoDB
副本集和一个用于管理和监控的 Mongo Express
。
总结
Secret
和ConfigMap
确保了敏感信息和初始化脚本的安全性和正确性。StatefulSet
和Service
确保了MongoDB
副本集(Replica-Set
)的高可用性和数据持久化。Deployment
和Service
确保了Mongo Express
的正常运行和外部访问。