Kubernetes 是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、扩缩和管理。
Kubernetes#
控制平面#
控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件。
| 组件名称 | 描述 |
|---|---|
| kube-apiserver | API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。 |
| kube-controller-manager | 控制平面组件,负责运行集群管理功能,比如节点管理、服务发现和负载均衡、自动扩展和滚动更新。 |
| kube-scheduler | 集群调度组件,负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。 |
| etcd | 一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库 |
工作节点#
节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行时环境。
| 组件名称 | 描述 |
|---|---|
| kubelet | 运行在每个节点上,负责维护容器的生命周期,并确保容器运行在指定的节点上。 |
| kube-proxy | 集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。 |
kube-proxy
- 如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。
- 如果使用网络插件为 Service 实现本身的数据包转发, 并提供与 kube-proxy 等效的行为,那么你不需要在集群中的节点上运行 kube-proxy。
部署工具#
| 工具名称 | 描述 |
|---|---|
| kubeadm | 使用 kubeadm 工具来创建和管理 Kubernetes 集群。 该工具能够执行必要的动作并用一种用户友好的方式启动一个可用的、安全的集群。 |
| kind | kind 让你能够在本地计算机上运行 Kubernetes。 使用这个工具需要你安装 Docker 或者 Podman。 |
| minikube | minikube 是一个工具, 能让你在本地运行 Kubernetes。 minikube 在你的个人计算机(包括 Windows、macOS 和 Linux PC)上运行一个一体化(all-in-one) 或多节点的本地 Kubernetes 集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。 |
快速开始#
本次使用 kubeadm 部署Kubernetes集群,版本: v1.33.0,4节点集群,3个控制节点,1个工作节点。使用 kube-vip 构建控制平面高可用。calico 构建网络插件。
| 名称 | 描述 | 地址 | 操作系统 | 容器运行时 | 资源 |
|---|---|---|---|---|---|
| master01 | 控制节点 | 192.168.0.61 | debian | containerd | 4C8G |
| master02 | 控制节点 | 192.168.0.62 | debian | containerd | 4C8G |
| master03 | 控制节点 | 192.168.0.63 | debian | containerd | 4C8G |
| node01 | 控制节点 | 192.168.0.64 | debian | containerd | 4C8G |
一、基础环境#
容器运行时,使用 containerd 运行容器。
- 时间同步
apt-get update && apt-get install -y chrony
systemctl enable chronyd && systemctl start chronyd
- 主机名
# 1. 修改主机名
# 192.168.0.61
hostnamectl set-hostname master01
# 192.168.0.62
hostnamectl set-hostname master02
# 192.168.0.63
hostnamectl set-hostname master03
# 192.168.0.64
hostnamectl set-hostname node01
# 2. 添加主机名 /etc/hosts
192.168.0.61 master01
192.168.0.62 master02
192.168.0.63 master03
192.168.0.64 node01
- 启用IPv4数据包转发
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/k8s.conf
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
- 安装容器运行时
国内建议使用阿里云镜像源;根据操作系统安装容器运行时。
# step 1: 安装必要的一些系统工具
apt-get update
apt-get install ca-certificates curl gnupg
# step 2: 信任 Docker 的 GPG 公钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Step 3: 写入软件源信息
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# Step 4: 安装containerd.io
apt-get update
apt-get install containerd.io
# 安装指定版本的containerd.io:
# Step 1: 查找containerd.io的版本:
# apt-cache madison containerd.io
# Step 2: 安装指定版本
# sudo apt-get -y install containerd.io=[VERSION]
- 配置 containerd
containerd 配置文件在 /etc/containerd/config.toml。
# 1. 生成配置文件
containerd config default > /etc/containerd/config.toml
# 2. 配置 systemd cgroup 驱动
SystemdCgroup = true
# 修改pause_image为指定的镜像仓库地址
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
# 3. 重启 containerd 服务
systemctl daemon-reload
systemctl restart containerd
systemctl enable containerd
systemctl status containerd
二、kubeadm、kubectl、kubelet#
- 确保每个节点上 MAC 地址和 product_uuid 的唯一性
cat /sys/class/dmi/id/product_uuid
- 交换分区的配置
kubelet 的默认行为是在节点上检测到交换内存时无法启动。 这意味着要么禁用交换(swap)功能,要么让 kubelet 容忍交换。
- 若需允许交换分区(swap),请在
kubelet配置文件中添加failSwapOn: false,或通过命令行参数指定。 注意:即使设置了failSwapOn: false,工作负载默认情况下仍无法访问交换空间。 可以通过在 kubelet 配置文件中设置swapBehavior来修改此设置。若要使用交换空间, 请设置swapBehavior的值,这个值不能是默认的NoSwap。 - 要禁用交换分区(swap),可以使用命令
swapoff -a暂时关闭交换分区功能。 要使此更改在重启后仍然生效,请确保在系统的配置文件(如/etc/fstab或systemd.swap)中禁用交换功能, 具体取决于你的系统配置方式。
- 每台机器上安装以下的软件包
国内部署依然使用阿里云镜像源;根据操作系统安装软件包。新版 kubernetes 源按照安装版本区分不同仓库,按照部署版本修改对应位置字符串。
- kubeadm:用来初始化集群的指令。
- kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
- kubectl:用来与集群通信的命令行工具。
# 1. 添加基础软件包
apt-get update && apt-get install -y apt-transport-https
# 2. 添加 kubernetes 密钥
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/deb/Release.key |
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 3. 添加 kubernetes 源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/deb/ /" |
tee /etc/apt/sources.list.d/kubernetes.list
# 4. 安装kubeadm、kubelet、kubectl
apt-get update
apt-get install -y kubelet kubeadm kubectl
- 配置容器运行时
配置文件在 /etc/crictl.yaml。使用 crictl config --list 生成配置文件。
| 运行时 | Unix 域套接字 |
|---|---|
| containerd | unix:///var/run/containerd/containerd.sock |
| CRI-O | unix:///run/crio/crio.sock |
| Docker Engine | unix:///var/run/cri-dockerd.sock |
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 0
debug: false
pull-image-on-create: false
disable-pull-on-run: false
三、负载均衡器(kube-vip)#
kube-vip 为 Kubernetes 集群提供了一个虚拟 IP 和负载均衡器,用于控制平面(用于构建高可用性集群)和 Kubernetes 服务类型,而无需依赖任何外部硬件或软件。
- 安装 kube-vip
# 1. Set the VIP address to be used for the control plane:
export VIP=192.168.0.100
# 2. Set the INTERFACE name to the name of the interface on the control plane(s) which will announce the VIP
export INTERFACE=ens192
# 3. Get the latest version of the kube-vip release by parsing the GitHub API. This step requires that jq and curl are installed
export KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")
- Creating the manifest
# 1. containerd
alias kube-vip="ctr image pull ghcr.io/kube-vip/kube-vip:$KVVERSION; ctr run --rm --net-host ghcr.io/kube-vip/kube-vip:$KVVERSION vip /kube-vip"
- 创建配置文件
/etc/kubernetes/manifests/kube-vip.yaml
kube-vip manifest pod \
--interface $INTERFACE \
--address $VIP \
--controlplane \
--services \
--arp \
--leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml
Note: Since Kubernetes v1.29, the kubeadm bootstrap process has changed so that the admin.conf isn’t usable immediately. This can be worked around by using the super-admin.conf for initialization and then switching to admin.conf when done. See this issue for more details.
修改kube-vip.yaml 文件,将 hostPath 的路径修改为 /etc/kubernetes/super-admin.conf
- hostPath:
path: /etc/kubernetes/super-admin.conf
name: kubeconfig
四、初始化集群#
- 生成集群配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
- 修改集群配置文件
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.0.61
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
name: master01
taints: null
timeouts:
controlPlaneComponentHealthCheck: 4m0s
discovery: 5m0s
etcdAPICall: 2m0s
kubeletHealthCheck: 4m0s
kubernetesAPICall: 1m0s
tlsBootstrap: 5m0s
upgradeManifests: 5m0s
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiServer:
certSANs:
- master01
- master02
- master03
- 192.168.0.61
- 192.168.0.61
- 192.168.0.61
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
controlPlaneEndpoint: 192.168.0.100:6443
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.33.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
proxy: {}
scheduler: {}
- 下载镜像
kubeadm config images pull --config kubeadm-config.yaml
- 初始化集群
# 1. 初始化集群
kubeadm init --config=kubeadm-config.yaml --upload-certs
# 2. 配置认证信息
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 3. 检查集群状态
kubectl cluster-info
# 4. 查看节点状态
kubectl get nodes
- 拷贝集群配置文件
以下证书文件(ca, sa, front-proxy-ca)需要复制到其他 控制节点。
- /etc/kubernetes/pki/ca.*
- /etc/kubernetes/pki/sa.*
- /etc/kubernetes/pki/front-proxy-ca.*
# 1. 复制证书文件至master02
scp -rp /etc/kubernetes/pki/ca.* root@192.168.0.62:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/sa.* root@192.168.0.62:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/front-proxy-ca.* root@192.168.0.62:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/etcd/ca.* root@192.168.0.62:/etc/kubernetes/pki/etcd
# 2. 复制证书文件至master03
scp -rp /etc/kubernetes/pki/ca.* root@192.168.0.63:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/sa.* root@192.168.0.63:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/front-proxy-ca.* root@192.168.0.63:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/etcd/ca.* root@192.168.0.63:/etc/kubernetes/pki/etcd
- 添加节点
根据步骤4 输出的命令,添加控制节点、工作节点。
五、网络插件#
flannel 官方文档#
- 部署命令
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
calico 官方文档#
- 部署命令
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/refs/tags/v3.30.3/manifests/calico.yaml
参考文档


