如何将静态内部 IP 设置为 GKE 内部 Ingress
How to set static internal IP to the GKE internal Ingress
我想为我的 GKE 工作负载创建一个 Internal Ingress。我想知道我可以使用的注释是什么,以便在我的入口中设置静态 INTERNAL IP address/name。
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 的 Ingress,但是我想设置一个我已经在 region/subnet 中创建的静态 IP。是否可以这样做,如果可以,是否有相同的注释
编辑
现在您可以按照以下文档创建具有 内部 IP 和 GKE
的 Ingress 资源:
将下面的部分留给 nginx-ingress
解决方案,Service
类型 LoadBalancer
具有内部 IP 地址。
有一个解决方法,需要使用具有内部 LoadBalancer
服务的 nginx-ingress
控制器。
请看官方文档:
- Cloud.google.com: Kuberentes Engine: Internal Load Balancing - 用于解决方法的文档
- Kubernetes.github.io: Ingress-nginx: Deploy - 用于解决方法的文档
下面我提供了一个变通方法示例,并解释了所采取的步骤。
解释:
- 可以使用静态 IP
创建内部 LoadBalancer
Nginx-ingress
正在使用 LoadBalancer
类型的服务作为入口点
- 您可以创建一个
nginx-ingress
内部 LoadBalancer
如以上要点所述
步骤:
- 下载并修改
nginx-ingress
定义
- 运行 并检查
nginx-ingress-controller
服务是否具有所需的静态 IP 地址
- 部署示例应用程序并进行测试
下载并修改nginx-ingress
定义
默认情况下,official site 中的 nginx-ingress
定义会将 LoadBalancer
类型的服务配置为入口点。默认情况下,它将获得一个 外部 IP 地址。您可以 modify/edit 服务定义来获得一个 internal。
请下载thisYAML
并编辑下面负责服务定义的部分:
A tip!
nginx-ingress
is also available to deploy with 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
.
公开示例应用程序的过程
YAML
Deployment
、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
您可以使用注释
kubernetes.io/ingress.regional-static-ip-name: <STATIC_IP_NAME>
我想为我的 GKE 工作负载创建一个 Internal Ingress。我想知道我可以使用的注释是什么,以便在我的入口中设置静态 INTERNAL IP address/name。
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 的 Ingress,但是我想设置一个我已经在 region/subnet 中创建的静态 IP。是否可以这样做,如果可以,是否有相同的注释
编辑
现在您可以按照以下文档创建具有 内部 IP 和 GKE
的 Ingress 资源:
将下面的部分留给 nginx-ingress
解决方案,Service
类型 LoadBalancer
具有内部 IP 地址。
有一个解决方法,需要使用具有内部 LoadBalancer
服务的 nginx-ingress
控制器。
请看官方文档:
- Cloud.google.com: Kuberentes Engine: Internal Load Balancing - 用于解决方法的文档
- Kubernetes.github.io: Ingress-nginx: Deploy - 用于解决方法的文档
下面我提供了一个变通方法示例,并解释了所采取的步骤。
解释:
- 可以使用静态 IP 创建内部
Nginx-ingress
正在使用LoadBalancer
类型的服务作为入口点- 您可以创建一个
nginx-ingress
内部LoadBalancer
如以上要点所述
LoadBalancer
步骤:
- 下载并修改
nginx-ingress
定义 - 运行 并检查
nginx-ingress-controller
服务是否具有所需的静态 IP 地址 - 部署示例应用程序并进行测试
下载并修改nginx-ingress
定义
默认情况下,official site 中的 nginx-ingress
定义会将 LoadBalancer
类型的服务配置为入口点。默认情况下,它将获得一个 外部 IP 地址。您可以 modify/edit 服务定义来获得一个 internal。
请下载thisYAML
并编辑下面负责服务定义的部分:
A tip!
nginx-ingress
is also available to deploy with 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
.
YAML
Deployment
、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
您可以使用注释
kubernetes.io/ingress.regional-static-ip-name: <STATIC_IP_NAME>