上官泰 发表于 2025-10-1 17:04:43

博客园出海记-组装集装箱:自建 Kubernetes 集群


在开篇中我们宣布了博客园出海计划的启航,出海航船选择了阿里云。
第一件准备工作是在航船上组装集装箱 —— 搭建 Kubernetes 集群。
出海根据地选在了阿里云新加坡机房,Kubernetes 集群用阿里云 ECS 自己搭建,没有使用阿里云容器服务 ACK。
首先购买一台 ECS 用于部署 Control Plane 节点,Control Plane 是指挥协调控制中心,不干具体活,所以不需要很高的配置,选择了2核4G的经济型 ECS 实例(ecs.e-c1m2.large),操作系统选用了 Ubuntu 24.04,加入新建的 kube 安全组(集群中的节点服务器都会加入这个安全组),主机名是 kube-cp-01。
准备工作

安装 k8s 三驾马车

安装 kubelet + kubeadm + kubectl,使用的版本是 1.33.4
安装所需的软件包
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gnupg添加 k8e 安装源的签名秘钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg添加 k8e 安装源
echo 'deb https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
chmod 644 /etc/apt/sources.list.d/kubernetes.listapt-get 命令安装三驾马车
apt-get update
apt-get install -y kubelet kubectl kubeadm确认版本
~# kubelet --version
Kubernetes v1.33.4
~# kubectl version
Client Version: v1.33.4
~# kubeadm version -o short
v1.33.4配置网络

开启 IPv4 包转发
echo "net.ipv4.ip_forward = 1" | tee /etc/sysctl.d/k8s.conf
sysctl --system安装容器运行时 containerd

采用手动安装方式,安装的 containerd 版本是 2.1.4
下载并解压至 /usr/local
wget -c https://github.com/containerd/containerd/releases/download/v2.1.4/containerd-2.1.4-linux-amd64.tar.gz
tar Cxzvf /usr/local containerd-2.1.4-linux-amd64.tar.gz通过 systemd 自动运行 containerd
mkdir -p /usr/local/lib/systemd/system
wget -c https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -O /usr/local/lib/systemd/system/containerd.service
systemctl daemon-reload
systemctl enable --now containerd安装 runc
wget -c https://github.com/opencontainers/runc/releases/download/v1.3.1/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc安装CNI 插件
wget -c https://github.com/containernetworking/plugins/releases/download/v1.8.0/cni-plugins-linux-amd64-v1.8.0.tgz
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.8.0.tgz生成 containerd 配置
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml在 /etc/containerd/config.toml 中启用 SystemdCgroup

...

    SystemdCgroup = true重启 containerd 使配置生效
systemctl restart containerd安装 containerd 命令行工具 nerdctl
wget -c https://github.com/containerd/nerdctl/releases/download/v2.1.4/nerdctl-2.1.4-linux-amd64.tar.gz
tar -zxf nerdctl-2.1.4-linux-amd64.tar.gz
mv nerdctl /usr/bin/nerdctl将 nerdctl 的默认命名空间设置为 k8s.io
mkdir /etc/nerdctl
echo 'namespace = "k8s.io"' | tee /etc/nerdctl/nerdctl.toml创建高可用集群

在 /etc/hosts 中添加 control-plane-endpoint 的主机名解析
127.0.0.1kube-api用 kubeadm 命令创建集群
kubeadm init \
    --control-plane-endpoint "kube-api:6443"\
    --upload-certs \
    --pod-network-cidr=10.0.0.0/8 \
    --skip-phases=addon/kube-proxy注:没有安装 kube-proxy 是因为会用 cilium 取代它
出现下面的输出说明集群创建成功了
Your Kubernetes control-plane has initialized successfully!
...注:上面的输出内容中包含加入 control-plane 与 worker 节点的命令,后面会用到
用 nerdctl ps 命令查看容器运行情况
root@kube-cp-01 ~ # nerdctl ps   
CONTAINER ID    IMAGE                                              COMMAND                   CREATED               STATUS
f54d0fc6215a    registry.k8s.io/kube-proxy:v1.33.4               "/usr/local/bin/kube…"    About a minute ago    Up   
73cbd7ab3d69    registry.k8s.io/kube-scheduler:v1.33.4             "kube-scheduler --au…"    About a minute ago    Up
5ff05420d284    registry.k8s.io/kube-controller-manager:v1.33.4    "kube-controller-man…"    About a minute ago    Up
7031f91cfc16    registry.k8s.io/kube-apiserver:v1.33.4             "kube-apiserver --ad…"    About a minute ago    Up
2c79907098d4    registry.k8s.io/etcd:3.5.21-0                      "etcd --advertise-cl…"    About a minute ago    Up   
975b724b2814    registry.k8s.io/pause:3.10                         "/pause"                  About a minute ago    Up       添加 kubectl 用到的配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config查看节点运行情况
root@kube-cp-01 ~ # kubectl get nodes
NAME         STATUS   ROLES         AGE   VERSION
kube-cp-01   Ready    control-plane   2m41s   v1.33.4注:这里 control-plane node 处于 Ready 状态,如果用了 kube-proxy,要等完成安装 CNI 网络插件才会处于 Ready 状态
查看 pod 运行情况
root@kube-cp-01 ~ # kubectl get pods -n kube-system                                                                                                                                                                1 ↵
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-674b8bbfcf-994fx             0/1   Pending   0          2m40s
coredns-674b8bbfcf-bsgdd             0/1   Pending   0          2m40s
etcd-kube-cp-01                      1/1   Running   0          2m46s
kube-apiserver-kube-cp-01            1/1   Running   0          2m45s
kube-controller-manager-kube-cp-01   1/1   Running   0          2m44s
kube-proxy-vlvt9                     1/1   Running   0          2m40s
kube-scheduler-kube-cp-01            1/1   Running   0          2m44scoredns 处于 Pending 状态是因为还没安装 CNI 网络插件
安装 CNI 网络插件

选用 cilium 作为 CNI(容器网络接口) 插件
安装 cilium cli
wget -c https://github.com/cilium/cilium-cli/releases/download/v0.18.7/cilium-linux-amd64.tar.gz
tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin安装 cilium
root@kube-cp-01 ~ # cilium install --version 1.18.1 \--namespace kube-system \--set bpf.masquerade=true \--set kubeProxyReplacement=trueℹ️Using Cilium version 1.18.1
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 博客园出海记-组装集装箱:自建 Kubernetes 集群