如何在 CentOS 8 上安装 Kubernetes 集群
在CentOS 8上安装Kubernetes 集群的过程与CentOS 7的过程几乎相似(您可以在此处查看),但此处的过程有一些变化。这些变化主要围绕Docker的安装。
从CentOS 8(以及RHEL 8)开始,docker已被Redhat的工具podman和buildah取代。事实上,docker 软件包现已从默认软件包存储库中删除。
Redhat团队希望通过此举简化创建和使用容器的过程,而无需特殊权限,同时保持与 Docker 镜像的兼容性,并且无需守护进程即可操作它们。Podman承诺在Kubernetes环境中运行时提供更大的灵活性,但目前尚无定论。
在本文中,我们将介绍在CentOS 8平台上安装Kubernetes的过程,该平台运行Docker-CE(社区版)。在后面的文章中,我们还将使用podman对我们的容器进行类似的安装。
先决条件
- 运行 CentOS 8 的三台服务器——1个主节点和2 个工作节点。
- 建议你的节点至少有 2 个 CPU,每台机器有 2GB 或以上的 RAM。这不是一个严格的要求,但很大程度上取决于你打算运行的应用程序的需求。
- 所有节点均具有 Internet 连接。我们将从存储库中获取Kubernetes和docker包。同样,您需要确保默认安装了DNF 包管理器,并且可以远程获取包。
- 所有节点都应该能够相互连接,无论是在私有网络还是公共网络上(以可用网络为准)。
- 您还需要访问具有 sudo 或 root 权限的帐户。在本教程中,我将使用我的 root 帐户。
预防
大多数节点通常具有唯一的MAC地址,但在某些特殊情况下,某些虚拟机可能具有相同的 MAC 地址。因此,建议您确认 Product_UUID和MAC地址在任何节点中都不相同。
Kubernetes使用这些值来唯一标识集群中的节点。如果这些值对于每个节点来说不是唯一的,则安装过程可能会失败。
检查网络接口的MAC地址并进行比较。
# ip link
要检查product_uuid并进行比较,请运行以下命令。
# cat /sys/class/dmi/id/product_uuid
逻辑架构
我们的安装设计为让主节点控制工作节点。在此安装结束时,我们的逻辑架构将如下所示。
主节点——该机器通常充当控制平面并运行集群数据库和 API 服务器(kubectl CLI 与其通信)。
我们的 3 节点Kubernetes 集群看起来如下:
在主节点上安装 Kubernetes 集群
要使Kubernetes正常工作,您需要一个容器化引擎。如上所述,我们将使用Docker-CE。
下列机构将在CentOS 8 Master-Node上执行。
步骤 1:准备主机名、防火墙和 SELinux
在您的CentOS 8 主节点上,设置系统主机名并在/etc/hosts文件中更新 DNS。
# hostnamectl set-hostname master-node # cat <<EOF>> /etc/hosts 192.168.0.47 master-node 192.168.0.48 node-1 worker-node-1 192.168.0.49 node-2 worker-node-2 EOF
接下来,使用ping 命令ping 你的worker-node-1和worker-node-2,以检查更新的主机文件是否正常工作。
# ping 192.168.0.48 # ping 192.168.0.49
接下来,禁用Selinux,因为这是允许容器访问主机文件系统所必需的,而主机文件系统是 pod 网络和其他服务所需要的。
# setenforce 0
设置setenforce可0
有效地将 SELinux 设置为宽容,从而有效地禁用 SELinux 直到下次重新启动。要完全禁用它,请使用以下命令并重新启动。
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux # reboot
Kubernetes 使用各种端口进行通信和访问,这些端口需要对 Kubernetes 可访问,并且不受防火墙的限制。
在端口上配置防火墙规则。
# firewall-cmd --permanent --add-port=6443/tcp # firewall-cmd --permanent --add-port=2379-2380/tcp # firewall-cmd --permanent --add-port=10250/tcp # firewall-cmd --permanent --add-port=10251/tcp # firewall-cmd --permanent --add-port=10252/tcp # firewall-cmd --permanent --add-port=10255/tcp # firewall-cmd --reload # modprobe br_netfilter # echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
步骤2:在 CentOS 8 上安装 Docker-CE
您需要先使用以下dnf config-manager命令添加Docker存储库,因为它不再位于默认包列表中。
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
还安装containerd.io包,该包作为守护进程使用,管理主机系统的完整容器生命周期,从图像传输和存储到容器执行和监督到低级存储到网络附件等等。
# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
现在安装最新版本的docker-ce包。
# dnf install docker-ce
您现在可以启用并启动docker服务。
# systemctl enable docker # systemctl start docker
步骤 3:在 CentOS 8 上安装 Kubernetes(Kubeadm)
接下来,您需要手动添加Kubernetes存储库,因为它们在CentOS 8上未默认安装。
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
Kubeadm可帮助您启动符合最佳实践的最小可行 Kubernetes 集群。借助kubeadm,您的集群应该能够通过 Kubernetes 一致性测试。
Kubeadm还支持其他集群生命周期功能,例如升级、降级和管理引导令牌。Kubeadm 还可以与其他编排工具(如Ansible和Terraform)集成。
软件包 repo 现已准备好,您可以继续安装kubeadm软件包。
# dnf install kubeadm -y
安装成功完成后,启用并启动该服务。
# systemctl enable kubelet # systemctl start kubelet
步骤 4:使用 kubeadm 创建控制平面 Master
Kubernetes 主服务器充当集群的控制平面 ,运行集群所需的一些关键服务。因此,初始化过程将进行一系列预检查,以确保机器已准备好运行 Kubernetes。这些预检查会显示警告并在出现错误时退出。然后, kubeadm init下载并安装集群控制平面组件。
现在是时候初始化 Kubernetes master 了,但在此之前,您必须禁用交换才能运行“ kubeadm init ”命令。
# swapoff -a
初始化Kubernetes master 是一个完全自动化的过程,由“ kubeadm init ”命令控制,如下所示。
# kubeadm init
接下来,复制以下命令并将其存储在某处,因为我们稍后需要在工作节点上运行此命令。
kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5 \ --discovery-token-ca-cert-hash ha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf7
提示:有时上述命令可能会抛出有关传递的参数的错误,因此为了避免错误,您需要删除该‘\’
字符,最终命令将如下所示。
# kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5 –discovery token-ca-cert-hash sha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf7
一旦Kubernetes成功初始化,您必须允许您的用户开始使用集群。在我们的场景中,我们将使用 root 用户。您也可以使用 sudo 用户启动集群,如下所示。
要使用root,请运行:
# mkdir -p $HOME/.kube # cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # chown $(id -u):$(id -g) $HOME/.kube/config
要使用启用 sudo 的用户,请运行:
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
现在确认kubectl命令已激活。
# kubectl get nodes
此时,您将看到主节点的状态为“ NotReady ”。这是因为我们尚未将 pod 网络部署到集群。
pod 网络是集群的覆盖网络,部署在现有节点网络之上。它旨在实现跨 pod 的连接。
步骤 5:设置你的 Pod 网络
部署网络集群是一个高度灵活的过程,具体取决于您的需求,并且有许多可用选项。由于我们希望尽可能简化安装,我们将使用Weavenet插件,它不需要任何配置或额外的代码,并且它为每个 pod 提供一个 IP 地址,这对我们来说非常好。如果您想查看更多选项,请点击此处。
这些命令对于获取 pod 网络设置非常重要。
# export kubever=$(kubectl version | base64 | tr -d '\n') # kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
现在,如果您检查主节点的状态,它应该是“就绪”。
# kubectl get nodes
接下来,我们将工作节点添加到集群中。
将工作节点添加到 Kubernetes 集群
加入 Kubernetes 集群时,每个工作节点上都将执行以下指令。
步骤 1:准备主机名、防火墙和 SELinux
首先在worker-node-1和worker-node-2上设置主机名,然后将主机条目添加到/etc/hosts文件中。
# hostnamectl set-hostname 'node-1' # cat <<EOF>> /etc/hosts 192.168.0.47 master-node 192.168.0.48 node-1 worker-node-1 192.168.0.49 node-2 worker-node-2 EOF
接下来,使用ping 命令从工作节点ping主节点,以确认更新的主机文件正常工作。
# 192.168.0.47
接下来,禁用SElinux并更新防火墙规则。
# setenforce 0 # sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux # firewall-cmd --permanent --add-port=6783/tcp # firewall-cmd --permanent --add-port=10250/tcp # firewall-cmd --permanent --add-port=10255/tcp # firewall-cmd --permanent --add-port=30000-32767/tcp # firewall-cmd --reload # echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
步骤 2:设置 Docker-CE 和 Kubernetes Repo
首先使用 DNF 配置管理器添加 Docker 存储库。
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
接下来,添加containerd.io包。
# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
安装这两个包后,安装最新版本的docker-ce。
# dnf install docker-ce
启用并启动docker服务。
# systemctl enable docker # systemctl start docker
您需要手动添加Kubernetes存储库,因为它们并非预先安装在CentOS 8上。
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
步骤3:在 CentOS 8 上安装 Kubeadm
软件包仓库现已准备好,您可以继续安装kubeadm。
# dnf install kubeadm -y
启动并启用服务。
# systemctl enable kubelet # systemctl start kubelet
步骤 4:将工作节点加入 Kubernetes 集群
我们现在需要kubeadm init生成的令牌来加入集群。如果您已将其复制到某个地方,则可以将其复制并粘贴到节点 1和节点 2 。
# kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5 --discovery-token-ca-cert-hash sha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf78
正如最后一行所建议的,返回到主节点并使用以下命令验证工作节点 1和工作节点 2是否已加入集群。
# kubectl get nodes
如果所有步骤都成功运行,那么你应该在master-node上看到node-1和node-2处于就绪状态。此时,你已在CentOS 8上成功部署了 Kubernetes 集群。
推荐阅读:如何在 Kubernetes 集群上部署 Nginx
一些限制
我们在此处创建的集群只有一个主节点,因此,如果主节点发生故障,您的集群可能会丢失数据,并且可能需要从头开始重新创建。
因此,我建议采用高可用性设置。