KONG 使用私有 IP 进入 GKE
KONG ingress in GKE with private IP
当我尝试在 GKE 中创建 kong 入口控制器时,它实际上创建了面向 public 的第 4 层 tcp 负载均衡器,有什么方法可以阻止外部 IP 并使用私有 IP
如果我对这里的问题理解正确,我认为你应该可以使用内部 L7 Ingress。这是一个配置示例:
https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress
但请检查您是否符合要求:
https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress#requirements
回答问题:
How can I create an Ingress
resource used by Kong Ingress Controller
that is available only through the private/internal IP with GKE
cluster?
您可以按照以下步骤进行操作:
- 修改并应用
Kong Ingress
控制器清单。
- 创建并应用将由
Kong
使用的 Ingress
资源。
A side note!
Ingress
controllers like nginx-ingress
, kong
, etc. are using the Service
of type Loadbalancer
(Layer 4) for incoming traffic.
修改并应用 Kong Ingress
控制器清单
Kong
github 页数:
如前所述,您需要下载、修改和应用 Kong Ingress
控制器清单。 默认情况下,您的控制器将暴露给外部资源,但您可以通过指定以下注释来更改此行为(在您下载的清单的 Service
类型 LoadBalancer
中):
networking.gke.io/load-balancer-type: "Internal"
您需要像下面这样编辑 Service
:
apiVersion: v1
kind: Service
metadata:
annotations:
networking.gke.io/load-balancer-type: "Internal" # <-- IMPORTANT, ADD THIS
name: kong-proxy
namespace: kong
spec:
ports:
- name: proxy
port: 80
protocol: TCP
targetPort: 8000
- name: proxy-ssl
port: 443
protocol: TCP
targetPort: 8443
selector:
app: ingress-kong
type: LoadBalancer
生成后修改 YAML
表明你的 Service
负责传入流量应该如下所示:
$ kubectl get service -n kong
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kong-proxy LoadBalancer 10.8.5.66 10.156.0.92 80:32764/TCP,443:32002/TCP 14m
kong-validation-webhook ClusterIP 10.8.6.32 <none> 443/TCP 14m
如您所见,kong-proxy
的 External IP
位于 GKE
节点的 CIDR
之内。您需要将请求发送到子网内的这个特定地址。
创建并应用 Ingress
将由 Kong
使用的资源
要检查您新创建的 Ingress
控制器是否正常运行,您可以使用以下示例进行检查:
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=ClusterIP
Ingress
资源 YAML
此示例的清单如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kong-ingress
annotations:
kubernetes.io/ingress.class: "kong" # <-- IMPORTANT, ADD THIS
spec:
rules:
- host:
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
ingress.class
用于告诉您的 Kubernetes
集群哪个 Ingress
控制器应该处理这个资源。
应用以上资源后,您应该可以通过调用看到它:
$ kubectl get ingress kong-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
kong-ingress <none> * 10.156.0.92 80 16m
如您所见,您的 kong-ingress
在 内部 IP 上可用,与类型 LoadBalancer
的 Service
相同。
您可以使用子网中的其他 VM
来检查它是否工作 运行:
curl 10.156.0.92
应该可以看到 NGINX
欢迎页面。
其他资源:
当我尝试在 GKE 中创建 kong 入口控制器时,它实际上创建了面向 public 的第 4 层 tcp 负载均衡器,有什么方法可以阻止外部 IP 并使用私有 IP
如果我对这里的问题理解正确,我认为你应该可以使用内部 L7 Ingress。这是一个配置示例:
https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress
但请检查您是否符合要求: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress#requirements
回答问题:
How can I create an
Ingress
resource used byKong Ingress Controller
that is available only through the private/internal IP withGKE
cluster?
您可以按照以下步骤进行操作:
- 修改并应用
Kong Ingress
控制器清单。 - 创建并应用将由
Kong
使用的Ingress
资源。
A side note!
Ingress
controllers likenginx-ingress
,kong
, etc. are using theService
of typeLoadbalancer
(Layer 4) for incoming traffic.
修改并应用 Kong Ingress
控制器清单
Kong
github 页数:
如前所述,您需要下载、修改和应用 Kong Ingress
控制器清单。 默认情况下,您的控制器将暴露给外部资源,但您可以通过指定以下注释来更改此行为(在您下载的清单的 Service
类型 LoadBalancer
中):
networking.gke.io/load-balancer-type: "Internal"
您需要像下面这样编辑 Service
:
apiVersion: v1
kind: Service
metadata:
annotations:
networking.gke.io/load-balancer-type: "Internal" # <-- IMPORTANT, ADD THIS
name: kong-proxy
namespace: kong
spec:
ports:
- name: proxy
port: 80
protocol: TCP
targetPort: 8000
- name: proxy-ssl
port: 443
protocol: TCP
targetPort: 8443
selector:
app: ingress-kong
type: LoadBalancer
生成后修改 YAML
表明你的 Service
负责传入流量应该如下所示:
$ kubectl get service -n kong
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kong-proxy LoadBalancer 10.8.5.66 10.156.0.92 80:32764/TCP,443:32002/TCP 14m
kong-validation-webhook ClusterIP 10.8.6.32 <none> 443/TCP 14m
如您所见,kong-proxy
的 External IP
位于 GKE
节点的 CIDR
之内。您需要将请求发送到子网内的这个特定地址。
创建并应用 Ingress
将由 Kong
使用的资源
要检查您新创建的 Ingress
控制器是否正常运行,您可以使用以下示例进行检查:
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=ClusterIP
Ingress
资源 YAML
此示例的清单如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kong-ingress
annotations:
kubernetes.io/ingress.class: "kong" # <-- IMPORTANT, ADD THIS
spec:
rules:
- host:
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
ingress.class
用于告诉您的 Kubernetes
集群哪个 Ingress
控制器应该处理这个资源。
应用以上资源后,您应该可以通过调用看到它:
$ kubectl get ingress kong-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
kong-ingress <none> * 10.156.0.92 80 16m
如您所见,您的 kong-ingress
在 内部 IP 上可用,与类型 LoadBalancer
的 Service
相同。
您可以使用子网中的其他 VM
来检查它是否工作 运行:
curl 10.156.0.92
应该可以看到 NGINX
欢迎页面。
其他资源: