主题
Kubernetes
Kubernetes(简称 K8s)是业界主流的容器编排平台,负责自动化部署、伸缩、故障恢复与服务发现。本文体系化梳理核心对象与生产实践。
架构概览
- Control Plane(控制面):
kube-apiserver(API 入口)、etcd(数据存储)、kube-scheduler(调度)、kube-controller-manager(控制器)。 - Node(工作节点):
kubelet(与 API 通信、管容器)、kube-proxy(网络规则)、容器运行时(containerd/CRI-O)。
bash
kubectl get nodes
kubectl cluster-info核心概念
- Namespace:资源逻辑隔离(default / kube-system / 自定义)。
- Pod:最小部署单元,可含一个或多个共享网络/存储的容器。
- Label / Selector:键值对,用于对象选择与关联。
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:latest
ports:
- containerPort: 3000Workload(工作负载)
Deployment
声明式管理无状态应用,支持滚动更新与回滚。
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:v1
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mibash
kubectl apply -f deploy.yaml
kubectl rollout status deployment/my-deployment
kubectl rollout undo deployment/my-deployment # 回滚StatefulSet
有状态应用(数据库、中间件),提供稳定网络标识与持久存储。常用于 MySQL、Redis Cluster、Kafka。
DaemonSet
每个(或匹配的)节点运行一个 Pod,常用于日志采集(如 Filebeat)、监控代理(如 node_exporter)。
Job / CronJob
- Job:一次性任务,运行完成即结束。
- CronJob:定时任务,类似 Linux crontab(
schedule: "0 2 * * *")。
Service 与 Ingress
Service(服务发现)
Pod IP 会变化,Service 提供稳定虚拟 IP 与负载均衡。
yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 3000
type: ClusterIP # ClusterIP / NodePort / LoadBalancer| 类型 | 访问范围 |
|---|---|
| ClusterIP | 集群内部 |
| NodePort | 节点 IP:随机端口 |
| LoadBalancer | 云厂商外部负载均衡 |
Ingress(外部路由)
将外部 HTTP/HTTPS 流量路由到内部 Service,通常配合 Ingress Controller(NGINX / Traefik / APISIX)。
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80生产网关实践可参考 APISIX 生产落地实战。
配置与存储
ConfigMap / Secret
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
---
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData:
DB_PASSWORD: changeme在 Pod 中引用:
yaml
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD持久化(PV / PVC / StorageClass)
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Giyaml
# Pod 中挂载
volumes:
- name: data
persistentVolumeClaim:
claimName: data-pvc
volumeMounts:
- name: data
mountPath: /var/lib/data调度与弹性
- 节点亲和/反亲和:
affinity控制 Pod 落点。 - 污点/容忍:
taints+tolerations隔离专用节点(如 GPU 节点)。 - HPA(Horizontal Pod Autoscaler):基于 CPU/内存或自定义指标自动扩缩容。
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70探针(健康检查)
yaml
livenessProbe: # 失败则重启容器
httpGet:
path: /healthz
port: 3000
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe: # 失败则从 Service 摘除流量
httpGet:
path: /ready
port: 3000运维命令
bash
kubectl get pods -n <ns>
kubectl describe pod <pod> # 排查排程/启动失败
kubectl logs <pod> -f
kubectl exec -it <pod> -- /bin/bash
kubectl apply -f <file>
kubectl delete -f <file>
kubectl rollout restart deploy/<name>
kubectl top nodes / pods # 资源占用(需 metrics-server)生产实战要点
- 资源 requests/limits 必设:防止资源抢占与节点雪崩。
- 探针必配:liveness 防僵死,readiness 防流量打到未就绪实例。
- HPA 自动伸缩:应对流量波动。
- 配置与密钥外置:ConfigMap/Secret,镜像不含环境配置。
- 可观测性:接入 Prometheus + Grafana,配合 Alertmanager 告警。
- 包管理 Helm:用 Chart 模板化部署,避免手写大量 YAML。
- 镜像固定 tag/digest:禁止
latest进生产。
最佳实践
- 一切皆声明式(
kubectl apply),不用命令式kubectl run跑生产。 - 用 Namespace 隔离环境(prod/test)。
- 为关键服务配置 PDB(PodDisruptionBudget)防止驱逐导致不可用。
- 日志统一输出 stdout,由采集端(DaemonSet)收集。
- 定期升级集群版本,及时修补 CVE。