k3s 安装笔记
k3s 安装笔记
k3s 是轻量级单节点集群,当然也可以加入多节点。
集群引导
单master节点
curl -sfL https://get.k3s.io | sh -
# 中国区加速curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -运行完就安装完成了,需要保证 6443 和 443 端口可用。
安装完,集群默认配置文件在/etc/rancher/k3s/k3s.yaml,如果不想sudo使用的话,可以移动配置文件:
mkdir -p ~/.kubesudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/configsudo chown $USER:$USER ~/.kube/config设置环境变量export KUBECONFIG=~/.kube/config
- 加入agent节点
查看/var/lib/rancher/k3s/server/node-token得到token,加入
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='agent --node-ip=10.0.0.14 --node-name=p4' K3S_URL='master url' K3S_TOKEN='token' sh -
# 建议指定--node-ip和-node-name,多网卡下自动获取的node-ip可能不对,而node-name一般不太标准多主节点
上面的初始化是单master节点的,因为使用的是sqlite,如果要使用多节点,需要在第一台机器上加入--cluster-init,即:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='server --node-ip=10.0.0.21 --node-name=h1 --flannel-backend=none --disable-network-policy --disable=traefik --cluster-init' sh -
# --flannel-backend=none --disable-network-policy --disable=traefik# 是禁用自带的CNI和网络配置,为后面的cilium做准备后面的server节点不需要,即:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='server --node-ip=10.0.0.24 --node-name=h4 --flannel-backend=none --disable-network-policy --disable=traefik' K3S_URL='https://10.0.0.21:6443' K3S_TOKEN='token' sh -
# 除此之外的INSTALL_K3S_EXEC参数需要和第一个节点相同,否则无法同步其他agent加入与server相同,但注意不要INSTALL_K3S_EXEC参数控制网络插件
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='agent --node-ip=10.0.0.14 --node-name=p4' K3S_URL='https://10.0.0.21:6443' K3S_TOKEN='token' sh -删除
# master/usr/local/bin/k3s-uninstall.sh# agent/usr/local/bin/k3s-agent-uninstall.sh删除后集群数据并不会完全删除,可能残留有网络插件数据,查阅文档删除即可。
集群网络
CNI cilium
由于自带的是flannel+vxlan,性能比较差,一般希望换成cilium,官方文档:
由于cilium是取代了kube-proxy的,这里面还需要处理一下,安装server的时候:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC='--flannel-backend=none --disable-network-policy' sh -
# 如果不想使用自带的LB,再加入--disable=traefik来diable network
然后照官方文档安装cilium就可以了
helm install cilium ./cilium --version 1.17.0 \ --namespace cilium \ --set hubble.relay.enabled=true \ --set operator.replicas=1 \ --set hubble.ui.enabled=true \ --create-namespace
# operator.replicas=1建议只使用1另外注意的是ip段,cilium默认使用10.0.0.0/8,如果CIDR冲突,需要更改集群IP段,用helm拉下找到CIDR即可,不然cilium修改route后会断网
集群存储
Longhorn
按照官网的安装教程来,使用helm,但是需要做一些初始化工作,每个节点都需要达到要求
# 基础工具nfs-commonsudo apt install -y nfs-common cryptsetup
# dm_crypt 模块lsmod | grep dm_cryptsudo modprobe dm_cryptsudo echo "dm_crypt" | sudo tee -a /etc/modules # 加入启动列表自动加载
# 关闭multipathdsudo systemctl stop multipathd.socketsudo systemctl disable multipathd.socketsudo systemctl stop multipathd.servicesudo systemctl disable multipathd.service完毕后,安装:
helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.8.0longhorn自带一个UI来设置所有的values,所以我们不需要改
集群LB
Ingress Gateway
安装
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v0.0.0-latest -n envoy-gateway-system --create-namespace# 测试kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Availablekubectl apply -f https://github.com/envoyproxy/gateway/releases/download/latest/quickstart.yaml -n defaultHA Loadbalance
frontend k3s-frontend bind *:16443 # 这里必须是*,否则没拿到IP的backup节点启动失败 mode tcp option tcplog default_backend k3s-backend
backend k3s-backend mode tcp option tcp-check balance roundrobin default-server inter 10s downinter 5s server server-1 10.0.0.21:6443 check server server-2 10.0.0.22:6443 check server server-3 10.0.0.24:6443 check
global_defs { enable_script_security script_user root}
vrrp_script chk_haproxy { script 'killall -0 haproxy' # 测试haproxy进程是否存在 interval 2}
vrrp_instance haproxy-vip { interface eth1 # 修改通信网卡 state <STATE> # MASTER, BACKUP, BACKUP priority <PRIORITY> # 200, 150, 100
virtual_router_id 51
virtual_ipaddress { 10.0.0.99/24 }
track_script { chk_haproxy }}其他
集群调试
实践中关键数据库一般不会暴露到集群外,如 mysql,假设上面我们只有一个 mysql-ci-service 可用,怎么连上mysql 进行调试呢?
- port-forward:使用 kubectl 端口转发:可以转发到 pod 和服务,只转发端口
- proxy:通过 k8s api 访问集群服务,但只能访问 http 服务
- 使用 telepresence:推荐
port-forward
我们已知上面的service 名称为 mysql-ci-service,端口为 30002,则可以输入:
kubectl port-forward service/mysql-ci-service 3306:30002就把本地端口转发到 service 的 30002,service 再转发到 pod 3306
如果要转发 pod(比如说可能想绕过 service 的负载均衡到达指定 pod),则需要得到 pod 名称,然后输入:
kubectl port-forward pod/mysql-6d57fdf866-f492r 3306:3306proxy
输入 kubectl proxy 即可使用
telepresence
telepresence 可以直接拦截本地流量发送到 k8s 上,看起来就好像身处集群中。
telepresence connect如果想要拦截云上服务的流量,telepresence 也能做到,详细参考文档。
其他问题
本地私有仓库配置
k3s不是在containerd的配置文件中配置本地仓库,而是配置k3s,自动生成containerd的配置文件,假设10.0.0.21:5000上有一个镜像站:
sudo mkdir -p /etc/rancher/k3s# 添加mirrors: "10.0.0.21:5000": endpoint: - "http://10.0.0.21:5000"然后重启k3s服务
命名空间无法删除的问题
查看命名空间存在的资源:
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl -n <name-of-namespace> get然后删除对应的资源