介绍
Kubernetes 是一个开源工具,在 容器编排 中至关重要。Kubernetes 的工作原理是在各种云环境甚至本地服务器上大规模编排和管理集群。集群是一组用于运行容器化应用程序和服务的主机。一个集群至少需要两个节点才能工作 – 一个 master 节点 以及一个 worker 节点。考虑到可扩展性,您可以根据需要扩展集群,添加任意数量的 worker 节点。
Kubernetes 中的节点是指服务器。master 节点是管理集群状态的服务器。worker 节点是运行工作负载的服务器 – 这些通常是 容器化的应用程序和服务.
本指南将引导您完成在 Ubuntu 20.04 上安装和部署由两个节点组成的 Kubernetes 集群的步骤。如前所述,在处理 Kubernetes 时,拥有两个节点是最基本的配置。一旦您了解了基本原理,您还可以选择添加更多 worker 节点。我们还将向您展示如何连接这两台服务器,以允许 master 节点控制 worker 节点。
为了测试我们的配置,我们将部署一个运行 Docker 容器,其中运行 Nginx Web 服务器 到集群中。这是 Kubernetes 的一个典型实际应用。随着我们的深入,您将了解更多关于 Kubernetes 的一些核心组件,例如 kubectl 和 kubeadm。此外,建议您先熟悉我们关于 了解 Kubernetes 工具包基础知识 的教程,以熟悉 Kubernetes 平台的基础知识。
现在,让我们开始吧!
前提条件
您需要准备两台运行在 Ubuntu 20.04 上的服务器。为了获得最佳性能,Kubernetes 的最低系统要求是 2GB 内存和 2 个 CPU。您可以按照此分步教程来帮助您设置您的 Ubuntu 服务器(在 CloudSigma 上)。其中一台服务器将作为 master 节点,另一台将作为 worker 节点。我们恰当地将这两台服务器命名为 kubernetes-master 和 kubernetes-worker。这使得跟随教程变得更加容易。但是,您可以自由选择您喜欢的 主机名。
-
确保在两个节点上都添加一个具有 sudo 权限的用户,我们将使用该用户来运行上述教程中概述的命令。请按照此 关于配置 Linux sudoers 文件的教程进行操作.
-
网络连接 – 集群中的服务器应该能够进行通信。当您从 CloudSigma 部署虚拟机时,默认情况下它们将通过公共 IP 连接到互联网。如果您在本地网络中工作,您可能必须 编辑每个服务器中的 /etc/hosts 文件并进行适当的关联。
-
您将需要安装并启用 Docker 在每个节点上。Kubernetes 依赖容器运行时在 pod 中运行容器。虽然还有其他容器平台可供选择,但我们在本教程中将使用 Docker。Docker 将提供 Ubuntu 所需的运行时环境。您可以按照我们关于安装和操作 Docker 的教程.
步骤 1:安装 Kubernetes
在这一步中,我们将安装 Kubernetes。就像您在前提条件中所做的那样,您必须在两个节点中运行命令来安装 Kubernetes。使用 ssh 登录到两个节点并继续。您将首先安装 apt-transport-https 包,该包允许在 Ubuntu 的软件源中使用 http 和 https。此外,还要安装 curl ,因为接下来的步骤将需要它。执行以下命令:
|
1 |
sudo apt install apt-transport-https curl |
然后,通过执行以下命令将 Kubernetes 签名密钥 添加到两个节点:
|
1 |
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add |
接下来,我们使用以下命令将 Kubernetes 软件源 作为两个节点上的包源:
|
1 2 |
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" >> ~/kubernetes.list sudo mv ~/kubernetes.list /etc/apt/sources.list.d |
在此之后,更新节点:
|
1 |
sudo apt update |
- 安装 Kubernetes 工具
更新完成后,我们将安装 Kubernetes。这涉及安装构成 Kubernetes 的各种工具: kubeadm, kubelet, kubectl,以及 kubernetes-cni。这些工具安装在两个节点上。我们在下面定义了每个工具:
-
kubelet – 运行在每个节点上的代理,负责与主节点通信以在容器运行时中启动工作负载。输入以下命令安装 kubelet:
|
1 |
sudo apt install kubelet |
-
kubeadm – Kubernetes 项目的一部分,有助于初始化 Kubernetes 集群。输入以下命令安装 kubeadm:
|
1 |
sudo apt install kubeadm |
-
kubectl – Kubernetes 命令行工具,允许您在 Kubernetes 集群内运行命令。执行以下命令安装 kubectl:
|
1 |
sudo apt install kubectl |
-
kubernetes-cni – 启用容器内的网络,确保容器可以通信和交换数据。执行以下命令进行安装:
|
1 |
sudo apt-get install -y kubernetes-cni |
或者,您也可以使用单个命令安装所有这四个工具:
|
1 |
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni |
步骤 2:禁用交换内存
Kubernetes 无法在正在使用 交换 内存的系统中运行。因此,必须在主节点和所有工作节点中禁用它。执行以下命令禁用交换内存:
|
1 |
sudo swapoff -a |
此命令会禁用交换内存,直到系统重启。我们必须确保即使在重启后它也保持关闭状态。这必须在主节点和所有工作节点上完成。我们可以通过编辑 fstab 文件 并注释掉 /swapfile 行,使用 #。通过输入以下命令,使用 nano 文本编辑器打开该文件:
|
1 |
sudo nano /etc/fstab |
在文件内部,注释掉 swapfile 行,如下面的屏幕截图所示:

