3. Kubernetes入门:K8s架构解析、核心组件、集群搭建
好,咱们进入Kubernetes的世界。说实话,我第一次接触K8s的时候,感觉这东西太复杂了——一堆新名词,Pod、Service、Deployment,听着就头大。但后来我发现,只要抓住它的核心思想,其实没那么玄乎。
Kubernetes,说白了就是一个容器编排平台。你想想看,Docker帮你把应用打包成容器,但容器多了谁来管?谁来保证它们高可用?谁来处理网络和存储?这就是K8s要干的事。
3.1 K8s架构:控制面与工作节点
K8s的架构,我习惯把它分成两大部分:控制面(Control Plane)和工作节点(Worker Nodes)。
控制面是大脑,负责决策。工作节点是手脚,负责干活。这个设计思路,其实跟金融系统的分布式架构很像——控制节点不处理业务数据,只做调度和决策。
核心要点:控制面挂了,集群还在跑,但你没法做变更了。所以生产环境一定要做控制面高可用,至少3个Master节点。
下面这张图,是我自己总结的K8s核心架构关系,你看一眼就能明白各组件怎么配合:
3.2 核心组件详解
Pod:最小的调度单元
Pod是K8s里最基本的概念。我经常跟团队说:Pod就是一组容器的"合租屋"。它们共享网络栈、共享存储卷,彼此之间用localhost就能通信。
为什么要搞个Pod出来?直接跑容器不行吗?嗯,这里有个实际场景。我在做金融交易系统时,有个应用需要边跑业务进程边收集日志。这两个容器必须部署在同一台机器上,而且日志容器要能实时读到业务容器的日志文件。用Pod就完美解决了——它们共享同一个文件系统。
我的经验:一个Pod里尽量只放一个主容器。除非有明确的"辅助容器"需求(比如日志收集、网络代理),否则别把多个业务容器塞进一个Pod。这会让扩缩容变得很尴尬。
Pod的定义文件长这样:
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: nginx:1.21
ports:
- containerPort: 80
Service:稳定的网络入口
Pod是"朝生暮死"的。今天它在这个节点上,明天可能就跑到另一个节点了。IP地址也会变。那其他服务怎么找到它?
Service就是干这个的。它提供一个稳定的虚拟IP和DNS名称,不管后端Pod怎么变,客户端只管访问Service就行。
我记得有一次,生产环境的Pod因为节点故障重建了,IP全变了。但前端服务完全没感知,因为它们访问的是Service的ClusterIP。这就是Service的价值。
| Service类型 | 适用场景 | 访问方式 |
|---|---|---|
| ClusterIP | 集群内部访问 | 虚拟IP,仅集群内可达 |
| NodePort | 外部访问(测试环境) | 节点IP + 固定端口 |
| LoadBalancer | 云环境外部访问 | 云厂商负载均衡器 |
Deployment:声明式的应用管理
Deployment是我用得最多的资源对象。它让你声明"我想要什么状态",然后K8s负责把实际状态变成你想要的状态。
比如你说"我要3个nginx副本",Deployment就会创建3个Pod。如果某个Pod挂了,它会自动再拉起一个。如果要升级版本,它会做滚动更新,逐个替换Pod。
避坑指南:我曾经在生产环境直接编辑Deployment的yaml文件,改了副本数,结果忘了保存。后来别人部署时覆盖了我的配置,导致服务降级。记住:永远用kubectl apply -f 文件.yaml来管理资源,别手动改。
一个典型的Deployment配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
3.3 集群搭建:从零开始
搭建K8s集群,我推荐用kubeadm。它是最官方、最标准的方式。别自己去手动装组件,那太容易出错了。
基本步骤就三步:
- 准备环境:所有节点装好Docker、关闭swap、设置好主机名和网络
- 安装kubeadm:在Master和Worker节点上都装
- 初始化集群:Master节点执行kubeadm init,Worker节点执行kubeadm join
具体命令我就不贴了,网上教程很多。但我想强调几个关键点:
- Pod网络插件一定要先选好。我习惯用Calico,它在金融场景下性能不错。Flannel也行,但功能少一些。
- Master节点的/etc/hosts要配好。不然节点之间解析不了主机名,集群起不来。
- kubeadm init成功后,会输出一个join命令。把它保存好,Worker节点加入集群时要用。
我的建议:第一次搭建,用虚拟机或者云主机,搞3台机器(1个Master + 2个Worker)。别用Minikube,那东西跟生产环境差距太大。你想想看,金融系统里谁会只用单节点?
集群搭好后,验证一下:
# 查看节点状态
kubectl get nodes
# 查看所有Pod
kubectl get pods --all-namespaces
# 部署一个测试应用
kubectl create deployment test --image=nginx
kubectl expose deployment test --port=80 --type=NodePort
看到所有节点都是Ready状态,Pod都在Running,恭喜你,K8s入门了。
说实话,K8s的学习曲线确实陡。但只要你理解了Pod、Service、Deployment这三个核心概念,后面学什么StatefulSet、ConfigMap、Ingress,都是水到渠成的事。我在金融云项目里,80%的日常操作都围绕着这三个组件转。