此笔记先搭建单节点集群(pod运行在控制平面),后续会扩展成控制平面+工作节点(pod运行在工作节点)

硬件版本:ubuntu24.04(内核版本:6.14.0-29-generic)

软件版本:containerd:v2.2.1、k8s及其三件套:v1.35.0、cilium:v1.18.5


前期准备工作:

1、配置静态IP(非常重要,防止断网重联ip变化导致集群挂掉)

在网络设置中进行配置:从自动改为手动,填写ip、掩码、网关、DNS。

重新连接wifi或者有线网,使配置生效,使用ifconfig进行检查:

ifconfig

2、进入root模式:

sudo -i

3、关闭swap(非常重要,k8s强制要求)

注:电脑重启后,swap可能会重新挂载,因此每次重启电脑都需要关闭swap,否则集群不会正常启动

swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab

验证:

free -h

交换必须是0B

4、开启内核模块(containerd和CNI必须)

cat <<EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

5、添加内核参数:

cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

验证检查:

sysctl --system

正式开始安装(安装顺序:容器运行时-k8s组件-CNI):

一、安装容器运行时(这里选择containerd):

1、安装依赖:

apt update
apt install -y ca-certificates curl gnupg lsb-release

2、添加docker官方源(containerd在dorcker仓库里):

注:高版本ubuntu一般自带keyrings文件夹,若不存在就自己建:

mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

确保/etc/apt/keyrings目录下出现docker.gpg:

ls /etc/apt/keyrings

没有就多运行几次。

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" \
  | tee /etc/apt/sources.list.d/docker.list > /dev/null

3、安装containerd:

apt update
apt install -y containerd.io

验证版本:

containerd --version

注:此时/etc/containerd/config.toml该路径文件缺少必要参数,需要对其进行初始化。

4、初始化生成默认配置:

注:一般安装完该文件夹会自动生成,如果没有就自己建:

mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

5、修改cgroup驱动(k8s v1.35官方文档要求)

vi /etc/containerd/config.toml

找到[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]下的SystemdCgroup
将SystemdCgroup = false 改为 SystemdCgroup = true

6、重载沙箱(pause)镜像:

找到[plugins.'io.containerd.cri.v1.images'.pinned_images]修改sandbox
sandbox = 'registry.aliyuncs.com/google_containers/pause:3.10.1'(使用国内源)

保存并退出编辑:esc + :wq + 回车

7、启动验证containerd:

systemctl daemon-reload
systemctl restart containerd
systemctl enable containerd

检查状态:

systemctl status containerd

看是否active(running)

按q退出

8、开启内核能力(可选,这里选择开启):

apt install -y linux-tools-common linux-tools-$(uname -r)

9、添加kubernetes官方源(这里是v1.35版本,可以根据实际进行更改):

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key \
  | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes.gpg

确保/etc/apt/keyrings目录下出现kubernetes.gpg:

ls /etc/apt/keyrings
echo "deb [signed-by=/etc/apt/keyrings/kubernetes.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list

10、安装cri-tools:

apt update
apt install -y cri-tools

验证:

crictl version

如果能看到 RuntimeName: containerd,说明 CRI 链路完全正常。

11、配置 crictl 默认 socket(指明containerd.sock,避免每次加参数):

cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

二、安装kuberbetes:

1、安装三大组件:

apt update
apt install -y kubelet kubeadm kubectl

验证版本:

kubeadm version
kubectl version --client
kubelet --version

2、锁版本(防止自动升级出现版本问题):

apt-mark hold kubelet kubeadm kubectl

3、输入exit退出root模式


三、初始化集群(控制平面):

1、在当前文件夹生成 kubeadm 初始化配置:

kubeadm config print init-defaults > kubeadm-init.yaml

2、确认和修改生成的默认参数文件:

vi kubeadm-init.yaml

找到并确认或修改:
advertiseAddress: 1.2.3.4(改成本机ip,如192.168.105.53)

nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock(检查是否指向containerd.sock)

imageRepository: registry.aliyuncs.com/google_containers(改为国内源)

kubernetesVersion: v1.35.0(检查版本是否正确)

name: 24-04gnb(修改为自己主机名称,可通过hostname查询)

networking:
  podSubnet: "10.244.0.0/16"(增加podcidr统一分配段,保障后面cilium检测pod环境无误)

3、初始化集群:

sudo kubeadm init --config kubeadm-init.yaml

