使用Kubernetes容器本机负载平衡和GCP Standalone NEG进行网络负载平衡

时间:2020-10-26 18:39:58

标签: kubernetes google-cloud-platform google-kubernetes-engine

场景

使用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创建期间可以通过以将运行状况检查端口与服务端口分开的注释?

谢谢

0 个答案:

没有答案