第3章 部署Traefik网关

部署API网关可以统一对外提供服务,包括统一认证,这里选择Traefik作为API网关,MetalLB提供裸金属环境负载均衡。

1. 安装配置Metallb

MetalLB可以给Traefik Dashboard在服务器上提供类似云环境的负载均衡功能。

1.1 安装Metallb组件

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.15.2/config/manifests/metallb-native.yaml

1.2 配置L2负载均衡

1.2.1 生成配置文件:

# k8s/metallb/metallb-config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-address-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.0.240-192.168.0.250   # 这里填写本地网络中可用且未被占用的IP范围

---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default-l2-advertisement
  namespace: metallb-system
spec:
  ipAddressPools:
  - default-address-pool

1.2.2 应用配置文件

$ kubectl apply -f k8s/metallb/metallb-config.yaml

注意,配置IPAddressPoolL2Advertisement时,可能会遇到一个内部错误:https://github.com/metallb/metallb/issues/1540
这个错误主要是网络问题,建议尝试重启或重装flannel,如果无效重启集群节点即可解决。

检查Metallb状态,每个节点上会起一个speaker:


Metallb状态

2. 部署Traefik

官网:https://doc.traefik.io/traefik/setup/kubernetes/#prepare-helm-chart-configuration-values

1.1 安装helm

$ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
$ helm repo add traefik https://traefik.github.io/charts  # 更改traefik的仓库
$ helm repo update

1.2 创建自签证书

生成自签证书,生产环境建议购买证书 Let's Encrypt

$ mkdir -p k8s/traefik
$ cd k8s/traefik
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt \
  -subj "/CN=*.docker.localhost"

1.3 创建配置文件

创建values.yaml文件,注意将NodePort改为了LoadBalancer。

# k8s/traefik/values.yaml

# 配置网络端口和入口点
ports:
  web:
    port: 80
    redirections:
      entryPoint:
        to: websecure
        scheme: https
        permanent: true
  websecure:
    port: 443

service:
  type: LoadBalancer      # 改为 LoadBalancer 类型
  loadBalancerIP: 192.168.0.240  # 确保这个IP是可用的,且在MetalLB的地址池中

api:
  dashboard: true
  insecure: false

ingressRoute:
  dashboard:
    enabled: true
    matchRule: Host(`dashboard.traefik.internal`)
    entryPoints:
      - websecure
    middlewares:
      - name: dashboard-auth

extraObjects:
  - apiVersion: v1
    kind: Secret
    metadata:
      name: dashboard-auth-secret
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: "123456"
  - apiVersion: traefik.io/v1alpha1
    kind: Middleware
    metadata:
      name: dashboard-auth
    spec:
      basicAuth:
        secret: dashboard-auth-secret

providers:
  kubernetesIngress:
    enabled: true
  kubernetesGateway:
    enabled: false

ingressClass:
  enabled: true

# 启用日志功能
logs:
  general:
    level: INFO
  access:
    enabled: true  # 启用访问日志(输出到 stdout)

# 启用 Prometheus 监控指标
metrics:
  prometheus:
    enabled: true

# 允许非root用户绑定低端口
securityContext:
  capabilities:
    drop: [ALL]
    add: [NET_BIND_SERVICE]     # 开放绑定端口
  readOnlyRootFilesystem: true
  runAsGroup: 0
  runAsNonRoot: false
  runAsUser: 0

values.yaml配置有几个需要注意的地方:
1. ingressRoute.dashboard.matchRule不要用localhost后缀,否则Windows系统会将地址解析到本地。
2. 启用kubernetesIngress,关闭kubernetesGateway
3. 服务类型改为LoadBalancer,可以通过MetalLB实现负载均衡。
4. 增加securityContext部分,允许非root权限绑定80和443端口,否则会出现权限不足的错误。

1.4 安装Traefik及Dashboard

使用命令安装:

# 先创建命名空间
$ kubectl create namespace traefik
$ helm upgrade --install traefik traefik/traefik \
  --namespace traefik \
  --values values.yaml

安装成功如下图:


Traefik安装完成且Pod运行正常

浏览器中输入https://dashboard.traefik.internal/,输入配置好的用户凭证,即可进入Dashboard界面。

Traefik Dashboard界面

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容