成功会看到:
Your Kubernetes control-plane has initialized successfully!

注:如果初始化失败,需清理环境,检查问题后重新初始化:

sudo kubeadm reset -f
sudo rm -rf \
  /etc/kubernetes \
  /var/lib/etcd \
  /etc/cni/net.d \
  /var/lib/cni \
  /var/lib/kubelet \
  /run/flannel \
  /run/calico
sudo systemctl restart containerd
sudo systemctl start kubelet

重置环境再重新init

4、配置 kubectl(使非root用户可以运行kubectl):

mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5、单节点允许调度(因为目前是单节点集群,后面扩展为多节点集群后可以取消):

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

检查:

kubectl get pods -A

此时coredns都是pending状态,说明pod间无法通信,需进一步安装CNI。


四、部署CNI(选择通过helm部署cilium eBPF,需要内核版本大于等于5.10):

1、安装Helm:

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

验证版本:

helm version

2、添加Cilium官方仓库:

helm repo add cilium https://helm.cilium.io
helm repo update

3、部署Cilium v1.18.5:

显式部署:

注:k8sServiceHost改为自己的主机ip、最后一个参数多节点时需改为2。

helm install cilium cilium/cilium \
  --namespace kube-system \
  --version 1.18.5 \
  --set kubeProxyReplacement=false \
  --set k8sServiceHost=192.168.105.53 \
  --set k8sServicePort=6443 \
  --set ipam.mode=kubernetes \
  --set routingMode=tunnel \
  --set encryption.enabled=false \
  --set operator.replicas=1

删除集群自带的kube-proxy:

kubectl -n kube-system delete ds kube-proxy

检查是否删除:

kubectl -n kube-system get ds | grep kube-proxy

更新参数,使用cilium的proxy:

helm upgrade cilium cilium/cilium \
  -n kube-system \
  --version 1.18.5 \
  --reuse-values \
  --set kubeProxyReplacement=true \
  --set kubeProxyReplacementMode=strict
kubectl -n kube-system rollout restart ds/cilium

查看cilium状态(需全部running且1/1):

kubectl get pods -n kube-system | grep cilium

查看节点状态(NotReady → Ready):

kubectl get nodes

查看pod状态(需全部running):

kubectl get pods -A

4、简单验证:

创建临时测试 Pod,验证网络连通性和 DNS 解析:

注:此镜像网站可能会失效,若失效可跳过简单验证。

kubectl run test --image=swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/registry.cn-beijing.aliyuncs.com/acs/busybox:v1.29.2 --rm -it -- /bin/sh

测试外网访问(验证网络转发):

ping www.baidu.com

输入exit退出

5、使用sonobuoy进行验证:

进入https://github.com/vmware-tanzu/sonobuoy/releases下载sonobuoy_0.57.3_linux_amd64.tar.gz

tar -xzf sonobuoy_0.57.3_linux_amd64.tar.gz
sudo mv sonobuoy /usr/local/bin/
sonobuoy version

如果没有配置梯子代理,那么需要先手动拉取国内镜像:

拉取conformance:

sudo crictl pull k8s.m.daocloud.io/conformance:v1.35.0

修改标签:

sudo ctr -n k8s.io images tag k8s.m.daocloud.io/conformance:v1.35.0 registry.k8s.io/conformance:v1.35.0

拉取systemd-logs:

sudo crictl pull docker.m.daocloud.io/sonobuoy/systemd-logs:v0.4

修改标签:

sudo ctr -n k8s.io images tag docker.m.daocloud.io/sonobuoy/systemd-logs:v0.4 docker.io/sonobuoy/systemd-logs:v0.4

运行:

sonobuoy run --wait

过程很长,需等待

查看结果:

results=$(sonobuoy retrieve)
sonobuoy results $results

结果应该会有两个测试失败,是正常的,不用管

Plugin: e2e
Status: failed
Total: 7353
Passed: 442
Failed: 2
Skipped: 6909

Failed tests:
 [sig-apps] Daemon set [Serial] should rollback without unnecessary restarts [Conformance]
 [sig-architecture] Conformance Tests should have at least two untainted nodes [Conformance]


至此,单控制平面节点集群就搭建好了

下一步,为集群添加工作节点:Kuberbetes(k8s)集群搭建笔记2(加入工作节点)

注:可以配置好代理,方便从官方源拉取镜像:Kubernetes(k8s)集群搭建笔记3(为节点配置代理)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