1. Kubernetes基础概述
Kubernetes(简称K8s)是当前最流行的容器编排系统,它源自Google内部15年的大规模容器管理经验。简单来说,Kubernetes就像是一个智能的容器调度管家,它能自动帮你部署、扩展和管理容器化的应用程序。想象一下,你有一堆乐高积木(容器),Kubernetes就是那个能帮你把这些积木按照图纸(应用架构)自动组装起来,还能在积木损坏时自动更换的智能机器人。
Kubernetes的核心价值在于它解决了微服务架构下容器管理的三大痛点:
- 部署自动化:不再需要手动SSH到每台服务器敲命令
- 弹性伸缩:流量高峰时自动扩容,低谷时自动缩容
- 故障自愈:当容器崩溃时自动重启或迁移
对于初学者来说,Kubernetes的学习曲线确实比较陡峭,但掌握它的基础概念后,你会发现它其实是一套非常优雅的分布式系统抽象模型。本文将从零开始,带你理解Kubernetes的核心架构和基本操作。
2. Kubernetes核心架构解析
2.1 控制平面(Control Plane)
控制平面是Kubernetes的大脑,由以下几个关键组件构成:
-
API Server:整个系统的唯一入口,提供RESTful API接口。所有操作(包括kubectl命令)最终都会转化为API调用。
实际部署时建议启用--audit-log-path参数记录审计日志,这对生产环境排查问题非常有用
-
etcd:分布式键值存储,保存整个集群的状态数据。生产环境建议:
- 使用SSD存储
- 部署3/5/7个节点组成高可用集群
- 定期备份数据(etcdctl snapshot save)
-
Controller Manager:负责维护集群状态的核心控制器,包括:
- Node Controller:监控节点健康状况
- Replication Controller:确保Pod副本数符合预期
- Endpoints Controller:维护Service与Pod的映射关系
-
Scheduler:决定Pod应该运行在哪个节点上,考虑因素包括:
- 资源请求(CPU/Memory)
- 亲和性/反亲和性规则
- 数据本地化(如需要特定存储)
2.2 工作节点(Worker Node)
每个工作节点运行着以下关键组件:
-
kubelet:节点上的"Pod管家",负责:
- 与API Server通信
- 管理容器生命周期
- 定期报告节点状态
-
kube-proxy:实现Service的网络代理,支持三种模式:
- userspace(已淘汰)
- iptables(默认)
- IPVS(高性能场景推荐)
-
容器运行时:支持多种实现:
- Docker(已弃用)
- containerd(当前主流)
- CRI-O(RedHat系推荐)
3. Kubernetes核心对象模型
3.1 Pod:最小调度单元
Pod是Kubernetes中最小的部署单元,它:
- 包含1个或多个紧密关联的容器
- 共享网络命名空间(同一Pod内容器通过localhost通信)
- 共享存储卷(volumes)
典型Pod定义示例:
yaml复制apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
3.2 Deployment:声明式更新
Deployment是管理Pod副本集的更高级抽象,它提供:
- 滚动更新(RollingUpdate)
- 版本回滚(rollback)
- 副本数伸缩(scale)
创建Deployment的典型命令:
bash复制kubectl create deployment nginx --image=nginx:1.19 --replicas=3
3.3 Service:服务发现与负载均衡
Service解决Pod动态IP带来的访问问题,主要类型包括:
- ClusterIP(默认):集群内部访问
- NodePort:通过节点端口暴露服务
- LoadBalancer:云厂商提供的负载均衡器
- ExternalName:映射到外部DNS
示例Service定义:
yaml复制apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
4. Kubernetes基础操作实战
4.1 集群初始化
使用kubeadm创建生产级集群的推荐步骤:
-
在所有节点上安装容器运行时和kubeadm/kubelet:
bash复制# 以containerd为例 apt-get update && apt-get install -y containerd kubelet kubeadm kubectl -
主节点初始化:
bash复制
kubeadm init --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=<MASTER_IP> \ --control-plane-endpoint=<LOAD_BALANCER_DNS> -
安装网络插件(如Calico):
bash复制
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml -
加入工作节点:
bash复制kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash <HASH>
4.2 日常运维命令
常用命令速查表:
| 操作类型 | 命令示例 | 说明 |
|---|---|---|
| 查看资源 | kubectl get pods -A -w |
监控所有命名空间的Pod变化 |
| 排查问题 | kubectl describe pod <pod-name> |
查看Pod详细事件 |
| 查看日志 | kubectl logs -f <pod-name> -c <container> |
实时查看容器日志 |
| 执行命令 | kubectl exec -it <pod-name> -- /bin/sh |
进入容器交互式shell |
| 端口转发 | kubectl port-forward svc/nginx 8080:80 |
将服务端口映射到本地 |
5. 常见问题与解决方案
5.1 Pod一直处于Pending状态
可能原因及排查步骤:
- 检查资源是否充足:
bash复制kubectl describe node | grep -A 10 "Allocated resources" - 检查节点污点(Taints):
bash复制
kubectl describe node | grep Taints - 检查存储卷是否可用:
bash复制
kubectl get pv,pvc
5.2 Service无法访问
典型排查流程:
- 确认Endpoint是否正确:
bash复制
kubectl get endpoints <service-name> - 检查kube-proxy日志:
bash复制
kubectl logs -n kube-system <kube-proxy-pod> - 验证网络策略(NetworkPolicy):
bash复制
kubectl get networkpolicy -A
5.3 镜像拉取失败
解决方案:
- 配置镜像拉取密钥:
yaml复制spec: imagePullSecrets: - name: regcred - 使用国内镜像仓库:
bash复制
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx:1.19
6. 生产环境最佳实践
6.1 资源限制与请求
必须为每个容器设置:
yaml复制resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
经验值:Java应用建议至少1GB内存请求,Go应用可以从128MB开始
6.2 健康检查配置
完善的健康检查应包括:
yaml复制livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
6.3 安全加固措施
- 使用PodSecurityPolicy(或新版PodSecurity标准):
bash复制
kubectl label ns default pod-security.kubernetes.io/enforce=restricted - 启用RBAC授权:
bash复制
kubectl create role developer --verb=get,list --resource=pods kubectl create rolebinding dev-binding --role=developer --user=dev-user - 定期轮换证书:
bash复制
kubeadm certs renew all
7. 监控与日志方案
7.1 监控体系搭建
推荐组件组合:
- Prometheus:指标采集与存储
- Grafana:可视化仪表盘
- Alertmanager:告警管理
部署示例:
bash复制helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus prometheus-community/kube-prometheus-stack
7.2 日志收集方案
主流选择:
-
EFK Stack:
- Elasticsearch:日志存储
- Fluentd/Fluent Bit:日志收集
- Kibana:日志查询
-
Loki Stack:
- Loki:轻量级日志存储
- Promtail:日志收集
- Grafana:日志查询
部署命令:
bash复制helm install loki grafana/loki-stack --set fluent-bit.enabled=true,promtail.enabled=false
8. 学习路径建议
对于Kubernetes初学者,我建议按照以下顺序学习:
-
基础概念(1周):
- 掌握Pod/Deployment/Service等核心对象
- 熟悉kubectl基本操作
-
网络与存储(2周):
- 理解CNI插件工作原理
- 掌握PV/PVC/StorageClass
-
安全与运维(3周):
- 深入学习RBAC授权模型
- 掌握Helm包管理工具
-
生产实践(持续):
- 参与实际集群运维
- 研究Operator开发模式
推荐的学习资源:
- 官方文档(kubernetes.io/docs)
- Katacoda交互式教程
- 《Kubernetes in Action》书籍
- KubeCon技术大会视频
我在实际运维中最大的体会是:Kubernetes的复杂性主要来自于分布式系统本身的特性,而不是Kubernetes的设计问题。建议新手从单节点集群(如minikube)开始实验,逐步过渡到多节点生产环境。每次只改变一个变量,做好变更记录,这样遇到问题时更容易定位原因。
