Kubernetes的奇遇:控制平面配置
Source: Dev.to
在使用像 Google Kubernetes Engine(GKE)这样的托管平台时,有许多事情你不必担心,因为平台会为你处理它们。但你是否曾停下来思考过,在那层简单表面之下到底运行着什么机器?也许你曾好奇自己是否能做到,或者至少想尝试一下。
我进行此项目的个人动机很简单:我想亲自尝试,以真正理解 Kubernetes 的核心。超越托管服务的抽象层,我决定剥开层层包装,检查核心组件。这种做法包括设置标准的 Google Compute Engine(GCE)虚拟机,手动安装和配置每个组件,并自行将网络连线在一起。这种刻意的、动手的过程有助于建立解决问题、优化以及更好理解我们自己集群所需的基础知识。
先决条件
- 一个 Google Cloud Platform(GCP)账户。
- 在本地机器上已安装并通过身份验证的 gcloud CLI。
第一步 – 创建基础实例
我们首先创建一个 “seed” 或基础实例。该虚拟机作为我们的基础,在其上安装所有必需的软件,提供一个清晰的模板,展示 Kubernetes 节点/虚拟机的构建方式。通常会选择 E2 系列,因为它在 GCP 上提供了性价比最高的虚拟机,能够在性能与成本之间取得平衡,适合作为 Kubernetes 控制平面。我们使用 e2-standard-2 机器类型,因为 Kubernetes 至少需要 2 vCPU 和 2 GB RAM 才能舒适运行。
gcloud compute instances create k8s-seed \
--zone=us-central1-a \
--machine-type=e2-standard-2 \
--image-project=ubuntu-os-cloud \
--image-family=ubuntu-2204-lts \
--boot-disk-size=50GB
创建完成后,SSH 登录到该机器:
gcloud compute ssh k8s-seed --zone=us-central1-a
第2步 – 配置操作系统
Kubernetes 对底层 Linux 操作系统有特定要求。我们需要加载内核模块并调整网络设置,以便 Kubernetes 能够正确地操控流量。
1. 加载内核模块
这些模块允许 Kubernetes 操作 Pod 和 Service 的网络流量。
cat /dev/null
2. 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd.io
3. 配置 systemd Cgroup
Kubernetes 推荐使用 systemd 作为 cgroup 驱动。
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
第4步 – 安装 Kubernetes 工具
现在我们安装 “三大组件”:
- kubeadm – 引导程序。
- kubelet – 节点代理。
- kubectl – 命令行工具。
# Add Kubernetes repo
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
# Install
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
现在您已经拥有一个可用于进一步 Kubernetes 引导的基础 VM(例如使用 kubeadm init 初始化控制平面)。继续完成剩余步骤——设置网络、加入工作节点以及部署 Pod 网络——即可在原始 GCE VM 上构建一个完整的、自我管理的 Kubernetes 集群。
第5步 – 初始化集群
此时,我们的“种子”机器已全部准备就绪。我们现在将使用它来初始化控制平面。
1. 运行 Init
我们指定一个与所选网络插件(Calico)兼容的 pod 网络 CIDR。
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
2. 配置 Kubectl
要对新集群执行命令,请运行以下操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
第6步 – 安装网络(Calico)
在安装容器网络接口(CNI)之前,节点之间无法通信。我们将使用 Calico。
Calico 通过不使用封装或覆盖层来提供高性能网络,并提供分布式防火墙,以实现灵活的网络策略强制执行。
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml
运行 kubectl get nodes;大约一分钟后,你应该会看到节点状态变为 Ready。
如果我只使用 GKE 会怎样?
为了体会我们刚才完成的工作,请注意,你只需使用一条 Google Kubernetes Engine(GKE)命令,就可以实现一个完全托管、面向生产环境的等效方案:
gcloud container clusters create k8s-easy \
--zone us-central1-a \
--machine-type e2-standard-2 \
--num-nodes 3
这条命令会创建控制平面(由 Google 托管)、创建工作节点、配置网络,并设置身份验证。通过手动构建其中的一部分,你现在已经了解了这些组件是如何协同工作的。
接下来做什么?
恭喜!您已经成功从零构建了一个功能完整的 Kubernetes 控制平面。
通过以“稍微困难一点”的方式搭建集群,您已经从使用托管服务的用户,转变为了解现代容器化应用编排组件的人。这一基础对于排障、优化以及扩展生产级 Kubernetes 环境至关重要。
后续步骤:
- 为现有集群添加工作节点。
- 使用 Calico 探索高级网络策略。
- 实现持久化存储、监控和日志解决方案。
- 通过 RBAC、审计日志和网络策略加固控制平面。
注意: 我们使用 apt-mark hold 来防止自动更新破坏集群。