Alpine Linux部署K3S集群和Cilium CNI

alpine_cilume

说明:在k3s官方文档中,运行control plane(控制平面)组件和数据存储组件的节点称为Server 节点、运行业务容器的节点为Agent 节点,本文档中为了和k8s的术语一致,将Server 节点称之为Master节点,将Agent 节点称之为Worker节点。

一、规划

  1. 节点及网络规划

    角色 主机名 IP VIP root密码 备注
    高可用Master节点 master-node01 192.16.2.201 192.16.2.200
    (k3s的API Server组件高可用部署使用)
    高可用Master节点 master-node02 192.16.2.202
    高可用Master节点 master-node03 192.16.2.203
    worker节点 worker-node01 192.16.2.204
    worker节点 Worker-node02 192.16.2.205
  2. K3S各服务使用的端口

    通常,允许所有出站流量,入站流量根据实际需求配置

    协议 端口 目的地 描述
    TCP 协议 2379-2380 服务器 服务器 仅对于具有嵌入式 etcd 的 HA 是必需的
    TCP 协议 6443 代理 服务器 K3s 主管和 Kubernetes API 服务器
    UDP 协议 8472 所有节点 所有节点 仅对 Flannel VXLAN 是必需的
    TCP 协议 10250 所有节点 所有节点 Kubelet 指标
    UDP 协议 51820 所有节点 所有节点 仅对具有 IPv4 的 Flannel Wireguard 是必需的
    UDP 协议 51821 所有节点 所有节点 仅对具有 IPv6 的 Flannel Wireguard 是必需的
    TCP 协议 5001 所有节点 所有节点 仅对嵌入式分布式注册表 (Spegel) 是必需的
    TCP 协议 6443 所有节点 所有节点 仅对嵌入式分布式注册表 (Spegel) 是必需的
  3. CNI插件:Cilium

二、Alpine Linux部署k3s

说明:关于Alpine Linux使用private挂载的问题

  1. Alpine Linux部署k3s使用Calico或Cilium CNI(容器网络接口)插件,会报错:

    path "/sys/fs" is mounted on "/sys" but it is not a shared mount      以及  
    path "/sys/fs/bpf" is mounted on "/sys" but it is not a shared mount  以及
    path "/run/cilium/cgroupv2" is mounted on "/run/cilium/cgroupv2" but it is not a shared or slave mount
  2. 原因是Alpine为了安全,默认使用private(私有)模式挂载文件系统,而其他主流linux系统使用share模式挂载文件系统

    1) Debian: 
    nas[~]$ findmnt -o target,propagation /sys
    TARGET   PROPAGATION
    /sys     shared
    2) Alpine: 此系统默认没有findmn命令,需要apk add findmn安装
    master-node01:~# findmnt -o target,propagation /sys
    TARGET   PROPAGATION
    /sys     private
  3. 解决办法

    # mount --make-rshared /sys
    # mount --make-rshared /run/cilium/cgroupv2

1、操作系统配置(每个节点均配置)

1.1. 解决CNI需要共享子树操作问题

  1. mount --make-rshared重启之后会失效,使用 OpenRC 服务脚本实现,创建的服务脚本:/etc/init.d/mount-shared

    • 注意:确保在启动服务时挂载点已经挂载
    <所有主机>:~# cat > /etc/init.d/mount-shared << 'EOF'
    #!/sbin/openrc-run
    
    depend() {
       after *
    }
    
    start() {
       ebegin "Mounting and setting up shared mounts"
       # 设置/sys为共享挂载
       mount --make-rshared /sys
       /etc/init.d/mount-share.sh > /var/log/mount-share.log &
       eend 0
    }
    
    stop() {
       ebegin "Unmounting shared mounts"
       # 通常不需要在停止时做任何事情,除非你想取消共享挂载
       eend 0
    }
    
    restart() {
       stop
       start
    }
    EOF
  2. 创建脚本

    <所有主机>:~# cat > /etc/init.d/mount-share.sh << 'EOF'
    #! /bin/sh
    # 设置/run/cilium/cgroupv2为共享挂载,但/run/cilium/cgroupv2挂载的比较玩,通过循环判断实现共享挂载
    MOUNT_POINT="/run/cilium/cgroupv2"
    # 使用循环等待目录挂载
    sleep 5
    while true; do
       if mountpoint -q "$MOUNT_POINT"; then
           echo "$MOUNT_POINT is mounted. Setting it to rshared."
           # 执行 mount --make-rshared 命令
           mount --make-rshared "$MOUNT_POINT"
           break  # 退出循环
       else
           echo "$MOUNT_POINT is not mounted yet. Waiting..."
           sleep 2  # 等待2秒后再次检查
       fi
    done
    EOF
  3. 设置脚本执行权限

    # chmod +x /etc/init.d/mount-shared
    # chmod +x /etc/init.d/mount-share.sh
  4. 确保服务在启动时运行

    # rc-update add mount-shared default

1.2. 使用IPVS Mode

使用 ipvs 模式时,需要预先在每台 Node 上加载内核模块 nf_conntrack_ipv4, ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh 等

kubernetes从1.8开始增加了IPVS支持,IPVS相对于iptables来说效率会更加高,使用ipvs模式需要在允许proxy的节点上安装ipvsadm,ipset工具包加载ipvs的内核模块。并且ipvs可以轻松处理每秒 10 万次以上的转发请求。

当proxy启动的时候,proxy将验证节点上是否安装了ipvs模块。如果未安装的话将回退到iptables模式。

  1. 安装ipvsadm,ipset

    # apk add ipvsadm ipset
  2. 无需其他配置

1.3. 集群内嵌入式注册表镜像配置(可选)

  1. 创建配置文件

    # mkdir  -p /etc/rancher/k3s/
    # cat > /etc/rancher/k3s/registries.yaml <<'EOF'
    mirrors:
     docker.io:
     registry.k8s.io:
    EOF
  2. 在安装k3s时启用分布式 OCI 注册表镜像参数:--embedded-registry,详见部署控制平台服务章节。

1.4. 其他配置

  1. 启用cgroups服务

    rc-update add cgroups
    rc-service cgroups start
  2. 添加静态hosts记录(可选)

    # cat >>/etc/hosts <<'EOF'
    192.16.2.201 master-node01
    192.16.2.202 master-node02
    192.16.2.203 master-node03
    192.16.2.204 worker-node01
    192.16.2.205 worker-node02
    EOF

2、Master节点配置HAProxy实现API Server高可用

外部负载均衡器可用于提供固定的注册地址,用于注册节点,或用于对 Kubernetes API 服务器的外部访问。常用的负载均衡器有Nginx 和 HAProxy,这里以HAProxy为例。

  1. 在3台master节点均安装 HAProxy 和 KeepAlived:

    1)启用社区仓库,编辑/etc/apk/repositories文件,取消community仓库的#号注释
    # cat /etc/apk/repositories
    http://mirrors.neusoft.edu.cn/alpine/v3.20/main
    http://mirrors.neusoft.edu.cn/alpine/v3.20/community
    2)安装 HAProxy 和 KeepAlived
    # apk add haproxy keepalived
  2. 在3台master节点均配置haproxy服务

    # vim /etc/haproxy/haproxy.cfg
    frontend k3s-apiserver-frontend
       bind *:8443 # 在master节点部署haproxy时,此端口不能和api server的6443端口冲突
       mode tcp
       option tcplog
       default_backend k3s-apiserver-backend
    
    backend k3s-apiserver-backend
       mode tcp
       option tcp-check
       balance roundrobin
       default-server inter 10s downinter 5s
       server master-node01 192.16.2.201:6443 check
       server master-node02 192.16.2.202:6443 check
       server master-node03 192.16.2.203:6443 check
  3. 在3台master节点均配置keepalived服务

    1)alpine linux安装keepalived后不会创建目录及配置文件,先创建目录
    # mkdir /etc/keepalived/
    2)创建配置文件
    # vim /etc/keepalived/keepalived.conf
    global_defs {
       script_user root
       enable_script_security
    }
    
    vrrp_script chk_haproxy {
       script /usr/bin/killall -0 haproxy # 注意不是单引号,是反引号
       interval 2
    }
    
    vrrp_instance haproxy-vip {
      interface eth0 # 工作接口,通告选举使用哪个接口进行
       state  #  master-node01设置为MASTER, 其他两个master节点设置为BACKUP
       priority  # 1~255直接取值,值越大、优先级越高,这里master-node01设置为200,master-node01设置为150,master-node01设置为100
    
       virtual_router_id 51
    
       virtual_ipaddress {
           192.16.2.200/24
       }
    
       track_script {
           chk_haproxy
       }
    }
  4. 启动及开机自启服务

    1) 启动haproxy和keepalived服务
    # rc-service haproxy start
    # rc-service keepalived start
    2) 开机自启动haproxy和keepalived服务
    # rc-update add haproxy default
    # rc-update add keepalived default

