Ingress


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM