部署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
注意,配置
IPAddressPool
和L2Advertisement
时,可能会遇到一个内部错误:https://github.com/metallb/metallb/issues/1540。
这个错误主要是网络问题,建议尝试重启或重装flannel,如果无效重启集群节点即可解决。
检查Metallb状态,每个节点上会起一个speaker:
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
安装成功如下图:
浏览器中输入https://dashboard.traefik.internal/,输入配置好的用户凭证,即可进入Dashboard界面。