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.yamlmongo.yaml 移动到 apps 目录,将 mongo-configmap.yamlmongo-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 部署流程。


原始标题:Kubectl Apply to All Files in a Directory