3、采用高可用嵌入式 etcd方式部署控制平面服务(3台master节点)

3.1. 安装脚本环境变量及标识说明(需定制化安装的可参考)

此章节描述环境变量及标识截至2024年12月份,如遇到标识或环境变量不可用,可能是新版本废弃或代替了,请查阅k3s官方手册。

  1. 集群选项:安装时标志和环境变量二选一即可

    标志Flag 环境变量 描述
    --token value, -t value K3S_TOKEN 共享密钥,用于将 server 或 agent 加入集群
    --token-file value K3S_TOKEN_FILE 包含 cluster-secret/token 的文件
    --agent-token value K3S_AGENT_TOKEN 共享密钥,用于将 agent 加入集群,但不能用于 server
    --agent-token-file value K3S_AGENT_TOKEN_FILE 包含 agent secret 的文件
    --server value K3S_URL 要连接的 server,用于加入集群
    --cluster-init K3S_CLUSTER_INIT 使用嵌入式 Etcd 初始化新集群
    --cluster-reset K3S_CLUSTER_RESET 忘记所有对等点,成为新集群的唯一成员
  2. 集群组件选项

    标志Flag 描述
    --disable value 禁用的一些插件,包括traefik、servicelb、local-storage等
    --disable-scheduler 禁用 Kubernetes 默认调度程序
    --disable-cloud-controller 禁用 k3s 默认云 Controller Manager
    --disable-kube-proxy 禁用运行 kube-proxy
    --disable-network-policy 禁用 K3s 默认网络策略控制器
    --disable-helm-controller 禁用 Helm 控制器
  3. 网络选项

    标志Flag 默认值 描述
    --tls-san —— 在 TLS 证书上添加其他主机名或 IPv4/IPv6 地址作为 SubjectAltName 扩展项
    --cluster-cidr value “10.42.0.0/16” 用于 Pod IP 的网络 CIDR
    --service-cidr value “10.43.0.0/16” 用于 service IP 的网络 CIDR
    --service-node-port-range value “30000-32767” 为具有 NodePort 可见性的服务保留的端口范围
    --cluster-dns value “10.43.0.10” 用于 coredns 服务的集群 IP。应该在您的service-cidr范围内
    --cluster-domain value “cluster.local” 集群域名
    --flannel-backend value “vxlan” ‘none’, ‘vxlan’, ‘ipsec’, ‘host-gw’, 或 'wireguard’中的一个
  4. 其他常用选项

    标志Flag 默认值 描述
    --tls-san —— 在 TLS 证书上添加其他主机名或 IPv4/IPv6 地址作为 SubjectAltName 扩展项
    --kube-proxy-arg value —— kube-proxy 进程的自定义标志,可以指定iptabls或ipvs

