首頁 > 軟體

Ingress七層路由機制實現域名的方式存取k8s

2022-03-18 16:00:49

Ingress概念:

通俗來講:Ingress和之前說的Service、Deployment一樣,也是一個k8s的資源型別;Ingress用於實現域名的方式存取k8s的內部應用,Service可能更適於服務間存取。

這東西我們使用的k8s官方維護的本版,另外nginx官方也有一個版本,怎麼用看個人。

Ingress支援多種方案:包括 Nginx、Haproxy、Traefik、istio等;在實際中Ingress上面可能還有一層公司的硬體層代理。

大概的流程圖如下:

建立一個Ingress:

這個ingress使用Hlem方式建立,以後會寫一篇helm的使用,現在不用管原理。

所需資源準備:

Ingress-nginx使用的兩個容器映象下載地址:

映象地址:registry.cn-hangzhou.aliyuncs.com

映象:yyangs/ingress-nginx-controller;yyangs/ingress-nginx-kube-webhook-certgen

chart包:ingress-nginx-4.0.17

首先我們先建立一個Helm(因為要使用helm建立)

[root@k8s-master01 ~]# wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz
[root@k8s-master01 ~]# tar xf helm-v3.8.0-linux-amd64.tar.gz
[root@k8s-master01 ~]# mv linux-amd64/helm /usr/local/bin/helm

建立一個倉庫 ,方便安裝ingress:ingress的APP VERSION版本最好要大於0.35,檢視其下可用的包

