场景
使用kubernetes托管的NEG(Standalone NEG)作为TCP / SSL全局代理的后端。我的后端服务不是基于HTTP的服务。今天,我已经使用针对GCE端点的网络端点组进行了设置。因此,我想关闭GCE端点,并用GKE工作负载替换它们。
问题
对我的端点进行运行状况检查不起作用。由于我的目标不是基于http的,因此我需要使用单独的服务来满足GCP负载平衡器使用的基于HTTP的运行状况检查。
为了证明这一点,我使用了iperf作为服务,并使用了运行http health-checker应用程序的小汽车。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: iperf
labels:
app: iperf
spec:
replicas: 1
selector:
matchLabels:
app: iperf
serviceName: iperf
template:
metadata:
labels:
app: iperf
spec:
containers:
- name: iperf
image: networkstatic/iperf3
imagePullPolicy: Always
args:
- "-s"
ports:
- name: iperf
containerPort: 5201
protocol: TCP
readinessProbe:
tcpSocket:
port: iperf
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: iperf
initialDelaySeconds: 15
periodSeconds: 20
# Health checker side car
- name: checker
# This is the image built from the Dockerfile
image: health-checker
imagePullPolicy: Always
command: ["/home/checker/health-checker/health-checker"]
args: ["--listener=0.0.0.0:8081", "--port=5201", "--log-level=warning"]
ports:
- name: checker
containerPort: 8081
protocol: TCP
# Service with standalone neg
---
apiVersion: v1
kind: Service
metadata:
name: iperf-s-iperf
annotations:
cloud.google.com/neg: '{"exposed_ports": {"5201":{}}}'
spec:
selector:
app: iperf
ports:
- name: iperf
protocol: TCP
port: 5201
targetPort: 5201
- name: checker
protocol: TCP
port: 8081
targetPort: 8081
侧面的汽车集装箱正在使用从下面的Dockerfile构建的映像:
FROM ubuntu:latest
# Create home directory for the user
RUN mkdir -p /home/checker/health-checker/ && \
useradd -m -u 1001 -U -s /bin/sh -d /home/checker checker && \
chown -R checker:checker /home/checker/health-checker
WORKDIR /home/checker/health-checker
# Copy health-checker from Github
ADD https://github.com/gruntwork-io/health-checker/releases/download/v0.0.5/health-checker_linux_386 /home/checker/health-checker/health-checker
RUN chmod +x /home/checker/health-checker/health-checker
# Change user to checker
USER checker
CMD ["/home/checker/health-checker/health-checker"]
构建映像,设置状态集和服务。
GCP代理
接下来,我们必须使用跨多个区域的标准外部TCP负载平衡器设置TCP代理。 iperf
端口是命名端口,协议是TCP。对于HTTP运行状况检查,我已经针对端口8081进行了标准检查,检查了路径/
。
我要向负载均衡器添加将iperf端口作为后端暴露的NEG。一个或多个目标从未被治愈。
预期的行为
我希望我的Pod被发现健康,并且可以访问iperf端口。
奇怪的行为/解决方法
我可以通过使用http入口安装辅助服务来“欺骗”运行状况检查,并以相同的端口和pod为目标。
---
apiVersion: v1
kind: Service
metadata:
name: iperf-s-checker
annotations:
cloud.google.com/neg: '{"ingress": true}'
spec:
type: ClusterIP
selector:
app: iperf
ports:
- name: checker
protocol: TCP
port: 8081
targetPort: 8081
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: iperf-i-checker
spec:
backend:
serviceName: iperf-s-checker
servicePort: 8081
以上配置将创建一个具有支持网络端点的基于外部HTTP的负载均衡器。现在,基于http的运行状况检查正在使用服务端口作为运行状况检查目标。 正如预期的那样,这将很好地工作,并且我们可以从外部获得健康响应。令人兴奋! 现在到奇怪的部分。现在,当我们的后台Pod被标记为基于http的服务的运行状况时,我们还将发现上述iperf服务中的运行状况,并且现在非HTTP流量的负载平衡也可以正常工作。
这种工作方式显然不是正确的方法。
有什么办法解决这个问题?我是否缺少某些东西,也许是在NEG创建期间可以通过以将运行状况检查端口与服务端口分开的注释?
谢谢