3.2. 第一个Master节点部署

  1. Master-node01安装k3s

    master-node01:~# curl -sfL https://get.k3s.io | \
    INSTALL_K3S_EXEC="server --cluster-init --cluster-domain=cluster.homecloud --tls-san=192.16.2.200 --flannel-backend=none --disable-network-policy --embedded-registry --disable-kube-proxy --disable=traefik,servicelb,local-storage --disable-cloud-controller" \
    INSTALL_K3S_VERSION=v1.31.5+k3s1 \
    K3S_TOKEN="sAsSSSDSS334ssdfCaddnVsdjfsldfsSSdsdstsY2r#7yTXff1AdBzQR1"  sh -s -
    
    国内加速:
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="server --cluster-init --cluster-domain=cluster.homecloud --tls-san=192.16.2.200 --flannel-backend=none --disable-network-policy --embedded-registry --disable-kube-proxy --disable=traefik,servicelb,local-storage --disable-cloud-controller" \
    INSTALL_K3S_VERSION=v1.31.5+k3s1 \
    K3S_TOKEN="sAsSSSDSS334ssdfCaddnVsdjfsldfsSSdsdstsY2r#7yTXff1AdBzQR1"  sh -s -
    • 本次使用cilium cni完全代替kube-proxy,如果使用kube-proxy可指定模式为ipvs:--disable-kube-proxy替换为 --kube-proxy-arg=proxy-mode=ipvs
  2. Master-node01安装Cilium CLI

    master-node01:~# CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
    master-node01:~# CLI_ARCH=amd64
    master-node01:~# if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
    master-node01:~# curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
    master-node01:~# sha256sum -c cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
    master-node01:~# tar xzvf cilium-linux-${CLI_ARCH}.tar.gz -C /usr/local/bin
    master-node01:~# rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
  3. 查看版本

    master-node01:~# cilium version --client
    cilium-cli: v0.16.20 compiled with go1.23.2 on linux/amd64
    cilium image (default): v1.16.3
    cilium image (stable): v1.16.4
  4. 使用Cilium CLI安装Cilium(默认安装或小需求的定制化安装时推荐)

    master-node01:~# export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
    master-node01:~# cilium install --version 1.16.4 \
     --set k8sServiceHost=192.16.2.200 \
     --set k8sServicePort=8443 \
     --set operator.replicas=1 \
     --set cluster.name=homecloud \
     --set ipam.mode=kubernetes \
     --set=ipam.operator.clusterPoolIPv4PodCIDRList="10.42.0.0/16" \
     --set kubeProxyReplacement=true \
     --set routingMode=native \
     --set ipv4NativeRoutingCIDR="10.42.0.0/16" \
     --set autoDirectNodeRoutes=true \
     --set hubble.enabled=true \
     --set hubble.relay.enabled=true \
     --set hubble.ui.enabled=true \
     --set hubble.peerService.clusterDomain=cluster.homecloud \
     --set bpf.masquerade=true
    
    参数说明:
     --set k8sServiceHost=192.16.2.200 
     --set k8sServicePort=8443 
     --set cluster.name=homecloud   # 集群名称
     --set ipam.mode=kubernetes
     --set kubeProxyReplacement=true
     #启用本地路由(Native-Routing)可提升网络最大吞吐量
     --set routingMode=native
     --set ipv4NativeRoutingCIDR="<你的Pod-CIDR>"  
     --set autoDirectNodeRoutes=true
     # 启用hubble可观测性
     --set hubble.enabled=true \
     --set hubble.relay.enabled=true \
     --set hubble.ui.enabled=true \
     --set hubble.peerService.clusterDomain=cluster.homecloud # 用于查询 Hubble Peer 服务的集群域,需要和k3s安装是指定的‘--cluster-domain’保持一致,如果k3s安装是没有指定'--cluster-domain'的话,这里也不需要指定
     # 高级特性
     --set bpf.masquerade=true \ # 开启 bpf masquerade
  5. 使用helm安装Cilium(有个性化安装需求时推荐)

    # helm repo add cilium https://helm.cilium.io
    # export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
    修改xxxx文件
    # helm install cilium cilium/cilium --version 1.16.4 \
      --namespace $CILIUM_NAMESPACE \
      --set operator.replicas=1
  6. 查看

    1)查看所有pod,等待所有pod处于Running状态(国内可能需要科学上网)
    master-node01:~# kubectl get pod -A
    NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
    kube-system   cilium-envoy-xhzsw                 1/1     Running   0          42m
    kube-system   cilium-operator-5f5c497c8b-525mf   1/1     Running   0          42m
    kube-system   cilium-z8s97                       1/1     Running   0          13m
    kube-system   coredns-56f6fc8fd7-zkvwg           1/1     Running   0          50m
    kube-system   metrics-server-5985cbc9d7-jbc9d    1/1     Running   0          50m
    
    2)查看cilium状态,必须配置$KUBECONFIG环境变量,否则命令会报错
    master-node01:~# cilium status --wait
       /¯¯\
    /¯¯\__/¯¯\    Cilium:             OK
    \__/¯¯\__/    Operator:           OK
    /¯¯\__/¯¯\    Envoy DaemonSet:    OK
    \__/¯¯\__/    Hubble Relay:       disabled
       \__/       ClusterMesh:        disabled
    
    DaemonSet              cilium             Desired: 1, Ready: 1/1, Available: 1/1
    DaemonSet              cilium-envoy       Desired: 1, Ready: 1/1, Available: 1/1
    Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
    Containers:            cilium             Running: 1
                          cilium-envoy       Running: 1
                          cilium-operator    Running: 1
    Cluster Pods:          2/2 managed by Cilium
    Helm chart version:    1.16.4
    Image versions         cilium             quay.io/cilium/cilium:v1.16.4@sha256:d55ec38938854133e06739b1af237932b9c4dd4e75e9b7b2ca3acc72540a44bf: 1
                          cilium-envoy       quay.io/cilium/cilium-envoy:v1.30.7-1731393961-97edc2815e2c6a174d3d12e71731d54f5d32ea16@sha256:0287b36f70cfbdf54f894160082f4f94d1ee1fb10389f3a95baa6c8e448586ed: 1
                          cilium-operator    quay.io/cilium/operator-generic:v1.16.4@sha256:c55a7cbe19fe0b6b28903a085334edb586a3201add9db56d2122c8485f7a51c5: 1
    
    3)查看k3s节点状态:master-node01处于Ready状态后再进行其他两个master节点k3s的安装
    master-node01:~# kubectl get nodes
    NAME            STATUS   ROLES                       AGE   VERSION
    master-node01   Ready    control-plane,etcd,master   3m    v1.31.2+k3s1

