1. 简介
目前,Kubernetes 已成为部署应用的事实标准,因为它可以更方便地管理部署,并提供高可用性和可扩展性。
我们在 Kubernetes 中使用 YAML 或 JSON 文件来管理部署。在一次标准的部署中,通常会使用多个 YAML 文件来定义部署所需的各种配置。
为了更好地组织这些文件,我们可以将它们放入不同的目录中,例如为测试环境和生产环境分别创建不同的目录,这样可以快速定位所需的 YAML 文件。
本文将介绍如何通过一条命令,一次性应用某个目录下所有 YAML 文件中的配置。这将极大简化部署流程。
2. 文件位于单个目录中
本节将演示如何一次性应用一个目录下的所有 YAML 文件。
首先,我们创建一个目录,命名为 dir1
:
$ mkdir dir1
在该目录下,我们创建以下四个文件:
2.1. ConfigMap 配置文件
文件名:mongo-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-configmap
data:
database_url: mongodb-service
该文件定义了后端应用连接数据库所需的配置信息。
2.2. Secret 配置文件
文件名:mongo-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
mongo-root-username: dXNlcm5hbWU=
mongo-root-password: cGFzc3dvcmQ=
该文件用于存储敏感信息,如数据库用户名和密码。
2.3. 后端应用配置文件
文件名:mongo-express.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-express
labels:
app: mongo-express
spec:
replicas: 1
selector:
matchLabels:
app: mongo-express
template:
metadata:
labels:
app: mongo-express
spec:
containers:
- name: mongo-express
image: mongo-express
ports:
- containerPort: 8081
env:
- 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
- name: ME_CONFIG_MONGODB_SERVER
valueFrom:
configMapKeyRef:
name: mongodb-configmap
key: database_url
---
apiVersion: v1
kind: Service
metadata:
name: mongo-express-service
spec:
selector:
app: mongo-express
type: LoadBalancer
ports:
- protocol: TCP
port: 8081
targetPort: 8081
nodePort: 30000
该文件定义了后端服务的 Deployment 和 Service。Deployment 负责容器的配置,Service 负责暴露服务。
2.4. 数据库配置文件
文件名:mongo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
labels:
app: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo
ports:
- containerPort: 27017
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
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
selector:
app: mongodb
ports:
- protocol: TCP
port: 27017
targetPort: 27017
该文件定义了数据库的 Deployment 和 Service,用于后端服务连接。
2.5. 一次性部署所有文件
创建完所有文件后,我们可以使用以下命令一次性应用所有配置:
$ kubectl apply -f dir1
Kubernetes 会自动遍历目录下的所有 YAML 文件并依次应用。
执行完成后,我们可以使用以下命令查看资源状态:
$ kubectl get all
输出示例如下:
NAME READY STATUS RESTARTS AGE
pod/svclb-mongo-express-service-l8dxb 1/1 Running 0 6m45s
pod/mongodb-deployment-8f6675bc5-gxfl9 1/1 Running 0 6m45s
pod/mongo-express-78fcf796b8-nx94g 1/1 Running 1 (6m4s ago) 6m45s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 12d
service/mongodb-service ClusterIP 10.43.238.212 <none> 27017/TCP 6m45s
service/mongo-express-service LoadBalancer 10.43.108.110 172.19.0.3 8081:30000/TCP 6m45s
NAME DESIRED CURRENT READY NODE SELECTOR AGE
daemonset.apps/svclb-mongo-express-service 1 1 1 <none> 6m45s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mongodb-deployment 1/1 1 1 6m45s
deployment.apps/mongo-express 1/1 1 1 6m45s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mongodb-deployment-8f6675bc5 1 1 1 6m45s
replicaset.apps/mongo-express-78fcf796b8 1 1 1 6m45s
可以看到,所有 Deployment 和 Service 均已成功创建。
3. 文件位于嵌套目录中
上一节我们演示了如何应用单个目录下的所有 YAML 文件。但如果我们希望将 YAML 文件按功能拆分到多个子目录中,是否需要对每个目录分别执行命令?答案是否定的,Kubernetes 提供了递归支持。
首先,删除上一节创建的资源:
$ kubectl delete deploy mongodb-deployment mongo-express
$ kubectl delete service mongodb-service mongo-express-service
然后,我们将 mongo-express.yaml
和 mongo.yaml
移动到 apps
目录,将 mongo-configmap.yaml
和 mongo-secret.yaml
移动到 conf
目录:
dir1
├── apps
│ ├── mongo-express.yaml
│ └── mongo.yaml
└── conf
├── mongo-configmap.yaml
└── mongo-secret.yaml
此时如果我们直接运行:
$ kubectl apply -f dir1
会报错:
error: error reading [dir1]: recognized file extensions are [.json .yaml .yml]
因为 kubectl
默认不会递归查找子目录下的 YAML 文件。
要启用递归查找,我们需要加上 -R
或 --recursive
参数:
$ kubectl apply -f dir1 -R
✅ 此时命令执行成功,所有资源均被正确创建。
4. 总结
在 Kubernetes 中,我们通常使用多个 YAML 文件来管理部署。随着项目复杂度增加,将 YAML 文件组织到多个目录中是常见做法。
关键点总结如下:
- ✅ 使用
kubectl apply -f <dir>
可以一次性应用指定目录下的所有 YAML 文件 - ✅ 使用
-R
或--recursive
参数可递归应用子目录中的 YAML 文件 - ✅ 合理组织 YAML 文件结构有助于提高项目的可维护性
- ⚠️ 注意 YAML 文件命名和路径的规范性,避免部署失败
通过合理使用目录结构和递归参数,我们可以更高效地管理 Kubernetes 部署流程。