欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

k8s對(duì)外服務(wù)之ingress使用詳解

 更新時(shí)間:2025年07月10日 09:22:33   作者:新是一切的根源  
Ingress作為K8s的7層負(fù)載均衡器,通過(guò)單一入口管理多個(gè)服務(wù),使用IngressController(如Nginx)和資源,支持按域名/路徑路由,解決端口沖突與配置復(fù)雜問(wèn)題

1. ingress概述

k8s 對(duì)外暴露服務(wù)(service)主要有兩種方式:NotePort, LoadBalance, 此外externalIPs也可以使各類(lèi)service對(duì)外提供服務(wù),但是當(dāng)集群服務(wù)很多的時(shí)候,NodePort方式最大的缺點(diǎn)是會(huì)占用很多集群機(jī)器的端口;LB方式最大的缺點(diǎn)則是每個(gè)service一個(gè)LB又有點(diǎn)浪費(fèi)和麻煩,并且需要k8s之外的支持; 而ingress則只需要一個(gè)NodePort或者一個(gè)LB就可以滿足所有service對(duì)外服務(wù)的需求。

工作機(jī)制大致可以用下圖表示:

實(shí)際上,ingress相當(dāng)于一個(gè)7層的負(fù)載均衡器,是k8s對(duì)反向代理的一個(gè)抽象。大概的工作原理也確實(shí)類(lèi)似于Nginx,可以理解成在 Ingress 里建立一個(gè)個(gè)映射規(guī)則 , ingress Controller 通過(guò)監(jiān)聽(tīng) Ingress這個(gè)api對(duì)象里的配置規(guī)則并轉(zhuǎn)化成 Nginx 的配置(kubernetes聲明式API和控制循環(huán)) , 然后對(duì)外部提供服務(wù)。

ingress包括:ingress controller和ingress resources

  • ingress controller:核心是一個(gè)deployment,實(shí)現(xiàn)方式有很多,比如nginx, Contour, Haproxy, trafik, Istio,需要編寫(xiě)的yaml有:Deployment, Service, ConfigMap, ServiceAccount(Auth),其中service的類(lèi)型可以是NodePort或者LoadBalancer。
  • ingress resources:這個(gè)就是一個(gè)類(lèi)型為Ingress的k8s api對(duì)象了,這部分則是面向開(kāi)發(fā)人員。

Kubernetes給出的方案就是Ingress,Ingress包含了兩大主件Ingress Controller和Ingress。

Ingress解決的是新的服務(wù)加入后,域名和服務(wù)的對(duì)應(yīng)問(wèn)題,基本上是一個(gè)ingress的對(duì)象,通過(guò)yaml進(jìn)行創(chuàng)建和更新進(jìn)行加載。

Ingress Controller是將Ingress這種變化生成一段Nginx的配置,然后將這個(gè)配置通過(guò)Kubernetes API寫(xiě)到Nginx的Pod中,然后reload.(注意:寫(xiě)入 nginx.conf 的不是service的地址,而是service backend 的 pod 的地址,避免在 service 在增加一層負(fù)載均衡轉(zhuǎn)發(fā))

從上圖中可以很清晰的看到,實(shí)際上請(qǐng)求進(jìn)來(lái)還是被負(fù)載均衡器攔截,比如 nginx,然后 Ingress Controller 通過(guò)跟 Ingress 交互得知某個(gè)域名對(duì)應(yīng)哪個(gè) service,再通過(guò)跟 kubernetes API 交互得知 service 地址等信息;綜合以后生成配置文件實(shí)時(shí)寫(xiě)入負(fù)載均衡器,然后負(fù)載均衡器 reload 該規(guī)則便可實(shí)現(xiàn)服務(wù)發(fā)現(xiàn),即動(dòng)態(tài)映射

了解了以上內(nèi)容以后,這也就很好的說(shuō)明了我為什么喜歡把負(fù)載均衡器部署為 Daemon Set;因?yàn)闊o(wú)論如何請(qǐng)求首先是被負(fù)載均衡器攔截的,所以在每個(gè) node 上都部署一下,同時(shí) hostport 方式監(jiān)聽(tīng) 80 端口;那么就解決了其他方式部署不確定 負(fù)載均衡器在哪的問(wèn)題,同時(shí)訪問(wèn)每個(gè) node 的 80 都能正確解析請(qǐng)求;如果前端再 放個(gè) nginx 就又實(shí)現(xiàn)了一層負(fù)載均衡。

Ingress Controller 會(huì)根據(jù)你定義的 Ingress 對(duì)象,提供對(duì)應(yīng)的代理能力。業(yè)界常用的各種反向代理項(xiàng)目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已經(jīng)為Kubernetes 專(zhuān)門(mén)維護(hù)了對(duì)應(yīng)的 Ingress Controller。

2. ingress-nginx 部署

ingress調(diào)度的是后端的service,而不是pod

ingress controller 是與k8s集群做交互的,感知etcd的變化

首先拉取 ingress-controller鏡像至harbor倉(cāng)庫(kù)

部署nginx-ingress-controller

拿到y(tǒng)aml文件 應(yīng)用ingress controller定義文件

[kubeadm@server1 ingress]$ ls
mandatory.yaml
[kubeadm@server1 ingress]$ 

編輯此文件,把鏡像的位置換成本地倉(cāng)庫(kù)中鏡像的位置

應(yīng)用ingress controller定義文件


應(yīng)用ingress-service定義文件

查看信息


3. 創(chuàng)建ingress服務(wù)

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
spec:
  backend:
    serviceName: nginx-svc
    servicePort: 80
