使用 Kubeadm、Containerd 和 Calico 网络插件搭建 Kubernetes 集群教程
1.安装前准备(所有节点执行)
- 关闭防火墙
sudo systemctl disable --now ufw
- 设置服务时区
# 设置为亚洲的上海时区
sudo timedatectl set-timezone Asia/Shanghai
# 重启时间同步服务
sudo systemctl restart systemd-timesyncd.service
# 确保时间同步服务正常运行
timedatectl status
- 关闭swap分区
vim /etc/fstab
注释掉下面的内容
最后执行:sudo swapoff -a
- 关闭SELinux
sudo apt install -y policycoreutils
# 检查selinux关闭状态
sestatus
- 配置hosts
# 修改机器名称
vim /etc/hostname
# 修改hosts
vim /etc/hosts
# 添加以下内容,这里的ip地址和hostname根据实际情况填写
192.168.80.130 k8s-master
192.168.80.131 k8s-node
- 转发 IPv4 并让 iptables 看到桥接流量
#转发 IPv4 并让 iptables 看到桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOFsudo modprobe overlay
sudo modprobe br_netfilter
lsmod | grep br_netfilter #验证br_netfilter模块
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF# 应用 sysctl 参数而不重新启动
sudo sysctl --system
通过运行以下命令确认 net.bridge.bridge-nf-call-iptables 、net.bridge.bridge-nf-cal1-ip6tables 和 net.ipv4.ip_forward 系统变量在你的sysctl 配置中被设置为 1:
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
- 安装容器运行时
本次安装的是containerd的容器运行时,下载地址:https://github.com/containerd/containerd/releases/download/v1.7.13/crictl-containerd-cni-1.7.13-linux-amd64.tar.gz,可以通过下面命令进行下载:
curl -LO https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz
然后解压到根目录:
sudo tar -zxvf cri-containerd-cni-1.7.13-linux-amd64.tar.gz -C /
然后可以通过下面这行命令查看安装的版本:
containerd -v
通过下面命令创建配置文件目录:
sudo mkdir /etc/containerd
然后通过下面命令先将配置文件创建出来:
先运行:containerd config default
再运行:containerd config default | sudo tee /etc/containerd/config.toml
然后修改一下这个文件:
sudo vi /etc/containerd/config.toml
大概在65行位置修改 sandbox_image 值为 registry.aliyuncs.com/google_containers/pause:3.9 :
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
大概在137行位置修改 SystemdCgroup 为 true:
Root = ""ShimCgroup = ""SystemdCgroup = true
然后保持推出之后通过下面命令启动containerd:
sudo systemctl enable --now containerd
设置containerd配置镜像加速器:
https://www.cnblogs.com/fsdstudy/p/18355827
- 安装Kubernetes
配置并安装apt包
以下内容直接在官网复制的,安装的1.28版本,参考连接:
https://v1-28.docs.kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
sudo apt-get update # apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包 sudo apt-get install -y apt-transport-https ca-certificates curl gpg
下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
添加 Kubernetes apt 仓库。请注意,此仓库仅包含适用于 Kubernetes 1.28 的软件包;对于其他 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.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install-y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
通过下面命令查看安装的kubeadm版本:
kubeadm version
2.初始化集群(在主节点上执行)
- 初始化集群
上一步已经确定了安装v1.28.15的版本,接下来可以在主节点上执行这行命令将主节点的镜像拉取下来:
sudo kubeadm config images pull
--image-repository=registry.aliyuncs.com/google_containers
--kubernetes-version=v1.28.15
--cri-socket unix:///run/containerd/containerd.sock
成功后可以看到:
root@k8s-master:~/dny# crictl images
IMAGE TAG IMAGE ID SIZE
registry.aliyuncs.com/google_containers/coredns v1.10.1 ead0a4a53df89 16.2MB
registry.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc06 56.9MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.28.15 9dc6939e7c573 34.4MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.28.15 10541d8af03f4 33.3MB
registry.aliyuncs.com/google_containers/kube-proxy v1.28.15 ba6d7f8bc25be 28.3MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.28.15 9d3465f8477c6 18.5MB
registry.aliyuncs.com/google_containers/pause 3.9 e6f1816883972 322kB
接下来通过下面命令初始化集群(注意修改主节点IP地址和版本号): (主节点执行)
sudo kubeadm init \
--apiserver-advertise-address=192.168.80.130 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.15 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
接下来,在本机上执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后在所有工作节点上执行这行命令(注意修改为自己的token),注意后面拼接上 --cri-socket=unix:///var/run/containerd/containerd.sock
参数:
kubeadm join 192.168.80.130:6443 --token gyknuw.pb20crsddgovgiqm \--discovery-token-ca-cert-hash sha256:cbd8b9102a6dabac26c1d9a4d60b721720de89b08b5a4df45d8678921c0c8ce4 \--cri-socket=unix:///run/containerd/containerd.sock
然后就可以通过下面命令在主节点上查看所有节点:
kubectl get nodes -o wide
kubectl get pod -A
- 安装calico网络组件
安装Tigera Calico操作符和自定义资源定义:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml
接下来需要安装必须的客户端资源,因为我们pod的网段与calico官网不相同,所以先将这个文件下载下来然后更改一下网段地址:
# 下载客户端资源文件
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml
# 修改pod的网段地址
sed -i 's/cidr: 192.168.0.0/cidr: 10.244.0.0/g' custom-resources.yaml
# 这里的网段地址10.244.0.0是通过以下方式查询的:
root@k8s-master:~/dny/k8s# kubectl get node -oyaml |grep CIDRpodCIDR: 10.244.0.0/24podCIDRs:podCIDR: 10.244.1.0/24 # 这个网段CIDR是/24,custom-resources.yaml中的网段要包含10.244.1.0/24才行podCIDRs:
最后根据这个文件创建资源,执行下面这行命令:
kubectl apply -f custom-resources.yaml
然后可以开始使用下面这行命令监控创建过程:
watch kubectl get all -o wide -n calico-system
如果想要在node节点执行kubectl命令,在每个node节点运行以下命令:(ip地址替换成master节点ip)
scp root@192.168.80.130:/etc/kubernetes/admin.conf /etc/kubernetes/
export KUBECONFIG=/etc/kubernetes/admin.conf
3.遇到的问题:
- 更换镜像下载源,修改deploy一直不生效
解决方法:https://blog.csdn.net/m0_46423830/article/details/145285971