你還在用K8S?是時候來一套生產級K3S叢集了

StarsL發表於2024-11-03

什麼是 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}'

相關文章