如何强制 Kubernetes 监听特定接口

How to force Kubernetes to listen to specific interface

我的 PC 上有多个网络接口:

  1. lo 127.0.0.1 - 环回接口
  2. enp2s0 192.168.1.244 - 主界面
  3. lo:40 192.168.40.1 - 虚拟环回设备
  4. 其他无关紧要

我在主接口和第一个环回端口 80443 上都是 运行 apache 我需要那个 apache 不受干扰。

所以我为 kubernetes 创建了一个虚拟环回设备以使用 IP 192.168.40.1 但每次我尝试将它附加到 kubernetes 时,它也会抓取主界面。

到目前为止,这是我的入口控制器配置文件(重要部分):

kind: Service
apiVersion: v1
metadata:
  name: traefik
  namespace: kube-system
spec:
  loadBalancerIP: 192.168.40.1
  externalIPs:
    - 192.168.40.1
  ports:
    - name: web
      protocol: TCP
      port: 1380
      targetPort: web
      nodePort: 32211
    - name: websecure
      protocol: TCP
      port: 13443
      targetPort: websecure
      nodePort: 32506
  selector:
    app.kubernetes.io/instance: traefik
    app.kubernetes.io/name: traefik
  clusterIP: 10.43.181.90
  clusterIPs:
    - 10.43.181.90
  type: LoadBalancer
  sessionAffinity: None
  externalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  allocateLoadBalancerNodePorts: true
  internalTrafficPolicy: Cluster

我尝试更改 externalIploadBalancerIP 设置,但这只会让 kubernetes 同时获取 192.168.1.244192.168.40.1

出于某种原因,当我尝试编辑文件时,它在仪表板编辑器中显示了一个额外的只读部分:

status:
  loadBalancer:
    ingress:
      - ip: 192.168.1.244

我想这就是控制界面的原因。

如何防止 Kubernetes 抢占主界面,让它只使用 192.168.40.1

k3s 默认绑定到第一个 public 系统接口。
要覆盖此行为,您需要向服务器进程提供 --node-ip=<listen-ip> 参数。

由于没有允许设置该参数的配置(无论是内部还是外部),设置它的唯一方法是修改 systemd 服务文件。

您必须修改 /etc/systemd/system/k3s.service 文件并在最后一行更改

ExecStart=/usr/local/bin/k3s \
    server \

ExecStart=/usr/local/bin/k3s \
    server --node-ip=192.168.40.1 \

并通过运行

重启kubernetes
sudo systemctl daemon-reload
sudo systemctl restart k3s.service

这样 Kubernetes 将仅使用分配给此 ip 的接口在 192.168.40.1 上侦听。