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/