我是一个Kubernetes业余爱好者,试图在GKE上使用NGINX入口控制器。我正在关注this谷歌云文档以为我的服务设置NGINX Ingress,但是在访问NGINX位置时遇到了问题。
正在做什么?
什么不起作用?
K8S服务
[msekar@ebs kube-base]$ kubectl get services -n payment-gateway-7682352
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-controller LoadBalancer 10.35.241.255 35.188.161.171 80:31918/TCP,443:31360/TCP 6h
nginx-ingress-default-backend ClusterIP 10.35.251.5 <none> 80/TCP 6h
payment-gateway-dev ClusterIP 10.35.254.167 <none> 5000/TCP 6h
payment-gateway-qa ClusterIP 10.35.253.94 <none> 5000/TCP 6h
K8S入口
[msekar@ebs kube-base]$ kubectl get ing -n payment-gateway-7682352
NAME HOSTS ADDRESS PORTS AGE
pgw-nginx-ingress * 104.198.78.169 80 6h
[msekar@ebs kube-base]$ kubectl describe ing pgw-nginx-ingress -n payment-gateway-7682352
Name: pgw-nginx-ingress
Namespace: payment-gateway-7682352
Address: 104.198.78.169
Default backend: default-http-backend:80 (10.32.1.4:8080)
Rules:
Host Path Backends
---- ---- --------
*
/dev/ payment-gateway-dev:5000 (<none>)
/qa/ payment-gateway-qa:5000 (<none>)
Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/ssl-redirect":"false"},"name":"pgw-nginx-ingress","namespace":"payment-gateway-7682352"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"payment-gateway-dev","servicePort":5000},"path":"/dev/"},{"backend":{"serviceName":"payment-gateway-qa","servicePort":5000},"path":"/qa/"}]}}]}}
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: false
Events: <none>
注释(入口描述输出)中最后应用的配置显示了入口资源清单。但是,我将其粘贴在下面以供参考
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: pgw-nginx-ingress
namespace: payment-gateway-7682352
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- backend:
serviceName: payment-gateway-dev
servicePort: 5000
path: /dev/
- backend:
serviceName: payment-gateway-qa
servicePort: 5000
path: /qa/
其他信息
我要访问的服务是使用上下文的springboot服务,因此,根位置不是有效的端点。
相应地定义了容器的就绪性和活动性探针。
例如,“ payment-gateway-dev”服务使用上下文/ pgw / v1上下文,因此只能通过该上下文访问部署。要访问应用程序的规范,您可以使用URL
http:// <> /pgw/v1/swagger-ui.html
我的部署行为
ingress-controller-LB-ip = 35.188.161.171
对于我可能做错的任何建议或见解,将不胜感激。
答案 0 :(得分:2)
+1是这个很好问的问题。
您的设置对我来说似乎是正确的。在您的解释中,我发现您的服务将需要http://<>/pgw/v1/swagger-ui.html
作为上下文。但是,在您的设置中,如果您的路线为http://<>/qa/pgw/v1/swagger-ui.html
,则提交给服务的路径将为/qa/
。
要删除前缀,您需要做的是向入口添加rewrite
规则:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: pgw-nginx-ingress
namespace: payment-gateway-7682352
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- backend:
serviceName: payment-gateway-dev
servicePort: 5000
path: /dev/(.+)
- backend:
serviceName: payment-gateway-qa
servicePort: 5000
path: /qa/(.+)
此后,您的服务应该会收到正确的上下文。
参考:
答案 1 :(得分:0)
另一种方法是使用基于主机的路由。您只需为Ingress静态IP(pgw-dev.foo.com,pgw-qa.foo.com)创建几个CNAME DNS条目,然后用host:属性替换path:属性。无需重写URL。
使用基于主机的方法imo的最佳理由是人类的清晰度和灵活性。我在很多不同的地方工作过。几乎所有的主机都以这种方式使用主机名来区分环境。味道很棒,馅料少。
例如,如果将DEV和QA划分为单独的群集,则无需更改其配置(并且K8s模板将可重用)。只需更新DNS。如果您想启动一个新的Staging或Performance Test环境,那么,您现有的测试工具应该很容易适应新的环境:只需在配置中更改主机名即可。
随着时间的流逝,我认为您会发现主机名是比路径前缀更自然的区分环境的方式。