内容适用的情况:多台实体机器(内网互联)。
使用 docker 作为容器运行时。
系统使用:debian。
安装 kubelet kubeadm kubectl
一次运行以下命令即可。
安装所需的工具
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
下载 k8s 仓库的谷歌公钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
将 k8s 仓库添加到 apt 中
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
使用 apt 安装
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
docker 作为容器运行时
按照另一篇博客中方法:k8s 使用 docker 作为容器引擎 (kicey.site)
代理
k8s 的容器仓库在国内访问不到,需要设置代理或者镜像仓库,这里为了避免麻烦直接使用了代理(这里设置的是 docker 的代理)。
编辑文件 /usr/lib/systemd/system/docker.service
[Service]
Type=notify
Environment="HTTP_PROXY=http://ip:port" # http代理
Environment="HTTPS_PROXY=http://ip:port" # https代理
#Environment="NO_PROXY=ip/dns" # 不需要走代理的地址
(改为自己的代理地址,可以使用 v2ray 在容器中启动一个代理客户端,提一下不展开。)
关闭 swap
编辑文件 /etc/fstab
注释掉 swap 挂载的语句
检查并拉取镜像
现在可以执行 `sudo kubeadm init phase preflight --
sudo kubeadm init phase preflight --apiserver-advertise-address=192.168.x.x --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock
注意 apiserver-advertise-address
设置为当前主机网卡的 ip (k8s 之后将使用这个命令生成加入其他节点的命令,其他节点使用这个地址与主节点通信)。
这个操作会提前检查镜像并拉取,在之后启动时就不需要等待拉取容器镜像。
加载 cni 插件
curl --insecure -sfL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | kubectl apply -f -
国内存在访问问题,可以提前下载文件指定本地文件(注意版本问题 k8s 1.24 和 2.6.0 对应)。
cni 插件将自动的在其他节点上加载。
加入其他 node
如果创建集群成功,将活得一个主节点,以及一个用于加入其他节点的 join 命令。
类似
kubeadm join 192.168.x.x:x --token myt3ue.fyn46edqx4oqqtox \
--discovery-token-ca-cert-hash sha256:<sha256>
如果你使用 docker,需要指定容器运行时的 socker 描述符
使用这样的命令
kubeadm join 192.168.x.x:x --token myt3ue.fyn46edqx4oqqtox \
--discovery-token-ca-cert-hash sha256:<sha256> \
--cri-socket=unix:///var/run/cri-dockerd.sock
查看节点
在主节点上使用命令
kubectl get nodes
(可能需要使用 sudo)
将得到类似下面的结果
问题可提评论。