前言
因为镜像拉取失败,所以好多小伙伴说calico网络插件安装失败。之前写过CentOS7上安装多主节点的Kubernets集群,而CentOS7又停止维护了。所以借着在Ubuntu上安装多主的Kubernetes集群的机会,使用国内镜像安装calico网络插件。
视频教程地址:https://www.bilibili.com/video/BV1cus5ehE6y
环境准备
拓扑图
本次安装的为3主3从堆叠etcd集群的k8s集群,使用keepalived和haproxy作为负载均衡器。拓扑图为(图片来自官网):
安装版本
本次操作系统的版本为 Ubuntu Server 24.04
,下载地址为:https://mirrors.aliyun.com/ubuntu-releases/noble/ubuntu-24.04-live-server-amd64.iso。
安装的Kubernetes版本为:1.30
也是目前第二新的版本:
安装的容器运行时为containerd,版本号为 v1.7.20
,下载地址为:https://github.com/containerd/containerd/releases/download/v1.7.20/cri-containerd-cni-1.7.20-linux-amd64.tar.gz。
内网环境
我内网的网段为 172.18.0.0/16
,所以我分配的IP为每台电脑分配的IP地址为:
IP地址 | 主机名称 | 配置 | 作用 |
---|---|---|---|
172.18.88.80 | k8s-control-plane01 | 2c4g | k8s的第一个主节点 |
172.18.88.81 | k8s-control-plane02 | 2c4g | k8s的第二个主节点 |
172.18.88.82 | k8s-control-plane03 | 2c4g | k8s的第三个主节点 |
172.18.88.83 | k8s-apiserver-lb01 | 2c2g | 安装keepalived和haproxy,做主节点apiserver的负载均衡01 |
172.18.88.84 | k8s-apiserver-lb02 | 2c2g | 安装keepalived和haproxy,做主节点apiserver的负载均衡02 |
172.18.88.85 | k8s-worker01 | 2c4g | k8s的第一个工作节点 |
172.18.88.86 | k8s-worker02 | 2c4g | k8s的第二个工作节点 |
172.18.88.87 | k8s-worker03 | 2c4g | k8s的第三个工作节点 |
同时也需要一个虚拟IP地址来负责负载均衡主节点的apiserver,这个IP地址为:172.18.88.88
安装准备
安装ssh软件包
| 此步骤所有服务器都需要做
因为Ubuntu Server默认不支持远程连接,所以需要安装ssh软件包,并启动ssh(同时设置开机自启动),这样我们才能远程连接Ubuntu服务器。执行下面命令安装ssh:
sudo apt install -y ssh
1
同时执行下面命令启动ssh,并设置ssh开机自启动:
sudo systemctl enable --now ssh
1
如图:
接下来就可以连接所有服务器了:
关闭防火墙
| 这个步骤所有服务器都要做
因为是内网安装,所以可以直接关闭防火墙。ubuntu下执行这行命令关闭并且永久关闭:
sudo systemctl disable --now ufw
1
关闭Swap分区
| 这个步骤所有安装Kubernetes的节点都要执行,负载均衡节点选择性执行
临时关闭
执行下面命令可临时关闭Swap分区:
sudo swapoff -a
1
永久关闭
需要修改 /etc/fstab
文件注释掉带 /swap.img
的这一行:
时间同步
| 这个步骤所有的服务器都要做
设置上海时区
因为ubuntu默认时间并不是中国国内时区,所以需要执行这一行命令设置为中国上海时区:
sudo timedatectl set-timezone Asia/Shanghai
1
时间同步
首先需要安装ntpdate,执行下面命令安装:
sudo apt install -y ntpdate
1
执行下面命令进行时间同步:
sudo ntpdate ntp.aliyun.com
1
修改hosts配置
需要将所有服务器的服务器名和域名绑定一下,所以需要修改 /etc/hosts
文件,修改描述为:
添加内容为:
172.18.88.80 k8s-control-plane01
172.18.88.81 k8s-control-plane02
172.18.88.82 k8s-control-plane03
172.18.88.83 k8s-apiserver-lb01
172.18.88.84 k8s-apiserver-lb02
172.18.88.85 k8s-worker01
172.18.88.86 k8s-worker02
172.18.88.87 k8s-worker03
12345678
启用 IPv4 数据包转发
| 这个步骤所有k8s节点都要做
手动启用 IPv4 数据包转发:
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
1234567
使用以下命令验证 net.ipv4.ip_forward
是否设置为 1:
sysctl net.ipv4.ip_forward
1
执行如图:
安装软件
安装容器运行时
下载Containerd
这次选用的容器运行时是 containerd,版本号为 1.7.20
。可直接执行下面这行命令下载此安装包:
curl -LO https://github.com/containerd/containerd/releases/download/v1.7.20/cri-containerd-cni-1.7.20-linux-amd64.tar.gz
1
下载后如图:
解压压缩包
直接将这个压缩包解压到根目录就可以了,直接执行这行命令:
sudo tar -zxvf cri-containerd-cni-1.7.20-linux-amd64.tar.gz -C /
1
解压后可以执行这行命令查看版本号:
sudo containerd --version
1
可以看到安装的 1.7.20
这个版本的containerd:
修改配置文件
因为安装后默认是不自带配置文件的,所以需要创建目录并生成配置文件。执行这行命令创建目录:
sudo mkdir /etc/containerd
1
然后执行这行命令生成配置文件:
containerd config default | sudo tee /etc/containerd/config.toml
1
因为默认的pause镜像是在谷歌上拉取的,国内拉取不下来,所以需要修改 /etc/containerd/config.toml
配置文件,将pause镜像改为 registry.aliyuncs.com/google_containers/pause:3.9
,如图所示:
然后需要开启cgroup,用于限制分配给进程的资源。将SystemCgroup设置为true,如图所示:
注意要保存哦。
启动containerd
执行这行命令启动containerd,并设置为开机自启动:
sudo systemctl enable --now containerd
1
然后可以查看启动结果:
安装Kubernetes
安装keepalived和haproxy
| 此步骤仅用在负载均衡服务器上做即可
执行下面命令安装:
sudo apt install -y keepalived haproxy
1
修改keepalived配置文件
配置文件地址为/etc/keepalived/keepalived.conf
,keepalived配置文件主节点和从节点内容不同,配置文件如下:
! /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 3
weight -2
fall 10
rise 2
}
vrrp_instance VI_1 {
! 主节点为MASTER,从节点为BACKUP
state MASTER/BACKUP
! 网卡接口名字
interface ens160
virtual_router_id 51
! 主节点为101,从节点为100
priority 101/100
authentication {
auth_type PASS
auth_pass XiaoHH
}
virtual_ipaddress {
! 虚拟IP地址,注意修改为你自己的地址
172.18.88.88
}
track_script {
check_apiserver
}
}
123456789101112131415161718192021222324252627282930313233
内容:
state: 状态,主节点为MASTER,从节点为BACKUPinterface:物理接口名称,获取可执行下面命令:
ip a
1
获取内容如下:
priority:优先级,主节点为101,从节点为100virtual_ipaddress:虚拟IP地址,我的为 172.18.88.88
,注意修改为你自己规划的IP地址
所以主节点配置文件内容为:
! /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 3
weight -2
fall 10
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 101
authentication {
auth_type PASS
auth_pass XiaoHH
}
virtual_ipaddress {
172.18.88.88
}
track_script {
check_apiserver
}
}
1234567891011121314151617181920212223242526272829
从节点配置文件内容为:
! /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 3
weight -2
fall 10
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 100
authentication {
auth_type PASS
auth_pass XiaoHH
}
virtual_ipaddress {
172.18.88.88
}
track_script {
check_apiserver
}
}
123456789101112131415161718192021222324252627282930
keepalived还需要一个健康检查脚本,脚本地址为 /etc/keepalived/check_apiserver.sh
,注意我规划的负载均衡端口为6443,如果不同注意修改为你自己的。内容为(主从节点内容一样):
#!/bin/sh
errorExit() {
echo "*** $*" 1>&2
exit 1
}
curl -sfk --max-time 2 https://localhost:6443/healthz -o /dev/null || errorExit "Error GET https://localhost:6443/healthz"
12345678
然后需要将这个文件添加执行权限,执行下面命令:
sudo chmod +x /etc/keepalived/check_apiserver.sh
1
修改haproxy配置文件
该配置文件地址为 /etc/haproxy/haproxy.cfg
,需要修改到内容为:
# /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log stdout format raw local0
daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 1
timeout http-request 10s
timeout queue 20s
timeout connect 5s
timeout client 35s
timeout server 35s
timeout http-keep-alive 10s
timeout check 10s
#---------------------------------------------------------------------
# apiserver frontend which proxys to the control plane nodes
#---------------------------------------------------------------------
frontend apiserver
# 负载均衡端口
bind *:6443
mode tcp
option tcplog
default_backend apiserverbackend
#---------------------------------------------------------------------
# round robin balancing for apiserver
#---------------------------------------------------------------------
backend apiserverbackend
option httpchk
http-check connect ssl
http-check send meth GET uri /healthz
http-check expect status 200
mode tcp
balance roundrobin
# 主节点列表,注意IP地址修改为你自己的
server k8s-control-plane01 172.18.88.80:6443 check verify none
server k8s-control-plane02 172.18.88.81:6443 check verify none
server k8s-control-plane03 172.18.88.82:6443 check verify none
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
修改结果为:
启动keepalived和haproxy
使用下面命令启动keepalived和haproxy,并开机自启动:
sudo systemctl enable --now keepalived
sudo systemctl enable --now haproxy
12
看到下面结果代表启动成功:
安装kubelet kubeadm kubectl
以下指令适用于 Kubernetes 1.30。更新 apt
包索引并安装使用 Kubernetes apt
仓库所需要的包:
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
123
下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
123
添加 Kubernetes apt
仓库:
# 此操作会覆盖 /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.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
12
更新 apt
包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
123
安装成功后可以查看版本:
初始化集群
首先可以只在主节点上拉取镜像,执行下面命令:
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.30.4
1
然后在任意一台主节点上执行下面命令进行初始化:
sudo kubeadm init
--apiserver-advertise-address=172.18.88.80
--control-plane-endpoint="172.18.88.88:6443"
--upload-certs
--image-repository=registry.aliyuncs.com/google_containers
--kubernetes-version=v1.30.4
--service-cidr=10.96.0.0/12
--pod-network-cidr=10.244.0.0/16
--cri-socket=unix:///run/containerd/containerd.sock
123456789
参数解释:
–apiserver-advertise-address:执行这行命令的主节点IP地址,注意修改为你自己的–control-plane-endpoint:负载均衡apiserver的虚拟IP地址和端口,注意修改为自己的–upload-certs:标志用来将在所有控制平面实例之间的共享证书上传到集群–image-repository:因为官方镜像在谷歌,国内拉取不下来,所以使用国内的阿里云镜像–kubernetes-version:Kubernetes的版本号–service-cidr:Service的网段地址–pod-network-cidr:pod的网段地址–cri-socket:标志使用containerd作为容器运行时
执行后初始化成功如图:
在初始化成功的主节点本地执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
123
其余主节点执行这条命了加入主节点集群,注意后面加上了 --cri-socket=unix:///run/containerd/containerd.sock
来使用containerd作为容器运行时(注意复制你自己的):
sudo kubeadm join 172.18.88.88:6443 --token xsp48h.uzkxsr9bd58vmey2
--discovery-token-ca-cert-hash sha256:2ed5ad71a9adfcc2f4fb7e4c3b3f5bca53fae29bd21d4788820ed34eddf27049
--control-plane --certificate-key e0472e957c5a54cea8eb41aefc47abe52c701ed3f65a1cc17c524b34163404a8
--cri-socket=unix:///run/containerd/containerd.sock
1234
执行成功后可以看到提示,同样圈起来命令需要本地执行一下:
然后可以执行如下命令查看已经加入的节点:
kubectl get nodes -o wide
1
可以看到三个主节点加入成功:
然后在所有工作节点下执行下面命令,以加入工作节点。注意同样添加了 --cri-socket=unix:///run/containerd/containerd.sock
参数(注意复制你自己的):
sudo kubeadm join 172.18.88.88:6443 --token xsp48h.uzkxsr9bd58vmey2
--discovery-token-ca-cert-hash sha256:2ed5ad71a9adfcc2f4fb7e4c3b3f5bca53fae29bd21d4788820ed34eddf27049
--cri-socket=unix:///run/containerd/containerd.sock
123
执行后可以看到加入成功:
安装calico网络插件
calico网络插件的地址为:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart
我事先将镜像做好了,并且提交到了阿里云。安装分两种情况安装calico:
如果你的节点数量小于等于50,执行下面这行命令安装calico:
kubectl create -f https://raw.githubusercontent.com/xiaohh-me/kubernetes-yaml/main/network/calico/calico-v3.28.1.yaml
1
如果你的节点数量大于50个,执行这行命令进行安装calico:
kubectl create -f https://raw.githubusercontent.com/xiaohh-me/kubernetes-yaml/main/network/calico/calico-typha-v3.28.1.yaml
1
根据你的的节点数量进行选择性安装,因为我的节点数量包括主节点只有六个,所以选择上面那行命令。执行结果如图:
可以执行下面命令查看是否安装成功:
kubectl get pod -o wide -n kube-system
1
当这些calico的pod都为执行状态的时候则代表calico安装完成:
测试部署一个应用程序
将安装一个nginx应用程序来测试这个kubernetes是否搭建成功,执行下面命令:
kubectl apply -f https://raw.githubusercontent.com/xiaohh-me/kubernetes-yaml/main/deployment/nginx/nginx-deploy-1.25.5.yaml
1
执行这行命令可以看结果:
访问任意一个节点的30080端口可以看到nginx访问成功:
Kubernetes多主节点的集群就安装完成了,你们也可以参考我之前的文章或视频,了解包括metallb,ingress等组件的安装,使自己的kubernetes集群更加完善。