VMware下安装Ubuntu系统部署k8s集群(保姆级教程)
之前我们已经部署过单机k8s,但是单机k8s总归是有着很大的局限性,今天我们就来学习一下在VMware中创建三台虚拟机部署k8s集群的流程。
VMware的下载以及Ubuntu的安装我就不过多赘述了,网络上的教程已经足够丰富且完善了(下面部署k8s集群使用的Ubuntu版本是24.04)
既然是k8s集群,我们就要先来进行一下我们的规划,以下是我在部署时使用的规划
master IP:192.168.43.3 CIDR:10.244.0.0/16
node01 IP:192.168.43.4 CIDR:10.244.1.0/16
node02 IP:192.168.43.5 CIDR:10.244.2.0/16
在我的规划中有一个master节点,两个node节点,若你想要更多的节点,也可以自由添加。
下面我们先来查看一下你自己的IP是什么
在你创建好第一个虚拟机后,点击最上方的导航栏中的编辑——虚拟网络编辑器,进来之后选择NAT模式,在最下方你能看到自己的IP地址(但这个看到的地址不能作为任何一个节点的地址),你可以选择192.168.xx.1-192.168.xx.254中未被占用的地址,最好是连续的地址来作为你的节点地址
然后点击NAT设置,你能看到子网掩码和子网网关的信息,记住你自己的信息,不要在这个页面做任何更改,退出
然后我们就可以进入到虚拟机中来进行初始设置了,我们开始只需要先创建一台虚拟机,后续的节点虚拟机通过克隆来完成
首先,进入终端,设置主机名为master,这里要重启一下终端才会改变
hostnamectl set-hostname master
然后直接通过可视化界面来调整IP
DNS设置为8.8.8.8
设置好之后点击应用,开关一下网络连接,即可生效
后续的操作我们切换为root用户进行操作,防止一些命令因权限问题执行失败
sudo -i
输入密码
········
更新软件源
apt update
下载一些必要的工具
apt install vim
apt install curl
apt install open-vm-tools-desktop -y #复制粘贴工具
apt install ssh
systemctl start ssh #启动ssh
systemctl enable ssh #设置开机自启
systemctl status ssh #查看状态
reboot #重启
每次重启之后重新切换root用户
sudo -i
部署docker(通过脚本部署)
vim docker-install.sh
点击查看代码
#!/bin/bash
# 脚本名称:docker_install.sh
# 功能描述:安装Docker、配置镜像加速器及Docker Compose
# 输出带时间戳的日志信息
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# 检查命令执行结果
check_status() {
if [ $? -ne 0 ]; then
log "错误:$1 执行失败"
exit 1
else
log "$1 执行成功"
fi
}
# 主函数
main() {
log "开始执行Docker安装与配置脚本"
# 关闭swap分区
log "关闭swap分区"
swapoff -a
check_status "关闭swap分区"
# 备份hosts文件
log "备份hosts文件"
cp /etc/hosts /etc/hosts.bak
check_status "备份hosts文件"
# 配置hosts文件
log "配置hosts文件"
echo "185.199.111.133 raw.githubusercontent.com">> /etc/hosts
check_status "配置hosts文件"
# 更新软件包索引
log "更新软件包索引"
apt update
check_status "更新软件包索引"
# 安装Docker
log "安装Docker"
apt install -y docker.io
check_status "安装Docker"
# 启动Docker服务
log "启动Docker服务"
systemctl start docker
check_status "启动Docker服务"
# 设置Docker服务开机自启
log "设置Docker服务开机自启"
systemctl enable docker
check_status "设置Docker服务开机自启"
# 创建Docker配置目录
log "创建Docker配置目录"
mkdir -p /etc/docker
check_status "创建Docker配置目录"
# 配置Docker镜像加速器
log "配置Docker镜像加速器"
tee /etc/docker/daemon.json <<EOF > /dev/null
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu"
]
}
EOF
check_status "配置Docker镜像加速器"
# 重新加载Docker配置
log "重新加载Docker配置"
systemctl daemon-reload
check_status "重新加载Docker配置"
# 重启Docker服务
log "重启Docker服务"
systemctl restart docker
check_status "重启Docker服务"
# 安装Docker Compose
log "安装Docker Compose"
curl -L "https://1ms.run/install/docker-compose/latest/$(uname -s)/$(uname -m)" -o /usr/local/bin/docker-compose
check_status "下载Docker Compose"
# 设置Docker Compose执行权限
log "设置Docker Compose执行权限"
chmod +x /usr/local/bin/docker-compose
check_status "设置Docker Compose执行权限"
# 创建Docker Compose软链接
log "创建Docker Compose软链接"
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
check_status "创建Docker Compose软链接"
log "Docker安装与配置脚本执行完成"
}
# 执行主函数
main
授予脚本权限
chmod +x docker-install.sh
执行脚本
./docker-install.sh
docker version
看到Client和Serverdocker即安装成功
安装好docker之后就可以开始安装kubelet kubeadm kubectl
sudo apt-get update && sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https curl
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl #阻止自动更新
修改containerd配置,使其从阿里云拉取镜像
先创建containerd目录
mkdir -p /etc/containerd
生成config.toml文件
containerd config default | sudo tee /etc/containerd/config.toml
编辑修改配置
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"]
..................................
# 搜索sandbox_image,把原来的k8s.gcr.io/pause:3.6改为"registry.aliyuncs.com/google_containers/pause:3.9"
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
..........................
SystemdCgroup = true #搜索SystemdCgroup,把这个false改为true
# 搜索config_path,配置镜像加速地址(这是一个目录下面创建)
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
三处修改
配置加速
创建镜像加速目录
mkdir /etc/containerd/certs.d/docker.io -pv
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://b9pmyelo.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
加载containerd的内核模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
重启containerd
systemctl restart containerd
systemctl status containerd
至此,在master节点上的部署要先告一段落了,因前面的所有部署是需要在所有节点上同步进行的,所以我们先在master节点上完成,然后克隆到其他节点
现在来进行克隆工作
右键虚拟机——管理——克隆,按照以下图片步骤完成克隆(要克隆多个节点,重复克隆第一个虚拟机即可)
克隆完成之后打开新的虚拟机
同样的,先修改主机名
hostnamectl set-hostname node01
然后修改ip
修改好之后我们就可以将几台虚拟机进行dns解析,进行相互连通了
修改每台虚拟机的hosts文件,加入ip解析(每台虚拟机上都要运行以下代码!!!这里我就用了三台虚拟机,如果你有更多的,请自行添加)
echo "192.168.43.3 master" | tee -a /etc/hosts
echo "192.168.43.4 node01" | tee -a /etc/hosts
echo "192.168.43.5 node02" | tee -a /etc/hosts
然后你就可以在任意一台虚拟机上使用ping命令查看是否已经联通
ping master
ping node01
ping node02
以上工作都完成之后,我们就可以回到第一台虚拟机master来继续部署了
由于我们使用的是临时关闭swap分区,故在部署过程中,如果有任何的重启都需要重新关闭一下
swapoff -a
创建默认的kubeadm-config.yaml文件并修改
sudo kubeadm config print init-defaults > kubeadm-config.yaml
vim kubeadm-config.yaml
四处修改
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.43.3 # 修改ip
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: master # 修改成自定义的名称
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 使用阿里源
kind: ClusterConfiguration
kubernetesVersion: 1.22.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.244.0.0/16 # 修改成10.244.0.0/16
scheduler: {}
运行kubeadm-config.yaml配置文件
sudo kubeadm init --config kubeadm-config.yaml --v=5
看到Your Kubernetes control-plane has initialized successfully!说明配置成功
此时根据他下面的提示,继续运行他提供的代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后在其他的node节点上运行初始化结束显示在最下方的代码(每个人的token是不一样的,不要直接复制我的)
kubeadm join 192.168.43.6:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:fc81e2f99ed76008b75515d64abbde93970cdfd286810a24eed926d6a82d8a34
运行结束之后回到master节点,查看是否已经加入集群
kubectl get node
接下来就可以进行网络部署了,只需要在master节点部署
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这里我遇到了一个问题,我在虚拟机上连接不到raw.githubusercontent.com,所以我是现在主机上下载了kube-flannel.yml文件,然后将它上传到虚拟机
主机运行:
curl https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
然后回到虚拟机master运行
scp root@1.94.2.33:/root/kube-flannel.yml .
kubectl apply -f kube-flannel.yml
由于它配置文件中的镜像我们还是拉取不到,故这里采用手动拉取
拉取 Flannel CNI 插件镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1
# 拉取 Flannel 主镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/flannel/flannel:v0.26.3
执行
docker save swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1 -o flannel-cni-plugin.tar
docker load -i flannel-cni-plugin.tar
docker save swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/flannel/flannel:v0.26.3 -o flannel-main.tar
docker load -i flannel-main.tar
为每个节点分配CIDR
kubectl patch node master -p '{"spec":{"podCIDR":"10.244.0.0/16"}}'
kubectl patch node node01 -p '{"spec":{"podCIDR":"10.244.1.0/16"}}'
kubectl patch node node02 -p '{"spec":{"podCIDR":"10.244.2.0/16"}}'
然后,我们删除掉现有的Flannel Pod使其重新启动
kubectl delete pods -n kube-flannel -l app=flannel
等待大概3-5分钟
查看所有pod
kubectl get pods --all-namespaces
都处于running状态即网络部署成功
kubectl get node
看到所有节点都处于ready状态
至此k8s全部部署完成