3.2. 其他两个master节点安装

  1. 两个master节点部署

    <其他两个master节点># curl -sfL https://get.k3s.io | \
    INSTALL_K3S_EXEC="server --server=https://192.16.2.201:6443 --cluster-domain=cluster.homecloud --tls-san=192.16.2.200 --flannel-backend=none --disable-network-policy --embedded-registry --disable-kube-proxy --disable=traefik,servicelb,local-storage --disable-cloud-controller" \
    INSTALL_K3S_VERSION=v1.31.5+k3s1 \
    K3S_TOKEN="sAsSSSDSS334ssdfCaddnVsdjfsldfsSSdsdstsY2r#7yTXff1AdBzQR1"  sh -s -
    
    国内加速:
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="server --server=https://192.16.2.201:6443 --cluster-domain=cluster.homecloud --tls-san=192.16.2.200 --flannel-backend=none --disable-network-policy --embedded-registry --disable-kube-proxy --disable=traefik,servicelb,local-storage --disable-cloud-controller" \
    INSTALL_K3S_VERSION=v1.31.5+k3s1 \
    K3S_TOKEN="sAsSSSDSS334ssdfCaddnVsdjfsldfsSSdsdstsY2r#7yTXff1AdBzQR1"  sh -s -
  2. 两个master节点安装完成后查看k3s节点信息

    master-node03:~# kubectl get nodes
    NAME            STATUS     ROLES                       AGE    VERSION
    master-node01   Ready      control-plane,etcd,master   56m    v1.31.5+k3s1
    master-node02   Ready      control-plane,etcd,master   32m    v1.31.5+k3s1
    master-node03   Ready      control-plane,etcd,master   32m    v1.31.5+k3s1

