本次教程安装主要基于Ubuntu 22.04, 使用AWS EC2服务器来部署。当然,AWS也有自己的AWS K8s服务,不过需要花费小钱钱。虽然也不是说不行,但手动安装下也能熟悉K8s。
1. 安装Docker
-
卸载旧版本:
sudo apt-get remove docker docker-engine docker.io containerd runc
-
设置仓库
更新 apt 包索引
sudo apt-get update
安装apt依赖包
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common \
gpg
添加 Docker 的官方 GPG 密钥
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add –
设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
$(lsb_release -cs) \
stable"
-
安装 Docker Engine-Community
更新 apt 包索引
sudo apt-get update
安装最新版本的 Docker Engine-Community 和 containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
测试 Docker 是否安装成功,输入以下指令,能够打印出版本信息则安装成功:
sudo docker version
设置Docker镜像加速器和驱动程序
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{ "exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
sudo tee /etc/docker/daemon.json <<-'EOF'
{ "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
2. 前置准备
-
设置安全组
在AWS上对每个节点设置同一安全组并在入站规则中进行绑定:
-
设置主机名
更改每台服务器的主机名
sudo hostnamectl set-hostname "k8s-master"
sudo hostnamectl set-hostname "k8s-node1"
sudo hostnamectl set-hostname "k8s-node2"
-
关闭Swap分区
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab
查看分区是否关闭成功,如果没有输出则说明分区关闭成功
swapon -show
若要临时关闭分区
swapoff -a
-
添加主机名
在每个节点上添加hosts(注意换成你自己服务器的IP地址)
sudo nano /etc/hosts
写入以下信息后退出
172.31.34.249 k8s-master
172.31.37.96 k8s-node1
172.31.47.59 k8s-node2
-
桥接IPv4流量
将桥接的IPv4流量传递到iptables的链接,在每个节点添加如下的命令:
sudo nano /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
加载br_netfilter模块
sudo modprobe br_netfilter
查看是否加载
lsmod | grep br_netfilter
生效
sudo sysctl –system
-
同步系统时间
在每个节点添加时间同步
sudo apt -y install ntpdate
sudo ntpdate time.windows.com
-
开启ipvs 在每个节点安装ipset和ipvsadm
sudo apt -y install ipset ipvsadm
在每个节点执行如下脚本
sudo cat > /etc/sysconfig/modules/ipvs.modules <<EOF
打开写入如下内容
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
如果没有该文件夹手动创建:
sudo mkdir -p /etc/sysconfig/modules
sudo chmod 777 /etc/sysconfig/modules/
sudo cat > /etc/sysconfig/modules/ipvs.modules <<EOF
在ipvs.modules里写入以下内容:
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
-
授权、运行、检查是否加载:
sudo chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
3. 安装kubeadm、kubelet和kubectl
注意:如果后期想要使用dashboard,请务必确认版本是否兼容,检查地址:
https://github.com/kubernetes/dashboard/releases
-
下载用于 Kubernetes公共签名密钥-每个节点
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
-
添加 Kubernetes apt 仓库-每个节点
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/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
保持每个节点cgroup drvier和kubelet使用的cgroup drver一致
sudo nano /etc/sysconfig/kubelet
添加以下内容
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置为开机自启动
systemctl enable kubelet
4. 部署k8s的Master节点
切换到根用户下执行
sudo su -
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址
kubeadm init --apiserver-advertise-address=172.31.34.249 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.30.3 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
如果初始遇到Kubeadm初始化报错:[ERROR CRI]: container runtime is not running:
执行以下命令
rm -rf /etc/containerd/config.toml
systemctl restart containerd
根据提示信息,在Master节点上使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5. 部署K8s的从(slave)节点
在k8s-node1和k8s-node2上分别执行以下命令:
切换到根用户下执行
sudo su –
-
添加主节点的token以及token证书
kubeadm join 172.31.34.249:6443 --token 1umscb.zbq9wf4tef99nxkx --discovery-token-ca-cert-hash sha256:e066e73b927432e599ba7b6634e449900bc6b4858e2979a9a4749f35e1dbf30d
6. 部署CNI网络插件
根据提示,在Master节点使用kubectl工具查看节点状态:
kubectl get nodes
如果执行后出现couldn't get current server API group list: Get "https://xxxx /api?timeout=32s": dial tcp xxxxxxx: connect: connection refused 错误
则没有永久关闭交换分区情况下中途退出了
解决方式:重新执行一遍关闭命令即可
sudo swapoff -a
sudo systemctl restart kubelet
-
在Master节点部署CNI网络插件
sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
-
查看部署CNI网络插件进度:
kubectl get pods -n kube-system
-
再次在Master节点使用kubectl工具查看节点状态:
kubectl get nodes
这里可能会有问题,如果master节点上kube-apiserve监听的6443端口时而正常时而异常
刚部署完正常后面一直出现如下错误
The connection to the server xxxxx:6443 was refused - did you specify the right host or port?
查看CNI插件部署进度也出现CrashLoopBackOff错误的话
执行以下命令:
containerd config default | tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
service containerd restart
service kubelet restart
7. 查看集群
查看集群健康状态:
kubectl get cs
kubectl cluster-info
部署成功 !!!(^-^)V