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

加载更多搜索结果...

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

如何在 Ubuntu 22.04 上使用 Kubeadm 设置 Kubernetes 集群

在此页

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

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

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

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

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

先决条件

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

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

设置系统

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

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

设置 /etc/hosts 文件

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

Hostname    IP Address        Used as
--------------------------------------------
cplane1     192.168.5.10      control-plane
worker1     192.168.5.25      worker node
worker2     192.168.5.26      worker node

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

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

sudo hostnamectl set-hostname cplane1

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

# setup hostname worker1
sudo hostnamectl set-hostname worker1

# setup hostname worker2
sudo hostnamectl set-hostname worker2

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

sudo nano /etc/hosts

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

192.168.5.10 cplane1
192.168.5.25 worker1
192.168.5.26 worker2

完成后保存并关闭文件。

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

ping cplane1 -c3
ping worker1 -c3
ping worker2 -c3

配置 UFW 防火墙

Kubernetes 需要在所有系统上打开一些端口。在默认的 Ubuntu 系统上,UFW 防火墙被用作默认防火墙。您将为 Kubernetes 部署向 UFW 防火墙添加一些端口。

对于 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

在添加 UFW 规则之前,请务必使用以下命令将 OpenSSH 应用程序添加到您的防火墙。然后,启用 UFW 防火墙。当提示确认时,输入“y”以启用并运行 UFW 防火墙。

sudo ufw allow "OpenSSH"
sudo ufw enable

在控制平面节点“cplane1”上,运行以下 ufw 命令打开端口。

sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 10257/tcp

sudo ufw status

在工作节点 \worker1\ 和 \worker2\ 上,运行以下 ufw 命令打开一些端口。

sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp

sudo ufw status

启用内核模块并禁用 SWAP

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 部署的容器。因此,您将在所有服务器、控制平面和工作节点上安装 containerd。

有多种安装 containerd 的方法,最简单的方法是使用 Docker 存储库提供的预构建二进制包。

现在运行以下命令添加 Docker 存储库和 GPG 密钥。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

使用以下命令更新和刷新 ubuntu 系统上的包索引。

sudo apt update

现在使用下面的 apt 命令安装 containerd 包。安装将开始。

sudo apt install containerd.io

安装完成后,运行以下命令停止containerd服务。

sudo systemctl stop 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 服务。

sudo systemctl start containerd

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

sudo systemctl is-enabled containerd
sudo systemctl status containerd

安装 Kubernetes 包

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

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

运行以下 apt 命令来安装一些包依赖项。

sudo apt install apt-transport-https ca-certificates curl -y

现在使用以下命令添加 Kubernetes 存储库和 GPG 密钥。

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

更新并刷新您的 Ubuntu 存储库和包索引。

sudo apt update

更新完成后,使用以下 apt 命令安装 Kubernetes 包。输入 Y 确认安装,按 ENTER 继续,安装将开始。

sudo apt install kubelet kubeadm kubectl

安装完成后,运行以下命令固定当前版本的 Kubernetes 包。这将防止 Kubernetes 包自动更新并防止 Kubernetes 包之间的版本偏差。

sudo apt-mark hold kubelet kubeadm kubectl

安装 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”的“cplane1”服务器上。

在初始化 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”命令在“cplane1”服务器上初始化 Kubernetes 集群。此节点“cplane1”将自动被选为 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

以下是在“cplane1”服务器上初始化 Kubernetes 集群时的输出。

初始化完成后,您会看到诸如“您的 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 都在运行。

kubectl get pods --all-namespaces

向 Kubernetes 添加工作节点

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

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

kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28

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

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

kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28

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

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

kubectl get pods --all-namespaces

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

kubectl get nodes -o wide

结论

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

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