Ingresss是k8s集群中的一個API資源對象,扮演邊緣路由器(edge router)的角色,也可以理解為集群防火牆、集群網關,可以自定義路由規則來轉發、管理、暴露一組Pod。

kubernetes處理這種場景時,涉及到三個組件:

1、反向代理web服務器
負責攔截外部請求,一般是以Deployment或DeamonSet的方式部署到kubernetes集群中的Nginx、Apache等
通常以NodePort或HostNetwork方式對k8s之外暴露
由於所在主機IP不確定,因此一般需要添加約束讓其運行在固定的一批主機上,並在上層添加負載均衡
2、Ingress controller
實時感知Ingress路由規則集合的變化,再與apiserver交互,獲取Service、Pod在集群中的IP等信息,然后發送給反向代理web服務器,刷新其路由配置信息
常用ingress controller包括:
①Kubernetes社區發布的
ingress-nginx和Nginx公司發布的
kubernetes-ingress
使用nginx作為代理,但貌似nginx和Ingress controller在一個Pod里
使用traffic proxy進行代理
還提供了友好的控制面板和監控界面,不僅可以方便地查看Traefik根據Ingress生成的路由配置信息,還可以查看統計的一些性能指標數據,如:總響應時間、平均響應時間、不同的響應碼返回的總次數等。
Traefik還支持豐富的annotations配置,可配置眾多出色的特性,例如:自動熔斷、負載均衡策略、黑名單、白名單
3、Ingress
定義路由規則集合。
示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress-no-third-host
spec:
IngressClassName: xx
rules:
- host: first.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: second.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
- http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service3
port:
number: 80
(1)IngressClassName用於指定一個IngressClass:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb
spec:
controller: example.com/ingress-controller
parameters:
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb
namespace: external-configuration
scope: Namespace/Cluster
將IngressClass的annotation添加ingressclass.kubernetes.io/is-default-class:true,可以將其設置為集群默認IngressClass,沒有指定IngressClass的Ingress都會使用它
(2)每條rule=host(可選)+IngressRuleValue
host必須為域名,即必須通過{域名}:{反向代理服務器對外暴露的端口}訪問反向代理服務器
如果沒有DNS,則需要在訪問方的hosts文件中添加反向代理服務器所在主機IP-域名的映射關系,
host一旦配置為某個域名(或使用如*.foo.com這樣的通配符匹配一批域名),則這條rule僅適用於訪問該域名的請求
IngressRuleValue目前只有HTTPIngressRuleValue一種,由若干HTTPIngressPath組成,每個HTTPIngressPath包括:
-
path
-
pathType
path的匹配規則,有以下三種:
ImplementationSpecific:對於這種路徑類型,匹配方法取決於 IngressClass。
Exact:精確匹配 URL 路徑,且區分大小寫。
Prefix:基於以 / 分隔的 URL 路徑前綴匹配,此時path可以形如“/, /aaa, /aaa/bbb”
-
backend
除了可以是svc,還可以是:
backend:
resource:
apiGroup: k8s.example.com
kind: StorageBucket
name: icon-assets
綜上,該Ingress意味着:所有訪問first.bar.com的流量轉向Service1,所有訪問second.bar.com的流量轉向Service2,請求頭里沒有域名的流量轉向Service3
進行https卸載
首先創建Secret:
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: base64 編碼的 cert
tls.key: base64 編碼的 key
type: kubernetes.io/tls
在Ingress中配置tls:
spec:
tls:
- hosts:
- https-example.foo.com
secretName: testsecret-tls
這樣,ingress與service之間的連接就從https變為了http