容器編排系統(tǒng)k8s之Ingress資源

提示:如上圖所示,ingress就是ingress 控制器pod的代理規(guī)則;用戶請求某個后端pod所提供的服務(wù)時,首先會通過ingress controller pod把流量引入到集群內(nèi)部,然后ingress controller pod根據(jù)ingress定義的規(guī)則,把對應(yīng)ingress規(guī)則轉(zhuǎn)化為對應(yīng)ingress controller pod實現(xiàn)的對應(yīng)應(yīng)用的配置(ingress controller 可以由任何具有七層反向代理功能的服務(wù)實現(xiàn),比如nginx,haproxy等等)然后再適配用戶請求,把對應(yīng)請求反代到對應(yīng)service上;而對于pod的選擇上,ingress控制器可以基于對應(yīng)service中的標(biāo)簽選擇器,直接同pod直接通信,無須通過service對象api的再次轉(zhuǎn)發(fā),從而省去了用戶請求到kube-proxy實現(xiàn)的代理開銷(本質(zhì)上ingress controller 也是運行為一個pod,和其他pod在同一網(wǎng)段中);

  ingress controller部署

  在k8s上ingress controller的實現(xiàn)有很多,比如基于nginx的,基于haproxy的等等,這里以nginx為例;

  下載ingress-nginx包

1

wget https://github.com/kubernetes/ingress-nginx/archive/nginx-0.28.0.tar.gz

  解壓包,找到對應(yīng)的部署清單

[root@master01 ~]# ll

total 92144

-rw------- 1 root root 65586688 Dec? 8 15:16 flannel-v0.13.1-rc1.tar

drwxr-xr-x 2 root root? ? 4096 Dec 21 21:04 manifests

-rw-r--r-- 1 root root 28760559 Dec 21 21:02 nginx-0.28.0.tar.gz

[root@master01 ~]# tar xf nginx-0.28.0.tar.gz

[root@master01 ~]# ls

flannel-v0.13.1-rc1.tar? ingress-nginx-nginx-0.28.0? manifests? nginx-0.28.0.tar.gz

[root@master01 ~]# cd ingress-nginx-nginx-0.28.0/

[root@master01 ingress-nginx-nginx-0.28.0]# ls

build? ? ? ? code-of-conduct.md? docs? ? hack? ? ? labels.yaml? mkdocs.yml? ? ? README.md? ? ? ? ? ? ? SECURITY_CONTACTS? version

Changelog.md? CONTRIBUTING.md? ? go.mod? images? ? LICENSE? ? ? OWNERS? ? ? ? ? requirements-docs.txt? test

cmd? ? ? ? ? deploy? ? ? ? ? ? ? go.sum? internal? Makefile? ? OWNERS_ALIASES? rootfs? ? ? ? ? ? ? ? vendor

[root@master01 ingress-nginx-nginx-0.28.0]# cd deploy/

[root@master01 deploy]# ls

aws? ? ? ? cloud-generic? grafana? prometheus? static? ? ? ? ? ? ? ? ? ? ? with-validating-webhook.yaml.tpl

baremetal? cluster-wide? minikube? README.md? validating-webhook.yaml.tpl

[root@master01 deploy]# cd static/

[root@master01 static]# ls

configmap.yaml? mandatory.yaml? namespace.yaml? provider? rbac.yaml? with-rbac.yaml

[root@master01 static]# pwd

/root/ingress-nginx-nginx-0.28.0/deploy/static

[root@master01 static]#

  提示:資源配置清單在ingress-nginx-nginx-0.28.0/deploy/static下,名為mandatory.yaml;

  資源配置清單內(nèi)容

View Code

  提示:以上清單主要定義了一個名稱ingress-nginx的名稱空間,在其名稱空間下創(chuàng)建了幾個configmap,最重要的是用deployment創(chuàng)建了一個ingress-nginx pod;

  這里說一下,對于ingress-nginx控制器,它本質(zhì)還是運行為一個pod,對于pod來說要想接入外部訪問流量到集群內(nèi)部來,有三種方式,一種是使用NodePort類型的service;第二種是使用ds或deploy控制器,在定義pod模板時使用hostPort把pod端口映射到宿主機方式;第三種是定義pod模板時使用hostNetwork,直接共享宿主機網(wǎng)絡(luò)名稱空間;如下所示

  使用專有NodePort service來引入外部流量

  提示:這種使用deploy控制管理ingress controller pod,如果在pod模板中沒有暴露端口,則需要創(chuàng)建一個service資源來暴露ingress controller pod的端口來引入外部流量到集群內(nèi)部;

  使用ds控制器管理ingress controller pod在pod模板中使用hostPort方式暴露端口

  提示:使用ds控制器能夠保證每個節(jié)點上只運行一個ingress controller,所以我們可以把對應(yīng)ingress controller pod端端口通過端口映射的方式映射到宿主機上的某一固定端口;

  使用ds控制器在pod模板中使用hostNetwork方式共享宿主機網(wǎng)絡(luò)名稱空間

  提示:共享宿主機網(wǎng)絡(luò)名稱空間,也必須使用ds控制器來確保對應(yīng)每個節(jié)點上只能運行一個ingress controller pod,這樣才能確保每個ingress controller pod能夠正常把端口暴露出去,以供集群外部客戶端訪問;

  選擇上述其中一種方式暴露ingress controller pod的端口即可;如果選擇使用ds控制器來暴露端口,我們就需要修改其對應(yīng)資源配置清單中的pod模板,如下所示

  使用ds控制器來管理ingress controller pod在pod模板中使用hostPort方式暴露端口

