本文将向您展示如何使用 kubeadm 命令在 Ubuntu 22.04 上安装 Kubernetes 集群。

Kubernetes 是一个免费的开源容器编排工具,也称为K8S。在 Kubernetes 的帮助下,我们可以实现自动部署,容器应用程序的缩放和管理。

Kubernetes 集群由主节点 (用于管理集群中的工作节点和 pod),工作节点 (用于部署应用程序) 组成。

在本指南中,我们使用一个主节点和两个工作节点。各节点的系统要求如下

  • Minimal install Ubuntu 22.04
  • Minimum 2GB RAM or more
  • Minimum 2 CPU cores / or 2 vCPU
  • 20 GB free disk space on /var or more
  • Sudo user with admin rights
  • Internet connectivity on each node

实验设置

  • Master Node: 192.168.1.173 – k8smaster.example.net
  • First Worker Node: 192.168.1.174 – k8sworker1.example.net
  • Second Worker Node: 192.168.1.175 – k8sworker2.example.net

(1) 设置主机名并在 hosts 文件中添加条目

登录到 master 节点并使用 hostnamectl 命令设置 hostname

$ sudo hostnamectl set-hostname "k8smaster.example.net"
$ exec bash

在 worker 节点上,运行以下命令

$ sudo hostnamectl set-hostname "k8sworker1.example.net"   // 1st worker node
$ sudo hostnamectl set-hostname "k8sworker2.example.net"   // 2nd worker node
$ exec bash

在每个节点上的 /etc/hosts 文件中添加以下内容

192.168.1.173   k8smaster.example.net k8smaster
192.168.1.174   k8sworker1.example.net k8sworker1
192.168.1.175   k8sworker2.example.net k8sworker2

(2) 禁用 swap & 添加内核设置

在所有节点上,执行下面的 swapoff 和 sed 命令禁用交换功能

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

在所有节点上加载以下内核模块

$ sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
$ sudo modprobe overlay
$ sudo modprobe br_netfilter

为 Kubernetes 设置以下内核参数,运行如下的 tee 命令

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

重新加载上述更改,运行

$ sudo sysctl --system

(3) 安装 containerd 运行时

我们将在 Kubernetes 集群中使用containerd 运行时,首先要安装它的依赖项。

$ sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

启用 docker 存储库

$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

运行以下 apt 命令安装 containerd

$ sudo apt update
$ sudo apt install -y containerd.io

配置 containerd,使它使用 systemd 作为 cgroup

$ containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
$ sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

重启并启用 containerd 服务

$ sudo systemctl restart containerd
$ sudo systemctl enable containerd

(4) 添加 Kubernetes apt 存储库

执行以下命令为 Kubernetes 添加 apt 存储库

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

注意: 在编写本指南时,Xenial 是最新的 Kubernetes 存储库,但是当存储库在 Ubuntu 22.04 (Jammy Jellyfish)上可用时,你需要在 apt-add-repository 命令中用 jammy 替换 xenial

(5) 安装 Kubectl, kubeadm 和 kubelet

Install Kubernetes components like kubectl, kubelet and Kubeadm utility on all the nodes. Run following set of commands,

在所有节点上安装 kubectl,kubelet,Kubeadm

$ sudo apt update
$ sudo apt install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

(6) 使用 Kubeadm 命令初始化 Kubernetes 集群

我们已经准备好初始化 Kubernetes 集群,仅在主节点上运行以下 Kubeadm 命令。

$ sudo kubeadm init --control-plane-endpoint=k8smaster.example.net

Kubeadm-initialize-kubernetes-ubuntu-22-04

上面的输出确认控制面板已成功初始化,我们还得到了一组与集群交互的命令,以及工作节点加入集群的命令。

因此,要开始与集群交互,请从主节点运行以下命令

$ 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 cluster-info
$ kubectl get nodes

Initial-k8s-cluster-information

将两个工作节点加入到集群中,命令已经有输出了,只需要在工作节点上复制粘贴即可

$ sudo kubeadm join k8smaster.example.net:6443 --token vt4ua6.wcma2y8pl4menxh2 \
   --discovery-token-ca-cert-hash sha256:0494aa7fc6ced8f8e7b20137ec0c5d2699dc5f8e616656932ff9173c94962a36

两个工作节点上的输出如下:

Woker1-Join-kubernetes-Cluster

Woker2-Join-kubernetes-Cluster

在主节点使用 kubectl 命令检查节点状态

$ kubectl get nodes

Node-Status-K8s-Before-CNI

As we can see nodes status is ‘NotReady’,
so to make it active. We must install CNI (Container Network Interface)
or network add-on plugins like Calico, Flannel and Weave-net.

正如我们看到的,节点的状态是 NotReady,所以要使它激活。我们必须安装 CNI (Container Network Interface) 或例如 Calico, Flannel 和 Weave-net 等插件

(6) 安装 Calico Pod Network Add-on

在主节点运行以下 curl 和 kubectl 命令安装 Calico 网络插件

$ curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
$ kubectl apply -f calico.yaml

Install-Calico-Network-Add-on-k8s

验证 kube-system 命名空间中 pods 的状态

$ kubectl get pods -n kube-system

Kube-System-Pods-after-calico-installation

太好了,检查一下节点状态

$ kubectl get nodes

Nodes-Status-after-Calico-Network-Add-on

上面的输出确认了节点是活动节点,我们可以说我们的 Kubernetes 集群是有效的。

(7) 测试 Kubernetes

为了测试 Kubernetes,让我们尝试部署基于 nginx 的应用程序并尝试访问它。

$ kubectl create deployment nginx-app --image=nginx --replicas=2

检查 nginx-app 部署状态

$ kubectl get deployment nginx-app
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-app   2/2     2            2           68s
$

将部署公开为 NodePort 模式

$ kubectl expose deployment nginx-app --type=NodePort --port=80
service/nginx-app exposed
$

查看服务状态,执行以下命令

$ kubectl get svc nginx-app
$ kubectl describe svc nginx-app

Deployment-Service-Status-k8s

使用以下命令访问基于 nginx 的应用程序

$ curl http://<woker-node-ip-addres>:31246

$ curl http://192.168.1.174:31246

Curl-Command-Access-Nginx-Kubernetes

很好,上面的输出证实了基于 nginx 的应用程序是可访问的。

我的开源项目

酷瓜云课堂


鸠摩智首席音效师
472 声望9 粉丝

身强体健,龙精虎猛的活着。