00‑Kubernetes 介绍
应用部署发展过程
传统部署时代
企业在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。
物理机内部同时跑多个应用进程、Redis、DB 等,全部争抢宿主机 CPU、文件系统、内存硬件资源。
虚拟化部署时代
作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机 (VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
层级:宿主机硬件资源 → 宿主机操作系统 → 虚拟机管理系统 → 多台独立虚拟机,每台虚拟机拥有独立操作系统、CPU、内存、文件系统,内部运行业务进程与依赖库。
容器部署时代
容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统 (OS)。因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。
容器因具有许多优势而变得流行起来,下面列出了容器的一些好处:
- 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
- 持续开发、集成和部署:通过快速简单的回滚 (由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
- 关注开发与运维的分离:在构建 / 发布时而不是在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。
- 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
- 云和操作系统分发的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、Google Kubernetes Engine 和其他任何地方运行。
- 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
- 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理‑而不是在一台大型单机上整体运行。
- 资源隔离:可预测的应用程序性能。
- 资源利用:高效率和高密度。
Kubernetes 前世今生
Kubernetes 的名字来自希腊语,意思是 "舵手" 或 "领航员"。K8s 是将 8 个字母 "ubernete" 替换为 "8" 的缩写。
据说 Google 的数据中心里运行着 20 多亿个容器,而且 Google 十年前就开始使用容器技术。最初,Google 开发了一个叫 Borg 的系统 (现在命名为 Omega) 来调度如此庞大数量的容器和工作负载。在积累了这么多年的经验后,Google 决定重写这个容器管理系统,并将其贡献到开源社区,让全世界都能受益。这个项目就是 Kubernetes (K8s)。简单地讲,Kubernetes 是 Google Omega 的开源版本。
- 2014 年 6 月,谷歌云计算专家埃里克・布鲁尔 (Eric Brewer) 在旧金山的发布会为这款新的开源工具揭牌。
- 2015 年 7 月 22 日 K8S 迭代到 v 1.0 并正式对外公布。
- 2017 年 9 月,Mesosphere 宣布 支持 Kubernetes;10 月,Docker 宣布将在新版本中加入对 Kubernetes 的原生支持。至此,容器编排引擎领域的三足鼎立时代结束,Kubernetes 赢得全面胜利。
目前,AWS、Azure、Google、阿里云、腾讯云等主流公有云提供的是基于 Kubernetes 的容器服务;Rancher、CoreOS、IBM、Mirantis、Oracle、Red Hat、VMWare 等无数厂商也在大力研发和推广基于 Kubernetes 的容器 CaaS 或 PaaS 产品。可以说,Kubernetes 是当前容器行业最炙手可热的明星。
Kubernetes 是什么
官方介绍:Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。
Kubernetes 特性
- 自动化上线和回滚:Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。 如果出现问题,Kubernetes 会为你回滚所作更改。
- 服务发现与负载均衡:你无需修改应用来使用陌生的服务发现机制。Kubernetes 为每个 Pod 提供了自己的 IP 地址并为一组 Pod 提供一个 DNS 名称,并且可以在它们之间实现负载均衡。
- 存储编排:自动挂载所选存储系统,包括本地存储、公有云提供商所提供的存储或者诸如 iSCSI 或 NFS 这类网络存储系统。
- Secret 和配置管理:部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息暴露出来。
- 自动装箱:根据资源需求和其他限制自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载进行混合放置,以提高资源利用率并节省更多资源。
- 批量执行:除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。
- 自我修复:Kubernetes 会自动重启崩溃的容器,在必要时替换整个 Pod, 在发生更大范围的故障时重新挂载存储,并且能够与节点自动扩缩容器集成,实现节点级别的自我修复能力。
- 水平扩缩:使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。
- IPv4/IPv6 双协议栈:为 Pod 和 Service 分配 IPv4 和 IPv6 地址。
- 为扩展性设计:无需更改上游源码即可扩展你的 Kubernetes 集群。
Kubernetes 不是什么
Kubernetes 并不是传统的 PaaS (平台即服务) 系统。
- Kubernetes 不限制支持应用的类型,不限制应用框架。不限制受支持的语言 runtimes (例如,Java, Python, Ruby),满足 12‑factor applications。不区分 "apps" 或者 "services"。 Kubernetes 支持不同负载应用,包括有状态、无状态、数据处理类型的应用。只要这个应用可以在容器里运行,那么就能很好的运行在 Kubernetes 上。
- Kubernetes 不提供中间件 (如 message buses)、数据处理框架 (如 Spark)、数据库 (如 Mysql) 或者集群存储系统 (如 Ceph) 作为内置服务。但这些应用都可以运行在 Kubernetes 上面。
- Kubernetes 不部署源码不编译应用。持续集成的 (CI) 工作流方面,不同的用户有不同的需求和偏好的区域,因此,我们提供分层的 CI 工作流,但并不定义它应该如何工作。
- Kubernetes 允许用户选择自己的日志、监控和报警系统。
- Kubernetes 不提供或授权一个全面的应用程序配置 语言 / 系统 (例如,jsonnet)。
- Kubernetes 不提供任何机器配置、维护、管理或者自修复系统。
PaaS 是 (Platform as a Service) 的缩写,是指平台即服务。云计算时代的服务器平台或者开发环境作为服务进行提供就成为了 PaaS。典型的 PaaS 是一个开发平台框架,开发人员可以基于该框架进行构建,从而开发或自定义基于云的应用程序。
Kubernetes 架构
一个 Kubernetes 集群由一组被称作 node 的计算机组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群至少具有一个 master 节点和一个 worker 节点。
控制平面组件(Control Plane Components)
控制平面组件对集群做出全局决策 (比如调度),以及检测和响应集群事件 (例如,当不满足部署的 replicas 字段时,启动新的 pod )。 控制平面组件可以在集群中的任何节点上运行。为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。
表格
| 组件 | 说明 |
|---|---|
| kube‑apiserver | 部署在 master 节点,提供 Kubernetes API 服务,是 Kubernetes 控制面的前端。各种客户端工具 (CLI 或 UI) 以及 Kubernetes 其他组件可以通过它管理 Cluster 的各种资源。 |
| kube‑scheduler | 部署在 master 节点,按照预定的调度策略将 Pod 调度到相应的机器上。 |
| kube‑controller‑manager | 部署在 master 节点,负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。 |
| etcd | 兼具一致性和高可用性的键值数据库,保存 Kubernetes 所有集群数据的后台数据库。 |
Worker 组件
Worker 组件在每个节点上运行 (包括 master 节点),维护运行的 Pod 并提供 Kubernetes 运行环境。
表格
| 组件 | 说明 |
|---|---|
| kubelet | 集群中每个节点上都需要运行的代理,负责维护容器的生命周期,同时也负责 Volume (CVI) 和网络 (CNI) 的管理。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 |
| kube‑proxy | 集群中每个节点上运行的网络代理,负责为 Service 提供 cluster 内部的服务发现和负载均衡。kube‑proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。 |
| 容器运行环境 (Container Runtime) | 负责镜像管理以及 Pod 和容器的真正运行 (CRI)。Kubernetes 支持多个容器运行环境: containerd、cri‑o 等任何实现 Kubernetes CRI (容器运行环境接口)。 |
插件 (Addons)
插件使用 Kubernetes 资源 (DaemonSet , Deployment 等) 实现集群功能,插件资源属于 kube‑system 命名空间。
- kubedns:一个 DNS 服务器,为 Kubernetes 服务提供 DNS 记录。
- Dashboard:为 Kubernetes 集群提供 Web UI,用于管理集群应用与排错。
- 容器资源监控:采集容器时序指标存入数据库,提供浏览界面。
- 集群层面日志:收集容器日志集中存储,提供检索。
- 网络插件:实现 CNI 规范,给 Pod 分配 IP,实现 Pod 跨节点通信。
为什么 master 上也有 kubelet 和 kube‑proxy 呢? Master 同时也是一个 worker。Master 上也可以运行应用,几乎所有的 Kubernetes 组件本身都运行在 Pod 里。例如 etcd,kube‑apiserver,kube‑controller‑manager 等。kubelet 是唯一没有以容器形式运行的 Kubernetes 组件。
01‑Kubernetes 安装
生产环境说明
安装方式对比
表格
| 安装方式 | 核心特点 | 难度 | 适用场景 | 优点 | 缺点 | 推荐指数 |
|---|---|---|---|---|---|---|
| kubeadm | 官方标准、无魔改 | 中等 | 生产自建、CKA/CKAD 考试、标准集群 | 兼容性强、易升级、生态完善、文档全 | 步骤较多,需手动配置运行时 / 网络 | ⭐⭐⭐⭐⭐ |
| 二进制手工部署 | 全手动、底层可控 | 极高 | 原理研究、深度定制、教学演示 | 掌控所有组件、无任何封装 | 极易出错、升级繁琐、维护成本高 | ⭐⭐ |
| Sealos / KubeKey | 一键部署、高可用 | 低 | 快速搭建生产 / 测试环境 | 命令简单、自动装依赖、自带插件 | 轻度封装,不如 kubeadm 透明 | ⭐⭐⭐⭐ |
| k3s / k0s | 轻量、单二进制 | 低 | 边缘节点、低配机器、开发测试 | 占用小、启动快、自带 containerd/ingress | 裁剪版,部分高级特性有差异 | ⭐⭐⭐⭐ |
| minikube / kind / k3d | 单机实验环境 | 极低 | 本地开发、快速验证学习调试 | 一键启动、环境干净 | 不能模拟真实多节点生产集群 | ⭐⭐⭐ |
| 云厂商托管 (ACK/EKS 等) | Master 托管、免运维 | 低 | 云上生产业务 | 高可用、自动升级、无需维护控制面 | 成本高、受厂商限制 | ⭐⭐⭐⭐ |
| RKE / OpenShift | 企业发行版 | 中高 | 大型企业、有商业化支持需求 | 生态成熟、技术支持完善 | 重、学习成本高、商用成本高 | ⭐⭐⭐ |
选择建议
- 学习 + 未来上生产:优先 kubeadm
- 快速搭建、不想折腾:Sealos
- 本地测试 / 开发:k3s 或 minikube
- 边缘 / 低配机器:k3s
环境说明
软件清单
- vmware workstation 17
- ubuntu‑24.04‑live‑server‑amd64
- kubeadm 1.30.2
- kubernetes 1.30.2
- containerd.io=1.7.20‑1
- nerdctl‑1.7.7‑linux‑amd64
- cni‑plugins‑linux‑amd64‑v1.6.0
虚拟机硬件配置
- 2 cpu
- 4G memory
- 1 个 NAT 网卡
- 1 个 200G 硬盘
节点规划
表格
| 节点 | IP | 角色 |
|---|---|---|
| master30.laoma.cloud | 10.1.8.30 | master |
| worker31.laoma.cloud | 10.1.8.31 | worker |
| worker32.laoma.cloud | 10.1.8.32 | worker |
系统准备
安装系统
Ubuntu 2404 系统最小化安装,不要 swap 分区。分区:
- /boot 2G
- / 90G
配置操作系统华为源
cat > /etc/apt/sources.list.d/ubuntu.sources <<'EOF'
Types: deb
URIs: http://mirrors.huaweicloud.com/ubuntu/
Suites: noble noble‑updates noble‑backports
Components: main restricted universe multiverse
Signed‑By: /usr/share/keyrings/ubuntu‑archive‑keyring.gpg
EOF
containerd 仓库
# 导入 containerd 仓库 key
curl -fsSL https://mirrors.huaweicloud.com/docker‑ce/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg
# 添加 containerd 仓库
cat << 'EOF' > /etc/apt/sources.list.d/docker‑ce.list
deb [arch=amd64] https://mirrors.huaweicloud.com/docker‑ce/linux/ubuntu noble stable
EOF
kubernetes 阿里源 (v1.30)
# 添加 kubernetes 仓库 key
curl -fsSL https://mirrors.aliyun.com/kubernetes‑new/core/stable/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes‑apt‑keyring.gpg
# 添加 kubernetes 仓库
echo "deb [signed‑by=/etc/apt/keyrings/kubernetes‑apt‑keyring.gpg] https://mirrors.aliyun.com/kubernetes‑new/core/stable/v1.30/deb/ /" > /etc/apt/sources.list.d/kubernetes.list
安装基础软件包
apt update && apt install -y vim lrzsz bash‑completion open‑vm‑tools apt‑transport‑https sshpass
设置静态 IP (master 示例)
mkdir /etc/netplan/origin
mv /etc/netplan/*yaml /etc/netplan/origin
cat > /etc/netplan/00‑static.yaml <<EOF
network:
ethernets:
ens33:
dhcp4: no
addresses:
‑ 10.1.8.30/24
routes:
to: default
via: 10.1.8.2
nameservers:
addresses:
10.1.8.2
223.5.5.5
version: 2
EOF
chmod 600 /etc/netplan/00‑static.yaml
netplan apply
设置 /etc/hosts
cat << 'EOF' >> /etc/hosts
###### kubernetes #####
10.1.8.30 master30.laoma.cloud master30
10.1.8.31 worker31.laoma.cloud worker31
10.1.8.32 worker32.laoma.cloud worker32
10.1.8.21 hub.laoma.cloud
EOF
关闭 swap
swapoff -a && sed -i '/^.*swap/d' /etc/fstab
rm -f /swap.img
配置 chrony 时间同步
apt install -y chrony
systemctl enable chrony --now
ssh 优化
echo 'UseDNS no' >> /etc/ssh/sshd_config
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
ssh‑keygen -N '' -f ~/.ssh/id_rsa -t rsa
配置 IPVS
# 安装依赖
apt install -y iptables ipvsadm ipset conntrack
# 临时加载模块
modprobe overlay
modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_lc
modprobe ip_vs_sh
modprobe nf_conntrack
# 永久加载模块
cat > /etc/modules‑load.d/k8s‑net.conf << EOF
# K8s 基础网络
br_netfilter
overlay
# IPVS 必需
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_lc
ip_vs_sh
nf_conntrack
EOF
内核参数
cat > /etc/sysctl.d/k8s.conf << 'EOF'
net.bridge.bridge‑nf‑call‑iptables=1
net.bridge.bridge‑nf‑call‑ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
sysctl -p /etc/sysctl.d/k8s.conf
配置 containerd
apt install -y containerd.io=1.7.20‑1 cri‑tools
crictl config runtime‑endpoint unix:///var/run/containerd/containerd.sock
containerd config default > /etc/containerd/config.toml
# 修改 cgroup 与pause镜像
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml
再修改 config.toml 配置镜像 mirrors、tls 跳过校验,之后重启服务
systemctl restart containerd.service
安装 nerdctl & cni‑plugins
tar -xf nerdctl‑1.7.7‑linux‑amd64.tar.gz -C /usr/bin/
mkdir -p /opt/cni/bin
tar -xf cni‑plugins‑linux‑amd64‑v1.6.0.tgz -C /opt/cni/bin
配置 nerdctl 镜像加速:
/etc/containerd/certs.d/下配置各个仓库 hosts.toml
安装 kubeadm kubelet kubectl
apt install -y kubeadm=1.30.2‑1.1 kubelet=1.30.2‑1.1 kubectl=1.30.2‑1.1
systemctl enable kubelet --now
命令补全
mkdir /etc/bash_completion.d
crictl completion bash > /etc/bash_completion.d/crictl
nerdctl completion bash > /etc/bash_completion.d/nerdctl
echo 'export CONTAINERD_NAMESPACE=k8s.io' >> /etc/bash_completion.d/nerdctl
kubectl completion bash > /etc/bash_completion.d/kubectl
kubeadm completion bash > /etc/bash_completion.d/kubeadm
初始化集群
预拉取镜像
kubeadm config images pull --kubernetes‑version=v1.30.2 --image‑repository registry.aliyuncs.com/google_containers
kubeadm init 初始化 master
kubeadm init \
--kubernetes‑version=v1.30.2 \
--pod‑network‑cidr=10.224.0.0/16 \
--image‑repository registry.aliyuncs.com/google_containers
配置 kubectl 凭据
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
部署 calico 网络
# 内网下载calico yaml
wget http://192.168.46.200/class/course‑materials/softwares/stage03/calico‑3.30.7.yaml -O calico.yaml
# 修改pod网段为10.224.0.0/16
sed -i "s|# ‑ name: CALICO_IPV4POOL_CIDR|‑ name: CALICO_IPV4POOL_CIDR|g" calico.yaml
sed -i "s|# value: \"192.*| value: \"10.224.0.0/16\"|g" calico.yaml
kubectl apply -f calico.yaml
worker 节点加入集群
# master生成join命令
kubeadm token create --print‑join‑command
# worker节点执行输出的join命令示例
kubeadm join 10.1.8.30:6443 --token xxx --discovery‑token‑ca‑cert‑hash sha256:xxx
验证集群
kubectl get nodes
kubectl get pods -A
kubectl cluster‑info
kubectl version
节点状态 Ready 条件:网络插件就绪、kubelet 正常运行、swap 关闭。
02‑Node and Cluster
查看节点
# 查看节点清单
kubectl get nodes
# 查看节点详细信息
kubectl describe node worker31.laoma.cloud
删除 worker 节点流程
-
节点设置维护模式,驱逐 Pod
kubectl drain worker31.laoma.cloud --ignore‑daemonsets
执行后节点状态变为
Ready,SchedulingDisabled,不再调度新 Pod。
-
master 删除节点对象
kubectl delete node worker31.laoma.cloud
-
在被删除的 worker 机器执行重置
kubeadm reset -f
reset 不会清理 CNI 网络配置、iptables/ipvs 规则,需要手动清理:
rm -rf /etc/cni/net.d
ipvsadm --clear
完整删除整个集群
-
先驱逐所有 worker 节点
kubectl drain worker31.laoma.cloud --ignore‑daemonsets --force
kubectl drain worker32.laoma.cloud --ignore‑daemonsets --force
kubectl delete node worker31.laoma.cloud worker32.laoma.cloud -
worker 节点执行重置
worker31
kubeadm reset -f
rm -rf /etc/cni/net.d
ipvsadm --clearworker32
kubeadm reset -f
rm -rf /etc/cni/net.d
ipvsadm --clear -
master 节点删除、重置
kubectl delete node master30.laoma.cloud
kubeadm reset -f
rm -fr .kube/
重建集群
# 方式1:使用配置文件初始化
kubeadm init --config kubeadm.yml
# 方式2:直接命令行初始化
kubeadm init \
--kubernetes‑version=v1.30.2 \
--pod‑network‑cidr=10.224.0.0/16 \
--image‑repository hub.laoma.cloud/kubernetes
# 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 部署calico网络
kubectl apply -f calico.yaml
# worker节点加入集群
kubeadm join 10.1.8.30:6443 --token xxx --discovery‑token‑ca‑cert‑hash sha256:xxx