记录 Kubernetes 的安装与配置步骤。Kubernetes 有多种安装方式,本文使用 kubeadm。
机器们
1 | debian1, Master 节点 |
如果更新了内核,重启。
添加/etc/hosts
1 | 192.168.4.187 debian1 debian1.lianzy.vip |
Kubernetes 的机器不能有 swap 分区,所以要卸载 swap 分区。
1 | sudo swapoff -a |
然后编辑 /etc/fstab
文件,注释或删除 swap 那行(如有)。
开启转发等:
1 | cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf |
根据 kubernetes 官方文档,要安装官方版本的 docker,因此按照 docker 官方文档安装。
安装 docker
删除非官方安装的 docker,如果你看过本站对于 docker 的介绍,那就需要卸载非官方 docker。对于 Docker 官方的版本 和 Debian 仓库中维护的版本的区别,Debian 仓库中的 Docker 版本低一些,有没有其区别不确定。
卸载非官方版本 Docker,因为会与官方版本冲突。
1 | for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done |
官方文档 安装
1 | sudo apt-get update |
启动 docker 并设置开机自动运行
1 | sudo systemctl enable docker --now |
注意,官方 Docker 与 Debian 仓库里的 docker-compose 不同,官方 Docker 用 docker compose 来 compose,compose 作为一个插件,Debian 仓库中的 docker-compose 用 docker-compose 来 compose。
安装 cri-dockerd
cli-dockerd 是 Kubernetes 控制 Docker 的中间层。cri: container runtime interface
1 | git clone https://github.com/Mirantis/cri-dockerd.git |
注意,自行编译 cri-dockerd 需要 golang,如果提示找不到 go,安装 goalng: sudo apt install golang
如果后面的命令遇到 socket 问题无法连接,重启服务器,暂时关闭防火墙等。
安装 kubeadm, kubelet and kubectl
这部分依旧来自官方文档 注意虽然我们在 Debian 11/12 上安装,但是依旧是 xenial(Ubuntu 16.04 LTS) 的源。参考安装文档
1 | sudo apt-get update |
至此,Kubeadm 安装完成
配置集群官方文档
一个很重要的问题是网络,k8s 集群中有很多台计算机,但是对外只有一个网络接口,比如你在 k8s 上运行一个网站,那么只能通过一个 ip 地址访问这个网站,但是集群中的每一台计算机都需要一个 ip 地址来通信,这个地址可以是私有地址,也可以是公网地址。k8s 本身不提供网络解决方案,需要安装插件,官方文档:installing addons
这里选用了 https://www.tigera.io/project-calico/,不同插件操作方法略有不同。
设置 master 节点
初始化:
1 | sudo kubeadm init --pod-network-cidr 10.144.0.0/16 --cri-socket unix:///var/run/cri-dockerd.sock --control-plane-endpoint debian1 |
如果服务器本身没有公网 ip ,需要指定的 endpoint,可以是域名,也可以是 ip 地址。
如果一切正常,会得到下面这样的输出
记下输出中的 kubeadm join 命令,接下来添加工作节点需要 Token,每个 Token 默认 24 小时后过期
Token 过期或者忘记,可以使用 kubeadm token create --print-join-command
直接生成一个新的。
根据提示,下一步操作。
1 | mkdir -p $HOME/.kube |
然后,安装网络插件 calico.
安装 Calico
目前版本 3.26.1,请到官网找最新版本 docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises
1 | curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O |
至此,主节点就设置好了,查看状态。
1 | kubectl get node |
默认情况下,出于安全的考虑,不能在主节点上跑 pod。
设置 worker 节点
使用 kubeadm join
命令,在一台已经安装了 kubeadm
等程序的服务器上,执行
1 | sudo kubeadm join debian1 --token sluqvx.itdsjivbewuiinfx \ |
worker 节点也需要安装 calico。
可能的 error
我在配置时,遇到了很多问题,绝大多数通过命令行的 error 提示,都能明白哪里出问题了,比如,cri-socket 服务无法启动,看看是否安装正常,手动调用,然后重启;或者端口占用,指定 cri-socket 等等。
唯一困扰我较长的问题是,worker 遇到 socket 8080 连接不上的问题(使用 kubectl get nods 输出 8080 拒绝连接),使用 kuneadm join 是 NotReady 状态,网上有很多讨论,很多人说 worker 节点也要有 $HOME/.kube/config/admin.conf 文件,但我先 init,再 join 也不行。最后在主节点删除了出问题的 worker 节点,重新运行一次相同的命令就通了,没有 admin.conf 文件。
在主节点删除 worker node:
1 | kubectl drain [node name] --ignore-daemonsets |
查看状态
回到主节点,查看 node。