Kubernetes - nginx-ingress 配置跳坑指南
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qingyafan/article/details/82692509 主要是有转发相关的东西.
Ingress是Kubernetes集群对外暴露服务的一种方式,Ingress作为一个抽象对象,定义了进入集群的流量的导向,可以视为router,真正处理流量,作为ingress和集群中微服务中介的称之为Ingress Controller
,有许多种Controller可供选择,有Kubernetes官方维护的Nginx Ingress Controller
,比较常用的还有Traefik Ingress Controller
、Kong Ingress Controller
,这里我们使用的是Nginx Ingress Controller
。
简单配置
Ingress有一个规则配置文件,nginx的反向代理的配置文件就是通过Ingress配置的规则生成的,格式像下面这样(test.yaml):
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress spec: rules: - host: example.com http: paths: - path: /service/ backend: serviceName: app1 servicePort:
执行kubectl apply -f test.yaml
,通过example.com/app1/
就可以访问到app1的/service/
目录,这里需要注意,app1中需要定义/service/
路由,否则会出现错误,以上的配置文件最终的nginx规则是:
example.com/service/ --> app1:8080/
Attention !!!
host可以不指定
host指定域名,如果指定,那么只能通过域名访问,如果不指定,则通过域名或者其他方式(只要可以转发到集群的node节点的80端口),都可以访问。
path只能转到应用的根目录
例如上面的path定义生成的规则是: host.example.com/service/ ⇒ app1:8080/。如果app1中服务路由并不是定义在根目录(/),假设我们的实际情况是: host.example.com/service/ ⇒ app1:8080/s1/,那么则需要做一个rewrite:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/configuration-snippet: | rewrite /service/(.*) /s1/$ break; spec: rules: - host: example.com http: paths: - path: /service/ backend: serviceName: app1 servicePort:
路径中支持正则表达式
高级配置
Ingress背后是Nginx,所以Nginx能实现的Ingress同样可以实现,但是实现方式不太一样,基本都是通过annotations
实现的,各种配置可以参考文档: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md 。
配置HTTPS
首先创建一个secret资源,来存储秘钥和证书。如果你的证书是.pem的,也是一样的,将下面的your_cert.crt改为your_cert.pem即可。
kubectl create secret tls tls_secret_name --key your_key.key --cert your_cert.crt
或者:
apiVersion: v1 kind: Secret metadata: name: tls_secret_name namespace: default data: tls.crt: your-k8s-ing.crt tls.key: your-k8s-ing.key type: kubernetes.io/tls
然后在Ingress的配置文件中配置使用tls: kubectl apply -f ingress.yaml
,即可。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/configuration-snippet: | rewrite /service/(.*) /v1/$ break; spec: tls: - hosts: - example.com secretName: tls_secret_name rules: - host: example.com http: paths: - path: /v1/ backend: serviceName: app1 servicePort:
总结
本文主要介绍了nginx版本的Ingress的配置。