我一直在尝试在同一HTTP负载均衡器下的Google Kubernetes Engine和Compute Engine VM上混合使用服务,以便在相同的公共静态IP和DNS别名下访问它们 . 我正在努力的是让虚拟机上的服务可访问 .

我从https://github.com/kubernetes/ingress-gce/blob/master/README.md获得了基本的解决方案,用已经存在的Deployment替换了ReplicationController(基本上在GKE集群上运行的主应用程序一侧添加了glbc) .

我一直在尝试应用https://stackoverflow.com/a/35446176/2745865中提出的解决方案,但为Jenkins实例创建的虚拟NodePort服务(在计算引擎VM中运行在集群之外)仍然不 Health .

在主应用程序部署容器下我有这个:

- name: projectX-glbc
    image: gcr.io/google_containers/glbc:0.9.7
    livenessProbe:
      httpGet:
        path: /ping
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 30
      timeoutSeconds: 5
    resources:
      limits:
        cpu: 100m
        memory: 100Mi
      requests:
        cpu: 100m
        memory: 50Mi
    args:
    - --apiserver-host=http://localhost:8080
    - --default-backend-service=default/projectX-test
    - --sync-period=300s

其余服务:

kind: Service
apiVersion: v1
metadata:
  name: projectX-jenkins-dummyservice
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 80

---
kind: Endpoints
apiVersion: v1
metadata:
  name: projectX-jenkins-dummyservice
subsets:
  - addresses:
    - ip: 10.156.0.2 # this IP is the static IP of the Jenkins master VM
    ports:
    - name: jenkins-master-http
      protocol: TCP
      port: 80

---
kind: Service
apiVersion: v1
metadata:
  name: projectX-test
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: projectX-backend
    protocol: TCP
  selector:
    app: projectX
    role: backend
    env: test

---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: projectX-test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.global-static-ip-name: "projectX-public-ip"
spec:
  backend:
    serviceName: projectX-test
    servicePort: 80
  rules:
  - host: projectX.domain.invalid
    http:
      paths:
      - path: /jenkins
        backend:
          serviceName: projectX-jenkins-dummyservice
          servicePort: 80

此配置的最终结果是可以访问公共IP上的主应用程序(以及上面显示为 projectX.domain.invalid 的DNS别名),但由于为Jenkins自动为"0 of 3 instances healthy"生成后端服务, projectX-test-ingress 保持不 Health 状态 . 此外,至少GUI显示主要的应用程序Pod奇怪地在 projectX-jenkins-dummyserviceprojectX-test 下,即使它应该与Jenkins虚拟服务无关 . 主应用程序也会定期强制重启,这对我来说建议配置不正确......

The question is what am I doing wrong - or have I understood incorrectly and what I'm trying to accomplish just isn't possible (or should not be done)?

最初我们在Compute Engine上有一个手动构建的HTTP负载均衡器,但是我无法弄清楚如何包含来自Kubernetes集群的服务(但我只是寻求使用GCP GUI的解决方案) . 例如https://stackoverflow.com/a/35447985/2745865似乎声称这可以在没有Kubernetes Ingress对象的情况下完成......

Edit: 我能想到的一个解决方案是抛弃NodePort projectX-jenkins-dummyservice 以及 projectX-test-ingress config中的引用(我把那里指向 projectX-test 的根URL放在那里),然后去改变计算引擎加载从GUI手动 balancer 器,以便代替GKE后端,它将 /jenkins, /jenkins/* 指向为原始HTTP负载均衡器创建的原始 projectX-jenkins-backend .

这样我获得了所需的功能,但它是在GUI中应用yaml和手动工作的混合,如果有人需要重建它,它可能会很麻烦...拥有一个仅在 .yaml 文件中构建的解决方案会更自我-contained . 但是,由于GKE Ingress会自动保持计算引擎负载均衡器与给定的配置一致,因此在计算引擎端对负载均衡器进行的任何手动更改都会在一段时间后被覆盖 .