前言
想要部署自己的私有容器了,听说 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 usecgroupfs
. Usingcgroupfs
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')"
参考
- How to install Kubernetes on Ubuntu Server without Docker, TechRepublic, https://www.techrepublic.com/article/how-to-install-kubernetes-on-ubuntu-server-without-docker/
- Container Runtimes, Kubernetes Documentation, https://kubernetes.io/docs/setup/production-environment/container-runtimes/
- Configure a cgroup driver, Kubernetes Documentation, https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/
- Don’t Panic: Kubernetes and Docker, Kubernetes Blog, https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/
技术文,我都不知道评论啥😅