docker - 未转发 tcp 服务的 Kubernetes haproxy 负载均衡器
问题描述
我目前正在尝试使用 kubernetes 自动扩展我的 tcp 服务。我没有使用云基础设施(amazon、aws..etc),所以我使用 haproxy 进行负载平衡。我的 tcp 服务不是 http 协议,所以我用 --configmap-tcp-services 参数添加了我的服务。
apiVersion: apps/v1
kind: Deployment
metadata:
name: prokittest
spec:
replicas: 1
selector:
matchLabels:
app: prokit-server-label
template:
metadata:
labels:
app: prokit-server-label
spec:
volumes:
- name: host-volume
hostPath:
path: /cosmo/
type: DirectoryOrCreate
containers:
- name: flask-web-server
image: jakgon/app:2.2
securityContext:
privileged: true
volumeMounts:
- name: host-volume
mountPath: /node/plugins
env:
- name: POD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: SERVER_GROUP
value: "lobby"
- name: MAX_PLAYER
value: "100"
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
ports:
- name: server-port
containerPort: 25565
- name: healthz-checker
containerPort: 8088
---
kind: Service
apiVersion: v1
metadata:
name: prokittest
annotations:
haproxy.org/send-proxy-protocol: proxy-v2
haproxy.org/load-balance: "leastconn"
haproxy.org/check: "true"
haproxy.org/check-interval: "10s"
labels:
run: prokittest
app: service-monitor-label
spec:
selector:
app: prokit-server-label
ports:
- name: server-port
port: 25565
- name: healthz-checker
port: 8088
targetPort: 8088
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: blog-service-monitor
labels:
release: prometheus-operator
spec:
selector:
matchLabels:
app: service-monitor-label
endpoints:
- port: healthz-checker
以下是我的 configmap-tcp-services 配置图
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: default
data:
9000: "cosmoage/prokittest:25565"
在此应用后,haproxy.cfg 会在服务 pod 调整大小时自动更改。但是,如果没有手动端口转发,我将无法访问 haproxy 服务器,如下所示:
kubectl port-forward [[ingress pod name]] 9000:9000 --address 0.0.0.0
我对 haproxy ConfigMap 有误解吗?入口 pod 名称不固定,因此使用端口转发不是一个好主意。
解决方案
推荐阅读
- xml - XML 模式验证失败 - 找到无效内容的起始元素
- android - Android 8.0 及更高版本:在应用未运行时监控电池电量变化
- django - Django上的多对多关系模型
- telethon - 获取当前状态失败:AuthKeyUnregisteredError('密钥未在系统中注册')
- db2 - 不允许使用 CLLE SNDRCVF 命令
- flask - 动态 WTForms SelectField 显示数据库中表的列标题
- airflow - 了解 Airflow 中的“无”调度预设
- python - Python-Docker 容器无法连接到 MariaDB-Docker 容器
- python - 除了多维数组中的 int
- mysql - 在 MariaDB 中完全连接 2 个表