4、Kubernetes初探:K8s架构与核心组件、Minikube本地集群搭建、kubectl命令行工具

好,咱们进入第四讲。说实话,Kubernetes 这玩意儿,我刚接触的时候也觉得头大。一堆新名词,什么 Pod、Service、Deployment,听着就晕。但别怕,今天咱们就把这层窗户纸捅破。

你想想看,K8s 本质上就是个「管家」。你告诉它「我要跑三个 Nginx 实例,每个要 1 核 CPU、512M 内存」,它就会自动帮你安排到合适的机器上,还能保证它们一直活着。机器挂了?它自动把 Pod 挪到别的机器上。流量大了?它自动帮你扩容。这不就是我们想要的吗?

4.1 K8s 架构:Master 与 Node 的分工

K8s 集群分两拨人:Master 和 Node。Master 是大脑,Node 是手脚。

Master 节点(控制平面)负责决策和调度。它不跑你的业务应用,只跑系统组件。我个人习惯在生产环境部署 3 个 Master 做高可用,但本地学习一个就够了。

Node 节点(工作节点)才是真正跑你容器的地方。每个 Node 上都有个 kubelet,它就像 Master 派来的监工,时刻盯着 Pod 的状态,一有异常就上报。

核心要点:Master 管「做什么」,Node 管「怎么做」。你只管告诉 Master 你的需求,它负责调度到合适的 Node 上执行。

4.2 核心组件逐个拆解

咱们把 K8s 的核心组件过一遍。我当年学的时候,就是靠这张图把关系理清的。

4.2.1 etcd:集群的「记事本」

etcd 是个分布式键值存储,所有集群数据都存这里。谁在哪儿、什么状态、配置是什么,全记在 etcd 里。嗯,这里要注意:etcd 是集群的命根子,数据丢了集群就废了。我在项目中遇到过 etcd 磁盘写满导致集群瘫痪的事故,从那以后我养成了定期备份 etcd 的习惯。

4.2.2 kube-apiserver:唯一的「入口」

所有操作都要经过 API Server。你想创建 Pod?发请求给 API Server。你想看集群状态?也是找 API Server。它是整个集群的网关,也是唯一和 etcd 交互的组件。

4.2.3 kube-scheduler:聪明的「调度员」

当你要创建一个 Pod,Scheduler 就会开始「思考」:哪个 Node 最合适?它会看资源够不够、有没有特殊约束(比如必须跑在 SSD 的机器上),然后选一个最优的 Node。

4.2.4 kube-controller-manager:集群的「巡逻队」

Controller Manager 里跑着一堆控制器。比如 Node 挂了,Node Controller 会发现并标记;Deployment 期望 3 个副本,ReplicaSet Controller 会确保一直有 3 个 Pod 在跑。说白了,它就是保证集群状态和你的期望一致。

4.2.5 kubelet:Node 上的「代理人」

每个 Node 上都有 kubelet。它负责接收 Master 的指令,管理 Pod 的生命周期。比如 Master 说「在这个 Node 上启动一个 Nginx Pod」,kubelet 就会调用容器运行时(比如 Docker)来启动容器。

4.2.6 kube-proxy:网络「交通警」

负责 Service 的网络代理和负载均衡。它维护着节点上的网络规则,让流量能正确到达后端的 Pod。

我的经验:刚开始学的时候,别纠结每个组件的细节。先记住一句话:API Server 是入口,etcd 是数据库,Scheduler 负责调度,Controller Manager 负责维持状态,kubelet 负责执行,kube-proxy 负责网络。这就够了。

4.3 Minikube:本地搭建 K8s 集群

学 K8s 最怕什么?没环境练手。Minikube 就是来解决这个问题的。它能在你本地跑一个单节点的 K8s 集群,非常适合学习和开发测试。

4.3.1 安装 Minikube

我建议用二进制安装,最直接。以 Linux/Mac 为例:

# 下载 Minikube 二进制文件
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

# 安装
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 验证安装
minikube version

Windows 用户可以用 Chocolatey 安装:choco install minikube。我个人习惯用 Linux 虚拟机做实验,但 Minikube 在 Windows 和 Mac 上跑得也挺好。

4.3.2 启动集群

安装完直接启动,Minikube 会自动帮你搞定一切:

# 启动集群(默认使用 Docker 驱动)
minikube start

# 如果你用 Docker Desktop,可以指定驱动
minikube start --driver=docker

# 查看集群状态
minikube status

启动成功后,你会看到类似这样的输出:

