在 Ubuntu 22.04 LTS 上安装 Docker 和 Kubernetes

2024-06-12 渥太华微生活

images.jpg


简介:

Kubernetes 是一个符合 OCI 标准的容器工作负载编排开源平台。作为容器编排器,Kubernetes 可自动跨多个系统部署容器,并帮助扩展和管理容器化应用程序。


先决条件:

  • 两台或更多台运行 Ubuntu 22.04 的服务器

  • 命令行访问

  • 访问每个系统上具有 sudo 权限的用户帐户

  • 2 个 CPU

  • 至少 2GB 的 RAM

  • 至少 2GB 的磁盘空间

  • 可靠的互联网连接


一、准备工作(所有节点)

1)禁用swap

硬盘上的交换空间 (swap),操作系统会尝试将其用作 RAM。操作系统会尝试将不常访问的数据移动到交换空间,以释放 RAM 以执行更紧迫的任务。但是因为硬盘比 RAM 慢,所以访问swap中的数据比访问 RAM 中的数据慢得多。

Kubernetes 的调度基于对可用资源的理解。如果工作负载开始使用swap,Kubernetes 就很难做出准确的调度决策。因此,建议在安装 Kubernetes 之前禁用swap

运行以下命令临时禁用系统上的swap:

sudo swapoff -a

继续运行以下命令会修改配置文件,以使swap在系统重启后仍保持关闭状态。

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

2)设置主机名

当我们使用 Kubernetes 集群时,我们必须为节点提供唯一的主机名,以便 Kubernetes 可以使用这些名称来识别节点。

运行以下命令修改主机名:

# 对于主节点
sudo hostnamectl set-hostname master-node
# 对于工作节点:
sudo hostnamectl set-hostname worker-node-01

运行以下命令刷新当前 bash 会话,以便它可以立即识别并使用新主机名。

exec bash

3)更新 /etc/hosts 文件以进行主机名解析

设置主机名是不够的,还必须将主机名映射到其 IP 地址。应该更新所有节点(或至少主节点)的 /etc/hosts 文件。

运行以下命令进行主机名解析:

sudo nano /etc/hosts
10.0.0.216 master-node
10.0.0.208 worker-node-01

2024-06-12_145553.jpg

4)在所有节点上设置 IPV4 网桥

要在所有节点上配置 IPV4 网桥 (IPV4 bridge),请在每个节点上执行以下命令:

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

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
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

# Apply sysctl params without reboot
sudo sysctl --system

二、安装Docker(所有节点):

Docker 平台允许您在容器内创建、分发和运行应用程序。这些容器提供轻量级和可移植的环境,确保在各种设置中保持一致的性能。

Docker 充当容器运行时,通过促进容器化应用程序的高效管理和部署,在 Kubernetes 中发挥着至关重要的作用。

1)更新软件包列表:

sudo apt update

2)运行以下命令进行安装 Docker:

sudo apt install docker.io -y

3)运行以下命令将 Docker 设置为在Ubuntu启动时启动:

sudo systemctl enable docker

4)验证 Docker 是否正在运行:

sudo systemctl status docker

2024-06-12_151849.jpg

5)如果 Docker 未运行,请使用以下命令启动它:

sudo systemctl start docker

6)查看docker 版本(可选):

docker version

2024-06-12_152044.jpg


三、安装Kubernetes(包括kubelet, kubeadm, and kubectl)(所有节点)

在所有节点上安装 kubelet、kubeadm 和 kubectl 来创建 Kubernetes 集群。它们在管理 Kubernetes 集群中起着重要作用。

Kubelet 是在每个节点上运行的节点代理,负责确保容器按照 Pod 规范在 Pod 中运行。

kubeadm 用于引导 Kubernetes 集群,包括设置主节点和帮助工作节点加入集群。

Kubectl 是一个 CLI 工具,用于 Kubernetes 运行命令来执行各种操作,例如部署应用程序、检查资源和直接从终端管理集群操作。

1)更新软件包列表,安装依赖:

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

2)添加 Kubernetes 签名密钥 (Kubernetes Signing Key)

由于 Kubernetes 来自非标准存储库,所以需要下载签名密钥以确保软件正版。

在每个节点上,使用 curl 命令下载密钥并将其存储在安全的地方(默认为 /etc/apt/keyrings/):

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3)添加软件存储库:

Kubernetes 不包含在默认的 Ubuntu 存储库中。要将 Kubernetes 存储库添加到列表中,请在每个节点上输入以下命令:

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4)刷新软件包列表以查看新项目:

sudo apt update

2024-06-12_160341.jpg

5)运行命令来安装kubelet、kubeadm 和 kubectl:

sudo apt install kubelet kubeadm kubectl -y

6)将软件包标记为hold,以防止自动安装、升级或删除:

sudo apt-mark hold kubelet kubeadm kubectl

7)验证安装:

kubeadm version

2024-06-12_161311.jpg

kubectl version

2024-06-12_161440.jpg


四、初始化 Kubernetes 集群主节点

使用 kubeadm 初始化 Kubernetes 控制平面时,会部署多个组件来管理和编排集群。这些组件的一些示例包括 kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kube-proxy。

我们需要通过运行以下命令下载这些组件的镜像:

1)配置 kubelet:

打开 kubelet 文件:

sudo nano /etc/default/kubelet

在文件中添加以下行:

KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs"

重新加载配置并重新启动 kubelet:

sudo systemctl daemon-reload && sudo systemctl restart kubelet

2)配置 docker:

打开Docker守护进程配置文件:

sudo nano /etc/docker/daemon.json

添加以下配置块:

{
   "exec-opts": ["native.cgroupdriver=systemd"],
   "log-driver": "json-file",
   "log-opts": {
      "max-size": "100m"
   },
   "storage-driver": "overlay2"
}

重新加载配置并重新启动 Docker:

sudo systemctl daemon-reload && sudo systemctl restart docker

3)配置 kubeadm

打开 kubeadm 配置文件:

sudo nano /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

在文件中添加以下行:

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

2024-06-12_171705.jpg

重新加载配置并重新启动 kubelet:

sudo systemctl daemon-reload && sudo systemctl restart kubelet

4)初始化集群:

sudo kubeadm init --control-plane-endpoint=master-node --upload-certs

操作完成后,输出底部会显示 kubeadm join 命令。记下此命令,因为您将使用它来将工作节点加入集群。

2024-06-12_172353.jpg

5)配置集群

为 Kubernetes 集群创建目录:

mkdir -p $HOME/.kube

将配置文件复制到目录:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

将目录的所有权更改为当前用户和组

sudo chown $(id -u):$(id -g) $HOME/.kube/config

五、将 Pod 网络部署到集群主节点

Pod 网络 (Pod Network) 是一种允许集群中不同节点之间进行通信的方式。

本文使用 Flannel 节点网络管理器 (Flannel node network manager创建 Pod 网络。

通过执行以下步骤将 Flannel 管理器应用到主节点:

1)使用 kubectl 安装 Flannel:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

2)清除节点污染 (Untaint the node):

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

六、将工作节点添加到集群

配置主节点后,即可将工作节点添加到集群。在主节点上初始化 Kubeadm 时,您将收到一个令牌 (token),可用于添加工作节点。

要将工作节点添加到 Kubernetes 集群,请使用 kubeadm join 命令。

1)停止并禁用 AppArmor:

sudo systemctl stop apparmor && sudo systemctl disable apparmor

2)重启 containerd:

sudo systemctl restart containerd.service

3)在【工作节点】上,应用该步骤中的 kubeadm join 命令,以将它们连接到主节点。

记得在命令前加上 sudo:

sudo kubeadm join [master-node-ip]:6443 --token [token] --discovery-token-ca-cert-hash sha256:[hash]

将 [master-node-ip]、[token] 和 [hash] 替换为 kubeadm join 命令输出中的值。

例如,在此种情况下,命令如下:

sudo kubeadm join 10.0.0.216:6443 --token reyu01.9cux4t59j29f034a --discovery-token-ca-cert-hash sha256:bd00634e67acae5cef63830d5cba40ca0812de86b142979742b7205536df7b22

2024-06-12_184850.jpg

4)检查所有节点的状态(主节点)

几分钟后,切换到主节点,并输入以下命令检查节点的状态:

kubectl get nodes

系统显示了集群中的主节点和所有工作节点,如下图:

2024-06-12_185047.jpg


结论:

按照本文介绍的步骤操作后,您应该已经在 Ubuntu 上安装了 Kubernetes。

如果您是没有 Kubernetes 部署经验的初学者,Minikube 是一个很好的起点。


Q&A:

Q:在重启主节点服务器后,得到拒绝连接错误,如下:

$ kubectl get nodes
The connection to the server 10.0.2.15:6443 was refused - did you specify the right host or port?

A:解决办法如下:

sudo -i
swapoff -a
exit
strace -eopenat kubectl version

成功解决,如下图:

7d18c424fc6870c7f599c0b83aad806c4baf6571.png

二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

189
全部评论 (0)
展开快速发表评论

科技专栏

缩略图 | axios 介绍和使用

axios 介绍和使用

2024-06-04 90