4、添加worker节点

  1. 在各worker节点执行

    <所有worker节点># curl -sfL https://get.k3s.io | \
    INSTALL_K3S_VERSION=v1.31.5+k3s1 \
    INSTALL_K3S_EXEC="agent --server https://192.16.2.200:8443" \
    K3S_TOKEN="sAsSSSDSS334ssdfCaddnVsdjfsldfsSSdsdstsY2r#7yTXff1AdBzQR1" sh -s -
    
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_VERSION=v1.31.5+k3s1 \
    INSTALL_K3S_EXEC="agent --server https://192.16.2.200:8443" \
    K3S_TOKEN="sAsSSSDSS334ssdfCaddnVsdjfsldfsSSdsdstsY2r#7yTXff1AdBzQR1" sh -s -
    • 如果使用kube-proxy的ipvs模式,需要加:--kube-proxy-arg=proxy-mode=ipvs标志
  2. 在master节点查看所有节点信息

    master-node03:~# kubectl get nodes
    NAME            STATUS   ROLES                       AGE     VERSION
    master-node01   Ready    control-plane,etcd,master   5h21m   v1.31.5+k3s1
    master-node02   Ready    control-plane,etcd,master   3h34m   v1.31.5+k3s1
    master-node03   Ready    control-plane,etcd,master   3h7m    v1.31.5+k3s1
    worker-node01   Ready                          20m     v1.31.5+k3s1
    worker-node02   Ready                          6m22s   v1.31.5+k3s1

三、附:

1、 Cilium 常用操作

  1. 查看 Cilium Install 具体启用了哪些功能

    # kubectl -n kube-system exec ds/cilium -- cilium status
    Defaulted container "cilium-agent" out of: cilium-agent, config (init), mount-cgroup (init), apply-sysctl-overwrites (init), mount-bpf-fs (init), clean-cilium-state (init), install-cni-binaries (init)
    KVStore:                 Ok   Disabled
    Kubernetes:              Ok   1.31 (v1.31.2+k3s1) [linux/amd64]
    Kubernetes APIs:         ["EndpointSliceOrEndpoint", "cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "cilium/v2alpha1::CiliumCIDRGroup", "core/v1::Namespace", "core/v1::Pods", "core/v1::Service", "networking.k8s.io/v1::NetworkPolicy"]
    KubeProxyReplacement:    True   [eth0    192.16.2.201 192.16.2.200 fe80::2a0:98ff:fe60:6c46 (Direct Routing), eth1   10.0.10.3 fe80::2a0:98ff:fe74:80e7]
    Host firewall:           Disabled
    SRv6:                    Disabled
    CNI Chaining:            none
    CNI Config file:         successfully wrote CNI configuration file to /host/etc/cni/net.d/05-cilium.conflist
    Cilium:                  Ok   1.16.4 (v1.16.4-03807242)
    NodeMonitor:             Listening for events on 2 CPUs with 64x4096 of shared memory
    Cilium health daemon:    Ok
    IPAM:                    IPv4: 6/254 allocated from 10.42.0.0/24,
    IPv4 BIG TCP:            Disabled
    IPv6 BIG TCP:            Disabled
    BandwidthManager:        Disabled
    Routing:                 Network: Native   Host: BPF
    Attach Mode:             TCX
    Device Mode:             veth
    Masquerading:            BPF   [eth0, eth1]   10.42.0.0/16 [IPv4: Enabled, IPv6: Disabled]
    Controller Status:       46/46 healthy
    Proxy Status:            OK, ip 10.42.0.167, 0 redirects active on ports 10000-20000, Envoy: external
    Global Identity Range:   min 256, max 65535
    Hubble:                  Ok              Current/Max Flows: 4095/4095 (100.00%), Flows/s: 22.13   Metrics: Disabled
    Encryption:              Disabled
    Cluster health:          3/3 reachable   (2024-12-05T16:05:16Z)
    Modules Health:          Stopped(0) Degraded(2) OK(50)
  • 说明:
    • datapath mode: tunnel: 因为兼容性原因,Cilium 会默认启用 tunnel(基于 vxlan) 的 datapatch 模式,也就是 overlay 网络结构。
    • KubeProxyReplacement: 如果是Disabled,说明Cilium 是没有完全替换掉 kube-proxy 的。
    • Host Routing: Legacy Legacy Host Routing 还是会用到 iptables, 性能较弱;但是 BPF-based host routing 需要 Linux Kernel >= 5.10
    • Masquerading: IPtables IP 伪装有几种方式:基于 eBPF 的和基于 iptables 的。默认使用基于 iptables, 推荐使用 基于 eBPF 的。
    • Hubble Relay: disabled 默认 Hubble 也是禁用的。
  1. 安装 Cilium Hubble

    # cilium hubble enable --ui
  2. Cilium 取代 kube-proxy 之后,通过 service NodePort 暴露的端口在 node 服务器上用 netstat -lntp 命令查看不到,要通过 cilium 命令查看

    # kubectl exec -it -n kube-system daemonset/cilium -- cilium service list
    Defaulted container "cilium-agent" out of: cilium-agent, config (init), mount-cgroup (init), apply-sysctl-overwrites (init), mount-bpf-fs (init), clean-cilium-state (init), install-cni-binaries (init)
    ID   Frontend           Service Type   Backend
    1    10.43.0.1:443      ClusterIP      1 => 192.16.2.201:6443 (active)
                                          2 => 192.16.2.202:6443 (active)
                                          3 => 192.16.2.203:6443 (active)
    2    10.43.28.237:443   ClusterIP      1 => 192.16.2.201:4244 (active)
    3    10.43.149.141:80   ClusterIP
    4    10.43.156.70:80    ClusterIP      1 => 10.42.0.8:8081 (active)
    5    10.43.0.10:53      ClusterIP      1 => 10.42.0.198:53 (active)
    6    10.43.0.10:9153    ClusterIP      1 => 10.42.0.198:9153 (active)
    7    10.43.16.218:443   ClusterIP      1 => 10.42.0.37:10250 (active)

2、Q&A's

Q1:添加worker节点,worker节点上cilium pod无法启动

  1. 问题描述:添加worker节点,worker节点上cilium pod无法启动,查看worker节点上cilium pod中config容器的日志,报错如下

    # kubectl -n kube-system logs pod/cilium-qzlmr -c config
    Running
    2024/12/05 03:15:51 INFO Starting
    time="2024-12-05T03:15:51Z" level=info msg="Establishing connection to apiserver" host="https://127.0.0.1:6443" subsys=k8s-client
    time="2024-12-05T03:15:56Z" level=info msg="Establishing connection to apiserver" host="https://127.0.0.1:6443" subsys=k8s-client
    ......
    time="2024-12-05T03:16:51Z" level=error msg="Unable to contact k8s api-server" error="Get \"https://127.0.0.1:6443/api/v1/namespaces/kube-system\": dial tcp 127.0.0.1:6443: connect: connection refused" ipAddr="https://127.0.0.1:6443" subsys=k8s-client
    2024/12/05 03:16:51 ERROR Start hook failed function="client.(*compositeClientset).onStart (k8s-client)" error="Get \"https://127.0.0.1:6443/api/v1/namespaces/kube-system\": dial tcp 127.0.0.1:6443: connect: connection refused"
    2024/12/05 03:16:51 ERROR Start failed error="Get \"https://127.0.0.1:6443/api/v1/namespaces/kube-system\": dial tcp 127.0.0.1:6443: connect: connection refused" duration=1m0.039916839s
    2024/12/05 03:16:51 INFO Stopping
    Error: Build config failed: failed to start: Get "https://127.0.0.1:6443/api/v1/namespaces/kube-system": dial tcp 127.0.0.1:6443: connect: connection refused
  2. 问题分析:

    cilium 安装时,没有指定k8sServiceHost地址,默认为server: https://127.0.0.1:6443导致的

  3. 解决方法:

    方法1: 编辑daemonset.apps/cilium,修改

    # kubectl -n kube-system edit daemonset.apps/cilium
    ...  有多个,注意搜索
    - name: KUBERNETES_SERVICE_HOST
             value: 192.16.2.200   #apiserver的vip地址
           - name: KUBERNETES_SERVICE_PORT
             value: "8443"           #apiserver的vip地址的端口

    方法2:重新部署cilium,KUBECONFIG中修改api server地址为vip:port

微信扫一扫,分享到朋友圈

Alpine Linux部署K3S集群和Cilium CNI
0
别把想做的事情,留给遥不可及的未来!
上一篇

k8s中部署Harbor私有容器仓库

下一篇

大模型部署专题之2 - 辅助工具

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
执笔写快乐 管理员
别把想做的事情,留给遥不可及的未来!
返回顶部