手把手教你搭建高可用 Kubernetes 集群 (基于 kubeadm)
Kubernetes (K8s) 已经成为容器编排的事实标准,它极大地简化了容器化应用的部署、扩展和管理。无论是学习容器技术、构建微服务平台,还是部署生产环境应用,掌握 Kubernetes 的安装与配置都是必不可少的第一步。
本篇文章将手把手地引导你完成一个基于 kubeadm
工具的多节点 Kubernetes 集群安装过程。我们将专注于使用 Ubuntu Server 操作系统,并详细讲解每个步骤的意义和操作方法,确保即使是初学者也能成功搭建起自己的 K8s 环境。
本文目标:
- 了解使用
kubeadm
安装 Kubernetes 的基本流程。 - 掌握在 Ubuntu 系统上进行 Kubernetes 安装前的环境准备。
- 成功安装一个包含一个控制平面节点 (Control Plane) 和多个工作节点 (Worker Node) 的 Kubernetes 集群。
- 配置网络插件, enabling Pod 之间的通信。
- 验证集群的健康状态,并部署一个简单的应用进行测试。
适用范围:
- 适用于在虚拟机(如 VirtualBox, VMware, KVM)、云服务器(如 AWS EC2, Aliyun ECS)或物理机上搭建 K8s 集群。
- 操作系统:Ubuntu 20.04 LTS 或 Ubuntu 22.04 LTS。
- Kubernetes 版本:我们将使用撰写本文时较新的稳定版本(例如 1.28 或 1.29,具体取决于仓库提供的版本),但安装流程对于不同版本通常差异不大。
环境准备:
在开始之前,你需要准备至少两台运行 Ubuntu Server 的机器(虚拟机或物理机)。一台将用作控制平面节点,另一台或多台将用作工作节点。
对于本指南,我们假设你准备了三台机器:
k8s-control-plane
: 作为控制平面节点k8s-worker-1
: 作为工作节点 1k8s-worker-2
: 作为工作节点 2
每台机器的最低配置要求:
- 操作系统: Ubuntu 20.04+ Server 64-bit
- 内存: 至少 2GB (控制平面节点建议 4GB+)
- CPU: 至少 2 核 (控制平面节点建议 4 核+)
- 硬盘: 至少 20GB 可用空间
- 网络: 所有机器之间必须能够相互访问(特别是控制平面节点与工作节点之间),且所有机器都应能够访问互联网(用于下载安装包和镜像)。
- 用户权限: 一个拥有
sudo
权限的用户。
重要提示:
- 本文是基于
kubeadm
的基础安装指南,旨在帮助理解 K8s 的组件和安装过程。 对于生产环境,还需要考虑高可用控制平面、存储方案、监控、日志、安全加固等更多因素。 - 请在所有节点上执行标记为 “在所有节点上执行” 的步骤。
- 请在特定节点上执行标记为 “仅在控制平面节点执行” 或 “仅在工作节点执行” 的步骤。
第一步:在所有节点上进行系统初始化与配置
这一步将在所有参与 Kubernetes 集群的机器上执行,包括控制平面节点和所有工作节点。
1.1 更新系统包
在开始安装 Kubernetes 组件之前,最好先更新操作系统到最新状态。
“`bash
在所有节点上执行
sudo apt update
sudo apt upgrade -y
“`
等待更新完成。如果更新涉及内核等重要组件,可能需要重启机器。建议重启以确保所有更改生效。
“`bash
如果进行了重要更新,建议重启
sudo reboot
“`
1.2 配置主机名与 hosts 文件 (重要)
为了方便管理和识别集群中的节点,建议给每台机器设置一个有意义的主机名,并在 /etc/hosts
文件中添加所有节点的 IP 地址和主机名的映射。这将有助于节点间的名称解析。
假设你的机器 IP 和主机名如下:
k8s-control-plane
: 192.168.1.100k8s-worker-1
: 192.168.1.101k8s-worker-2
: 192.168.1.102
设置主机名:
在对应的机器上执行以下命令:
“`bash
在 k8s-control-plane 节点执行
sudo hostnamectl set-hostname k8s-control-plane
在 k8s-worker-1 节点执行
sudo hostnamectl set-hostname k8s-worker-1
在 k8s-worker-2 节点执行
sudo hostnamectl set-hostname k8s-worker-2
“`
修改 /etc/hosts
文件:
在所有节点上,编辑 /etc/hosts
文件:
“`bash
在所有节点上执行
sudo nano /etc/hosts
“`
在文件末尾添加所有节点的 IP 和主机名映射:
192.1668.1.100 k8s-control-plane
192.168.1.101 k8s-worker-1
192.168.1.102 k8s-worker-2
保存并关闭文件。现在,所有节点应该能够通过主机名相互 ping 通。
“`bash
在任意节点上测试 ping
ping k8s-worker-1
ping k8s-control-plane
等等,确保都能解析到正确的 IP
“`
1.3 关闭 Swap (重要)
Kubernetes 官方要求关闭 Swap,因为在使用 Swap 的系统中,Kubelet 会出现问题。你可以通过以下命令临时关闭,并修改 /etc/fstab
文件使其永久生效。
“`bash
在所有节点上执行
临时关闭
sudo swapoff -a
永久关闭:编辑 /etc/fstab 文件
找到包含 swap 的行,在行首添加 # 注释掉
sudo sed -i ‘/ swap / s/^(.*)$/#\1/g’ /etc/fstab
“`
验证 Swap 是否已关闭:
“`bash
在所有节点上执行
free -m
输出中的 Swap 行应该都是 0
“`
1.4 配置内核参数 (重要)
Kubernetes 需要一些特定的内核参数来正常工作,主要是关于网络桥接和 IPv4 转发。我们需要加载 br_netfilter
模块,并配置 sysctl
。
“`bash
在所有节点上执行
1. 加载 br_netfilter 模块,并使其开机加载
sudo modprobe br_netfilter
echo ‘br_netfilter’ | sudo tee /etc/modules-load.d/k8s.conf
2. 配置 sysctl 参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
3. 应用 sysctl 参数
sudo sysctl –system
“`
验证内核参数是否已应用:
“`bash
在所有节点上执行
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
应该输出对应参数的值为 1
“`
1.5 安装容器运行时 (Container Runtime)
Kubernetes 不直接运行容器,它依赖于一个容器运行时接口 (CRI)。Docker、containerd、CRI-O 都是常见的运行时。Kubernetes 推荐使用符合 CRI 标准的运行时,如 containerd 或 CRI-O。这里我们选择安装和配置 containerd
。
“`bash
在所有节点上执行
1. 安装 containerd
sudo apt update
sudo apt install -y containerd
2. 生成 containerd 默认配置文件并覆盖现有文件
注意:这会覆盖可能已存在的自定义配置,如果已有配置需谨慎
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
3. 修改 containerd 配置,使用 systemd 作为 Cgroup Driver
这是 kubelet 推荐的配置方式,确保 kubelet 和 containerd 使用相同的 Cgroup Driver
编辑 /etc/containerd/config.toml 文件
找到 [plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options]
将 SystemdCgroup = false 改为 SystemdCgroup = true
sudo sed -i ‘s/SystemdCgroup = false/SystemdCgroup = true/g’ /etc/containerd/config.toml
4. 重启 containerd 服务使配置生效
sudo systemctl restart containerd
5. 验证 containerd 状态
sudo systemctl status containerd
确保服务是 active (running) 状态
“`
1.6 添加 Kubernetes APT 仓库
Kubernetes 官方提供了 APT 仓库,方便我们在 Ubuntu 上安装 kubeadm
, kubelet
, kubectl
。
“`bash
在所有节点上执行
1. 安装必要的包以允许 apt 通过 HTTPS 使用仓库
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
2. 下载 Google Cloud 公钥
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg –dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
3. 添加 Kubernetes apt 仓库
echo “deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /” | sudo tee /etc/apt/sources.list.d/kubernetes.list
4. 更新 apt 索引
sudo apt update
“`
注意: 上述命令中的 v1.29
是撰写本文时的最新稳定版本示例。你可能需要根据实际情况或你的需求调整版本号。你可以访问 https://pkgs.k8s.io/core:/stable:/
查看可用的版本。
1.7 安装 Kubeadm, Kubelet 和 Kubectl
现在我们可以从刚刚添加的仓库安装 Kubernetes 的核心组件了。
kubeadm
: 用于初始化集群和加入节点。kubelet
: 运行在所有节点上,是节点上的主要代理,负责 Pod 的创建、终止等。kubectl
: 命令行工具,用于与集群进行交互。
“`bash
在所有节点上执行
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
验证安装
kubeadm version
kubectl version –client
“`
为了防止在未来的系统更新时不小心升级 Kubernetes 组件导致兼容性问题,建议将这三个包锁定版本。
“`bash
在所有节点上执行
sudo apt-mark hold kubelet kubeadm kubectl
“`
1.8 关闭防火墙 (建议在学习环境执行)
为了简化安装过程和避免网络问题,特别是对于初学者,建议在学习环境中关闭防火墙(如 ufw
)。在生产环境中,应该配置防火墙规则以允许必要的端口流量通过。
Kubernetes 需要开放的端口列表非常多,尤其是在控制平面节点。关闭防火墙能排除端口问题对安装的干扰。
“`bash
在所有节点上执行
检查防火墙状态
sudo ufw status
如果防火墙是激活的,则关闭它
sudo ufw disable
警告:这会使你的机器暴露在网络中,仅在安全的环境或测试中使用。
“`
如果不想关闭防火墙,你需要确保以下端口在节点之间是开放的:
- 控制平面节点:
- Inbound: 6443 (Kubernetes API Server)
- Inbound: 2379-2380 (etcd server client API)
- Inbound: 10250 (Kubelet API)
- Inbound: 10251 (Kube-scheduler)
- Inbound: 10252 (Kube-controller-manager)
- Inbound: CNI 插件所需的端口 (例如 Calico 默认需要 10250, 4789, 端口范围 30000-32767 for NodePort)
- 工作节点:
- Inbound: 10250 (Kubelet API)
- Inbound: 30000-32767 (NodePort Services 默认范围)
- Inbound: CNI 插件所需的端口
完成以上步骤后,所有节点的系统层面准备工作就完成了。
第二步:初始化 Kubernetes 控制平面节点
这一步仅在作为控制平面节点的机器上执行 (k8s-control-plane
)。
使用 kubeadm init
命令初始化集群。这是最核心的步骤,它会安装和配置控制平面所需的组件(如 etcd、API Server、Scheduler、Controller Manager)。
“`bash
仅在控制平面节点执行
sudo kubeadm init \
–apiserver-advertise-address=192.168.1.100 \
–pod-network-cidr=192.168.0.0/16 \
–v=5
“`
--apiserver-advertise-address
: 指定 API Server 发布的 IP 地址。应该使用控制平面节点内部可访问的 IP 地址,工作节点将通过此 IP 地址与控制平面通信。这里使用k8s-control-plane
的 IP 地址192.168.1.100
。--pod-network-cidr
: 指定 Pod 网络(Cluster IP)的 IP 地址范围。这是一个非常重要的参数,你需要选择一个不会与你的物理网络或 Service CIDR (默认为 10.96.0.0/12) 冲突的私有 IP 段。这里我们使用192.168.0.0/16
作为例子。这个 CIDR 将用于为 Pod 分配 IP 地址。选择的 CIDR 必须足够大,以容纳你未来可能创建的所有 Pod。CNI 插件需要这个信息来配置 Pod 网络。--v=5
: (可选) 增加 kubeadm 命令的详细程度,有助于排查问题。
执行 kubeadm init
命令后,过程可能需要几分钟,期间它会下载所需的容器镜像并启动控制平面组件的 Pod。
重要输出:
命令成功完成后,你会看到类似如下的输出:
“`
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a Pod network to the cluster.
Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each of the join nodes.
kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef \
–discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
“`
请务必保存这段输出!特别是最后面的 kubeadm join
命令,工作节点将使用它来加入集群。
2.1 配置 kubectl
根据 kubeadm init
输出的提示,为了能够以普通用户身份使用 kubectl
与集群交互,需要进行以下配置:
“`bash
仅在控制平面节点执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
“`
现在,你可以使用 kubectl
命令了。首先验证集群状态:
“`bash
仅在控制平面节点执行
kubectl get nodes
输出应该显示 k8s-control-plane 节点,状态可能是 NotReady 或 Ready
如果状态是 NotReady,这是正常的,因为我们还没部署网络插件
“`
你也可以查看 kube-system
命名空间下的 Pod,看看控制平面组件是否启动成功:
“`bash
仅在控制平面节点执行
kubectl get pods -n kube-system
你应该看到 etcd, kube-apiserver, kube-controller-manager, kube-scheduler 等 Pod 处于 Running 或 ContainerCreating 状态
“`
2.2 部署 Pod 网络插件 (CNI)
到目前为止,尽管控制平面组件已经运行,但 Pod 之间还无法相互通信,也无法通过 ClusterIP 访问 Service。这是因为我们还没有部署网络插件 (CNI – Container Network Interface)。Kubernetes 支持多种 CNI 插件,如 Calico, Flannel, Cilium 等。
这里我们选择部署 Calico,它是一个功能强大的 CNI 插件,支持网络策略等高级功能。
“`bash
仅在控制平面节点执行
使用 kubectl apply 部署 Calico
这里的 URL 指向 Calico 官方提供的 YAML 清单文件,可能会随版本更新而变化
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
注意:请检查 Calico 官方文档获取最新版本和推荐的安装方式
稍等片刻,检查 kube-system 命名空间下的 Pod 状态
kubectl get pods -n kube-system
“`
你应该看到 calico-node
和 calico-kube-controllers
Pods 正在创建并最终进入 Running
状态。这可能需要一些时间来拉取镜像和启动。
当 Calico Pods 运行正常后,再次检查节点状态:
“`bash
仅在控制平面节点执行
kubectl get nodes
“`
控制平面节点的状态应该从 NotReady
变为 Ready
。这意味着 Kubelet 能够与控制平面通信,并且网络插件已经就绪。
第三步:加入工作节点到集群
这一步在作为工作节点的机器上执行 (k8s-worker-1
, k8s-worker-2
, …)。
还记得在第二步 kubeadm init
命令输出的最后,有一段 kubeadm join
命令吗?现在就用到它了。
3.1 在工作节点上执行 join 命令
切换到你的工作节点 (k8s-worker-1
),执行之前保存的 kubeadm join
命令。请确保命令中的 IP 地址、Token 和 Hash 是你在控制平面节点上 kubeadm init
输出的实际值。
“`bash
仅在工作节点 (k8s-worker-1, k8s-worker-2…) 上执行
sudo kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef \
–discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
“`
执行命令后,工作节点会连接到控制平面,进行认证,并安装 Kubelet 和其他必要的组件,将其自身注册为集群的一部分。
这个过程同样需要一些时间。
3.2 在控制平面节点上验证工作节点是否加入
切换回控制平面节点 (k8s-control-plane
),再次查看节点状态:
“`bash
仅在控制平面节点执行
kubectl get nodes
“`
你应该看到 k8s-worker-1
(以及你加入的其他工作节点) 出现在列表中。它们的初始状态可能是 NotReady
,这是正常的,因为 Kubelet 需要时间来启动、安装 CNI Pod(Calico Pod 会自动部署到新加入的节点上)并等待 CNI 初始化完成。
稍等几分钟,再次运行 kubectl get nodes
。当节点的 CNI Pods 启动并运行正常后,工作节点的状态应该变为 Ready
。
如果你有多个工作节点,重复 3.1 和 3.2 步骤,将所有工作节点加入集群。
第四步:验证集群与部署测试应用
恭喜你!现在你已经搭建好了一个包含控制平面和工作节点的 Kubernetes 集群。接下来我们进行最后的验证并部署一个简单的应用。
4.1 检查所有节点状态
确保所有节点都处于 Ready
状态。
“`bash
仅在控制平面节点执行
kubectl get nodes
“`
输出应该类似这样:
NAME STATUS ROLES AGE VERSION
k8s-control-plane Ready control-plane <X> v1.29.x
k8s-worker-1 Ready <none> <Y> v1.29.x
k8s-worker-2 Ready <none> <Z> v1.29.x
注意工作节点没有 control-plane
角色,这是正常的。
4.2 检查所有系统 Pod 状态
确保 kube-system
命名空间下的所有 Pod 都处于 Running
状态。
“`bash
仅在控制平面节点执行
kubectl get pods -n kube-system
“`
输出应该显示所有核心组件 Pod (etcd, apiserver, scheduler, controller-manager, coredns, calico-node, calico-kube-controllers 等) 以及 CNI Pods 都是 Running
状态。coredns
Pod 状态变为 Running 是一个重要信号,它负责集群内部的 DNS 解析。
如果有些 Pod 长时间处于 Pending
或 Error
状态,可以使用 kubectl describe pod <pod-name> -n kube-system
命令查看详细信息和事件日志,帮助排查问题(例如,可能是镜像无法下载,配置错误,资源不足等)。
4.3 部署一个简单的 Nginx 应用
我们部署一个 Nginx 应用来测试集群是否能正常调度 Pod 并提供服务。
“`bash
仅在控制平面节点执行
1. 创建一个 Nginx Deployment
kubectl create deployment nginx-app –image=nginx
这会在 default 命名空间创建一个名为 nginx-app 的 Deployment,使用 nginx 官方镜像
2. 等待 Pod 创建完成
kubectl get pods -w # 可以使用 -w 参数实时查看状态变化,直到 Pod 变成 Running
kubectl get pods
3. 暴露 Deployment 为 NodePort Service
NodePort 类型的 Service 会在每个工作节点上打开一个特定的端口,并将流量转发到 Service 的 Pods
kubectl create service nodeport nginx-app –tcp=80:80
这会在 default 命名空间创建一个 NodePort Service,将进入节点 NodePort 的 TCP 流量转发到 Pod 的 80 端口
“`
4.4 访问部署的应用
获取 NodePort 的端口号:
“`bash
仅在控制平面节点执行
kubectl get service nginx-app
“`
输出会显示 Service 的信息,包括 NodePort 的端口号,通常在 30000-32767 范围内,例如:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-app NodePort 10.107.xxx.xx <none> 80:3xxxx/TCP <Z>
这里的 3xxxx
就是 NodePort。
现在,你可以在任何一个工作节点的 IP 地址上通过这个 NodePort 访问 Nginx 页面了。
例如,如果 k8s-worker-1
的 IP 是 192.168.1.101
,NodePort 是 30080
,则在浏览器中访问 http://192.168.1.101:30080
,应该能看到 Nginx 的默认欢迎页面。你也可以使用 curl
命令测试:
“`bash
在任意一个能访问工作节点 IP 的机器上执行
curl http://192.168.1.101:30080
“`
如果能看到 Nginx 的 HTML 代码输出,说明你的 Kubernetes 集群已经成功运行,并且 Pod 调度、网络通信、Service 转发等核心功能都工作正常。
第五步:常见问题与排查
在安装过程中,可能会遇到一些问题。以下是一些常见问题及其排查思路:
kubectl get nodes
显示节点状态为NotReady
:- 检查 CNI 插件是否已部署并运行正常 (
kubectl get pods -n kube-system
)。 - 检查 Swap 是否已关闭 (
free -m
)。 - 检查防火墙是否阻止了节点间的通信。如果关闭了防火墙还是有问题,检查安全组或网络策略。
- 在节点上查看 Kubelet 日志 (
sudo journalctl -u kubelet -f
),查找错误信息。
- 检查 CNI 插件是否已部署并运行正常 (
kubeadm init
或kubeadm join
卡住或失败:- 检查网络连接,确保能访问
k8s.gcr.io
(或新的registry.k8s.io
) 和容器镜像仓库(如 Docker Hub)以下载镜像。如果网络受限,可能需要配置代理或使用国内镜像源。 - 检查资源是否满足最低要求(CPU, 内存)。
- 检查容器运行时(containerd)是否安装正确并运行,特别是 Cgroup Driver 配置是否与 Kubelet 兼容 (
systemctl status containerd
,/etc/containerd/config.toml
配置)。 - 检查内核参数 (
sysctl --system
)。 - 如果之前尝试过安装失败,需要先重置 kubeadm 状态 (
sudo kubeadm reset -f
),再重新尝试。
- 检查网络连接,确保能访问
- Pod 处于
Pending
状态:- 通常是因为资源不足(CPU, 内存)或调度失败。使用
kubectl describe pod <pod-name>
查看事件信息。 - 如果没有可用的 Node 满足 Pod 的调度要求(如污点、容忍度),也会 Pending。控制平面节点默认有污点 (
node-role.kubernetes.io/control-plane:NoSchedule
),阻止普通 Pod 调度,这是正常的。
- 通常是因为资源不足(CPU, 内存)或调度失败。使用
- Pod 处于
ContainerCreating
状态长时间不变:- 通常是容器运行时问题或无法下载镜像。查看 Kubelet 日志 (
sudo journalctl -u kubelet -f
) 和容器运行时日志 (sudo journalctl -u containerd -f
)。 - 检查镜像仓库的可访问性。
- 通常是容器运行时问题或无法下载镜像。查看 Kubelet 日志 (
- Pod 处于
CrashLoopBackOff
状态:- Pod 启动后立即崩溃并循环重启。查看 Pod 的日志 (
kubectl logs <pod-name>
) 和事件 (kubectl describe pod <pod-name>
) 查找应用启动失败的原因。
- Pod 启动后立即崩溃并循环重启。查看 Pod 的日志 (
排查问题的关键是查看相关组件的日志 (journalctl -u <service-name> -f
) 和 Kubernetes 对象的事件 (kubectl describe <object-type>/<object-name>
)。
第六步:下一步学习方向
恭喜你完成了 Kubernetes 集群的基本安装!这只是万里长征的第一步。接下来你可以继续学习:
kubectl
的更多用法: 学习如何管理 Deployment, Service, StatefulSet, DaemonSet, ConfigMap, Secret, PersistentVolume 等各种 Kubernetes 对象。- Kubernetes 核心概念: 深入理解 Pod, ReplicaSet, Deployment, Service, Volume, Namespace 等概念。
- Service Types: 学习 ClusterIP, NodePort, LoadBalancer, ExternalName 服务的区别和用途。
- 网络与存储: 探索其他 CNI 插件(如 Cilium)和存储方案(如 PersistentVolume, StorageClass)。
- 部署应用: 学习如何使用 YAML 文件来定义和部署你的应用。
- 高可用性: 学习如何配置高可用的控制平面节点。
- 监控与日志: 集成 Prometheus, Grafana 进行监控,Elasticsearch, Fluentd, Kibana (EFK) 或 Loki 进行日志管理。
- 安全: 学习 RBAC, NetworkPolicy, Secret 管理等安全实践。
搭建自己的 Kubernetes 集群是深入理解其工作原理的最佳方式。祝你在 Kubernetes 的学习旅途中一切顺利!