前言
Kubernetes(K8s)是容器编排的事实标准。这篇文章从 Pod 开始,逐步讲解 K8s 的核心概念和资源对象。
Pod
概述
Pod 是 K8s 中最小的部署单元,是一组(一个或多个)容器的集合。Pod 就像是豌豆荚,而容器就像是豌豆荚中的豌豆。这些容器共享存储、网络等资源。
Pod 资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: tybe: app test: 1.0.0 namespace: 'default' spec: containers: - name: nginx image: 'nginx:1.20.2' imagePullPolicy: IfNotPresent startupProbe: exec: command: - /bin/sh - -c - "sleep 3; echo success > /inited" initialDelaySeconds: 1 periodSeconds: 5 failureThreshold: 3 successThreshold: 1 timeoutSeconds: 5 readinessProbe: httpGet: path: /started.html port: 80 initialDelaySeconds: 1 periodSeconds: 5 failureThreshold: 3 command: - nginx - -g - 'daemon off;' workingDir: /usr/share/nginx/html ports: - name: http containerPort: 80 protocol: TCP env: - name: JVM_OPTS value: '-Xms128m -Xmx128m' resources: requests: cpu: 100m memory: 128Mi limits: cpu: 200m memory: 256Mi restartPolicy: OnFailure
|
Deployment 控制器
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploy labels: controller: deploy spec: replicas: 3 revisionHistoryLimit: 5 paused: false progressDeadlineSeconds: 600 strategy: type: RollingUpdate rollingUpdate: maxSurge: 30% selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.20.2 ports: - containerPort: 80
|
版本管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| kubectl rollout status deployment nginx-deploy
kubectl rollout history deployment nginx-deploy
kubectl rollout pause deployment nginx-deploy
kubectl rollout resume deployment nginx-deploy
kubectl rollout undo deployment nginx-deploy
kubectl rollout undo deployment nginx-deploy --to-revision=2
|
滚动更新
1 2 3 4 5
| kubectl set image deployment nginx-deploy nginx=nginx:1.21.0
kubectl edit deployment nginx-deploy
|
金丝雀发布
金丝雀发布是一种灰度发布策略,先部署少量新版本实例,验证无误后再逐步扩大范围。
1 2 3 4 5 6
| kubectl set image deployment nginx-deploy nginx=nginx:1.21.0 kubectl scale deployment nginx-deploy --replicas=1
kubectl set image deployment nginx-deploy nginx=nginx:1.21.0
|
Service
Service 用于暴露 Pod 的访问入口,提供稳定的 IP 和 DNS 名称。
Service 类型
| 类型 |
说明 |
| ClusterIP |
默认类型,仅集群内部可访问 |
| NodePort |
通过节点端口暴露服务 |
| LoadBalancer |
使用云提供商的负载均衡器 |
| ExternalName |
映射到外部 DNS 名称 |
配置示例
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx-pod ports: - port: 80 targetPort: 80 nodePort: 30080 type: NodePort
|
ConfigMap 和 Secret
ConfigMap
用于存储非敏感配置数据。
1 2 3 4 5 6 7 8 9 10 11 12
| kubectl create configmap my-config --from-file=config.properties
apiVersion: v1 kind: ConfigMap metadata: name: my-config data: config.properties: | key1=value1 key2=value2
|
Secret
用于存储敏感数据(密码、密钥等)。
1 2 3 4 5 6 7 8 9 10
| kubectl create secret generic my-secret --from-literal=password=my-password
env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: my-secret key: password
|
常见问题
❌ Pod 一直处于 Pending 状态
原因:节点资源不足或没有匹配的节点。
解决:
1 2 3 4 5
| kubectl describe pod <pod-name>
kubectl top nodes
|
❌ 镜像拉取失败
原因:镜像地址错误或网络问题。
解决:
1 2 3 4 5
| kubectl get pod <pod-name> -o yaml | grep image
kubectl create secret docker-registry my-registry --docker-server=...
|
以上就是 Kubernetes 核心概念的详解。K8s 内容丰富,后续文章会继续深入讲解各个组件。