如果您没有看到 swapfile 行,只需忽略它。编辑完成后保存并关闭文件。对两个节点执行相同的过程。现在,即使在服务器重启后,交换内存设置也将保持关闭状态。
步骤 3:设置唯一的主机名
您的节点必须具有唯一的主机名,以便于识别。如果您正在部署包含许多节点的集群,可以将其设置为识别工作节点的名称,例如 node-1、node-2 等。正如我们之前提到的,我们将节点命名为 kubernetes-master 和 kubernetes-worker。我们是在创建服务器时设置它们的。但是,如果您还没有在命令行中进行设置,可以调整或设置您自己的主机名。要在主节点上调整主机名,请运行以下命令:
|
1 |
sudo hostnamectl set-hostname kubernetes-master |
在工作节点上,运行以下命令:
|
1 |
sudo hostnamectl set-hostname kubernetes-worker |
您可以关闭当前的终端会话并重新 ssh 登录到服务器以查看更改。
步骤 4:让 Iptables 查看桥接流量
为了让主节点和工作节点正确查看桥接流量,您应该确保 net.bridge.bridge-nf-call-iptables 在您的配置中设置为 1。首先,确保 br_netfilter 模块已加载。您可以通过发出以下命令来确认这一点:
|
1 |
lsmod | grep br_netfilter |
或者,您可以使用以下命令显式加载它:
|
1 |
sudo modprobe br_netfilter |
现在,您可以运行此命令将该值设置为 1:
|
1 |
sudo sysctl net.bridge.bridge-nf-call-iptables=1 |
步骤 5:更改 Docker Cgroup 驱动程序
默认情况下,Docker 安装时使用 “cgroupfs” 作为 cgroup 驱动程序。Kubernetes 建议 Docker 应该 运行,并使用 “systemd” 作为驱动程序。如果您跳过此步骤并尝试在下一步中初始化 kubeadm,您将在终端中收到以下警告:
|
1 2 |
[preflight] 正在运行 pre-flight 检查 [警告 IsDockerSystemdCheck]: 检测到 "cgroupfs" 作为 the Docker cgroup 驱动程序. 该 推荐的 驱动程序 是 "systemd". 请 遵循 该 指南 在 https://kubernetes.io/docs/setup/cri/ |
在主节点和工作节点上,使用以下命令更新 cgroupdriver:
|
1 2 3 4 5 6 7 8 9 |
sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF |
然后,执行以下命令以在系统启动时 重启 并 启用 Docker:
|
1 2 3 |
sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker |
设置完成后,我们就可以开始有趣的部分了:部署 Kubernetes 集群!
步骤 6:初始化 Kubernetes 主节点
部署 Kubernetes 集群的第一步是启动主节点。在主节点的终端上,执行以下命令来初始化 kubernetes-主节点:
|
1 |
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 |
如果您执行上述命令,而您的系统不符合预期的要求(例如在前提条件部分中所述的最小内存或 CPU),您将收到警告,并且集群将无法启动:

下面的屏幕截图显示初始化成功。我们还添加了一个标志来指定 IP 为 10.244.0.0 的 pod 网络,这是 kube-flannel 使用的默认 IP。我们将在下一步中详细讨论 pod 网络。

在输出中,您可以看到 kubeadm join 命令(我们已隐藏了我们的 IP 地址)以及一个唯一的令牌,您将在工作节点以及您想要加入此集群的所有其他工作节点上运行该命令。接下来,复制并粘贴此命令,因为您稍后将在工作节点中使用它。
在输出中, Kubernetes 还显示了一些其他命令,在开始使用集群之前,您应该在主节点上以普通用户身份运行这些命令。让我们运行这些命令:
|
1 2 3 |
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
我们现在已经初始化了主节点。但是,在加入工作节点之前,我们还必须在主节点上设置 pod 网络。
步骤 7:部署 Pod 网络
Pod 网络促进了服务器之间的通信,这对于 Kubernetes 集群的正常运行是必需的。您可以从官方文档中阅读更多关于 Kubernetes 集群网络 的信息。在本教程中,我们将使用 Flannel pod 网络。Flannel 是一个满足 Kubernetes 要求的简单叠加网络。
在部署 pod 网络之前,我们需要检查防火墙状态。如果您在按照第 5 步操作后启用了防火墙,该步骤位于 设置 Ubuntu 服务器的教程,您必须首先添加一个 防火墙 规则 以便为端口创建例外 6443(Kubernetes 的默认端口)。在主节点和工作节点上运行以下 ufw 命令:
|
1 2 |
sudo ufw allow 6443 sudo ufw allow 6443/tcp |
之后,您可以运行以下两个命令在主节点上部署 pod 网络:
|
1 2 |
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml |
加载 flannel 网络可能需要几秒钟到一分钟的时间,具体取决于您的环境。运行以下命令以确认一切已启动:
|
1 |
kubectl get pods --all-namespaces |
如果一切成功,该命令的输出应显示所有服务状态为正在运行:

