网站搜索

如何在 CentOS 8 上安装 Kubernetes 集群


CentOS 8 上安装 Kubernetes 集群 的过程几乎与 CentOS 7 类似(您可以在此处完成),但是这里的流程有一些变化。这些变化,主要围绕Docker的安装。

CentOS 8(以及扩展 RHEL 8)开始,docker 现已原生替换为 podmanbuildah 是来自 Redhat 的工具。事实上,docker 软件包现已从默认软件包存储库中删除。

通过这一举措,Redhat 团队的目标是简化创建和使用容器的过程,无需特殊权限,同时保持与 Docker 镜像的兼容性并无需守护进程即可操作它们。 Podman 承诺在 Kubernetes 环境中运行时提供更大的灵活性,但目前尚无定论。

在本文中,我们将介绍在 CentOS 8 平台上安装 Kubernetes 的过程,并在 Docker-CE 上运行(社区版本)。在后面的文章中,我们还将使用 podman 作为容器来运行类似的安装。

先决条件

  1. 三台运行 CentOS 8 的服务器 – 1 个主节点2 个工作节点
  2. 建议您的节点每台机器至少应有 2 个 CPU 和 2GB RAM 或更多。这不是一个严格的要求,但很大程度上是由您打算运行的应用程序的需求驱动的。
  3. 所有节点上的互联网连接。我们将从存储库中获取 Kubernetesdocker 包。同样,您需要确保默认安装 DNF 包管理器并且可以远程获取包。
  4. 您的所有节点还应该能够在专用网络或公共网络上(以可用者为准)相互连接。
  5. 您还需要访问具有 sudo 或 root 权限的帐户。在本教程中,我将使用我的 root 帐户。

预防

大多数节点通常都具有唯一的MAC地址,但是,在某些特殊情况下,某些虚拟机可能具有相同的MAC地址。因此,建议您确认任何节点中的 Product_UUIDMAC 地址都不相同。

Kubernetes 使用这些值来唯一标识集群中的节点。如果这些值对于每个节点来说不是唯一的,则安装过程可能会失败。

检查网络接口的MAC地址并进行比较。

ip link

要检查 product_uuid 并进行比较,请运行以下命令。

cat /sys/class/dmi/id/product_uuid 

逻辑架构

我们的安装设计为让主节点控制工作节点。安装结束时,我们的逻辑架构将如下所示。

主节点 – 该机器通常充当控制平面并运行集群数据库和 API 服务器(kubectl CLI 与之通信)。

我们的 3 节点 Kubernetes 集群 看起来像这样:

在主节点上安装 Kubernetes 集群

为了让 Kubernetes 工作,您需要一个容器化引擎。如前所述,我们将使用 Docker-CE

以下机构将在CentOS 8主节点上执行。

第 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

接下来,对您的 worker-node-1worker-node-2 执行 ping 操作,使用 ping 命令检查更新后的主机文件是否正常工作。

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 还可以与 AnsibleTerraform 等其他编排工具集成。

软件包存储库现已准备就绪,您可以继续安装 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-1worker-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:将Worker节点加入Kubernetes集群

我们现在需要 kubeadm init 生成的令牌来加入集群。如果您已将其复制到某处,则可以将其复制并粘贴到您的 node-1node-2 中。

kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5  --discovery-token-ca-cert-hash sha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf78

按照最后一行的建议,返回您的主节点并验证工作节点node-1工作节点node-2是否已加入使用以下命令进行集群。

kubectl get nodes

如果所有步骤都成功运行,那么您应该在主节点上看到node-1node-2处于就绪状态。至此,您已经在 CentOS 8 上成功部署了 Kubernetes 集群。

推荐阅读:如何在 Kubernetes 集群上部署 Nginx

一些限制

我们在这里创建的集群有一个主节点,因此,如果主节点发生故障,您的集群可能会丢失数据,并且可能需要从头开始重新创建。

因此,我建议采用高可用性设置。