• 操作系统:Ubuntu 24.04.1 LTS
  • 容器运行时:containerd://1.7.12
# 此内容为部署完的k8s集群信息

root@k8s-kubeovn:~# kubectl get node -owide
NAME          STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
k8s-kubeovn   Ready    control-plane   3h55m   v1.31.2   192.168.8.150   <none>        Ubuntu 24.04 LTS   6.8.0-35-generic   containerd://1.7.12

1. 安装容器运行时

1. 安装containerd,并配置开机自启动

apt install containerd #默认同时安装runc
apt install ipvsadm # 安装ipvs

2. 生成containerd配置文件

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

1. 配置 systemd cgroup 驱动

结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置:

sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

2. 修改sandbox_image镜像地址

sandbox_image = "k8s.lixx.cn/pause:3.10"

重启containerd

systemctl restart containerd
systemctl enable containerd

2. 安装前配置

1. 编辑hosts文件,添加本机host地址

root@k8s-kubeovn:~# cat /etc/hosts
127.0.0.1 localhost

192.168.8.150 k8s-kubeovn

2. 手动启用 IPv4 数据包转发

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

# 验证
sysctl net.ipv4.ip_forward

3. 关闭防火墙

ufw disable

sudo systemctl stop apparmor
sudo systemctl disable apparmor

4. 关闭swap

如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,sudo swapoff -a 将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如 /etc/fstab、systemd.swap 等配置文件中禁用交换分区,具体取决于你的系统如何配置

修改/etc/fstab配置文件,注释最后一行(和swap有关的一行)并重启操作系统。

3. 安装 k8s

1. 配置apt源,下载 kubelet kubeadm kubectl

如果下载慢可以更换阿里云镜像源或清华镜像源,修改地址即可。

参考官网:安装 kubeadm | Kubernetes

以下指令适用于 Kubernetes 1.31.

  1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
    sudo apt-get update
    # apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
    sudo apt-get install -y apt-transport-https ca-certificates curl gpg
    
  2. 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
    # 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
    # sudo mkdir -p -m 755 /etc/apt/keyrings
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    

说明:

在低于 Debian 12 和 Ubuntu 22.04 的发行版本中,/etc/apt/keyrings 默认不存在。 应在 curl 命令之前创建它。

  1. 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.31 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
    # 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    
  2. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    # 查看各个组件版本
    kubectl version --client
    kubelet --version
    kubeadm version
    
    systemctl restart kubelet
    systemctl enable kubelet
    

2. 配置crictl

  1. 创建 /etc/crictl.yaml 文件
cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 2
debug: false
pull-image-on-create: false
EOF
  1. 验证
root@k8s-kubeovn:~# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID              POD

3. kubeadm初始化

  1. 使用本人自建的镜像仓库,或者使用阿里云的 registry.aliyuncs.com/google_containers
# 查看要下载哪些镜像
kubeadm config images list 
# 执行
kubeadm init  --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address 192.168.8.150 --image-repository k8s.lixx.cn
  • apiserver-advertise-address: 服务器地址
  • image-repository:用阿里云镜像快速下载
  1. 执行成功结果如下
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 as root:

kubeadm join 172.8.8.16:6443 --token 8on0q5.vhcyalu0mognziwd \
        --discovery-token-ca-cert-hash sha256:3360d57313f4a51f2ce3896a2af503f41fdcd2342a2d8fd74e07522945db922b

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

4. 安装cni插件 kube-ovn

去除节点上的污点,允许 kube-ovn-pinger 调度到该节点

kubectl taint nodes k8s-kubeovn node-role.kubernetes.io/control-plane:NoSchedule-

参考:一键安装 - Kube-OVN 文档

下载安装脚本

wget https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.12/dist/images/install.sh

修改配置参数

使用编辑器打开脚本,并修改下列变量为预期值:

REGISTRY="hub.lixx.cn/kubeovn"         # 镜像仓库地址 默认"kubeovn"
VERSION="v1.12.28"                     # 镜像版本/Tag
POD_CIDR="10.16.0.0/16"                # 默认子网 CIDR 不要和 SVC/NODE/JOIN CIDR 重叠
SVC_CIDR="10.96.0.0/12"                # 需要和 apiserver 的 service-cluster-ip-range 保持一致
JOIN_CIDR="100.64.0.0/16"              # Pod 和主机通信网络 CIDR,不要和 SVC/NODE/POD CIDR 重叠 
LABEL="node-role.kubernetes.io/master" # 部署 OVN DB 节点的标签
IFACE=""                               # 容器网络所使用的的宿主机网卡名,如果为空则使用 Kubernetes 中的 Node IP 所在网卡
TUNNEL_TYPE="geneve"                   # 隧道封装协议,可选 geneve, vxlan 或 stt,stt 需要单独编译 ovs 内核模块

可使用正则表达式来匹配网卡名,例如 IFACE=enp6s0f0,eth.*

执行安装脚本

bash install.sh

等待安装完成。

root@k8s-kubeovn:~# kubectl get po -owide -A
kube-system   coredns-7d54cd9f-4sdjp                 1/1     Running   0             60m     10.16.0.2       k8s-kubeovn   <none>           <none>
kube-system   coredns-7d54cd9f-q52dz                 1/1     Running   1 (61m ago)   62m     10.16.0.4       k8s-kubeovn   <none>           <none>
kube-system   etcd-k8s-kubeovn                       1/1     Running   7 (61m ago)   3h55m   192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   kube-apiserver-k8s-kubeovn             1/1     Running   7 (61m ago)   3h55m   192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   kube-controller-manager-k8s-kubeovn    1/1     Running   7 (61m ago)   3h55m   192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   kube-ovn-cni-kmwsc                     1/1     Running   2 (61m ago)   72m     192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   kube-ovn-controller-54c97bf4cd-vskdc   1/1     Running   2 (61m ago)   72m     192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   kube-ovn-monitor-59579846b7-fsf8r      1/1     Running   2 (61m ago)   72m     192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   kube-ovn-pinger-769pc                  1/1     Running   0             59m     10.16.0.5       k8s-kubeovn   <none>           <none>
kube-system   kube-proxy-hdxbw                       1/1     Running   7 (61m ago)   3h55m   192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   kube-scheduler-k8s-kubeovn             1/1     Running   7 (61m ago)   3h55m   192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   ovn-central-664c6d577-6tx9g            1/1     Running   2 (61m ago)   73m     192.168.8.150   k8s-kubeovn   <none>           <none>
kube-system   ovs-ovn-kxcm4                          1/1     Running   2 (61m ago)   73m     192.168.8.150   k8s-kubeovn   <none>           <none>