你还在用K8S?是时候来一套生产级K3S集群了
什么是 K3s?
K3s 是轻量级的 Kubernetes。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。
-
打包为单个二进制文件。
-
使用基于 sqlite3 作为默认存储机制的轻量级存储后端。同时支持使用 etcd3、MySQL 和 Postgres。
-
封装在简单的启动程序中,可以处理很多复杂的 TLS 和选项。
-
默认情况下是安全的,对轻量级环境有合理的默认值。
-
添加了简单但强大的
batteries-included
功能,例如:- 本地存储提供程序
- service load balancer
- Helm controller
- Traefik ingress controller
-
所有 Kubernetes control plane 组件的操作都封装在单个二进制文件和进程中。因此,K3s 支持自动化和管理复杂的集群操作(例如证书分发等)。
-
最大程度减轻了外部依赖性,K3s 仅需要现代内核和 cgroup 挂载。K3s 打包了所需的依赖,包括:
- containerd
- Flannel (CNI)
- CoreDNS
- Traefik (Ingress)
- Klipper-lb (Service LB)
- 嵌入式网络策略控制器
- 嵌入式 local-path-provisioner
- 主机实用程序(iptables、socat 等)
K3S部署组件与架构
- K3S集群:3 * master + N * worker
- 集群存储:嵌入式 etcd(部署在3 * master)
- 高可用master + 负载均衡:kube-vip(部署在3 * master)
- ingress:Higress
- 存储卷:local-path-provisioner
生成kube-vip 部署文件清单
# 找一台具有docker的服务器(可以不是k3s的master或node)
# 生成部署kube-vip到K3s需要的用户与权限
curl https://kube-vip.io/manifests/rbac.yaml > kube-vip.yaml
# 定义2个变量
export VIP=10.118.70.94 # 定义一个访问K3S master的虚拟IP
export INTERFACE=enp1s0 #3台master节点的网卡名称(确保一致)
# 查找kube-vip的版本
# https://github.com/kube-vip/kube-vip/releases
# 转成国内镜像
# registry.cn-shenzhen.aliyuncs.com/starsl/kube-vip:v0.8.2
# 配置alias命令,方便生成部署的DaemonSet
alias kube-vip="docker run --network host --rm registry.cn-shenzhen.aliyuncs.com/starsl/kube-vip:v0.8.2"
# 生成部署清单
kube-vip manifest daemonset \
--interface $INTERFACE \
--address $VIP \
--inCluster \
--taint \
--controlplane \
--services \
--arp \
--leaderElection
# 生成的yaml文件追加到kube-vip.yaml
kube-vip 部署清单写入master
# 在3个master节点都执行
mkdir -p /var/lib/rancher/k3s/server/manifests/
cp kube-vip.yaml /var/lib/rancher/k3s/server/manifests/
# K3S部署的时候会自动执行该目录下的yaml文件
k3s master 1 安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - \
server --cluster-init \
--tls-san=10.118.70.94 \
--kube-controller-manager-arg=node-cidr-mask-size-ipv4=26 \
--kubelet-arg=max-pods=30 \
--cluster-cidr 10.118.232.0/21 \
--service-cidr 10.118.240.0/21 \
--disable-helm-controller \
--disable=traefik \
--disable=servicelb \
--pause-image="registry.cn-shenzhen.aliyuncs.com/starsl/mirrored-pause:3.10-amd64"
参数说明
# INSTALL_K3S_MIRROR=cn:使用K3S国内镜像
# --cluster-init:启用集群模式和嵌入式etcd
# --tls-san:kube-vip的虚拟IP(用于外部或worker节点的API访问)
# node-cidr-mask-size-ipv4:配置每个K3S节点的子网大小。
# --kubelet-arg=max-pods:配置每个K3S节点的最大pod数
# --cluster-cidr:pod的IP网段
# --service-cidr:service的IP网段
# --disable-helm-controller:禁止部署helm-controller
# --disable=traefik:禁止部署traefik(使用Higress)
# --disable=servicelb:禁止部署servicelb(使用kube-vip做负载均衡)
# --pause-image:指定pod的pause-image(默认pause-image是docker官方仓库的,国内无法下载)
注意1:以下4个参数可不配置,K3S会分配如下默认值:
--kube-controller-manager-arg=node-cidr-mask-size-ipv4=24
--kubelet-arg=max-pods=110
--cluster-cidr 10.42.0.0/16
--service-cidr 10.43.0.0/16
注意2:如果自己有指定网段规划需求,需要注意划分的pod网段,能满足每个K3S节点的最大pod数,以及给每个K3S节点分配的子网数。
提示:可以在各个K3S节点查看
/run/flannel/subnet.env
文件,来确认该节点是否成功分配到子网网段。
k3s master 2,3 安装
# 在master 1节点上获取token
cat /var/lib/rancher/k3s/server/token
# 再master2,3节点执行以下命令
# 注意 --server 参数后接master1的IP,其它参数和安装master1的参数保持一致。
TOKEN=K1067f69e8a57::server:f0ca2defd915c4
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=$TOKEN sh -s - \
server --server https://10.118.70.91:6443 \
--cluster-init \
--tls-san=10.118.70.94 \
--kube-controller-manager-arg=node-cidr-mask-size-ipv4=26 \
--kubelet-arg=max-pods=30 \
--cluster-cidr 10.118.232.0/21 \
--service-cidr 10.118.240.0/21 \
--disable-helm-controller\
--disable=traefik \
--disable=servicelb \
--pause-image="registry.cn-shenzhen.aliyuncs.com/starsl/mirrored-pause:3.10-amd64"
完成master节点部署后更换部分服务使用国内镜像
# 修改configmap:local-path-config
rancher/mirrored-library-busybox:1.36.1
改成
registry.cn-shenzhen.aliyuncs.com/starsl/mirrored-library-busybox:1.36.1
# 修改以下3个deployment的镜像
# coredns
registry.cn-shenzhen.aliyuncs.com/starsl/mirrored-coredns-coredns:1.10.1
# local-path-provisioner
registry.cn-shenzhen.aliyuncs.com/starsl/local-path-provisioner:v0.0.28
# metrics-server
registry.cn-shenzhen.aliyuncs.com/starsl/mirrored-metrics-server:v0.7.0
获取连接K3S的kubeconfig
# 在master节点查看kubeconfig
cat /etc/rancher/k3s/k3s.yaml
# token
cat /var/lib/rancher/k3s/server/token
注意:连接K8S时,kubeconfig内的master IP修改成kube-vip的虚拟IP
worker节点部署
# 在master节点获取token
TOKEN=K1067f69e8a57::server:f0ca2defd915c4
# 执行部署命令
# --server 填写kube-vip的虚拟IP
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=$TOKEN sh -s - \
agent --server https://10.118.70.94:6443 \
--kubelet-arg=max-pods=60 \
--pause-image="registry.cn-shenzhen.aliyuncs.com/starsl/mirrored-pause:3.10-amd64"
注意:
max-pods
参数,不能大于节点分配的网段的最大IP数。
kube-vip 作为负载均衡使用的配置参考
# kube-vip Load-Balancer service
apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: ops-monit
labels:
app: prometheus
spec:
loadBalancerIP: 10.118.70.95 # 增加该行,配置一个未使用的IP(可给多个service使用)
ports:
- name: http
protocol: TCP
port: 9090
targetPort: 9090
selector:
app: prometheus
externalTrafficPolicy: Cluster # 这里配置Cluster
type: LoadBalancer # 这里类型配置 LoadBalancer
更多配置说明请参考官网 https://kube-vip.io/docs/usage/k3s/
Higress部署
helm repo add higress.cn https://higress.cn/helm-charts
helm upgrade --install higress -n higress-system higress.cn/higress --create-namespace --render-subchart-notes --set global.local=true --set global.o11y.enabled=false
# 按上面的方法修改service:higress-gateway为loadBalancer类型,并配置一个未使用的IP。
增加一个web访问Hingress的ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: higress-web
namespace: higress-system
labels:
higress.io/domain_higress.xxx.com: 'true'
higress.io/resource-definer: higress
annotations:
higress.io/destination: higress-console.higress-system.svc.cluster.local:8080
higress.io/ignore-path-case: 'false'
spec:
ingressClassName: higress
rules:
- host: higress.xxx.com
http:
paths:
- path: /
pathType: Prefix
backend:
resource:
apiGroup: networking.higress.io
kind: McpBridge
name: default
兼容nginx方式
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ec-alpha
namespace: infra
annotations:
higress.io/ignore-path-case: 'false'
higress.io/ssl-redirect: 'true'
spec:
ingressClassName: higress
tls:
- hosts:
- ec-alpha.casstime.com
secretName: casstime-com
rules:
- host: ec-alpha.casstime.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-cass-webagent
port:
number: 10000
- path: /admin
pathType: Prefix
backend:
service:
name: service-terminal-webagent
port:
number: 10000
Tips
kube-vip需要3台master的物理网卡名称一致,ubuntu22.04修改master节点物理网卡名称
#获取网卡mac地址
lshw -C network
#修改网络配置
vi /etc/netplan/00-installer-config.yaml
network:
ethernets:
enp2s0:
match:
macaddress: 00:68:eb:99:9e:25
set-name: enp1s0
addresses:
- 10.118.70.93/24
nameservers:
addresses:
- 10.118.72.8
search: []
routes:
- to: default
via: 10.118.70.1
version: 2
# 新增8-10行内容
# 验证
netplan try
# 生效
netplan apply
执行helm命令报错
echo 'export KUBECONFIG=/etc/rancher/k3s/k3s.yaml' >> ~/.bashrc
source ~/.bashrc
卸载
# 要从 server 节点卸载 K3s,请运行:
/usr/local/bin/k3s-uninstall.sh
# 要从 agent 节点卸载 K3s,请运行:
/usr/local/bin/k3s-agent-uninstall.sh
# 清理
rm -rf /var/lib/rancher /etc/rancher ~/.kube/*; \
ip addr flush dev lo; \
ip addr add 127.0.0.1/8 dev lo;
仅部署到master节点的配置
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/master
operator: Exists
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: Exists
tolerations:
- operator: Exists
effect: NoSchedule
- operator: Exists
effect: NoExecute
# externalTrafficPolicy: Local
# kube-vip yaml env
- name: svc_election
value: "true"
cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json
cat /run/flannel/subnet.env
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
StarsL.cn