您还可以查看 健康状况,通过使用 get component status 命令:
|
1 |
kubectl get componentstatus |

此命令有一个简写形式 cs:
|
1 |
kubectl get cs |

如果您看到不健康的状态,请修改以下文件并删除 (spec->containers->command) 处包含此短语的行 - --port=0 :
|
1 |
sudo nano /etc/kubernetes/manifests/kube-scheduler.yaml |
对该文件执行相同的操作:
|
1 |
sudo nano /etc/kubernetes/manifests/kube-controller-manager.yaml |
最后,重启 Kubernetes 服务:
|
1 |
sudo systemctl restart kubelet.service |
第 8 步:将工作节点加入 Kubernetes 集群
随着 kubernetes-master 节点启动且 pod 网络就绪,我们可以将工作节点加入集群。在本教程中,我们只有一个工作节点,因此我们将针对该节点进行操作。如果您有更多工作节点,可以随时按照我们下面解释的相同步骤加入集群。
首先,在单独的终端会话中登录您的工作节点。您将使用在 kubeadm join 命令,该命令是在我们在第 6 步 中初始化主节点时在终端中显示的。执行该命令:
|
1 |
sudo kubeadm join 127.0.0.188:6443 --token u81y02.91gqwkxx6rnhnnly --discovery-token-ca-cert-hash sha256:4482ab1c66bf17992ea02c1ba580f4af9f3ad4cc37b24f189db34d6e3fe95c2d |
完成加入集群后,您应该会看到类似于下图的输出:

加入过程完成后,切换到主节点终端并执行以下命令,以确认您的工作节点已加入集群:
|
1 |
kubectl get nodes |
在上面命令输出的截图中,我们可以看到工作节点已经加入了集群:

第 9 步:向 Kubernetes 集群部署应用程序
至此,您已成功设置了 Kubernetes 集群。让我们通过向其部署服务来使集群可用。Nginx 是一款非常流行的 Web 服务器,即使在成千上万的连接下也拥有令人难以置信的速度。我们将向集群部署 Nginx Web 服务器,以证明您可以在实际应用中使用此设置。
在主节点上执行以下命令以创建一个 Kubernetes 部署(针对 Nginx):
|
1 |
kubectl create deployment nginx --image=nginx |
您可以查看已创建的 部署,通过使用 describe deployment 命令:
|
1 |
kubectl describe deployment nginx |

要使 nginx 服务 可以通过互联网访问,请运行以下命令:
|
1 |
kubectl create service nodeport nginx --tcp=80:80 |

上述命令将为 Nginx 部署创建一个面向公众的服务。由于这是一个 nodeport 部署,Kubernetes 会为该服务分配一个范围在 之间的端口32000+.
您可以通过发出以下命令来获取当前服务:
|
1 |
kubectl get svc |

您可以看到我们分配的端口是 32264。请记下终端中显示的端口,以便在下一步中使用。
要验证 Nginx 服务部署是否成功,请从主节点向工作节点发出 curl 调用。将您的工作节点 IP 和从上述命令中获取的端口进行替换:
|
1 |
curl your-kubernetes-worker-ip:32264 |
您应该会看到默认 Nginx 的输出index.html:

或者,您可以在浏览器中访问工作节点 IP 地址和端口的组合,并查看默认的 Nginx 索引页面:

您可以 delete 通过指定部署名称来删除部署。例如,此命令将删除我们的部署:
|
1 |
kubectl delete deployment nginx |
我们现在已经成功测试了我们的集群!
结论
在本教程中,您学习了如何在 Ubuntu 20.04 上安装 Kubernetes 集群。您设置了一个由主节点和工作节点组成的集群。您成功安装了 Kubernetes 工具集,创建了 Pod 网络,并将工作节点加入到主节点。我们还通过向集群基本部署 Nginx Web 服务器来测试了我们的概念。这应该可以作为在 Ubuntu 上使用 Kubernetes 集群的基础。
虽然我们只使用了一个工作节点,但您可以根据需要使用任意多个节点来扩展集群。如果您想通过自动化工具(如 Ansible)深入了解 DevOps,我们有一篇教程深入探讨了 使用 Ansible 和 Kubeadm 部署 Kubernetes 集群,欢迎阅读。如果您想学习 如何在 Kubernetes 集群上部署 PHP 应用程序,请查看本教程.
祝您使用愉快!
评论
暂无评论。发表第一条评论吧。