k8s容器入门(9)Kubernetes yaml常用配置
一、YAML 基础格式
apiVersion: apps/v1 # API 版本(核心资源多为 v1)
kind: Deployment # 资源类型(Pod/Service/Deployment 等)
metadata:name: my-app # 资源名称namespace: default # 命名空间(可选,默认 default)labels: # 标签(用于筛选资源)app: nginx
spec: # 规格定义(具体配置)replicas: 3 # 副本数(仅 Deployment/StatefulSet)selector: # 标签选择器(匹配 Pod 标签)matchLabels:app: nginxtemplate: # Pod 模板metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.21ports:- containerPort: 80
二、核心资源 YAML 配置
1. Pod
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: main-containerimage: nginx:latestports:- containerPort: 80env:- name: ENV_NAMEvalue: "test"volumeMounts:- name: data-volumemountPath: /datavolumes:- name: data-volumeemptyDir: {} # 临时卷(生命周期与 Pod 同步)
2. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploy
spec:replicas: 3strategy:type: RollingUpdate # 滚动更新策略rollingUpdate:maxSurge: 1 # 最多新增副本数maxUnavailable: 1 # 允许不可用的副本数template:spec:containers:- name: nginximage: nginx:1.21resources:limits:memory: "512Mi"cpu: "500m" # m 表示毫核(1 core = 1000m)requests:memory: "128Mi"cpu: "100m"
3. Service
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: ClusterIP # 服务类型(ClusterIP/NodePort/LoadBalancer)selector:app: nginx # 匹配 Pod 的标签ports:- protocol: TCPport: 80 # Service 暴露的端口targetPort: 80 # 容器监听的端口nodePort: 30000 # NodePort 类型时指定(需在 30000-32767 之间)
4. ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:config.properties: |key1=value1key2=value2
5. Secret
apiVersion: v1
kind: Secret
metadata:name: db-secret
type: Opaque
data:password: bXktc2VjcmV0 # Base64 编码后的值(可用 echo -n "my-secret" | base64 生成)
6. PersistentVolumeClaim (PVC)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: app-pvc
spec:storageClassName: standardaccessModes:- ReadWriteOnce # 访问模式(RWO/RWX)resources:requests:storage: 10Gi # 存储容量需求
三、常见配置字段详解
1. 镜像与拉取策略
image: nginx:1.21
imagePullPolicy: IfNotPresent # Always/Never/IfNotPresent
2. 环境变量
env:- name: DEBUGvalue: "true"- name: LOG_LEVELvalueFrom:configMapKeyRef:name: app-configkey: logLevel
3. 健康检查(探针)
livenessProbe: # 存活性探针httpGet:path: /healthport: 8080initialDelaySeconds: 10 # 初次检查延迟时间periodSeconds: 5 # 检查间隔readinessProbe: # 就绪性探针tcpSocket:port: 3000timeoutSeconds: 3
4. 资源限制(CPU/内存)
resources:limits:memory: "1Gi"cpu: "1"requests:memory: "256Mi"cpu: "0.2"
5. 挂载存储卷
volumes:- name: data-volumepersistentVolumeClaim:claimName: app-pvc
volumeMounts:- name: data-volumemountPath: /var/data
6. 标签与选择器
# Pod 标签
metadata:labels:app: nginxtier: backend# Deployment 选择器
selector:matchLabels:app: nginx
7. 注解(Annotations)
annotations:prometheus.io/scrape: "true" # 供监控系统识别kubernetes.io/ingress.class: nginx # Ingress 使用
四、多容器 Pod 配置
spec:containers:- name: appimage: my-app:1.0- name: sidecarimage: envoy:latestports:- containerPort: 8000
五、Ingress 示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: example.comhttp:paths:- path: /apppathType: Prefixbackend:service:name: app-serviceport:number: 8080
六、常用 kubectl 操作
# 创建资源
kubectl apply -f deployment.yaml# 查看资源状态
kubectl get pods,deployments,services# 删除资源
kubectl delete -f deployment.yaml# 强制替换资源
kubectl replace --force -f deployment.yaml# 查看事件日志
kubectl describe pod <pod-name>
七、YAML 调试技巧
-
验证语法:
kube-linter lint deployment.yaml # 检查潜在问题
-
查看 API 字段文档:
kubectl explain deployment.spec.template.spec.containers.resources
-
本地渲染模板:
helm template my-release ./chart --output-dir ./rendered
-
Diff 实际差异:
kubectl diff -f deployment.yaml # 对比当前集群与 YAML 的差异
八、最佳实践
- 命名空间隔离:
namespace: staging
避免不同环境资源冲突。 - 标签规范:如
app.kubernetes.io/name: my-app
提升可维护性。 - ConfigMap/Secret 解耦:将配置与镜像分离,提升复用性。
- 最小权限原则:通过
securityContext
限制容器权限(如非 root 用户运行)。