k3s部署

K3s 是 Rancher 实验室(现为 SUSE 的一部分)开发的一个轻量级的 Kubernetes 发行版,专为资源受限和边缘计算环境设计。它被打包成一个小于 100MB 的二进制文件,包含了运行一个完整 Kubernetes 集群所需的所有组件

环境准备:

机器IP节点系统
192.168.51.102k3s-master01ubuntu24.04
192.168.51.103k3s-master02ubuntu24.04
192.168.51.104k3s-master03ubuntu24.04
192.168.51.100k3s-node01ubuntu24.04
192.168.51.101k3s-node02ubuntu24.04

注:etcd 和 calico 都单独部署,不使用K3S内置的

1、关闭防火墙 或者 放开端口

ufw disable

2、禁用swap,Kubernetes(含K3S)和etcd均要求禁用Swap,否则会影响内存调度,导致集群或etcd异常

swapoff -a   #临时禁止
vim /etc/fstab #永久禁止

3、配置主机名和IP映射

vim /etc/hosts
192.168.51.100  k3s-node01
192.168.51.101  k3s-node02
192.168.51.102  k3s-master01
192.168.51.103  k3s-master02 
192.168.51.104  k3s-master03

4、配置内核参数

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-arptables = 1
EOF

5、配置时间同步,etcd集群对节点时间同步要求极高,时间误差超过1s会导致集群分裂,所有节点(尤其是etcd节点)必须配置时间同步,K3S集群也配置下

可通过chronyd来实现内网时间同步,再次不详细说

6、安装依赖包,如下:

apt-get update && apt-get install -y libseccomp2 socat conntrack wget curl openssl

7、重启节点,部分配置(如内核参数、主机名)需重启节点才能完全生效,建议执行重启:

reboot

8、容器运行时,不用单独部署,k3s已经内置了containerd

9、etcd集群,单独部署,可参考etcd集群部署

10、部署第一个master节点,如下:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=97540231abcdef sh -s - server \
--server --disable-etcd  \
--datastore-endpoint=https://192.168.51.242:2379,https://192.168.51.250:2379,https://192.168.51.251:2379 \
--datastore-cafile=/etc/ssl/etcd/etcd-ca.pem \
--datastore-certfile=/etc/ssl/etcd/server.pem \
--datastore-keyfile=/etc/ssl/etcd/server-key.pem \
--flannel-backend=none
  • INSTALL_K3S_MIRROR=cn:启用国内镜像源,加速K3S组件及镜像拉取
  • K3S_TOKEN:集群密钥,用于其他节点加入集群,需妥善保管,拥有该token即拥有集群完全管理员权限
  • –disable-etcd:禁用K3S内置的嵌入式etcd,使用外部etcd集群
  • –datastore-endpoint:指定外部etcd集群地址,多个地址用逗号分隔
  • –datastore-cafile/ –datastore-certfile/  –datastore-keyfile:指定etcd集群的CA证书、服务端证书和密钥,确保K3S能正常访问外部etcd(这里需要先从etcd集群里把证书copy到三个master节点)
  • –flannel-backend=none:禁用K3S默认的Flannel网络插件,后续将部署Calico
  • –server: 加了 --disable-etcd 必须同时加 --server

查看k3s状态,如图:

获取集群token(备用,若忘记自定义token,可通过此命令获取)

#该token为安全格式,包含集群CA哈希和凭证,可用于验证加入集群的节点身份
cat /var/lib/rancher/k3s/server/node-token

11、部署其余两个master节点,如下:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=97540231abcdef sh -s - server \
--server --disable-etcd  \
--datastore-endpoint=https://192.168.51.242:2379,https://192.168.51.250:2379,https://192.168.51.251:2379 \
--datastore-cafile=/etc/ssl/etcd/etcd-ca.pem \
--datastore-certfile=/etc/ssl/etcd/server.pem \
--datastore-keyfile=/etc/ssl/etcd/server-key.pem \
--flannel-backend=none \
--server https://192.168.51.102:6443
  • 其他参数与初始化节点完全一致,确保token、外部etcd配置、网络禁用参数统一,避免集群异常
  • –server:指定初始化Master节点的API Server地址(格式:https://初始化节点IP:6443)

此时的kubectl get nodes 还是NotReady状态,因为网络插件还没安装

12、安装calico(3.30.0版本),离线安装,在线会导致镜像拉取失败,如下:

先下载tigera-operator,首先执行如下命令:

wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.0/manifests/tigera-operator.yaml

查看tigera-operator需要的镜像,将镜像下载回来,三个master都要有此镜像如下:

cat tigera-operator.yaml | grep image:

注:如果镜像下载回来后或者保存到私有仓库再拉取到master节点后,镜像名字跟tigera-operator.yaml中的名字会不一样,此时可通过如果下命令修改镜像名字,如下:

k3s ctr images tag 旧镜像名 新镜像名    #没有docker,不能使用docker tag修改的
  • k3s中,管理容器的命令是crictl,crictl是容器运行时的接口封装,后面可以对接多个容器运行时,比如containerd、docker等

然后执行命令创建tigera-operator,如下:

kubectl create -f tigera-operator.yaml

第一次执行可能显示容器一直在创建,kubectl describe显示还需要拉取一个底层镜像,同样道理,拉回来修改名字如下:

docker.io/rancher/mirrored-pause:3.6  #本例子为3.6版本

最后查看容器已经运行起来,如图:

将custom-resources.yaml下载回来,修改cidr 地址,如图:

wget  https://raw.githubusercontent.com/projectcalico/calico/v3.30.0/manifests/custom-resources.yaml

执行如下命令创建calico,如下:

kubectl create -f custom-resources.yaml

同样需要把容器先拉取回来本地,再修改为实际的镜像名字,否则失败,需要拉取的镜像有:

  • docker.io/calico/pod2daemon-flexvol:v3.30.0
  • docker.io/calico/cni:v3.30.0
  • docker.io/calico/node:v3.30.0
  • docker.io/calico/node-driver-registrar:v3.30.0
  • docker.io/calico/typha:v3.30.0
  • docker.io/calico/goldmane:v3.30.0
  • docker.io/calico/whisker:v3.30.0
  • docker.io/rancher/mirrored-pause:3.6
  • docker.io/calico/whisker-backend:v3.30.0
  • docker.io/calico/kube-controllers:v3.30.0
  • docker.io/calico/csi:v3.30.0
  • docker.io/calico/apiserver:v3.30.0

13、再次验证集群节点,已经变为Ready状态,如图:

此时执行kubectl get po -A,还有部分容器没成功,还需要拉取镜像如下:

  • docker.io/rancher/mirrored-coredns-coredns:1.14.2

标签