如何在 Rocky Linux 上使用 Kubeadm 安装 Kubernetes 集群如何在 Rocky Linux 上使用 Kubeadm 安装 Kubernetes 集群如何在 Rocky Linux 上使用 Kubeadm 安装 Kubernetes 集群如何在 Rocky Linux 上使用 Kubeadm 安装 Kubernetes 集群
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Rocky Linux 上使用 Kubeadm 安装 Kubernetes 集群

在此页

  1. 先决条件
  2. 设置系统
  3. 设置 /etc/hosts 文件
  4. 配置防火墙规则
  5. 设置 SELinux 和内核模块并禁用 SWAP
  6. 安装容器运行时:Containerd
  7. 安装 Kubernetes 包
  8. 安装 CNI 插件:Flannel
  9. 初始化 Kubernetes 控制平面
  10. 向 Kubernetes 添加工作节点
  11. 结论

Kubernetes 或 k8s 是用于容器编排的开源平台,可自动部署、管理和扩展容器化应用程序。 Kubernetes 是谷歌创建的容器编排,现已成为开源项目,成为现代应用程序部署和计算平台的标准。

Kubernetes 是现代容器部署时代的解决方案。它提供服务发现和负载平衡、存储编排、自动推出和回滚、自我修复服务、秘密和配置管理。 Kubernetes 支持经济高效的云原生开发。

在本教程中,您将通过以下方式设置 Kubernetes 集群:

  1. 设置系统,包括 - 设置 /etc/hosts 文件、设置 SELinux、启用内核模块和禁用 SWAP。
  2. 通过添加 Kubernetes 所需的一些端口来设置 Firewalld。
  3. 安装 containerd 作为 Kubernetes 的容器运行时。
  4. 安装 Kubernetes 软件包,例如 kubelet、kubeadm 和 kubectl。
  5. 为 Kubernetes Pod 安装 Flannel 网络插件。
  6. 初始化一个控制平面节点并添加两个工作节点。

先决条件

要完成本教程,您需要满足以下要求:

  • 三台或更多 Rocky Linux 服务器。
  • 具有根/管理员权限的非根用户。

设置系统

在开始为 Kubernetes 部署安装任何包之前,您需要根据 Kubernetes 部署的要求设置所有系统。这包括以下配置:

  • 设置正确的 /etc/hosts 文件:每个服务器主机名必须解析为正确的 IP 地址。这可以通过多种方式完成,但最简单的方式是在所有服务器上使用 /etc/hosts 文件。
  • 设置防火墙:对于生产环境,始终建议在控制平面和工作节点上启用防火墙。
  • 设置 SELinux:对于这个例子,我们将 SELinux 的默认规则更改为“permissive”。
  • 启用内核模块:Kubernetes 需要在 Linux 系统上启用一些内核模块。内核模块“overlay”和“br_netfilter”是让 iptables 看到桥接流量所必需的。
  • 禁用 SWAP:这是强制性的,您必须在所有 Kubernetes 节点上禁用 SWAP,包括控制平面和工作节点。否则,kubelet 服务将运行有问题。

设置 /etc/hosts 文件

在第一步中,您将在所有服务器上设置系统主机名和 /etc/hosts 文件。对于此演示,我们将使用以下服务器。

Hostname              IP Address        Used as
-------------------------------------------------------
kube-master           192.168.5.10      control-plane
kube-kube-worker1     192.168.5.15      worker node
kube-kube-worker2     192.168.5.16      worker node

运行以下 hostnamectl 命令以在每台服务器上设置系统主机名。

对于控制平面节点,运行以下命令将系统主机名设置为 \kube-master\。

sudo hostnamectl set-hostname kube-master

对于 Kubernetes 工作程序节点,运行以下 hostnamectl 命令。

# setup hostname kube-worker1
sudo hostnamectl set-hostname kube-worker1

# setup hostname kube-worker2
sudo hostnamectl set-hostname kube-worker2

接下来,使用以下命令修改所有服务器上的 /etc/hosts 文件。

sudo nano /etc/hosts

将以下配置添加到文件中。确保每个主机名都指向正确的 IP 地址。

192.168.5.10 kube-master
192.168.5.15 kube-worker1
192.168.5.16 kube-worker2

完成后保存并关闭文件。

最后,如果您对每个主机名运行 ping 命令,您将指向在 /etc/hosts 文件中定义的正确 IP 地址。

