如何为 GKE 内部 Ingress 设置静态内部 IP

Ram*_*Ram 4 google-cloud-platform google-kubernetes-engine kubernetes-ingress

我想为我的 GKE 工作负载创建一个内部入口。我想知道我可以使用什么注释,以便在入口中设置静态内部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
Run Code Online (Sandbox Code Playgroud)

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

Daw*_*ruk 5

编辑

现在,您可以创建具有入口资源的内部IPGKE按照本文档:

将下面的部分留给具有内部 IP 地址类型的nginx-ingress解决方案。ServiceLoadBalancer



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

请查看官方文档:

下面我包含了一个解决方法的示例,并解释了所采取的步骤。


解释:

  • 可以LoadBalancer使用静态 IP创建内部
  • Nginx-ingress使用LoadBalancer服务类型作为入口点
  • 您可以按照上述要点创建一个nginx-ingresswith internalLoadBalancer

脚步:

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

下载和修改nginx-ingress定义

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

请下载 YAML和编辑负责以下服务定义相关的部分:

一个提示!

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 
Run Code Online (Sandbox Code Playgroud)

请具体看一下metadata部分:

  annotations: # ADD THIS LINE 
    cloud.google.com/load-balancer-type: "Internal" # ADD THIS LINE
Run Code Online (Sandbox Code Playgroud)

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

另外请看一下:

  annotations: # ADD THIS LINE 
    cloud.google.com/load-balancer-type: "Internal" # ADD THIS LINE
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

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

上述命令的输出:

  loadBalancerIP: 10.156.0.99 # ADD THIS LINE 
Run Code Online (Sandbox Code Playgroud)

如您所见EXTERNAL-IP,实际上是internal并设置为10.156.0.99.

你应该能curl这个地址并获得default-backendnginx-ingress-controller


部署示例应用程序并进行测试

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

YAMLDeployment,Service和 的定义Ingress

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
Run Code Online (Sandbox Code Playgroud)

应用此资源后,您应该能够:

  • $ curl 10.156.0.99

并受到欢迎:

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
Run Code Online (Sandbox Code Playgroud)