概述
了解如何从头开始在 Ubuntu 22.04 中安装最新的 Kubernetes 版本,包括配置主机和使用 kubeadm 进行更新。非常适合实验室环境!在本文中,我将使用 kubeadm 命令在 Ubuntu 22.04 中从头开始安装 Kubernetes。
环境说明
我在集群中安装了3个Ubuntu 22.04虚拟机作为Kubernetes主机,均我的VMware虚拟化基础架构中运行。它们配置有8 个CPU和8GB RAM,以及80GB的磁盘空间。每个主机都有一个可连接互联网的网卡。此外,我还创建了一个nnkin用户并将其添加到sudoers文件中,以便在示例环境中进行访问。
创建用户
sudo adduser nnkin
为新用户nnkin设置密码,确保其安全性。
sudo passwd nnkin
使用usermod命令将nnkin用户添加到sudo组,这样nnkin用户就可以执行具有管理员权限的命令。
sudo usermod -aG sudo nnkin
切换到新创建的nnkin用户,验证其是否具有sudo权限。
su - nnkin
三台Ubuntu虚拟机IP地址分别为
- kube01 192.168.0.201
- kube02 192.168.0.202
- kube03 192.168.0.203
DNS服务器
- 192.168.0.254
更新系统
无论部署任何环境,都建议先更新一下系统。
sudo apt-get update && sudo apt-get upgrade -y
设置主机名及添加DNS解析
- kube01.nnkin.com 192.168.0.201
- kube02.nnkin.com 192.168.0.202
- kube03.nnkin.com 192.168.0.203
在DNS服务器中分别添加3台主机的A记录解析,为了简单方便,你也可以使用sudo vim /etc/hosts
分别将DNS条目添加至每台服务器hosts文件中。
使用命令ping每台主机DNS解析,验证解析正常。
禁用交换文件
运行一下命令来关闭交换
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
添加内核模块
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
##执行上述命令后运行
sudo modprobe overlay
sudo modprobe br_netfilter
开启IP转发
sudo tee /etc/sysctl.d/kube.conf <<EOT
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOT
将更改应用到内核
sudo sysctl --system
设置Docker存储库
首先,需要设置 Docker的apt存储库
sudo apt-get install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装containerd
执行以下命令开始安装containerd,可能会由于网络缘故失败,多执行几次即可。
sudo apt install containerd.io -y
将systemd配置为组
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
启动服务配置
最后,需要将服务设置为自动启动并检查以确保其正在运行
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd
配置Kubernetes阿里云apt源
Kubernetes需要将某些apt存储库添加到Ubuntu系统中。要配置所需的Kubernetes存储库,将运行以下命令
sudo bash -c 'cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF'
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add
##执行上述命令后运行
sudo apt update
安装Kubernetes
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl -y
sudo apt-mark hold kubelet kubeadm kubectl -y
初始化Kubernetes集群
在master节点上执行以下命令开始初始化Kubernetes集群
sudo kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
耐心等待初始化,这里初始化的速度快慢通常取决于服务器的网络速度和镜像下载情况。一般这个过程通常需要3到10分钟 。如果网络速度较慢或者需要下载的镜像较多,时间可能会更长。
初始化Kubernetes出错
如初始化过程中出现 Initial timeout of 40s passed
,先分析下原因
可以通过执行如下命令解决
sudo sed -i 's/registry.k8s.io\/pause:3.8/registry.aliyuncs.com\/google_containers\/pause:3.9/g' /etc/containerd/config.toml
##执行上述命令后运行
sudo kubeadm reset
##执行上述命令后运行
sudo systemctl restart containerd
##执行上述命令后运行
sudo kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
初始化Kubernetes成功
稍等一会儿后应该看到Kubernetes集群已成功初始化。
该命令的输出将提供将kubeconfig文件复制到 $HOME 目录
同时在输出中,还看到可以在节点上使用的 join命令加入集群的引导。
kubeadm join 192.168.0.201:6443 --token c8h43l.0ws1l6zknfe9y1eo \
--discovery-token-ca-cert-hash sha256:bfe968783dcc5dd6536a286e66e85c4d537a4a1c3f8216550f05794753cd008c
至此集群初始化成功。
加入集群
将主节点/etc/kubernetes/
目录下的admin.conf文件分别拷贝到从节点/etc/kubernetes目录,然后设置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
现需要将kube02和kube03节点加入Kubernetes集群。由于有多个工作节点,因此将在下面的每个节点上使用 kubeadm join命令,需要将token替换为你实际环境中token!另外这段kubeamd join命令的token只有24h,24h就过期,需要执行kubeadm token create --print-join-command
重新生成。
sudo kubeadm join 192.168.0.201:6443 --token c8h43l.0ws1l6zknfe9y1eo \
--discovery-token-ca-cert-hash sha256:bfe968783dcc5dd6536a286e66e85c4d537a4a1c3f8216550f05794753cd008c
kube02
kube03
查看集群状态
kubectl get nodes
状态显示为 NotReady。还需要安装容器网络。
配置Pod网络
为了让Kubernetes节点进行通信,需要设置一个pod overlay网络。如上所述,这就是节点处于NotReady状态的原因。 Calico是Kubernetes的首选网络overlay。要安装Calico进行网络通信,可以在主节点上运行以下命令
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
安装 Calico后,可以再次检查集群的状态,我们看到节点现在处于Ready状态。我们现在已经为容器化应用程序做好了准备。
验证Kubernetes
可以使用以下命令查看集群上的所有资源
kubectl get all -A
创建测试部署
使用 Nginx 应用程序创建一个测试部署
kubectl create deploy nginx --image nginx