3. Kubernetes入门:K8s架构解析、核心组件、集群搭建

好,咱们进入Kubernetes的世界。说实话,我第一次接触K8s的时候,感觉这东西太复杂了——一堆新名词,Pod、Service、Deployment,听着就头大。但后来我发现,只要抓住它的核心思想,其实没那么玄乎。

Kubernetes,说白了就是一个容器编排平台。你想想看,Docker帮你把应用打包成容器,但容器多了谁来管?谁来保证它们高可用?谁来处理网络和存储?这就是K8s要干的事。

3.1 K8s架构:控制面与工作节点

K8s的架构,我习惯把它分成两大部分:控制面(Control Plane)工作节点(Worker Nodes)

控制面是大脑,负责决策。工作节点是手脚,负责干活。这个设计思路,其实跟金融系统的分布式架构很像——控制节点不处理业务数据,只做调度和决策。

核心要点:控制面挂了,集群还在跑,但你没法做变更了。所以生产环境一定要做控制面高可用,至少3个Master节点。

下面这张图,是我自己总结的K8s核心架构关系,你看一眼就能明白各组件怎么配合:

控制面 (Control Plane) API Server Scheduler Controller Manager etcd 工作节点 (Worker Node 1) Kubelet Kube-Proxy Pod Pod 工作节点 (Worker Node 2) Kubelet Kube-Proxy Pod Pod 核心组件说明 API Server:集群入口,所有操作都经过它 Scheduler:决定Pod跑在哪个节点上 Kubelet:节点上的管家,负责Pod生命周期 Pod:最小的调度单元,里面跑容器

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。它是最官方、最标准的方式。别自己去手动装组件,那太容易出错了。

基本步骤就三步:

  1. 准备环境:所有节点装好Docker、关闭swap、设置好主机名和网络
  2. 安装kubeadm:在Master和Worker节点上都装
  3. 初始化集群: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%的日常操作都围绕着这三个组件转。


专注资料整理