View Code

  提示:只需把對應(yīng)控制器類型更改為DaemonSet,在pod模板中spec字段下把replicas去掉;在spec.template.spec.containers.ports字段中加上nodePort字段指定要把容器的端口映射到宿主機上某個端口;如果暴露的端口是非標(biāo)準(zhǔn)端口,在對應(yīng)k8s集群外部我們還需要部署反代,比如使用nginx,haproxy,lvs;

  使用ds控制器管理ingress controller pod在ds控制器資源配置中使用hostNetwork

View Code

  提示:把對應(yīng)控制器類型更改外DaemonSet,在pod模板中spec字段下的replicas字段去掉;在spec.template.spec字段下加上hostNetwork: true即可;以上兩種使用ds控制器管理ingress controller pod也可以使用node選擇器,來篩選在某個節(jié)點上創(chuàng)建ingress controller pod;

  使用deploy控制器管理ingress controller pod,就直接應(yīng)用mandatory.yaml即可

[root@master01 ~]# kubectl apply -f mandatory.yaml

namespace/ingress-nginx created

configmap/nginx-configuration created

configmap/tcp-services created

configmap/udp-services created

serviceaccount/nginx-ingress-serviceaccount created

Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole

clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created

Warning: rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Role

role.rbac.authorization.k8s.io/nginx-ingress-role created

Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding

rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created

Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding

clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created

deployment.apps/nginx-ingress-controller created

limitrange/ingress-nginx created

[root@master01 ~]#

  查看應(yīng)用資源清單創(chuàng)建的資源對象

[root@master01 ~]# kubectl get all -n ingress-nginx

NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE

pod/nginx-ingress-controller-5466cb8999-4lsjc? 1/1? ? Running? 0? ? ? ? ? 80s

NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY? UP-TO-DATE? AVAILABLE? AGE

deployment.apps/nginx-ingress-controller? 1/1? ? 1? ? ? ? ? ? 1? ? ? ? ? 80s

NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DESIRED? CURRENT? READY? AGE

replicaset.apps/nginx-ingress-controller-5466cb8999? 1? ? ? ? 1? ? ? ? 1? ? ? 80s

[root@master01 ~]#

  提示:可以看到在ingress-nginx名稱空間下創(chuàng)建了一個deploy控制器,對應(yīng)控制器創(chuàng)建了一個nginx-ingress-controller控制器pod;但是此pod現(xiàn)在不能被外部客戶端訪問到,我們需要創(chuàng)建一個service來引入外部流量到此pod上;

  查看pod標(biāo)簽

[root@master01 ~]# kubectl get pod -n ingress-nginx --show-labels

NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE? ? LABELS

nginx-ingress-controller-5466cb8999-4lsjc? 1/1? ? Running? 0? ? ? ? ? 4m38s? app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx,pod-template-hash=5466cb8999

[root@master01 ~]#

  根據(jù)上述標(biāo)簽來寫一個創(chuàng)建ingress-service資源的配置清單

[root@master01 ~]# cat ingress-nginx-service.yaml

apiVersion: v1

kind: Service

metadata:

? name: ingress-nginx-svc

? namespace: ingress-nginx

spec:

? type: NodePort

? ports:

? ? - port: 80

? ? ? name: http

? ? ? nodePort: 30080

? ? - port: 443

? ? ? name: https

? ? ? nodePort: 30443

? selector:

? ? app.kubernetes.io/name: ingress-nginx

? ? app.kubernetes.io/part-of: ingress-nginx

[root@master01 ~]#

  提示:以上配置清單主要把滿足對應(yīng)標(biāo)簽選擇器的pod關(guān)聯(lián)起來;并把對應(yīng)pod的80和443端口分別映射到對應(yīng)主機上的30080和30443端口;

  應(yīng)用配置清單

[root@master01 ~]# kubectl apply -f ingress-nginx-service.yaml

service/ingress-nginx-svc created

[root@master01 ~]# kubectl get svc -n ingress-nginx

NAME? ? ? ? ? ? ? ? TYPE? ? ? CLUSTER-IP? ? EXTERNAL-IP? PORT(S)? ? ? ? ? ? ? ? ? ? ? AGE

ingress-nginx-svc? NodePort? 10.98.4.208? <none>? ? ? ? 80:30080/TCP,443:30443/TCP? 13s

[root@master01 ~]#

  訪問集群任意節(jié)點ip的30080和30443端口,看看是否訪問到對應(yīng)pod?

龍華大道1號 http://www.kinghill.cn/Dynamics/2106.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Ingress概述 Ingress 是對集群中服務(wù)的外部訪問進行管理的 API 對象,典型的訪問方式是 HTTP和...
    聯(lián)旺閱讀 824評論 0 1
  • k8s Ingress 服務(wù)部署方式 通常情況下,service和pod僅可在集群內(nèi)部網(wǎng)絡(luò)中通過IP地址訪問。所有...
    張家鋒閱讀 3,825評論 0 1
  • 一、Ingress概念 Kubernetes關(guān)于服務(wù)的暴露主要是通過NodePort方式,通過綁定宿主機的某個端口...
    沉淪2014閱讀 11,102評論 0 6
  • 容器技術(shù)概念入門篇 從進程說開去 容器本身沒有價值,有價值的是“容器編排”。 容器其實是一種沙盒技術(shù)。顧名思義,沙...
    白板時鐘閱讀 2,787評論 0 2
  • k8s環(huán)境搭建 文檔介紹在Docker for mac中的k8s如何把環(huán)境搭建好。 清單: docker for ...
    Carltony閱讀 1,595評論 0 0

友情鏈接更多精彩內(nèi)容