創(chuàng)建 service.yaml文件
kind: Service
apiVersion: v1
metadata:
  name: nginx-svc
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: nginx
[kubeadm@server1 ingress]$ \vi ingress.yaml
[kubeadm@server1 ingress]$ vim ingress.yaml 
[kubeadm@server1 ingress]$ vim service.yaml
[kubeadm@server1 ingress]$ kubectl apply -f service.yaml 
service/myservice created
[kubeadm@server1 ingress]$ kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/ingress-demo created
[kubeadm@server1 ingress]$ 

ingress-nginx調(diào)度nginx-svc這個(gè)服務(wù)

[kubeadm@server1 ingress]$ kubectl -n ingress-nginx get svc
NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.99.32.59   <none>        80:30016/TCP,443:31941/TCP   31m
[kubeadm@server1 ingress]$ 

外部訪問(wèn)

實(shí)現(xiàn)myservice服務(wù)中的負(fù)載均衡,因?yàn)閕ngress-nginx也是通過(guò)nodeport模式的端口暴露,實(shí)現(xiàn)外部訪問(wèn)

4. 通過(guò)域名的形式來(lái)訪問(wèn)后端

5. 通過(guò)不同的域名定義到不同的后端

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: reg.westos.org/k8s/myapp:v2
        ports:
        - containerPort: 80


---
kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: myapp
  type: ClusterIP

---

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-example
spec:
  rules:
  - host: www2.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 80


[kubeadm@server1 ingress]$ kubectl get ingress
NAME              CLASS    HOSTS             ADDRESS       PORTS   AGE
ingress-demo      <none>   www1.westos.org   10.99.32.59   80      36m
ingress-example   <none>   www2.westos.org   10.99.32.59   80      3m22s
[kubeadm@server1 ingress]$ 

訪問(wèn)www2.westos.org時(shí)訪問(wèn)到v2

訪問(wèn)www1.westos.org時(shí)訪問(wèn)到v1

訪問(wèn)不同的域名,訪問(wèn)到的后端service不同,負(fù)載到不同的pod后端

6. 訪問(wèn)同一域名,不同的path時(shí),調(diào)度到不同的后端

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-hello
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: www3.westos.org 
    http:
      paths:
      - path: /1 
        backend:
          serviceName: ingress-nginx
          servicePort: 80 
      paths:
      - path: /2
        backend:
          serviceName: myservice
          servicePort: 80


總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • K8S中設(shè)置JVM堆棧大小實(shí)現(xiàn)方式

    K8S中設(shè)置JVM堆棧大小實(shí)現(xiàn)方式

    這篇文章主要介紹了K8S中設(shè)置JVM堆棧大小實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解

    Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解

    這篇文章主要為大家介紹了Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 解決K8S中Node狀態(tài)為NotReady的步驟

    解決K8S中Node狀態(tài)為NotReady的步驟

    在Kubernetes集群中,Node狀態(tài)為NotReady通常意味著節(jié)點(diǎn)上存在某些問(wèn)題,解決Node節(jié)點(diǎn)NotReady狀態(tài)的步驟包括檢查節(jié)點(diǎn)日志、容器運(yùn)行時(shí)狀態(tài)、網(wǎng)絡(luò)組件、節(jié)點(diǎn)資源、節(jié)點(diǎn)與控制平面的通信,本文介紹解決K8S中Node狀態(tài)為NotReady的步驟,感興趣的朋友一起看看吧
    2025-03-03
  • Jenkins打包、發(fā)布、部署完整驟記錄

    Jenkins打包、發(fā)布、部署完整驟記錄

    這篇文章主要介紹了Jenkins的基本概念,服務(wù)器環(huán)境檢查,以及如何安裝和配置Jenkins,包括安裝FTP服務(wù)、Maven、Git和Jenkins本身,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • k8s中如何實(shí)現(xiàn)pod自動(dòng)擴(kuò)縮容詳解

    k8s中如何實(shí)現(xiàn)pod自動(dòng)擴(kuò)縮容詳解

    在實(shí)際生產(chǎn)系統(tǒng)中,經(jīng)常會(huì)遇到某個(gè)服務(wù)需要擴(kuò)容的場(chǎng)景,可能會(huì)遇到由于資源緊張或者工作負(fù)載降低而需要減少服務(wù)實(shí)例數(shù)量的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于k8s中如何實(shí)現(xiàn)pod自動(dòng)擴(kuò)縮容的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 云原生系列Kubernetes深度解析YAML文件使用

    云原生系列Kubernetes深度解析YAML文件使用

    這篇文章主要為大家介紹了云原生系列Kubernetes深度解析YAML文件使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Rainbond網(wǎng)絡(luò)治理插件ServiceMesh官方文檔說(shuō)明

    Rainbond網(wǎng)絡(luò)治理插件ServiceMesh官方文檔說(shuō)明

    這篇文章主要為大家介紹了Rainbond網(wǎng)絡(luò)治理插件ServiceMesh官方文檔說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Centos?8.2?升級(jí)內(nèi)核通過(guò)elrepo源的方法

    Centos?8.2?升級(jí)內(nèi)核通過(guò)elrepo源的方法

    這篇文章主要介紹了Centos?8.2?升級(jí)內(nèi)核通過(guò)elrepo源,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • Kubernetes如何限制不同團(tuán)隊(duì)只能訪問(wèn)各自namespace實(shí)現(xiàn)

    Kubernetes如何限制不同團(tuán)隊(duì)只能訪問(wèn)各自namespace實(shí)現(xiàn)

    這篇文章主要為大家介紹了Kubernetes如何限制不同團(tuán)隊(duì)只能訪問(wèn)各自namespace實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • K8S?中?kubectl?命令詳解

    K8S?中?kubectl?命令詳解

    這篇文章主要介紹了K8S?中?kubectl?命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評(píng)論