文章目录
-
-
- 附:常用ingress配置
-
- 1. 跨域(单个或多个)
- 2. ingress中的rewrite
- 3. https配置
- 4. ingress暴露自定义header
- 5. 注解说明
-
- 5.1 `nginx.ingress.kubernetes.io/affinity: "cookie"`
- 5.2 改写cookie的path`nginx.ingress.kubernetes.io/proxy-cookie-path`
- 5.3 定制服务器片段`nginx.ingress.kubernetes.io/server-snippet`
- 5.4 定制位置片段`nginx.ingress.kubernetes.io/configuration-snippet`
- 5.5 `nginx.ingress.kubernetes.io/rewrite-target`注解
- 5.6 `nginx.ingress.kubernetes.io/from-to-www-redirect: "true"`
- 6. ingress作内部反向代理
- 关于安装
-
Ingress是管理外部网咯访问K8S集群中Service的API对象(典型就是HTTP),它可以提供负载均衡、SSL终端以及基于名字的虚拟host。简单点来说它就是外网访问集群应用的媒介,流程如下:
+----------+ Ingress +---------+
| internet | ---------> | Service |
+----------+ +---------+
Ingress Controller 负责实现入口(即ingress的意思),通常使用负载均衡器,但它也可以配置边缘路由器或其他前端以帮助处理流量。Ingress不会随意暴露端口或协议,向Internet公开HTTP和HTTPS以外的服务通常使用Service.Type=NodePort
或Service.Type=LoadBalancer
类型的服务。
和其他K8S资源一样,Ingress必须要有一个 Ingress Controller,仅有 Ingress Resource 是无效的,Ingress也是无法正常工作的。Ingress Controller不会随着集群的启动而自动启动,且Ingress Controller有多种,目前K8S只支持和维护GCE(Google Kubernetes Engine)和nginx2种Controller。
【Ingress Resource】
Ingress Resource 则和大部分的K8S资源差不多,需要apiVersion
、kind
和metadata
等字段,下面一个最小ingress resource的示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
backend:
serviceName: test
servicePort: 80
Ingress通常都是使用注解annotations
来配置某些选项,具体可配置选项、支持哪些注解取决于Ingress Controller类型,上述是一个rewrite-target
的注解,spec
字段包含了负载均衡器或代理服务器的配置,最重要的是它包含了所有传入请求的匹配规则。注:Ingress Resource仅支持HTTP通信的规则。
Ingress rules是Ingress中比较重要的一部分,即上述示例中的rules
字段的含义(它是一个可以包含多种rule
对象的数组),每个Http的rule
都应该包含如下的信息:
host
:可选参数,用于限定rule适用的host,如指定为foo.bar.com
,那该rule只应用于这个host,上述示例中未指定,则该rule
适用于通过指定IP地址的所有入站HTTP流量;-paths
:一系列的path对象组成的数组,上述示例中只有一个path为/testpath
,每个path都有一个backend
对象(代表的是后端服务)与之对应;backend
:是一个serviceName
和servicePort
的组合对象,只有host
和path
都匹配成功的情况下,LoadBalancer才会将流量导向引用的服务。
通常Ingress会有一个 Default Backend,当在上述我们自定义的Ingress Resource没有匹配的rule
对象时,流量就会被导向这个Default Backend。当然这个default backend需要我们自己去配,通常不会在Ingress Resource中配置default backend,而是应该在Ingress Ctontroller中进行指定。
【Ingress的类型】
1.Single Service Ingress
即单服务Ingress,K8S当前是支持暴露单个服务的,可以通过在没有规则的情况下指定默认后端来使用ingress来完成此操作,如:
# ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
backend:
serviceName: testsvc
servicePort: 80
注:
安装完ingress后,还要执行:
# 创建命名空间 ingress-nginx
kubectl create namespace ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml
kubectl apply -f ingress.yaml
即可,通过kubectl get ingress test-ingress
可以查看详情,包括Ingress分配给这个default backend的IP。
2.Simple fanout
fanout基于请求的HTTP URI将配置流量从单个IP路由到多个服务,Ingress 是允许将负载平衡器的数量降到最低,如:
foo.bar.com -> 178.91.123.132 -> / foo service1:4200
/ bar service2:8080
上述的过程需要一个如下的Ingress(同一个域名配置了2个path):
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 4200
- path: /bar
backend:
serviceName: service2
servicePort: 8080
3.基于名字虚拟host
和2类似,这种类型的Ingress支持将HTTP流量路由到在同一个IP上的多个host name,流程如下:
foo.bar.com --| |-> foo.bar.com s1:80
| 178.91.123.132 |
bar.foo.com --| |-> bar.foo.com s2:80
此时的Ingress Resource应该为:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend