上一篇文章《解决K3s Traefik Ingress取不到浏览器IP问题》初步解决了获取浏览器IP不正确问题,但是总觉得解决的不彻底,所以花了点时间继续研究。
K3s自带了一个名为Klipper Load Balancer的Service Load Balancer(简称servicelb),通过它来转发宿主机端口的网络请求给Traefik Ingress Controller最终到达工作负载的pod,但带来一个问题是获取浏览器IP时,取到的都是pod网段的网关IP,例如10.42.0.1,之前一篇文章探索了简单解决办法就是设置hostNetwork。
但servicelb没发挥应有的作用,不但数据链路长,还费力去配置traefik,所以又经过反复验证,还有以下两种途径,既去掉servicelb,又能解决获取浏览器IP不正确问题。
方法一:设置traefik controller的容器端口映射到宿主机的80和443。
这种方式优点比较多:
- 去掉了servicelb,少了一次转发,减少开销。
- 只映射必要的端口比如80和443,不占用宿主机其他端口例如9000、9100
- 不开小于1024的端口,无需特殊设置。
配置方法:
创建k3s配置文件,禁用servicelb
#cat /etc/rancher/k3s/config.yaml
disable: "servicelb"
创建traefik配置文件,配置端口映射。
# cat /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
ports:
web:
expose: false
hostPort: 80
port: 8000
websecure:
expose: false
hostPort: 443
port: 8443
service:
enabled: false
然后正常安装k3s即可,例如:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh|sudo INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="server" sh -
方法二:设置pod的hostNetwork: true,直接使用宿主机网络监听。
这种方式比较简单粗暴,但要监听80和443这两个小于1024的端口,需要配置权限,否则报错。
创建k3s配置文件,禁用servicelb
#cat /etc/rancher/k3s/config.yaml
disable: "servicelb"
创建traefik配置文件,使用宿主机网络
#cat /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
hostNetwork: true
ports:
web:
port: 80
expose: true
websecure:
port: 443
expose: true
# 监听≤1204端口,以下配置必须,否则listen tcp :80: bind: permission denied
securityContext:
capabilities:
drop: [ALL]
add: [NET_BIND_SERVICE]
readOnlyRootFilesystem: true
runAsGroup: 0
runAsNonRoot: false
runAsUser: 0
service:
enabled: false
然后正常安装k3s即可,例如:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh|sudo INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="server" sh -