ping kube-master -c3
ping kube-worker1 -c3
ping kube-worker2 -c3

配置防火墙规则

Kubernetes 需要在您的所有系统上打开一些端口。在默认的基于 RHEL 的系统上,Firewalld 是默认的防火墙应用程序。您将为 Kubernetes 部署向 Firewalld 添加一些端口。

对于 Kubernetes 控制平面,您需要打开以下端口:

Protocol  Direction Port Range  Purpose Used By
-----------------------------------------------
TCP       Inbound   6443        Kubernetes API server All
TCP       Inbound   2379-2380   etcd server client API  kube-apiserver, etcd
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   10259       kube-scheduler  Self
TCP       Inbound   10257       kube-controller-manager Self

对于 Kubernetes 工作节点,您需要打开以下端口:

Protocol  Direction Port Range  Purpose Used By
--------------------------------------------------
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   30000-32767 NodePort Services†  All

在控制平面节点“kube-master”上,运行以下 firewall-cmd 命令以打开 Kubernetes 控制平面端口。然后,重新加载 Firewalld 规则并验证可用规则列表。

sudo firewall-cmd --add-port=6443/tcp --permanent
sudo firewall-cmd --add-port=2379-2380/tcp --permanent
sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=10259/tcp --permanent
sudo firewall-cmd --add-port=10257/tcp --permanent

sudo firewall-cmd --reload
sudo firewall-cmd --list-all

在工作节点 \kube-worker1\ 和 \kube-worker2\ 上,运行以下 firewall-cmd 命令打开一些 Kubernetes 工作端口。然后,重新加载 Firewalld 并验证 Firewalld 上的可用规则列表。

sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=30000-32767/tcp --permanent

sudo firewall-cmd --reload
sudo firewall-cmd --list-all

设置 SELinux 和内核模块并禁用 SWAP

为了使 Kubernetes 服务 kubelet 正常工作,您需要将默认的 SELinux 更改为“permissive”,或者您可以完全禁用 SELinux。在此示例中,您会将 SELinux 策略从“强制”更改为“宽容”,这意味着您只会收到来自 SELinux 的通知。

运行以下命令将默认的 SELinux 策略更改为 \permissive\。然后,检查并验证 SELinux 策略的当前状态。您应该会看到 SELinux 仍处于启用状态,但策略为“宽容”。

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sestatus

接下来,Kubernetes 要求在所有服务器上启用内核模块“overlay”和“br_netfilter”。这将使 iptbales 看到桥接的流量。此外,您还需要启用端口转发并禁用 SWAP。

运行以下命令以启用内核模块“overlay”和“br_netfilter”。

sudo modprobe overlay
sudo modprobe br_netfilter

要使其永久化,请将配置文件创建到 \/etc/modules-load.d/k8s.conf\。这将使 Linux 系统能够在系统引导期间启用内核模块。

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

接下来,使用以下命令创建所需的 systemctl 参数。

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

要在不重新启动的情况下应用新的 sysctl 配置,请使用以下命令。您应该获得系统上的默认 sysctl 参数列表,并确保获得刚刚添加到文件 \k8s.conf\ 中的 sysctl 参数。

sudo sysctl --system

要禁用 SWAP,您需要对 \/etc/fstab\ 文件中的 SWAP 配置进行注释。这可以通过 sed(流编辑器)使用单个命令或手动编辑 /etc/fstab 文件来完成。

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

或者

sudo nano /etc/fstab

现在使用以下命令关闭当前会话的 SWAP。然后,使用 \free -m\ 命令验证 SWAP 是否关闭。您应该看到 SWAP 的值为“0”,这意味着它现在已禁用。

sudo swapoff -a
free -m

安装容器运行时:Containerd

要设置 Kubernetes 集群,您必须在所有服务器上安装容器运行时,以便 Pod 可以运行。多个容器运行时可用于 Kubernetes 部署,例如 containerd、CRI-O、Mirantis Container Runtime 和 Docker Engine(通过 cri-dockerd)。

在此示例中,我们将使用“containerd”作为 Kubernetes 部署的容器。因此,您将在所有 Kubernetes 节点上安装 containerd。并且有多种安装 containerd 的方法,最简单的方法是使用 Docker 存储库提供的预构建二进制包。

