说明:在k3s官方文档中,运行control plane(控制平面)组件和数据存储组件的节点称为Server 节点、运行业务容器的节点为Agent 节点,本文档中为了和k8s的术语一致,将Server 节点称之为Master节点,将Agent 节点称之为Worker节点。
一、规划
-
节点及网络规划
角色 主机名 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 -
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) 是必需的 -
CNI插件:Cilium
二、Alpine Linux部署k3s
说明:关于Alpine Linux使用private挂载的问题
-
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
-
原因是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
-
解决办法
# mount --make-rshared /sys # mount --make-rshared /run/cilium/cgroupv2
1、操作系统配置(每个节点均配置)
1.1. 解决CNI需要共享子树操作问题
-
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
-
创建脚本
<所有主机>:~# 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
-
设置脚本执行权限
# chmod +x /etc/init.d/mount-shared # chmod +x /etc/init.d/mount-share.sh
-
确保服务在启动时运行
# 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模式。
-
安装ipvsadm,ipset
# apk add ipvsadm ipset
-
无需其他配置
1.3. 集群内嵌入式注册表镜像配置(可选)
-
创建配置文件
# mkdir -p /etc/rancher/k3s/ # cat > /etc/rancher/k3s/registries.yaml <<'EOF' mirrors: docker.io: registry.k8s.io: EOF
-
在安装k3s时启用分布式 OCI 注册表镜像参数:
--embedded-registry
,详见部署控制平台服务章节。
1.4. 其他配置
-
启用cgroups服务
rc-update add cgroups rc-service cgroups start
-
添加静态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为例。
-
在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
-
在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台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 } } -
启动及开机自启服务
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官方手册。
-
集群选项:安装时标志和环境变量二选一即可
标志Flag 环境变量 描述 --token
value,-t
valueK3S_TOKEN
共享密钥,用于将 server 或 agent 加入集群 --token-file
valueK3S_TOKEN_FILE
包含 cluster-secret/token 的文件 --agent-token
valueK3S_AGENT_TOKEN
共享密钥,用于将 agent 加入集群,但不能用于 server --agent-token-file
valueK3S_AGENT_TOKEN_FILE
包含 agent secret 的文件 --server
valueK3S_URL
要连接的 server,用于加入集群 --cluster-init
K3S_CLUSTER_INIT
使用嵌入式 Etcd 初始化新集群 --cluster-reset
K3S_CLUSTER_RESET
忘记所有对等点,成为新集群的唯一成员 -
集群组件选项
标志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 控制器 -
网络选项
标志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’中的一个 -
其他常用选项
标志Flag 默认值 描述 --tls-san
—— 在 TLS 证书上添加其他主机名或 IPv4/IPv6 地址作为 SubjectAltName 扩展项 --kube-proxy-arg
value—— kube-proxy 进程的自定义标志,可以指定iptabls或ipvs
3.2. 第一个Master节点部署
-
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
- 本次使用cilium cni完全代替kube-proxy,如果使用kube-proxy可指定模式为ipvs:
-
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}
-
查看版本
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
-
使用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
-
使用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
-
查看
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节点安装
-
两个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 -
-
两个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节点
-
在各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
标志
- 如果使用kube-proxy的ipvs模式,需要加:
-
在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 常用操作
-
查看 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.10Masquerading: IPtables
IP 伪装有几种方式:基于 eBPF 的和基于 iptables 的。默认使用基于 iptables, 推荐使用 基于 eBPF 的。Hubble Relay: disabled
默认 Hubble 也是禁用的。
-
安装 Cilium Hubble
# cilium hubble enable --ui
-
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无法启动
-
问题描述:添加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
-
问题分析:
cilium 安装时,没有指定k8sServiceHost地址,默认为
server: https://127.0.0.1:6443
导致的 -
解决方法:
方法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