【问题标题】:How to set static internal IP to the GKE internal Ingress如何将静态内部 IP 设置为 GKE 内部 Ingress
【发布时间】:2020-10-12 12:51:45
【问题描述】:

我想为我的 GKE 工作负载创建一个内部 Ingress。我想知道我可以使用什么注释,以便在我的入口中设置静态 INTERNAL IP 地址/名称。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-https
  namespace: istio-system
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.class: "gce-internal"
    ingress.gcp.kubernetes.io/pre-shared-cert: my-cert
    helm.sh/chart: {{ include "devtools.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  backend:
    serviceName: istio-ingressgateway-backend
    servicePort: 443

我知道它会创建一个带有内部 IP 的入口,但是我想设置一个我已经在区域/子网中创建的静态 IP。是否可以这样做,如果可以,是否有相同的注释

【问题讨论】:

  • 你试过this吗?在您的入口规范中添加loadBalancerIp。这是关于 K8S 而不是 Istio,但您可以尝试一下!我从未尝试过,但对您的测试结果很感兴趣!
  • 我担心GKE 的默认 Ingress 无法做到这一点。正如我所见,您只有一条通往istio-ingressgateway-backend 的路径。这是否意味着您可以使用内部 LoadBalancer 而不是 Ingress 资源?如果是,这里有关于它的文档:Cloud.google.com: Kubernetes Engine: Internal LoadBalancing。您还可以尝试将 nginx-ingress 配置为内部 LoadBalancer 作为入口点。请告知哪种解决方案适合您的需求。
  • 我已在 Istio 虚拟服务的帮助下附加了所有工作负载。我需要使用路径规则将流量重定向到不同的工作负载。所以我输入:LoadBalancer 可能对我没有帮助

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


【解决方案1】:

编辑

现在您可以按照以下文档使用GKE 创建具有内部 IP 的 Ingress 资源:

将下面的部分留给nginx-ingress 解决方案,其中Service 类型为LoadBalancer,具有内部IP 地址。



有一个解决方法,需要使用 nginx-ingress 控制器和内部 LoadBalancer 服务。

请看官方文档:

下面我提供了一个解决方法示例,并说明了所采取的步骤。


解释:

  • 可以使用静态 IP 创建内部 LoadBalancer
  • Nginx-ingress 使用 LoadBalancer 类型的服务作为入口点
  • 您可以创建一个带有内部 LoadBalancer 的 nginx-ingress,如上述要点中所述

步骤:

  • 下载修改nginx-ingress定义
  • 运行并检查 nginx-ingress-controller 服务是否具有所需的静态 IP 地址
  • 部署示例应用并进行测试

下载修改nginx-ingress定义

默认情况下,来自official site 的nginx-ingress 定义将配置LoadBalancer 类型的服务作为入口点。默认情况下,它将获得一个外部 IP 地址。您可以修改/编辑服务定义以获得内部。

请下载thisYAML并编辑下面负责服务定义的部分:

提示!

nginx-ingress 也可以与 Helm! 一起部署。

# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service   
metadata:
  annotations: # ADD THIS LINE 
    cloud.google.com/load-balancer-type: "Internal" # ADD THIS LINE
  labels:
    helm.sh/chart: ingress-nginx-2.4.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.33.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  loadBalancerIP: 10.1.2.99 # ADD THIS LINE 
  externalTrafficPolicy: Local
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller 

请具体查看metadata 部分:

  annotations: # ADD THIS LINE 
    cloud.google.com/load-balancer-type: "Internal" # ADD THIS LINE

因为这部分将指示GCP 提供一个内部 IP 地址

也请看一下:

  loadBalancerIP: 10.156.0.99 # ADD THIS LINE 

因为这一行将告诉GCP 分配所提供的 IP 地址。

请注意,此地址应与您在其中创建集群的 VPC 网络兼容。


运行并检查 nginx-ingress-controller 服务是否具有所需的静态 IP 地址

应用nginx-ingress 的完整定义后,您应该能够运行:

  • kubectl get svc ingress-nginx-controller -n ingress-nginx

上述命令的输出:

NAME                       TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   LoadBalancer   10.60.6.97   10.156.0.99   80:31359/TCP,443:32413/TCP   2m59s

如您所见,EXTERNAL-IP 实际上是内部并设置为10.156.0.99。

你应该能够curl这个地址并获得nginx-ingress-controller的default-backend。


部署示例应用并进行测试

此步骤是可选的,仅显示使用提到的nginx-ingress 公开示例应用程序的过程。

YAMLDeployment、Service 和 Ingress 的定义:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app
spec:
  selector:
    matchLabels:
      app: hello
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
---
apiVersion: v1
kind: Service
metadata:
  name: hello-service
  labels:
    app: hello
spec:
  type: NodePort
  selector:
    app: hello
  ports:
  - name: hello-port
    port: 80
    targetPort: 8080
    protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host:
    http:
      paths:
      - path: /
        backend:
          serviceName: hello-service
          servicePort: hello-port

应用这些资源后,您应该能够:

  • $ curl 10.156.0.99

并受到欢迎:

Hello, world!
Version: 2.0.0
Hostname: hello-app-7f46745f74-27gzh

【讨论】:

  • 谢谢,大卫。我认为这对我很有帮助。我尝试在我的环境中对此进行测试,但在创建 Ingress 时出现超时错误。不知道可能是什么原因。你能告诉我这个入口是可以有多个后端还是应该只有一个后端!
  • 这个Ingress 可以有多个后端。请检查您是否获得了与nginx-ingress-controller 关联的LoadBalancer 服务类型的内部IP 地址。另外请调用$ kubectl describe ingress NAME_OF_INGRESS。您应该有更多信息为什么它无法在那里创建。
  • 如果我先创建 Ingress,然后再创建 nginx-controller。它工作正常,但是如果我以其他方式做,我将无法创建 Ingress。我检查了 nginx-controller pod 中的日志。但是什么也察觉不到。服务器出错(超时):创建“ingress.yaml”时出错:超时:请求未在请求的超时 30 秒内完成
  • 这是奇怪的行为。我发现 Stackoverflow 问题 here 与您的问题类似,但不幸的是没有答案。为它创建另一个问题可能是个好主意,因为调试它会偏离原始问题。
【解决方案2】:

你可以使用注解 kubernetes.io/ingress.regional-static-ip-name: <STATIC_IP_NAME>

https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress#static_ip_addressing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2021-02-01
    • 2019-10-18
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多