[root@k8s-master01 ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
[root@k8s-master01 ~]# helm repo list
NAME         	URL                                       
ingress-nginx	https://kubernetes.github.io/ingress-nginx
[root@k8s-master01 ~]# helm search repo ingress-nginx
NAME                       	CHART VERSION	APP VERSION	DESCRIPTION                                       
ingress-nginx/ingress-nginx	4.0.17       	1.1.1      	Ingress controller for Kubernetes using NGINX a...

下載ingress包,將包解壓到一個建立的目錄中方便修改設定

[root@k8s-master01 ~]# helm pull ingress-nginx/ingress-nginx
ingress-nginx-4.0.17.tgz
[root@k8s-master01 ~]# mkdir /temp
[root@k8s-master01 ~]# mv ingress-nginx-4.0.17.tgz /temp/
[root@k8s-master01 ~]# cd /temp/
[root@k8s-master01 temp]# tar xf ingress-nginx-4.0.17.tgz 
# 進到ingress-nginx目錄
[root@k8s-master01 temp]# cd ingress-nginx/

修改values.yaml,基本每一行都代表一個位置

# 源位置
controller:
  name: controller
  image:
    registry: registry.cn-hangzhou.aliyuncs.com
    image: yyangs/ingress-nginx-controller
    ## digest: sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de
# dns策略
  dnsPolicy: ClusterFirstWithHostNet
# 使用宿主機埠號,效能好
  hostNetwork: true
# 資源型別選擇DaemonSet,會在指定節點上部署
  kind: DaemonSet
# 在有標籤的node上部署
  nodeSelector:
    kubernetes.io/os: linux
    ingress: "true"
# 型別,本地環境使用
    type: ClusterIP
# 最後位置的另一處源位置
    patch:
      enabled: true
      image:
        registry: registry.cn-hangzhou.aliyuncs.com
        image: yyangs/ingress-nginx-kube-webhook-certgen
        ## digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

對上面的修改做一些說明:

映象源:他預設源是國外的,我們存取不到。所以我替換成了我的阿里源,如果做這個實驗的小夥伴可以用我的源;最後一處的源也一樣;注意把校驗註釋

使用hostNetwork: true建立,配合資源型別選擇DaemonSet效能更好

dns策略:如果使用hostNetwork,策略需要改成dnsPolicy: ClusterFirstWithHostNet

執行yaml檔案建立

# 建立一個名稱空間
[root@k8s-master01 ingress-nginx]# kubectl create ns ingress-nginx
namespace/ingress-nginx created
# 因為要在指定node上建立,所以給一臺機器建立一個標籤
[root@k8s-master01 ingress-nginx]# kubectl label nodes k8s-master03 ingress=true
node/k8s-master03 labeled
# 執行helm建立,那個名稱自定義,之前出了一點問題,所以換個名字。
[root@k8s-master01 ~]# cd /temp/ingress-nginx/
您在 /var/spool/mail/root 中有新郵件
[root@k8s-master01 ingress-nginx]# helm install nginx-ingress -n ingress-nginx .
[root@k8s-master01 temp]# kubectl get pod -n ingress-nginx -o wide 
NAME                                           READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
nginx-ingress-ingress-nginx-controller-lrs9s   1/1     Running   0          22h   192.168.10.4   k8s-master03   <none>           <none>

可以看到這個Pod已經起來了,並且部署在master03節點上,也就是有ingress=ture標籤的節點上,這樣對ingress進行擴容或縮容的時候就會方便很多。
比如當你想擴容的時候只需要在想擴容的節點打上對應的標籤,就會自動部署一個新的Pod,就像下面這條命令。

kubectl label node k8s-master02 ingress=true

當我不想要這個Pod的時候,縮容也會比較簡單,去掉標籤就可以了,可以看出標籤的強大之處,減號等於刪除標籤的意思。

kubectl label node k8s-master02 ingress-

hostNetwork方式部署的ingress,會在宿主機啟動一個程序,我們去部署Pod的節點看一下,

[root@k8s-master03 ~]# ss -tpln | grep 80
LISTEN     0      16384  192.168.10.4:2380                     *:*                   users:(("etcd",pid=1703,fd=7))
LISTEN     0      16384        *:80                       *:*                   users:(("nginx",pid=106434,fd=19),("nginx",pid=106427,fd=19))
LISTEN     0      16384        *:80                       *:*                   users:(("nginx",pid=106433,fd=11),("nginx",pid=106427,fd=11))
LISTEN     0      16384     [::]:80                    [::]:*                   users:(("nginx",pid=106433,fd=12),("nginx",pid=106427,fd=12))
LISTEN     0      16384     [::]:80                    [::]:*                   users:(("nginx",pid=106434,fd=20),("nginx",pid=106427,fd=20))
[root@k8s-master03 ~]# ps aux | grep nginx
root       2622  0.0  0.1   8852  5456 ?        Ss   01:12   0:00 nginx: master process nginx -g daemon off;
101        2759  0.0  0.0   9272  2456 ?        S    01:12   0:00 nginx: worker process
101        2760  0.0  0.0   9272  2456 ?        S    01:12   0:00 nginx: worker process
root      25605  0.0  0.0 112840  2292 pts/0    S+   15:19   0:00 grep --color=auto nginx
101      106347  0.0  0.0    208     4 ?        Ss   09:08   0:00 /usr/bin/dumb-init -- /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key
101      106359  0.1  1.1 743048 44956 ?        Ssl  09:08   0:25 /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key
101      106427  0.0  0.9 145100 36332 ?        S    09:08   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
101      106433  0.0  1.0 157128 40848 ?        Sl   09:08   0:06 nginx: worker process
101      106434  0.0  1.0 157128 41000 ?        Sl   09:08   0:07 nginx: worker process
101      106435  0.0  0.7 143072 29120 ?        S    09:08   0:00 nginx: cache manager process

執行之後,接下來嘗試簡單的使用:

傳統架構中釋出服務,需要設定修改nginx的組態檔;在k8s中ingress與其他資源型別一樣,通過yaml去宣告一個ingress的範例。
官方網址:ingress-controller官方檔案詳細內容可以看這。

使用官網上一個例子先認識一下ingress

vim ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
  name: example
spec:
  ingressClassName: nginx
  rules:  # 可以設定多個rules
  - host: foo.bar.com # 域名匹配
    http:
      paths:  # 相當於nginx的location配合,同一個host可以設定多個paths
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc # 代理的哪個svc
            port: 
              number: 80

這裡說一下上面這個範例的一些說明:

從rules開始向下是定義前後端連線的規則:

host:代表基於域名存取,使用者端通過這個域名存取後端資源

http.paths:相當於nginx的location中匹配規則

pathType:Prefix:路徑型別,路徑由“/”符號分隔為一個個元素,匹配規則為逐個元素進行字首匹配,預設ImplementationSpecific,還有一種是Exact。

backend:定義後端

service:下定義後端的地址,包括代理的svc和埠號

這裡我遇到一個問題:

[root@k8s-master01 ~]# kubectl create -f ingress.yaml 
Error from server (InternalError): error when creating "ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": service "ingress-nginx-controller-admission" not found

建立的時候報錯:

yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes. io"

我檢視了下網上說應該是刪除之前建立的資源時沒刪乾淨。

[root@k8s-master01 ~]# kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io 
NAME                                    WEBHOOKS   AGE
ingress-nginx-admission                 1          3d

然後檢視下果然有個ingress-nginx-admission,刪除後在建立就成功了

[root@k8s-master01 ~]# kubectl delete -A validatingwebhookconfigurations.admissionregistration.k8s.io ingress-nginx-admission 
validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted

執行ingress.yaml檔案,這次就建立成功了。

[root@k8s-master01 ~]# kubectl create -f ingress.yaml 
ingress.networking.k8s.io/exmple created
[root@k8s-master01 ~]# kubectl get ingress
NAME     CLASS    HOSTS         ADDRESS   PORTS   AGE
exmple   <none>   foo.bar.com             80      10m

ingress也是可以設定多域名的

就是增加一個host範例。

# 第一個域名
  - host: foo.bar.com 
    http:
      paths:  
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port: 
              number: 80
# 第二個域名
  - host: foo2.bar.com 
    http:
      paths:  
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: nginx-svc-2
            port: 
              number: 80

然後更新yaml檔案就好了

[root@k8s-master01 ~]# kubectl replace -f ingress.yaml

以上就是Ingress七層路由機制實現域名的方式存取k8s的詳細內容,更多關於Ingress七層路由機制域名存取k8s的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com