😄  minikube v1.32.0 on Ubuntu 20.04
✨  Using the docker driver based on existing profile
👍  Starting control plane node minikube in cluster minikube
🔥  Creating docker container (CPUs=2, Memory=2200MB) ...
🐳  Preparing Kubernetes v1.28.3 on Docker 24.0.7 ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
🌟  Enabled addons: storage-provisioner, default-storageclass
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster

避坑指南:我曾经遇到过 Minikube 启动失败,原因是 Docker 资源不够。Minikube 默认需要 2 核 CPU 和 2G 内存。如果你的电脑配置低,可以用 minikube start --cpus=1 --memory=1024 降低资源需求。但说实话,1G 内存跑起来会很卡,我建议至少给 2G。

4.3.3 常用 Minikube 命令

命令 说明
minikube start 启动集群
minikube stop 停止集群(不删除数据)
minikube delete 删除集群(清空所有数据)
minikube dashboard 打开 K8s 的 Web 管理界面
minikube ip 查看集群的 IP 地址
minikube ssh SSH 到 Minikube 虚拟机内部

4.4 kubectl:K8s 的「瑞士军刀」

kubectl 是 K8s 的命令行工具,所有操作都靠它。你想想看,没有它你连个 Pod 都创建不了。

4.4.1 安装 kubectl

Minikube 自带了一个 kubectl,但我不建议用那个。我习惯单独安装最新版:

# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl

# 验证
kubectl version --client

4.4.2 核心命令速览

kubectl 的命令模式很统一:kubectl [操作] [资源类型] [资源名称] [选项]。记住这个模式,你就能举一反三。

最常用的几个操作:

# 查看所有 Pod
kubectl get pods

# 查看所有 Service
kubectl get services

# 查看所有 Deployment
kubectl get deployments

# 查看所有 Namespace
kubectl get namespaces

# 查看所有节点
kubectl get nodes

# 查看详细信息(加 -o wide 或 -o yaml)
kubectl get pods -o wide
kubectl get pods -o yaml

4.4.3 创建和删除资源

创建资源有两种方式:命令式和声明式。我建议你一开始用声明式,也就是写 YAML 文件。为什么?因为 YAML 文件可以版本控制,方便团队协作。

# 命令式创建(不推荐用于生产)
kubectl run nginx --image=nginx:latest

# 声明式创建(推荐)
kubectl apply -f my-deployment.yaml

# 删除资源
kubectl delete pod nginx-pod
kubectl delete -f my-deployment.yaml

我的习惯:所有资源定义都写成 YAML 文件,放到 Git 仓库里管理。这样谁改了什么一目了然,出了问题也能回滚。我曾经接手过一个项目,所有 Pod 都是手动 kubectl run 创建的,后来要迁移集群,光找这些 Pod 的配置就花了两天。从那以后,我再也不偷懒了。

4.4.4 调试和排查命令

出了问题怎么办?这几个命令能帮你快速定位:

# 查看 Pod 日志
kubectl logs pod-name

# 查看 Pod 的详细信息(包括事件)
kubectl describe pod pod-name

# 进入 Pod 内部
kubectl exec -it pod-name -- /bin/bash

# 查看集群事件
kubectl get events

# 查看资源使用情况
kubectl top pod
kubectl top node

4.5 实战:启动你的第一个 Pod

光说不练假把式。咱们现在就用 Minikube 启动一个 Nginx 服务,感受一下 K8s 的工作流程。

# 1. 确保 Minikube 在运行
minikube status

# 2. 创建一个 Nginx Deployment
kubectl create deployment nginx-demo --image=nginx:latest --replicas=2

# 3. 查看 Pod 状态
kubectl get pods

# 4. 暴露服务(创建 Service)
kubectl expose deployment nginx-demo --type=NodePort --port=80

# 5. 获取访问地址
minikube service nginx-demo --url

# 6. 用浏览器访问上面返回的 URL,你应该能看到 Nginx 的欢迎页面

看到 Nginx 欢迎页面的那一刻,恭喜你,你已经成功迈出了 K8s 的第一步!

总结一下:今天我们搞清楚了 K8s 的架构(Master 和 Node 的分工),认识了核心组件(etcd、API Server、Scheduler、Controller Manager、kubelet、kube-proxy),用 Minikube 在本地搭了一个集群,还学会了 kubectl 的基本操作。下一讲,咱们会深入 Pod 和 Deployment,看看怎么用 YAML 文件来管理应用。

公众号:蓝海资料掘金营,微信deep3321