Kubernetes 1.20+ 在 Ubuntu 20.04 LTS 上的管理节点初始化(不使用 Docker)

Posted by

on

前言

想要部署自己的私有容器了,听说 Kubernetes(后文可能简称“K8S”) 大红大紫,当然要试试。然而,2021 年年初的 K8S 版本已经开始弃用 Docker。在了解了社区 这么做的理由 后,当然要跟一把风弃用 Docker 了(反正早晚会被逼迫迁移)。

环境:Hyper-V 下的 Ubuntu 20.04 LTS amd64; 6GB RAM

步骤

1. 前期准备

# 更新软件源与系统
# sudo su -
apt update
apt upgrade

# 安装容器运行时(containerd)
apt install containerd

# 初始化容器运行时
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

重要:我在这里遇到了一个坑,为了后续使 K8S 管理节点初始化正常,我们还需让 containerd 使用 systemd 的 cgroups,否则可能会初始化失败。这一点在网上很多 guide 中没有被提及。

来自 Wiki 的解释:

When systemd is chosen as the init system for a Linux distribution, the init process generates and consumes a root control group (cgroup) and acts as a cgroup manager. Systemd has a tight integration with cgroups and allocates a cgroup per systemd unit. It’s possible to configure your container runtime and the kubelet to use cgroupfs. Using cgroupfs alongside systemd means that there will be two different cgroup managers.

2.  让 containerd 使用 systemd cgroups

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

3. 安装 Kubernetes

# 增加 Google 的软件源
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
apt update

# 安装 K8S
apt install kubeadm kubelet kubectl

4. 安装前的准备

# 要使 K8S 正常初始化,我们必须做一些前期准备工作。这可能包括开启转发,允许 iptables 监测桥接流量,关闭 swap 等等。

# 配置网络
nano /etc/sysctl.conf
# 设置
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
# 保存
sysctl -p

# 加载内核模块(层叠网络与适用于桥接流量的 netfilter)
modprobe overlay
modprobe br_netfilter

5. 设置 IP 与主机名

# K8S 的节点须具备一个内部可以被解析的域名
nano /etc/hosts
# 加入一行:<IP 地址> <主机名 / 域名>
hostnamectl set-hostname <主机名>

6. 关闭 Swap

# 在 fstab 中找到 swap 字眼的条目注释掉
nano /etc/fstab

# 关闭 swap
swapoff -a

7. 初始化 K8S 管理节点

kubeadm config images pull
kubeadm init --pod-network-cidr=<IP 地址 / 前缀>

# IP 地址可以是 IPv6,默认前缀为 /64;IPv4 的前缀默认是 /24。

8. 如果没有报错的话,即代表管理节点成功初始化了。在使用前,我们可能还需要进一步准备。

# sudo su -
# 在 “控制平面 / 管理节点”,使用这个命令来创建集群目录:
mkdir -p $HOME/.kube

# 将配置文件拷贝到这个目录
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 设置权限
chown $(id -u):$(id -g) $HOME/.kube/config

# 部署 Pod 网络到集群中(案例中使用 weave-net)
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

参考

  1. How to install Kubernetes on Ubuntu Server without Docker, TechRepublic, https://www.techrepublic.com/article/how-to-install-kubernetes-on-ubuntu-server-without-docker/
  2. Container Runtimes, Kubernetes Documentation, https://kubernetes.io/docs/setup/production-environment/container-runtimes/
  3. Configure a cgroup driver, Kubernetes Documentation, https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/
  4. Don’t Panic: Kubernetes and Docker, Kubernetes Blog, https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/

One response to “Kubernetes 1.20+ 在 Ubuntu 20.04 LTS 上的管理节点初始化(不使用 Docker)”

  1. 技术文,我都不知道评论啥😅

Leave a Reply

Your email address will not be published. Required fields are marked *