Kubernetes学习指北之Kubernetes YAML

一、 Kubernetes YAML 的基本结构

Kubernetes 资源对象通常是 YAML 文件。每个 YAML 对象至少包含三个字段:

apiVersion: v1         # API 版本,不同资源使用的版本不同
kind: Pod              # 资源类型,如 Pod、Deployment、Service、Secret、ConfigMap
metadata:              # 元数据
  name: my-pod
  namespace: default
spec:                  # 具体配置
  containers:
    - name: nginx
      image: nginx:1.25

二、常用字段详解

1. apiVersion

  • 指定资源的 API 版本。
    • 常见值:
      • v1:Pod、Service、ConfigMap、Secret
      • apps/v1:Deployment、StatefulSet、DaemonSet
      • batch/v1:Job、CronJob

2. kind

  • 资源类型
    • 常见类型:
      • Pod:最小的调度单位
      • Deployment:Pod 的管理控制器,可以做副本管理和滚动升级
      • Service:服务发现与负载均衡
      • ConfigMap / Secret:配置或敏感信息管理
      • Namespace:隔离资源的逻辑空间

3. metadata

  • 资源的名字、标签、注解等。
  • 常见字段:
    metadata:
    name: my-app
    namespace: default
    labels:
        app: my-app
    annotations:
        description: "Demo app"
    

4. spec

  • 资源的核心配置
  • 不同 kind 的 spec 完全不同,Pod、Deployment、Service 的 spec 都不一样。

三、 Pod 示例

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx
      image: nginx:1.25
      ports:
        - containerPort: 80

解释:

  • Pod 内部可以有一个或多个容器。
  • 每个容器定义名字、镜像和端口。
  • Pod 是调度的最小单位。

四、Deployment 示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 2                   # 副本数
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80

解释:

  • Deployment 可以管理多个副本的 Pod。
  • selector 用于匹配 Pod 标签,Deployment 会管理这些 Pod。
  • template 是 Pod 模板,Deployment 会根据它创建 Pod。

五、Service 示例

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  type: NodePort  # 可以外部访问

解释:

  • Service 用于内部 Pod 之间通信或对外暴露。
  • selector 绑定哪些 Pod 提供服务。
  • ports 配置服务端口
  • type 可选
    • ClusterIP(默认):内部访问
    • NodePort:节点 IP + 端口访问
    • LoadBalancer:云厂商提供负载均衡

六、ConfigMap 示例

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  APP_DEBUG: "false"

解释:

  • ConfigMap 用于存储非敏感配置。
  • 可以挂载到 Pod 里,或者作为环境变量注入。

七、 Secret 示例

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
stringData:
  username: laravel
  password: SuperSecret123

解释:

  • Secret 用于存储敏感信息。
  • stringData 会自动转换为 base64 存储在 etcd。
  • Pod 可以通过环境变量或挂载方式使用 Secret。

八、多对象 YAML

可以在同一个 YAML 文件中声明多个资源,用 — 分隔:

apiVersion: v1
kind: Namespace
metadata:
  name: my-ns
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: my-ns
spec:
  containers:
    - name: nginx
      image: nginx:1.25

九、YAML定义规范

一般情况下 Kubernetes 项目会拆成多个 YAML 文件,而不是把所有资源都写在一个文件里

1. 按资源类型拆分

  • Deployment / StatefulSet / DaemonSet:每个应用或服务一个文件

  • Service:对应应用的访问服务单独一个文件

  • ConfigMap / Secret:配置和密钥单独一个文件

  • Namespace / RBAC:全局资源单独一个文件

示例目录结构:

k8s/
├─ namespace.yaml
├─ mysql/
  ├─ secret.yaml
  ├─ pvc.yaml
  ├─ deployment.yaml
  └─ service.yaml
├─ laravel/
  ├─ configmap.yaml
  ├─ deployment.yaml
  └─ service.yaml
└─ ingress.yaml

2. 好处

  • 可维护性:每个资源独立,修改和调试更容易

  • 可复用性:可以在不同环境(dev、test、prod)复用相同资源

  • 方便 CI/CD:GitOps 或自动部署可以逐个 apply 文件

  • 减少冲突:多人协作时,避免同时修改同一个大文件

3. 管理方式

# 单个 apply:可以一次性 apply 整个目录
kubectl apply -f k8s/

# 按文件 apply:针对某个服务或资源单独 apply
kubectl apply -f namespace.yaml        # 需要先创建 Namespace
kubectl apply -f k8s/laravel/deployment.yaml -n demo # -n demo 是 kubectl 命令的 命名空间(Namespace)指定参数
kubectl apply -f k8s/laravel/service.yaml -n demo

# 删除资源:同样可以按文件删除
kubectl delete -f k8s/laravel/