在添加存储库之前,请运行下面的 DNF 命令以安装其他工具“dnf-utils\”。

sudo dnf install dnf-utils

现在运行以下命令为基于 CentOS 的系统添加 Docker 存储库。

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

运行以下命令来检查和验证 Rocky Linux 系统上的存储库。然后,生成一个新的元数据缓存。您将看到 Docker 存储库已添加到 Rocky Linux。

sudo dnf repolist
sudo dnf makecache

接下来,使用下面的 DNF 命令安装 containerd 包。输入Y确认安装,回车,开始安装。当要求导入 Docker GPG 密钥时,输入 y 进行添加。

sudo dnf install containerd.io

安装完成后,运行以下命令备份默认的containerd配置并生成新的containerd配置文件。

sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
sudo containerd config default > /etc/containerd/config.toml

现在使用以下命令修改 containerd 配置文件 \/etc/containerd/config.toml\。

sudo nano /etc/containerd/config.toml

将 cgroup 驱动程序的值“SystemdCgroup=false”更改为“SystemdCgroup=true”。这将为 containerd 容器运行时启用 systemd cgroup 驱动程序。

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

完成后,保存并关闭文件。

接下来,运行以下 systemctl 命令以启动并启用 containerd 服务。这将添加在系统启动时自动运行的 containerd 服务。

sudo systemctl enable --now containerd

最后,使用以下命令检查并验证 containerd 服务。您应该看到 containerd 已启用并将在系统启动时自动运行。而containerd服务的当前状态是running。

sudo systemctl is-enabled containerd
sudo systemctl status containerd

安装 Kubernetes 包

您已经安装了 containerd 容器运行时。现在,您将在所有 Rocky Linux 系统上安装 Kubernetes 包。这包括用于引导 Kubernetes 集群的 kubeadm、Kubernetes 集群的主要组件 kubelet 以及用于管理 Kubernetes 集群的命令行实用程序 kubectl。

在此示例中,我们将使用 Kubernetes 提供的存储库安装 Kubernetes 包。因此,您将把 Kubernetes 存储库添加到您所有的 Rocky Linux 系统中。

运行以下命令为基于 RHEL/CentOS 的操作系统添加 Kubernetes 存储库。

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

现在检查存储库列表并使用下面的 dnf 命令生成一个新的元数据缓存。您应该会看到 Kubernetes 存储库已添加到 Rocky Linux 系统中。

sudo dnf repolist
sudo dnf makecache

接下来,使用以下 dnf 命令安装 Kubernetes 包。输入 Y 确认安装,按 ENTER 继续,安装将开始。

sudo dnf install kubelet kubeadm kubectl --disableexcludes=kubernetes

安装完成后,运行以下systemctl命令启动并启用kubelet服务。然后,检查 kubelet 服务并确保其在所有节点上启用并运行。

此服务是主要的 Kubernetes 服务,它将在您初始化集群或将节点加入集群时等待任何事件。

sudo systemctl enable --now kubelet

安装 CNI 插件:Flannel

Kubernetes 支持各种容器网络插件,例如 AWS VPC for Kubernetes、Azure CNI、Cilium、Calico、Flannel 等等。在此示例中,我们将使用 Flannel 作为 Kubernetes 部署的 CNI 插件。而这需要你跨 Kubernetes 节点安装 Flannel 的二进制文件。

运行以下命令创建一个新目录\/opt/bin\。然后,将Flannel的二进制文件下载进去。

mkdir -p /opt/bin/
sudo curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.19.0/flanneld-amd64

现在,通过使用以下命令更改文件的权限,使 \flanneld\ 二进制文件可执行。这个“flanneld”二进制文件将在您设置 Pod 网络插件时自动执行。

sudo chmod +x /opt/bin/flanneld

初始化 Kubernetes 控制平面

您已经完成了部署 Kubernetes 集群的所有依赖项和要求。现在,您将通过首次初始化控制平面节点来启动 Kubernetes 集群。在此示例中,Kubernetes 控制平面将安装在 IP 地址为“192.168.5.10”的“kubem-master”服务器上。

在初始化 Control Plane 节点之前,运行以下命令来检查“br_netfilter”内核模块是否已启用。如果您从命令中获得输出,则表示“br_netfilter”模块已启用。

lsmod | grep br_netfilter

