Kubernetes学习指北之Kubernetes YAML
Kubernetes学习指北之Kubernetes YAML
一、 Kubernetes YAML 的基本结构
Kubernetes 资源对象通常是 YAML 文件。每个 YAML 对象至少包含三个字段:
1apiVersion: v1 # API 版本,不同资源使用的版本不同
2kind: Pod # 资源类型,如 Pod、Deployment、Service、Secret、ConfigMap
3metadata: # 元数据
4 name: my-pod
5 namespace: default
6spec: # 具体配置
7 containers:
8 - name: nginx
9 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
- 资源的名字、标签、注解等。
- 常见字段:
1metadata: 2name: my-app 3namespace: default 4labels: 5 app: my-app 6annotations: 7 description: "Demo app"
4. spec
- 资源的核心配置
- 不同 kind 的 spec 完全不同,Pod、Deployment、Service 的 spec 都不一样。
三、 Pod 示例
1apiVersion: v1
2kind: Pod
3metadata:
4 name: nginx-pod
5spec:
6 containers:
7 - name: nginx
8 image: nginx:1.25
9 ports:
10 - containerPort: 80
解释:
- Pod 内部可以有一个或多个容器。
- 每个容器定义名字、镜像和端口。
- Pod 是调度的最小单位。
四、Deployment 示例
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: nginx-deploy
5spec:
6 replicas: 2 # 副本数
7 selector:
8 matchLabels:
9 app: nginx
10 template:
11 metadata:
12 labels:
13 app: nginx
14 spec:
15 containers:
16 - name: nginx
17 image: nginx:1.25
18 ports:
19 - containerPort: 80
解释:
- Deployment 可以管理多个副本的 Pod。
- selector 用于匹配 Pod 标签,Deployment 会管理这些 Pod。
- template 是 Pod 模板,Deployment 会根据它创建 Pod。
五、Service 示例
1apiVersion: v1
2kind: Service
3metadata:
4 name: nginx-svc
5spec:
6 selector:
7 app: nginx
8 ports:
9 - port: 80
10 targetPort: 80
11 type: NodePort # 可以外部访问
解释:
- Service 用于内部 Pod 之间通信或对外暴露。
- selector 绑定哪些 Pod 提供服务。
- ports 配置服务端口
- type 可选
- ClusterIP(默认):内部访问
- NodePort:节点 IP + 端口访问
- LoadBalancer:云厂商提供负载均衡
六、ConfigMap 示例
1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: app-config
5data:
6 APP_ENV: production
7 APP_DEBUG: "false"
解释:
- ConfigMap 用于存储非敏感配置。
- 可以挂载到 Pod 里,或者作为环境变量注入。
七、 Secret 示例
1apiVersion: v1
2kind: Secret
3metadata:
4 name: db-secret
5type: Opaque
6stringData:
7 username: laravel
8 password: SuperSecret123
解释:
- Secret 用于存储敏感信息。
- stringData 会自动转换为 base64 存储在 etcd。
- Pod 可以通过环境变量或挂载方式使用 Secret。
八、多对象 YAML
可以在同一个 YAML 文件中声明多个资源,用 — 分隔:
1apiVersion: v1
2kind: Namespace
3metadata:
4 name: my-ns
5---
6apiVersion: v1
7kind: Pod
8metadata:
9 name: nginx-pod
10 namespace: my-ns
11spec:
12 containers:
13 - name: nginx
14 image: nginx:1.25
九、YAML定义规范
一般情况下 Kubernetes 项目会拆成多个 YAML 文件,而不是把所有资源都写在一个文件里
1. 按资源类型拆分
Deployment / StatefulSet / DaemonSet:每个应用或服务一个文件
Service:对应应用的访问服务单独一个文件
ConfigMap / Secret:配置和密钥单独一个文件
Namespace / RBAC:全局资源单独一个文件
示例目录结构:
1k8s/
2├─ namespace.yaml
3├─ mysql/
4│ ├─ secret.yaml
5│ ├─ pvc.yaml
6│ ├─ deployment.yaml
7│ └─ service.yaml
8├─ laravel/
9│ ├─ configmap.yaml
10│ ├─ deployment.yaml
11│ └─ service.yaml
12└─ ingress.yaml
2. 好处
可维护性:每个资源独立,修改和调试更容易
可复用性:可以在不同环境(dev、test、prod)复用相同资源
方便 CI/CD:GitOps 或自动部署可以逐个 apply 文件
减少冲突:多人协作时,避免同时修改同一个大文件
3. 管理方式
1# 单个 apply:可以一次性 apply 整个目录
2kubectl apply -f k8s/
3
4# 按文件 apply:针对某个服务或资源单独 apply
5kubectl apply -f namespace.yaml # 需要先创建 Namespace
6kubectl apply -f k8s/laravel/deployment.yaml -n demo # -n demo 是 kubectl 命令的 命名空间(Namespace)指定参数
7kubectl apply -f k8s/laravel/service.yaml -n demo
8
9# 删除资源:同样可以按文件删除
10kubectl delete -f k8s/laravel/
发表评论