Docker 解决的是“如何运行容器”,而 Kubernetes 进一步解决的是“如何在一组机器上持续、可靠地运行和管理大量容器”。
Kubernetes 的核心不是某一条
kubectl命令,而是理解 Cluster、Node、Pod、Deployment、Service、ConfigMap、Secret、PV/PVC、Ingress、调度与网络 之间的关系。
一、Kubernetes 概述
1.1 什么是 Kubernetes
Kubernetes(简称 K8s)是一个用于管理容器化工作负载和服务的平台,核心思想是通过声明式配置和控制器自动维护集群的目标状态。
Docker 更关注:
运行一个容器而 Kubernetes 关注:
运行一组应用 ↓保持副本数量 ↓发现服务 ↓分配资源 ↓故障自动恢复 ↓滚动更新 ↓扩缩容例如:
应用要求:3 个 Web 实例
Kubernetes │ ├── Pod 1 ├── Pod 2 └── Pod 3如果其中一个 Pod 出现故障:
Pod 1 X控制器会根据声明的目标状态创建新的 Pod,使系统重新回到:
Pod 1Pod 2Pod 3这就是 Kubernetes 中非常重要的:
Desired State与:
Actual State之间的持续协调。
Kubernetes 官方概念文档: Kubernetes Concepts
1.2 Kubernetes 的核心特点
Kubernetes 的典型能力包括:
容器编排自动调度服务发现负载分发故障自愈滚动更新水平扩缩容配置管理存储管理资源管理因此 Kubernetes 并不是简单的:
“Docker 的批量启动器”它实际上提供了一套完整的:
集群控制系统二、Kubernetes Cluster 与 Node
2.1 Cluster
Cluster(集群)是 Kubernetes 的整体运行环境。
可以简单理解为:
Kubernetes Cluster│├── Control Plane│└── Worker Nodes ├── Node 1 ├── Node 2 └── Node 3Kubernetes 官方架构中,一个集群由控制平面和一个或多个工作节点组成。控制平面负责管理集群状态,Worker Node 负责运行 Pod。
2.2 Control Plane
Control Plane 可以理解为 Kubernetes 的“大脑”。
主要组件:
kube-apiserveretcdkube-schedulerkube-controller-manager其中:
kube-apiserver
Kubernetes 的 API 入口。
kubectl │ ▼kube-apiserver所有主要的集群资源操作都会通过 Kubernetes API 进行。
etcd
用于保存 Kubernetes 的集群状态和 API 数据。
kube-apiserver │ ▼ etcd │ └── Cluster State可以把它理解成 Kubernetes 的核心状态存储。
kube-scheduler
负责给尚未绑定 Node 的 Pod 选择合适的节点。
Pending Pod │ ▼kube-scheduler │ ▼Nodekube-controller-manager
运行各种 Controller,不断比较:
Desired State vsActual State然后执行对应操作。
例如 Deployment 想要:
replicas = 3当前只有:
2 PodsController 就会推动系统创建第 3 个 Pod。
2.3 Worker Node
Worker Node 是真正运行工作负载的节点。
主要组件包括:
kubeletcontainer runtimekube-proxy(传统 Service 实现中)其中:
kubelet
kubelet 运行在每个 Node 上,负责确保 Pod 中声明的容器处于运行状态。
可以理解为:
Control Plane │ ▼Node │ kubelet │ ▼ ContainerContainer Runtime
负责实际运行容器。
例如:
containerdCRI-OKubernetes 通过 CRI 与容器运行时协作。
kube-proxy
在传统 Kubernetes Service 实现中,kube-proxy 负责在节点上维护实现 Service 流量转发所需的网络规则。
需要注意:
kube-proxy 并不是 Kubernetes Pod 网络本身。Pod 网络由 CNI 等网络实现负责。
三、Pod
3.1 Pod 是什么
Pod 是 Kubernetes 中最小的可部署计算对象。
一个 Pod 可以包含一个或多个容器,这些容器共享:
NetworkStorage生命周期并且通常会被调度到同一个 Node。
最常见的情况:
Pod└── Container但也可以:
Pod├── App Container└── Sidecar Container例如:
Pod├── application└── log-agent3.2 Pod 网络
每个 Pod 在 Kubernetes 网络模型中拥有自己的 IP。
同一个 Pod 内的容器共享网络命名空间,因此可以通过:
localhost互相通信。
例如:
Pod├── app :8080└── sidecar :9000两个容器可以:
localhost:8080localhost:9000但由于共享同一个网络命名空间,一个 Pod 内两个容器不能同时监听完全相同的端口。
3.3 Pod 为什么通常不直接管理
虽然可以直接创建 Pod:
kubectl run nginx --image=nginx但生产环境一般不直接管理裸 Pod,而是交给:
DeploymentStatefulSetDaemonSetJobCronJob等更高级的控制器管理。
最常见的无状态应用:
Deployment ↓ReplicaSet ↓Pods四、Namespace
Namespace 用于在同一个 Kubernetes Cluster 中对资源进行逻辑隔离。
例如:
Cluster│├── default│ ├── web│ └── redis│├── dev│ ├── web│ └── redis│└── prod ├── web └── redis查看:
kubectl get namespaces也可以:
kubectl get ns创建:
kubectl create namespace dev之后:
kubectl get pods -n dev这样就能只查看 dev Namespace 中的 Pod。
Namespace 并不是完整的安全边界,但它是 Kubernetes 中组织和隔离资源的重要机制。
五、使用 kubectl 管理 Kubernetes
kubectl 是 Kubernetes 最常用的命令行工具。
基本结构:
kubectl │ ├── get ├── describe ├── create ├── apply ├── edit ├── exec └── delete5.1 kubectl get
查看资源:
kubectl get pods查看 Deployment:
kubectl get deployments查看 Service:
kubectl get svc查看所有 Namespace:
kubectl get ns查看 Node:
kubectl get nodes查看更多信息:
kubectl get pods -o wide5.2 kubectl describe
查看资源详细信息:
kubectl describe pod nginx它特别适合故障排查。
例如可以看到:
EventsVolumesContainersConditionsNodeImage后面的很多故障排查都离不开:
kubectl describe5.3 kubectl create
例如:
kubectl create deployment nginx \ --image=nginx创建 Namespace:
kubectl create namespace dev5.4 kubectl apply
Kubernetes 非常强调声明式配置。
例如:
kubectl apply -f deployment.yaml意思不是:
执行一堆命令而是:
“让集群状态变成 YAML 描述的状态”因此实际生产环境中经常使用:
YAML ↓kubectl apply ↓Kubernetes API5.5 kubectl edit
可以直接编辑正在运行的资源:
kubectl edit deployment nginxKubernetes 会打开资源当前的 YAML 表示。
不过生产环境通常更推荐:
修改 Git 中的 YAML ↓提交 ↓部署而不是长期直接手工 kubectl edit,这样更容易保持配置可追踪和可审计。
5.6 kubectl exec
进入容器:
kubectl exec -it nginx -- /bin/sh如果 Pod 中有多个容器,可以指定:
kubectl exec -it nginx \ -c app \ -- /bin/sh常用于排查:
配置DNS网络文件环境变量进程5.7 kubectl delete
删除资源:
kubectl delete pod nginx或者:
kubectl delete -f deployment.yaml需要注意:
如果 Pod 由 Deployment 管理:
Deployment ↓ReplicaSet ↓Pod直接删除 Pod:
kubectl delete pod nginx并不一定意味着应用永久减少一个副本。
Controller 会发现:
Desired = 3Actual = 2然后重新创建 Pod。
六、Deployment 与 ReplicaSet
6.1 Deployment
Deployment 用于声明和管理无状态应用的副本以及更新。
例如:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80应用:
kubectl apply -f deployment.yaml查看:
kubectl get deployment查看 Pod:
kubectl get pods6.2 ReplicaSet
Deployment 通常不会直接管理 Pod,而是通过 ReplicaSet:
Deployment │ ▼ReplicaSet │ ├── Pod ├── Pod └── Pod例如:
replicas: 3意味着 ReplicaSet 会尽可能维持:
3 Pods6.3 自愈
假设:
Pod APod BPod C其中 Pod B 崩溃:
Pod APod B XPod CReplicaSet 会发现实际数量变成:
2于是创建:
Pod D恢复:
Pod APod CPod D这就是 Kubernetes 的控制器模型。
6.4 Deployment 更新
修改镜像:
nginx:1.27↓nginx:1.28然后:
kubectl apply -f deployment.yamlDeployment 会创建新的 ReplicaSet,并逐步替换旧 Pod。
Deployment │ ├── Old ReplicaSet │ ├── Pod │ └── Pod │ └── New ReplicaSet ├── Pod └── Pod这就是常见的:
Rolling Update查看发布状态:
kubectl rollout status deployment/nginx查看历史:
kubectl rollout history deployment/nginx回滚:
kubectl rollout undo deployment/nginx七、Service 与 Kubernetes 网络
Pod 有 IP,但是 Pod 本身并不适合作为稳定的访问入口。
因为 Pod 可能:
被删除被重新创建被调度到其他 NodeIP 改变因此 Kubernetes 使用 Service 为一组 Pod 提供稳定的网络入口。
Kubernetes 官方网络模型中,Service 提供稳定的 IP 或 DNS 名称,并通过 EndpointSlice 记录当前后端 Pod。
7.1 Service
例如:
Service 10.96.10.20 │ ┌────────┼────────┐ ▼ ▼ ▼ Pod A Pod B Pod CService 一般通过:
Label Selector选择后端 Pod。
例如:
selector: app: nginx对应:
labels: app: nginx7.2 ClusterIP
默认类型:
type: ClusterIP它主要用于集群内部访问。
例如:
backend │ ▼redis.default.svc.cluster.local │ ▼Redis Pods可以通过 Service 的 DNS 名称访问。
7.3 NodePort
NodePort 会在节点上开放一个端口。
例如:
type: NodePort结构:
Client │ ▼NodeIP:30080 │ ▼Service │ ▼Pod因此可以通过:
<NodeIP>:NodePort访问服务。
7.4 LoadBalancer
在支持云厂商负载均衡器的环境中,可以使用:
type: LoadBalancer典型结构:
Internet │ ▼Cloud Load Balancer │ ▼Service │ ▼Pods如果是裸机环境,则需要额外的 LoadBalancer 实现,例如 MetalLB 等方案。
7.5 Service 的本质
可以把 Service 理解成:
稳定入口 +Pod 集合因此:
Pod→ 容易变化
Service→ 提供稳定访问入口八、Kubernetes 集群网络基础
Kubernetes 网络涉及多个层次:
Container → ContainerPod → PodPod → ServiceExternal → Service官方文档把这些视为不同的网络问题。
8.1 Pod 网络
每个 Pod 获得一个集群范围内唯一的 IP。
基本模型是:
Pod A10.244.1.10 │ │ ▼Pod B10.244.2.20即使两个 Pod 位于不同 Node:
Node 1 └── Pod A
Node 2 └── Pod B也应该能够按照 Kubernetes 网络模型直接通信。
8.2 CNI
Kubernetes 本身定义网络模型,但不会替你实现整个 Pod 网络。
通常通过 CNI(Container Network Interface)插件实现 Pod 网络。
常见方案包括:
CiliumCalicoFlannel其职责可能涉及:
Pod IP 分配跨节点 Pod 通信网络路由NetworkPolicy因此:
Kubernetes │ └── 网络模型
CNI │ └── 具体网络实现8.3 Service 网络
Service 是另一层抽象:
Pod IP ↓Service IP ↓Service Backend所以排查 Kubernetes 网络问题时,不应该把:
Pod IPService IPNode IP混为一谈。
九、ConfigMap 与 Secret
Kubernetes 支持把应用配置与容器镜像分离。
9.1 ConfigMap
ConfigMap 用于保存:
非敏感配置例如:
apiVersion: v1kind: ConfigMapmetadata: name: app-configdata: APP_ENV: production LOG_LEVEL: info创建:
kubectl apply -f configmap.yamlConfigMap 可以通过:
环境变量命令参数Volume等方式提供给 Pod。
9.2 Secret
Secret 用于保存:
密码Token密钥证书例如:
apiVersion: v1kind: Secretmetadata: name: app-secrettype: OpaquestringData: DB_USER: app DB_PASSWORD: example需要注意:
Secret 主要表达“这是敏感数据”,并不意味着数据天然就具备完整的安全保护。
生产环境还应该考虑:
RBACAPI Server 安全静态数据加密外部 Secret 管理系统访问审计Kubernetes 官方文档也将 Secret 与 ConfigMap 区分开:ConfigMap 用于非机密配置,Secret 面向密码、Token、Key 等敏感数据。
9.3 为什么配置应该与镜像分离
不推荐:
Docker Image └── production-config更推荐:
Application Image +ConfigMap / Secret这样:
同一个 Image │ ├── dev ├── test └── prod只需要注入不同配置。
十、Kubernetes Volume、PV 与 PVC
10.1 Volume
Pod 可以声明 Volume。
例如:
volumes: - name: data emptyDir: {}然后挂载:
volumeMounts: - name: data mountPath: /data10.2 emptyDir
emptyDir 会随着 Pod 创建而产生一个空目录。
Pod└── emptyDir └── /data适用于:
临时文件缓存Pod 内多个容器共享临时数据但 Pod 被删除后,该 Volume 中的数据也会消失。
因此:
emptyDir≠持久化存储10.3 PersistentVolume
PV(PersistentVolume)代表集群中的持久化存储资源。
Storage │ ▼PersistentVolume它可以来自不同存储后端。
10.4 PersistentVolumeClaim
PVC(PersistentVolumeClaim)是工作负载对存储的请求:
Pod │ ▼PVC │ ▼PV │ ▼Storage例如:
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: app-dataspec: accessModes: - ReadWriteOnce resources: requests: storage: 10GiPod 使用 PVC:
volumes: - name: data persistentVolumeClaim: claimName: app-data这样应用就不需要直接关心底层磁盘的具体实现。
十一、Ingress 与 HTTP 流量管理
11.1 Ingress
Ingress 用于描述从集群外部进入 Kubernetes Service 的 HTTP/HTTPS 路由。
例如:
Internet │ ▼ Ingress / | \ / | \ ▼ ▼ ▼ web api admin │ │ │ Service Service ServiceIngress 可以根据:
HostPath进行路由。
例如:
example.com/ ↓web-service
example.com/api ↓api-service
admin.example.com ↓admin-service11.2 Ingress Controller
Ingress 资源本身只是 API 对象,并不会自动处理网络流量。
需要实际的 Ingress Controller:
Ingress │ ▼Ingress Controller │ ▼Service常见实现包括:
NGINX Ingress ControllerTraefikHAProxy具体选择取决于集群和平台。
11.3 Ingress 的当前定位
Ingress API 从 Kubernetes v1.19 起稳定,但目前已经冻结,不再继续增加新的 API 功能;Kubernetes 官方推荐新项目考虑 Gateway API。
因此学习 Ingress 仍然非常重要,因为大量现有 Kubernetes 集群仍在使用它:
历史与现有系统→ Ingress
新的流量管理设计→ Gateway API11.4 Ingress 不是什么
Ingress 主要针对:
HTTPHTTPS它不是一个通用 TCP/UDP 端口代理。
如果需要暴露其他协议,通常仍然会使用:
NodePortLoadBalancerGateway等方案。
十二、资源请求、限制与调度
Kubernetes 调度的重要输入之一,就是 Pod 对资源的声明。
最常见的是:
CPUMemory12.1 Requests
例如:
resources: requests: cpu: "500m" memory: "512Mi"可以理解为:
“我至少希望调度系统为我考虑这么多资源”Scheduler 会根据 Pod 的资源请求等条件选择合适的 Node。
12.2 Limits
例如:
resources: limits: cpu: "1" memory: "1Gi"用于限制容器可以使用的资源上限。
因此:
requests→ 调度参考
limits→ 资源约束Kubernetes 官方资源管理文档将 Requests、Limits 作为工作负载资源管理的核心机制。
12.3 CPU
Kubernetes 中:
1 CPU= 1 个 CPU 核心或对应计算单位例如:
500m表示:
0.5 CPU12.4 Memory
例如:
512Mi1Gi2Gi表示内存大小。
12.5 为什么必须合理设置资源
如果没有合理的资源声明:
Node ├── App A ├── App B └── App C其中 App A 可能不断消耗资源:
Memory ↑↑↑CPU ↑↑↑最终影响整个 Node。
因此 Kubernetes 需要结合:
RequestsLimitsQoSSchedulingEviction来进行资源管理。
十三、Kubernetes 调度
Scheduler 的基本流程可以理解成:
Pending Pod │ ▼Scheduler │ ├── Node 是否满足资源? ├── 是否满足约束? ├── 是否存在污点? ├── 是否满足亲和性? └── ... │ ▼选择 Node例如:
Node ACPU: 剩余 100m
Pod 需要:CPU: 500m那么 Pod 不适合调度到 Node A。
而:
Node BCPU: 剩余 2 CPU则更适合。
因此:
Kubernetes 调度不是简单地“找一台空闲机器”。
它需要综合考虑资源、节点属性和各种调度约束。
十四、kubeadm 搭建 Kubernetes 集群
kubeadm 是 Kubernetes 官方提供的集群引导工具之一。
它适合:
学习环境实验环境裸机集群自建 Kubernetes官方文档: Installing kubeadm
14.1 一个典型集群
实验环境可以准备:
Control Plane192.168.1.10
Worker Node 1192.168.1.11
Worker Node 2192.168.1.12整体:
Control Plane 192.168.1.10 │ ┌─────────┼─────────┐ ▼ ▼ ▼ Node 1 Node 2 Node ...14.2 准备条件
具体要求会随着 Kubernetes 版本和发行版变化,但通常需要准备:
Linux稳定主机名 / DNS网络连通容器运行时kubeadmkubeletkubectl此外还需要正确处理:
Swap内核模块sysctlcgroup防火墙 / 端口时间同步实际部署应该按照目标 Kubernetes 版本对应的官方 kubeadm 文档逐项准备,而不要完全照抄旧教程。
截至 2026 年 9 月,Kubernetes 官方当前维护的最新三个 minor release 为 1.37、1.36、1.35,其中 1.37.0 于 2026 年 8 月 26 日发布。
14.3 安装容器运行时
Kubernetes Node 需要容器运行时。
常见:
containerdCRI-O例如完成:
containerd安装与配置后,再准备:
kubeadmkubeletkubectl14.4 初始化 Control Plane
在控制平面节点运行:
sudo kubeadm init实际生产或多网卡环境中通常需要明确指定:
apiserver-advertise-addresspod-network-cidrcontrol-plane-endpoint例如:
sudo kubeadm init \ --apiserver-advertise-address=192.168.1.10 \ --pod-network-cidr=10.244.0.0/16这里的:
pod-network-cidr必须与后续选择的 CNI 配置匹配。
14.5 配置 kubectl
初始化完成后,通常需要为当前用户配置:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf \ $HOME/.kube/config
sudo chown "$(id -u)":"$(id -g)" \ $HOME/.kube/config测试:
kubectl get nodes此时可能看到:
NAME STATUS ROLES AGEmaster NotReady control-plane ...为什么是:
NotReady因为此时通常还没有安装 Pod Network。
14.6 安装 CNI
接下来安装选定的 CNI,例如:
CalicoCiliumFlannel安装后再检查:
kubectl get nodes如果网络配置正常,Node 通常会逐渐变成:
Ready14.7 加入 Worker Node
在 Worker Node 上先完成:
container runtimekubeadmkubelet然后使用 Control Plane 初始化时生成的 join 命令:
kubeadm join <control-plane>:6443 \ --token <token> \ --discovery-token-ca-cert-hash sha256:<hash>回到 Control Plane:
kubectl get nodes可以看到:
NAME STATUS ROLESmaster Ready control-planeworker1 Ready <none>worker2 Ready <none>14.8 kubeadm 背后的架构
使用 kubeadm 后,可以进一步理解:
Control Plane├── kube-apiserver├── etcd├── kube-scheduler├── kube-controller-manager└── static Pods
Worker├── kubelet├── container runtime└── kube-proxy / CNIkubeadm 常见的控制平面组件可以以 Static Pod 方式运行,这是当前官方 kubeadm 架构中的典型做法。
十五、Kubernetes 日志
Kubernetes 中排查应用故障时,最常用的命令之一:
kubectl logs15.1 查看 Pod 日志
kubectl logs nginx持续查看:
kubectl logs -f nginx查看上一次崩溃的容器日志:
kubectl logs nginx --previous15.2 多容器 Pod
如果 Pod 中有多个容器:
kubectl logs nginx -c app指定:
-c <container>15.3 日志与容器
通常:
Application │ ├── stdout └── stderr │ ▼ Container Runtime │ ▼ Kubernetes logs因此应用容器最好能够把关键日志输出到:
stdoutstderr而不是只写在容器内部不易收集的文件里。
生产环境再进一步通过日志系统进行集中收集:
Pod │ ▼Log Collector │ ▼Central Log SystemKubernetes 本身不会强制绑定某一种日志系统。
十六、Events 与故障排查
很多 Kubernetes 故障不是:
Application Exception而是:
SchedulerImageVolumeNetworkNode层面的问题。
因此:
kubectl get events以及:
kubectl describe pod <pod>非常重要。
16.1 Pod Pending
例如:
STATUS: Pending排查:
kubectl describe pod <pod>重点看:
Events常见原因:
资源不足节点不可用PVC 未绑定调度约束Taint / Toleration16.2 ImagePullBackOff
例如:
ImagePullBackOffErrImagePull重点检查:
镜像名称TagRegistry网络认证imagePullSecrets可以:
kubectl describe pod <pod>查看 Events。
16.3 CrashLoopBackOff
如果 Pod:
启动 ↓崩溃 ↓重启 ↓再次崩溃最终可能出现:
CrashLoopBackOff重点检查:
kubectl logs <pod>kubectl logs <pod> --previouskubectl describe pod <pod>常见原因:
配置错误环境变量错误依赖服务不可用启动命令错误权限问题应用本身崩溃16.4 Service 无法访问
排查顺序:
Pod ↓Pod IP ↓Pod Label ↓Service Selector ↓EndpointSlice ↓Service ↓Ingress / LoadBalancer例如:
kubectl get pods --show-labels检查:
kubectl get svc然后:
kubectl get endpointslices如果 Service 存在:
Service但没有对应后端:
EndpointSlice = empty通常需要检查:
SelectorLabelsPod Ready 状态十七、Kubernetes 存储故障
如果:
Pod ↓PVC ↓PV其中任何一层异常,都可能导致 Pod 无法正常运行。
检查:
kubectl get pvckubectl get pv详细信息:
kubectl describe pvc <name>常见问题:
PVC PendingStorageClass 不存在PV 无法绑定权限错误CSI 异常存储后端不可用因此 Kubernetes 存储排查不能只看:
Pod而要一直追踪到:
Pod ↓PVC ↓PV ↓StorageClass / CSI ↓Storage Backend十八、Kubernetes 网络故障排查
网络排查需要区分:
Pod → PodPod → ServiceNode → PodExternal → Service18.1 Pod → Pod
检查 Pod:
kubectl get pods -o wide查看 Pod IP 和 Node。
然后进入容器:
kubectl exec -it <pod> -- /bin/sh测试:
ping <pod-ip>或者:
curl http://<pod-ip>:808018.2 Pod → Service
先查看:
kubectl get svc再查看 EndpointSlice:
kubectl get endpointslices检查 DNS:
kubectl exec -it <pod> -- \ nslookup <service-name>18.3 External → Service
如果使用:
NodePortLoadBalancerIngress则需要继续检查:
外部入口 ↓Node / LoadBalancer ↓Service ↓EndpointSlice ↓Pod任何一层异常,都可能导致:
浏览器访问失败十九、Helm 基础
当 Kubernetes YAML 增多以后,直接维护大量 YAML 会变得复杂。
例如一个生产应用可能包含:
DeploymentServiceConfigMapSecretIngressPVCHPAServiceAccount于是出现了 Helm。
19.1 Helm 是什么
Helm 是 Kubernetes 常见的软件包管理工具。
可以理解为:
Helm │ └── Package Manager │ ▼ KubernetesHelm 中一个应用包通常叫:
Chart一个 Chart 可以包含:
Chart.yamlvalues.yamltemplates/19.2 Helm Chart
典型结构:
myapp/├── Chart.yaml├── values.yaml└── templates/ ├── deployment.yaml ├── service.yaml ├── configmap.yaml └── ingress.yaml其中:
templates/保存模板。
而:
values.yaml保存可配置参数。
例如:
replicaCount: 3
image: repository: nginx tag: "1.28"
service: port: 8019.3 Helm Install
例如:
helm install myapp ./myapp查看:
helm list卸载:
helm uninstall myapp19.4 Helm Upgrade
修改:
values.yaml然后:
helm upgrade myapp ./myapp这样可以复用同一个 Chart:
dev ↓values-dev.yaml
test ↓values-test.yaml
prod ↓values-prod.yaml而不是维护三套几乎相同的 YAML。
19.5 Helm 的定位
可以这样理解:
Dockerfile→ 构建容器镜像
Helm→ 打包 Kubernetes 应用部署配置它不负责替代:
Kubernetes而是帮助更方便地管理 Kubernetes 应用。
二十、Kubernetes 常用命令速查
虽然 Kubernetes 学习不能只靠背命令,但下面这些命令是日常运维中非常常见的。
# Nodekubectl get nodeskubectl describe node <node>
# Podkubectl get podskubectl get pods -o widekubectl describe pod <pod>kubectl logs <pod>kubectl logs <pod> --previouskubectl exec -it <pod> -- /bin/sh
# Deploymentkubectl get deploymentkubectl describe deployment <name>kubectl rollout status deployment/<name>kubectl rollout history deployment/<name>kubectl rollout undo deployment/<name>
# Servicekubectl get svckubectl describe svc <name>
# Config / Secretkubectl get configmapkubectl get secret
# Storagekubectl get pvkubectl get pvc
# Eventskubectl get events
# Namespacekubectl get ns
# Apply / Deletekubectl apply -f app.yamlkubectl delete -f app.yaml其中最值得熟悉的是:
getdescribelogsexecapplydelete可以把它们理解成:
get→ 看有什么
describe→ 看为什么
logs→ 看应用说了什么
exec→ 进入容器检查
apply→ 让集群变成声明的状态
delete→ 删除资源二十一、Kubernetes 故障排查总模型
Kubernetes 故障排查最好不要一上来就:
kubectl delete pod而应该先定位故障层级。
用户访问失败 │ ▼ Ingress / LB │ ▼ Service │ ▼ Endpoint │ ▼ Pod ┌────┴────┐ ▼ ▼ Container Volume │ ▼ Process │ ▼ Application如果 Pod 本身有问题:
Pod │ ├── Pending │ ├── ImagePullBackOff │ ├── CrashLoopBackOff │ └── Running but not Ready就继续沿着:
kubectl describekubectl logskubectl logs --previouskubectl exec进行定位。
如果是网络问题:
Pod IP ↓DNS ↓Service ↓EndpointSlice ↓Ingress / LoadBalancer如果是存储问题:
Pod ↓Volume ↓PVC ↓PV ↓StorageClass / CSI ↓Storage Backend如果是调度问题:
Pod Pending ↓Events ↓Requests ↓Node ↓Taint / Affinity ↓Scheduler二十二、Docker 与 Kubernetes 的关系
学习完 Docker 和 Kubernetes,可以把两者放在一起理解。
Docker│├── Image├── Container├── Network├── Volume└── Compose更偏向:
单机容器运行与管理而 Kubernetes:
Cluster│├── Node│├── Pod│├── Deployment│├── Service│├── ConfigMap / Secret│├── PV / PVC│├── Ingress / Gateway│└── Scheduler更偏向:
集群级容器编排与管理两者并不是:
DockerVSKubernetes的简单竞争关系。
更接近:
Container Image │ ▼Container Runtime │ ▼ Kubernetes │ ├── Scheduling ├── Networking ├── Storage ├── Service Discovery ├── Scaling └── Self-Healing二十三、从运维视角理解 Kubernetes
Docker 学习之后,真正值得建立的是 Kubernetes 的整体运行模型:
Kubernetes Cluster │ ┌──────────────┴──────────────┐ │ │ Control Plane Nodes │ │ ┌─────────┼─────────┐ ┌────────┼────────┐ ▼ ▼ ▼ ▼ ▼ ▼ API Server etcd Scheduler kubelet CNI Runtime │ ▼ Controllers │ ▼Deployment │ ▼ReplicaSet │ ▼Pods │ ├── ConfigMap / Secret ├── Volume / PVC └── Resources对外提供服务:
Internet │ ▼Ingress / Gateway │ ▼Service │ ▼Pods │ ▼Application真正进行故障排查时:
用户 ↓Ingress ↓Service ↓Pod ↓Container ↓Process ↓Application而 Pod 无法启动时:
Pod ↓Scheduler ↓Node ↓Image ↓Runtime ↓Volume ↓Network这就是 Kubernetes 运维中最核心的思维方式:
不要只记资源对象,而要理解一个请求、一个 Pod 和一份配置是怎样穿过整个 Kubernetes 系统的。
二十四、总结
Kubernetes 的核心知识可以整理成下面这条主线:
Cluster │ ├── Control Plane │ └── Node │ ▼ Pod │ ▼ Deployment │ ▼ ReplicaSet │ ▼ Pods │ ├── ConfigMap ├── Secret ├── Volume └── Resources网络:
Pod │ ▼Service │ ├── ClusterIP ├── NodePort └── LoadBalancer │ ▼Ingress / Gateway │ ▼External Traffic存储:
Pod ↓PVC ↓PV ↓Storage网络:
Pod ↓CNI ↓Pod Network ↓Service Network运维:
kubectl get ↓kubectl describe ↓kubectl logs ↓kubectl exec ↓Events ↓Node / Network / Storage / Resource最终可以用一句话概括 Kubernetes:
Kubernetes 通过声明式 API 和控制器,把分散在多台机器上的容器组织成一个可以自动调度、自动恢复、扩缩容和对外提供稳定服务的集群系统。