接下来,运行以下命令以下载 Kubernetes 集群所需的映像。此命令将下载创建 Kubernetes 集群所需的所有容器镜像,例如 coredns、kube-api server、etcd、kube-controller、kube-proxy 和 pause 容器镜像。

sudo kubeadm config images pull

下载完成后,运行以下 \kubeadm init\ 命令在 \kube-master\ 服务器上初始化 Kubernetes 集群。这个节点 \kube-master\ 将自动被选为 Kubernetes 控制平面,因为这是第一次初始化集群。

  • 此外,在此示例中,我们将 Pod 的网络指定为“10.244.0.0/16”,这是 Flannel CNI 插件的默认网络范围。
  • “--apiserver-advertise-address”决定了 Kubernetes API 服务器运行的 IP 地址,本例使用内部 IP 地址“192.168.5.10”。
  • 对于此处的“--cri-socket”选项,我们将 CRI 套接字指定为“/run/containerd/containerd.sock”上可用的容器运行时套接字。如果您使用不同的 Container Runtime,那么您必须更改套接字文件的路径,或者您可以删除此选项“--cri-socket”,因为 kubeadm 会自动检测 Container Runtime 套接字。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.5.10 \
--cri-socket=unix:///run/containerd/containerd.sock

初始化完成后,您会看到诸如“您的 Kubernetes 控制平面已成功初始化!”之类的消息,以及一些用于设置 Kubernetes 凭据和部署 Pod 网络附加组件的重要输出消息,如何添加Kubernetes 集群的工作节点。

在开始使用 Kubernetes 集群之前,您需要设置 Kubernetes 凭证。运行以下命令以设置 Kubernetes 凭据。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

现在您可以使用 \kubectl\ 命令与您的 Kubernetes 集群交互。运行以下 \kubectl\ 命令来检查 Kubernetes 集群信息。你应该看到 Kubernetes 控制平面和 coredns 正在运行。

kubectl cluster-info

要获取有关您的 Kubernetes 的完整信息,您可以使用选项 dump - so \kubectl cluster-info dump\。

Kubernetes Control Plane 运行后,运行以下命令安装 Flannel Pod 网络插件。此命令将自动运行“flanneld”二进制文件并运行一些 flannel pods。

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

使用以下命令检查 Kubernetes 上正在运行的 pod 列表。如果您的 Kubernetes 安装成功,您应该会看到 Kubernetes 的所有主要 pod(包括 Flannel pod)都在运行。

kubectl get pods --all-namespaces

向 Kubernetes 添加工作节点

在“kube-master”服务器上初始化 Kubernetes 控制平面后,您将向 Kubernetes 集群添加工作节点“kube-worker1”和“kube-worker2”。

移至“kube-worker1”服务器并运行以下“kubeadm join”命令以将“kube-worker1”添加到 Kubernetes 集群。您可能有不同的令牌和 ca-cert-hash,您可以在初始化控制平面节点时在输出消息上看到此信息的详细信息。

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

在以下输出中,您可以看到 \kube-worker1\ 服务器已加入 Kubernetes 集群。

接下来,移动到“kube-worker2”服务器并运行“kubeadm join”命令将“kube-worker2”添加到 Kubernetes簇。

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

该过程完成后,您将看到相同的输出消息。

现在回到控制平面服务器 kube-master\ 并运行以下命令来检查 Kubernetes 集群上所有命名空间的所有正在运行的 pod。您应该看到每个 Kubernetes 组件上都有额外的 pod。

kubectl get pods --all-namespaces

最后,使用下面的 kubectl\ 命令检查并验证 Kubernetes 集群上的所有可用节点。您应该看到 kube-master\ 服务器作为 Kubernetes 控制平面运行,并且 \kube-worker1\ 和\kube-worker2\ 服务器作为工作节点运行。

kubectl get nodes -o wide

结论

在本教程中,您已经完成了具有三个 Rocky Linux 服务器的 Kubernetes 集群的部署。 Kubernetes 集群运行有一个控制平面和两个工作节点。它与 containerd 一起运行,作为 Kubernetes 集群的容器运行时,以及用于集群上 Pod 网络的 Flannel 网络插件。您已完全配置 Kubernetes 集群,您可以开始将您的应用程序部署到 Kubernetes 集群或尝试安装 Kubernetes Dashboard 以了解有关您的 Kubernetes 环境的更多信息。

©2015-2025 艾丽卡 support@alaica.com