Ingress 入門

什么是ingress

通俗來講,ingress 和Service、Deployment 都是 kubernetes 的資源類型,Ingress 用于實現用域名的方式訪問K8s 內部應用。

1659680108233.jpg

Ingress 安裝

首先安裝 helm 管理工具:https://helm.sh/docs/intro/install/

使用 helm 安裝Ingress:https://kubernetes.github.io/ingress-nginx/deploy/

1.添加 Ingress 的 helm 倉庫

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

2.下載 ingress 的 helm 包至本地

helm pull ingress-nginx/ingress-nginx

3.更改對應的配置

tar xf ingress-nginx-3.6.0.tgz
cd ingress-nginx
vim values.yaml

4.需要修改的位置

  • Controller 和 admissionWebhook 的鏡像地址,需要將公網鏡像同步至公司內網鏡像倉庫。
  • hostNetwork 設置為true
  • dnsPolicy 設置為 ClusterFirstWithHostNet
  • NodeSelector 添加 ingress:“true” 部署至指定節點
  • 類型更改為kind:DaemonSet

5.部署 ingress

給需要部署ingress 的節點上打標簽

$ kubectl label node k8s-master03 ingress=true
$ kubectl create ns ingress-nginx
$ helm install ingress-nginx -n ingress-nginx

Ingress 使用

一個Ingress 資源示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: foo.bar.com
      http:
        paths:
          - path: "/"
            pathType: Prefix
            backend:
              service:
                name: nginx-svc
                port:
                  number: 80

Ingress 需要指定 apiVersionkindmetadataspec 字段。 Ingress 對象的命名必須是合法的 DNS 子域名名稱。

service 和 deployment YAML 如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
    - port: 80

使用 kubectl apply -f 創建

$ kubectl apply -f nginx-ingress.yaml -f nginx-svc.yaml

http://foo.bar.com 轉發到集群內的服務 nginx-svc上,完整的URL為http://nginx-svc:80/

配置 /etc/hosts 文件,如下所示:

192.168.31.217  foo.bar.com

在瀏覽器上訪問foo.bar.com,就可以看到內容了

默認后端

沒有設置規則的 Ingress 將所有流量發送到同一個默認后端,.spec.defaultBackend 則是在這種情況下處理請求的那個默認后端。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-resource-backend
spec:
  defaultBackend:
    resource:
      apiGroup: k8s.example.com
      kind: StorageBucket
      name: static-assets
  rules:
    - http:
        paths:
          - path: /icons
            pathType: ImplementationSpecific
            backend:
              resource:
                apiGroup: k8s.example.com
                kind: StorageBucket
                name: icon-assets

路徑類型

Ingress 中的每個路徑都需要有對應的路徑類型(Path Type)。未明確設置 pathType 的路徑無法通過合法性檢查。當前支持的路徑類型有三種:

  • ImplementationSpecific:對于這種路徑類型,匹配方法取決于 IngressClass。 具體實現可以將其作為單獨的 pathType 處理或者與 Prefix 或 Exact 類型作相同處理。

  • Exact:精確匹配 URL 路徑,且區分大小寫。

  • Prefix:基于以 / 分隔的 URL 路徑前綴匹配。匹配區分大小寫,并且對路徑中的元素逐個完成。 路徑元素指的是由 / 分隔符分隔的路徑中的標簽列表。

類型 路徑 請求路徑 匹配與否?
Prefix / (所有路徑)
Exact /foo /foo
Exact /foo /bar
Exact /foo /foo/
Exact /foo/ /foo
Prefix /foo /foo, /foo/
Prefix /foo/ /foo, /foo/
Prefix /aaa/bb /aaa/bbb
Prefix /aaa/bbb /aaa/bbb
Prefix /aaa/bbb/ /aaa/bbb 是,忽略尾部斜線
Prefix /aaa/bbb /aaa/bbb/ 是,匹配尾部斜線
Prefix /aaa/bbb /aaa/bbb/ccc 是,匹配子路徑
Prefix /aaa/bbb /aaa/bbbxyz 否,字符串前綴不匹配
Prefix /, /aaa /aaa/ccc 是,匹配 /aaa 前綴
Prefix /, /aaa, /aaa/bbb /aaa/bbb 是,匹配 /aaa/bbb 前綴
Prefix /, /aaa, /aaa/bbb /ccc 是,匹配 / 前綴
Prefix /aaa /ccc 否,使用默認后端
混合 /foo (Prefix), /foo (Exact) /foo 是,優選 Exact 類型

主機名通配符

主機名可以是精確匹配(例如 foo.bar.com),也可以使用通配符匹配(例如 *.bar.com)。精確匹配要求 HTTP host 頭部字段與 host 字段一致,通配符匹配要求 HTTP host 頭部字段與通配符規則中的后綴部分相同。

主機 host 頭部 匹配與否?
*.foo.com bar.foo.com 基于相同的后綴匹配
*.foo.com baz.bar.foo.com 不匹配,通配符僅覆蓋了一個 DNS 標簽
*.foo.com foo.com 不匹配,通配符僅覆蓋了一個 DNS 標簽

將同一域名的不同 URL 路徑轉發到不同的服務(Simple Fanout)

根據請求的 HTTP URI 將來自同一 IP 地址的流量路由到多個 Service。

1659681615852.jpg

Ingress 配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 4200
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 8080

使用 kubectl apply -f 創建 Ingress

$ kubectl apply -f ingress.yaml

查看 Ingress 詳細信息

$ kubectl describe ingress simple-fanout-example
Name:             simple-fanout-example
Namespace:        default
Address:          178.91.123.132
Default backend:  default-http-backend:80 (10.8.2.3:8080)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com
               /foo   service1:4200 (10.8.0.90:4200)
               /bar   service2:8080 (10.8.0.91:8080)
Annotations:
  nginx.ingress.kubernetes.io/rewrite-target:  /
Events:
  Type     Reason  Age                From                     Message
  ----     ------  ----               ----                     -------
  Normal   ADD     22s                loadbalancer-controller  default/test

將不同的域名轉發到不同的服務

基于名稱的虛擬主機支持將針對多個主機名的 HTTP 流量路由到同一 IP 地址上。

1659682444066.jpg
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: bar.foo.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service2
            port:
              number: 80

HTTPS 配置

通過設定包含 TLS 私鑰和證書的 Secret 來保護 Ingress。 Ingress 只支持單個 TLS 端口 443。 TLS Secret 的數據中必須包含用于 TLS 的以鍵名 tls.crt 保存的證書和以鍵名 tls.key 保存的私鑰。

apiVersion: v1
kind: Secret
metadata:
  name: testsecret-tls
  namespace: default
data:
  tls.crt: base64 編碼的證書
  tls.key: base64 編碼的私鑰
type: kubernetes.io/tls
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
      - https-example.foo.com
    secretName: testsecret-tls
  rules:
  - host: https-example.foo.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

更新 Ingress

可以使用 kubectl edit 更新 Ingress ,也可以使用 kubectl replace -f 更新 ingress.yaml 文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容