【云原生】Kubernetes----Ingress對外服務

目錄

引言

一、K8S對外方式

(一)NodePort

1.作用

2.弊端

3.示例

(二)externalIPs

1.作用

2.弊端

3.示例

(三)LoadBalancer

1.作用

2.弊端

(四)Ingress

二、Ingress的基本概念

(一)基本概念

(二)Ingress組成

1.ingress

2.ingress-controller

3.關系歸納

(三)Ingress的工作原理

(四)訪問流程

三、配置Ingress規則

(一)ingress暴露服務方式

(二)方式二搭建

1.獲取資源

1.1 獲取配置文件

1.2 獲取鏡像資源

2.修改ClusterRole資源配置

3.修改nginx-ingress-controller配置

4.創建資源

4.1 創建ingress-controller

4.2 創建pod與service

5.創建ingress規則

6.客戶端訪問

(三)方式三搭建

1.清空環境

2.獲取文件

3.創建代理資源

3.1 創建nginx-ingress-controller資源

3.2 創建service資源

4.創建訪問資源

4.1 創建Deployment

4.2 創建service

4.3 創建Ingress規則

5.使用客戶端進行訪問

四、虛擬主機

(一)創建pod資源

(二)創建service資源

(三)創建ingress規則

(四)客戶端訪問

五、HTPPS代理

(一)獲取SSL證書

(二)創建Kubernetes Secret

(三)創建pod資源

(四)創建service

(五)創建ingress規則

(六)客戶端訪問

六、實現BasicAuth

(一)創建認證文件

1.下載htpasswd工具

2.創建認證文件

(二)創建Secret

(三)創建pod資源

(四)創建service

(五)創建ingress資源

七、Nginx重寫


引言

隨著Kubernetes在云原生應用領域的廣泛應用,如何高效地管理集群的外部流量成為了許多開發者和管理員面臨的挑戰。在Kubernetes中,Ingress提供了一個標準化的方式來管理外部流量到集群內部服務的路由,從而簡化了流量管理的復雜性。本文將介紹Ingress的基本概念、工作原理以及如何使用Ingress來優化你的Kubernetes集群的流量路由

一、K8S對外方式

在Kubernetes(k8s)中,使外部應用能夠訪問集群內的服務主要有四種方式

(一)NodePort

1.作用

NodePort服務類型將服務暴露在每個Kubernetes節點的相同端口上。外部用戶可以通過訪問任何節點的IP地址和該端口來訪問服務。

2.弊端

NodePort背后就是Kube-Proxy,Kube-Proxy是溝通service網絡、Pod網絡和節點網絡的橋梁。
測試環境使用還行,當有幾十上百的服務在集群中運行時,NodePort的端口管理就是個災難。因為每個端口只能是一種服務,端口范圍只能是 30000-32767

3.示例

[root@master01 pod]#vim deployment.yaml 
[root@master01 pod]#cat deployment.yaml 
apiVersion: apps/v1
kind: Pod
metadata:name: nginx-podlabels:app: nginx  
spec:containers:- name: nginximage: nginx:1.18.0ports:- containerPort: 80
---
apiVersion: v1
kind: Service             #創建service
metadata:name: nginx-svclabels:app: nginx
spec:type: NodePort          #type類型為NodePort,用于對外提供服務ports:- port: 80targetPort: 80 selector:app: nginx

執行完yaml文件之后,查看地址與映射端口

[root@master01 pod]#kubectl apply -f pod.yaml 
pod/nginx-pod created
service/nginx-svc created
[root@master01 pod]#
[root@master01 pod]#kubectl get pod -owide
NAME        READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          14s   10.244.2.3   node02   <none>           <none>
[root@master01 pod]#kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        17d
nginx-svc    NodePort    10.96.131.227   <none>        80:30425/TCP   31s
#使用客戶端訪問任意節點的30425端口

使用客戶端進行訪問

[root@nfs ~]#curl 192.168.83.30:30425  -I
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 03 Jun 2024 06:55:53 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 14:09:01 GMT
Connection: keep-alive
ETag: "5e9efe7d-264"
Accept-Ranges: bytes

(二)externalIPs

1.作用

Kubernetes中的externalIPs允許將一個或多個外部IP地址直接綁定到一個Kubernetes服務上,從而可以通過這些外部IP地址直接訪問該服務

2.弊端

當使用externalIPs時,外部流量將直接通過指定的IP地址進入集群,這可能增加了集群的安全風險。攻擊者可能會利用這些外部IP地址對集群進行攻擊,如拒絕服務攻擊(DoS)、中間人攻擊(MITM)等。不支持負載均衡和故障轉移

3.示例

[root@master01 pod]#cat pod02.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx-pod02labels:app: nginx  
spec:nodeName: node02        
#pod需要使用節點親和,指定pod建立在externalIPs指定nodeIP地址之外
#同樣IP可能導致網絡數據包的路由變得混亂,使得Kubernetes集群內外的網絡無法正確區分和處理流量
#如果使用deployment建立的pod,則externalIPs只會非本節點的pod實例containers:- name: nginximage: nginx:1.18.0ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc02labels:app: nginx
spec: externalIPs:          #指定pod綁定地址- 192.168.83.40       #綁定到node01節點的IP上ports:- port: 80targetPort: 80 selector:app: nginx

創建后,查看服務

[root@master01 pod]#kubectl apply -f pod02.yaml 
pod/nginx-pod02 created
service/nginx-svc02 created
[root@master01 pod]#kubectl get pod nginx-pod02
[root@master01 pod]#kubectl get pod nginx-pod02 -owide
NAME          READY   STATUS    RESTARTS   AGE     IP          NODE     NOMINATED NODE   READINESS GATES
nginx-pod02   1/1     Running   0          5s   10.244.2.4     node02   <none>           <none>
[root@master01 pod]#kubectl get svc nginx-svc02 
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP     PORT(S)   AGE
nginx-svc02   ClusterIP   10.96.42.161   192.168.83.40   80/TCP    14s

客戶端直接訪問節點即可

[root@nfs ~]#curl 192.168.83.40  -I
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 03 Jun 2024 07:08:42 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 14:09:01 GMT
Connection: keep-alive
ETag: "5e9efe7d-264"
Accept-Ranges: bytes

(三)LoadBalancer

1.作用

LoadBalancer服務類型允許外部負載均衡器將流量路由到Kubernetes集群中的服務。

這種方式通常用于云服務提供商(如AWS、Azure、GCP等),它們可以自動創建一個負載均衡器并為其分配一個外部IP地址。

2.弊端

這種用法僅用于在公有云服務提供商的云平臺上設置 Service 的場景。受限于云平臺,且通常在云平臺部署LoadBalancer還需要額外的費用

(四)Ingress

  • Ingress是Kubernetes中的一個API對象,它管理外部訪問到集群內服務的HTTP和HTTPS路由規則。
  • 通常與Ingress Controller一起使用,Ingress Controller是一個反向代理服務器,負責實現Ingress定義的路由規則。
  • Ingress可以基于域名、路徑或其他HTTP請求屬性進行流量路由。
  • 配置Ingress需要創建Ingress對象并定義路由規則,同時還需要部署Ingress Controller。
  • Ingress提供了比LoadBalancer更高級的路由和流量管理功能。

二、Ingress的基本概念

(一)基本概念

在Kubernetes中,Ingress是一個API對象,它用于定義集群外部訪問內部服務的規則。通過Ingress,可以配置基于主機名、路徑等條件的路由規則,將外部流量轉發到集群內的一個或者多個service。Ingress提供了一種統一的、聲明式的方式來管理外部流量,使得流量路由更加靈活和可配置。

Ingress資源本身不會進行任何網絡流量的路由,它依賴于Ingress控制器(如Nginx Ingress Controller、HAProxy Ingress Controller、Traefik等)來根據Ingress資源中定義的規則進行實際的路由

(二)Ingress組成

1.ingress

  • 定義:Ingress是一個Kubernetes API對象,通常使用YAML文件進行配置。它主要的作用是定義請求如何轉發到集群內部服務的規則。
  • 功能:Ingress提供了負載均衡、SSL和基于名稱的虛擬托管。通過Ingress,可以定義服務外部可訪問的URL、負載均衡流量、SSL/TLS配置,以及基于名稱的虛擬主機。
  • 特點:Ingress可以被視為一種配置模板,用于描述外部訪問集群內部服務的方式。它定義了集群外部流量如何進入集群內各個服務的路由規則,但它本身無法直接實現這些路由。

2.ingress-controller

  • 定義:Ingress Controller是具體實現Ingress規則的程序。它與Kubernetes API交互,動態地感知集群中Ingress規則的變化,并按照這些規則生成相應的配置文件(例如Nginx的配置文件)。
  • 功能:Ingress Controller負責處理實際的流量轉發工作,確保外部請求能夠正確地路由到集群內部的Service。它實現了反向代理及負載均衡的功能,確保外部請求能夠高效地路由到集群內部的服務。
  • 特點:Ingress Controller監聽Ingress資源對象的變更,并根據Ingress規則進行配置。通常,Ingress Controller通過負載均衡器(如Nginx、Traefik等)來實現其功能。

ingress-controller并不是k8s自帶的組件,實際上ingress-controller只是一個統稱,用戶可以選擇不同的ingress-controller實現

目前,由k8s維護的ingress-controller只有google云的GCE與ingress-nginx兩個,其他還有很多第三方維護的ingress-controller,具體可以參考官方文檔。

但是不管哪一種ingress-controller,實現的機制都大同小異,只是在具體配置上有差異。

一般來說,ingress-controller的形式都是一個pod,里面跑著daemon程序和反向代理程序。daemon負責不斷監控集群的變化,根據 ingress對象生成配置并應用新配置到反向代理

比如ingress-nginx就是動態生成nginx配置,動態更新upstream,并在需要的時候reload程序應用新配置。為了方便,后面的例子都以k8s官方維護的ingress-nginx為例。

3.關系歸納

  • Ingress定義了請求轉發的規則,這些規則描述了外部流量如何進入集群內的各個服務。
  • Ingress Controller負責實現這些規則,并與Kubernetes API交互,動態地感知并應用Ingress規則的變化。
  • 要使Ingress資源生效,集群中必須有一個正在運行的Ingress Controller來讀取這些規則并相應地進行流量轉發。

總結:ingress-controller才是負責具體轉發的組件,通過各種方式將它暴露在集群入口,外部對集群的請求流量會先到 ingress-controller, 而ingress對象是用來告訴ingress-controller該如何轉發請求,比如哪些域名、哪些URL要轉發到哪些service等等

(三)Ingress的工作原理

Ingress的工作原理可以簡單概括為以下幾個步驟

監聽Ingress對象:Ingress Controller通過Kubernetes API服務器監聽Ingress對象的變化。當新的Ingress對象被創建、更新或刪除時,Ingress Controller能夠感知到這些變化。

解析Ingress規則:Ingress Controller解析Ingress對象中定義的規則。這些規則包括主機名、路徑、后端服務等信息,用于確定如何將流量路由到集群內的不同服務。

生成配置:Ingress Controller將解析后的規則轉化為特定負載均衡器(如Nginx、HAProxy等)可以理解的配置。這些配置通常包括反向代理設置、負載均衡策略、SSL/TLS配置等。再寫到nginx-ingress-controller的pod里,這個ingress-controller的pod里運行著一個Nginx服務,控制器會把生成的 nginx配置寫入 /etc/nginx.conf文件中

動態更新:Ingress Controller能夠實時響應Ingress對象的變化,并動態更新其配置。這意味著當Ingress規則發生變化時,無需重啟Ingress Controller或整個集群,流量路由將自動更新以適應新的規則。

(四)訪問流程

1.客戶端訪問域名,通過DNS解析到Ingress-confoller所在的節點

2.同時客戶端向Ingress-confoller所在的節點發送HTTP/HTTPS請求

3.Ingress-confoller通過Ingress的配置信息(URL、域名等),確定將請求轉發到哪一個service,而后根據service關聯的pod地址,決定Ingress-confoller將請求轉發到pod當中。

三、配置Ingress規則

(一)ingress暴露服務方式

ingress 暴露服務的方式有以下三種

方式一:Deployment+LoadBalancer 模式的 Service

這是公有云環境中非常常見的方式。在Kubernetes集群中,可以使用Deployment來部署Ingress Controller的Pod,并創建一個類型為LoadBalancer的Service來將Pod暴露到外部。在公有云環境中,當創建LoadBalancer類型的Service時,云提供商通常會為你自動創建一個負載均衡器(例如AWS的ELB,Azure的LB等),并且通常還會為你分配一個公網IP地址。你只需要將你的域名解析到這個公網IP地址,就可以通過Ingress來訪問你的服務了

優點

  1. 自動化與便捷性:在公有云環境中,創建LoadBalancer類型的Service會自動為你創建負載均衡器,并分配公網IP,簡化了配置過程。
  2. 高可用性:負載均衡器通常具有容錯和故障轉移的能力,保證服務的穩定性。
  3. 易于擴展:可以根據需求動態調整LoadBalancer的配置,如增加后端節點等。

缺點

  1. 成本:在公有云環境中,使用LoadBalancer通常需要支付額外的費用。
  2. 環境限制:這種方式主要適用于公有云環境,對于自建Kubernetes集群或者私有云環境可能不適用

方式二:DaemonSet+HostNetwork+nodeSelector

這種方式下,Ingress Controller以DaemonSet的方式部署,通過nodeSelector選擇特定的節點運行。同時,使用HostNetwork將Ingress Controller的Pod與宿主機的網絡打通,直接使用宿主機的80/443端口來提供服務。這樣,Ingress Controller所在的節點就起到了邊緣節點的作用,可以直接接受外部請求,并將請求轉發到集群內的服務。這種方式的優點是請求鏈路簡單,性能較好。但是,由于Ingress Controller直接占用了宿主機的端口,所以一個節點上通常只能運行一個Ingress Controller的Pod。

優點

  1. 性能優越:由于直接使用宿主機的網絡和端口,請求鏈路簡單,性能較好。
  2. 配置簡單:通過DaemonSet和nodeSelector可以很方便地將Ingress Controller部署到指定的節點上。
  3. 適合大并發環境:對于需要處理大量并發請求的生產環境,這種方式具有更好的性能表現。

缺點

  1. 資源限制:由于Ingress Controller直接占用了宿主機的端口,因此一個節點上通常只能運行一個Ingress Controller的Pod。
  2. 安全性:由于Ingress Controller直接暴露在公網上,需要特別注意安全性問題,如防止DDoS攻擊等。
  3. 可移植性差:使用HostNetwork和特定節點的方式使得Ingress Controller的部署與特定環境緊密相關,不利于跨環境部署和遷移。

方式三:Deployment+NodePort模式的Service

在這種方式下,Ingress Controller仍然以Deployment的方式部署,但是關聯的Service的類型是NodePort。NodePort類型的Service會將Pod的端口映射到集群中每個節點的特定端口上。然后,你可以通過任意節點的IP地址和該節點上的映射端口來訪問Ingress Controller。由于NodePort映射的端口是隨機選擇的,因此通常還需要在集群外部再部署一個負載均衡器來將流量分發到各個節點上。這種方式適用于節點IP地址相對固定的環境,但需要注意的是,由于NodePort類型的Service在節點之間進行了NAT轉發,因此在請求量很大時可能會對性能產生一定的影響。

優點

  1. 靈活性:NodePort類型的Service可以靈活地將Pod的端口映射到集群中每個節點的特定端口上,便于外部訪問。
  2. 適用于固定IP環境:在節點IP地址相對固定的環境中,這種方式可以很方便地暴露服務。

缺點

  1. 性能損耗:由于NodePort類型的Service在節點之間進行了NAT轉發,因此在請求量很大時可能會對性能產生一定的影響。
  2. 需要額外配置:通常需要在集群外部再部署一個負載均衡器來將流量分發到各個節點上,增加了配置的復雜性。
  3. 端口管理:由于NodePort映射的端口是隨機選擇的,可能會與現有應用或服務產生沖突,需要進行端口管理。

(二)方式二搭建

DaemonSet+HostNetwork+nodeSelector

1.獲取資源

1.1 獲取配置文件

官方下載地址
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

官方無法下載的話,可用國內的 gitee

https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

[root@master01 ingress]#wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
--2024-06-03 16:40:40--  https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
正在解析主機 gitee.com (gitee.com)... 180.76.198.77
正在連接 gitee.com (gitee.com)|180.76.198.77|:443... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:6635 (6.5K) [text/plain]
正在保存至: “mandatory.yaml”100%[============================================================================>] 6,635       --.-K/s 用時 0s      2024-06-03 16:40:41 (735 MB/s) - 已保存 “mandatory.yaml” [6635/6635])
[root@master01 ingress]#ls
mandatory.yaml
[root@master01 ingress]#wc -l mandatory.yaml 
293 mandatory.yaml
1.2 獲取鏡像資源

事先準備好鏡像,防止執行yaml文件過程中下載鏡像失敗,導致無法進入工作狀態

//在node01節點上下載
[root@node01 ~]#docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
0.30.0: Pulling from kubernetes-ingress-controller/nginx-ingress-controller
......//在node02節點上下載
[root@node02 ~]#docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
0.30.0: Pulling from kubernetes-ingress-controller/nginx-ingress-controller
......

2.修改ClusterRole資源配置

[root@master01 ingress]#vim mandatory.yaml
......91   - apiGroups:92       - "extensions"93       - "networking.k8s.io"    #0.25版本以前,需要添加此段94     resources:95       - ingresses96     verbs:97       - get98       - list99       - watch
100   - apiGroups:
101       - "extensions"
102       - "networking.k8s.io"     #0.25版本以前,需要添加此段
103     resources:
104       - ingresses/status
105     verbs:
106       - update
......
---------------------------------------------------------------   
ClusterRole的規則部分,用于定義哪些API資源可以被特定的用戶或用戶組訪問,以及可以進行哪些操作
91-99行:定義第一個規則組:
apiGroups: 定義了資源所屬的API組。這里指定了兩個API組:"extensions" 和 "networking.k8s.io"
resources: 定義具體的資源類型,允許對Ingress資源(用于HTTP/HTTPS路由)進行操作
verbs:定義了可以對資源進行的操作。get(獲取資源信息)、list(列出所有資源)和watch(監視資源變化)100-106行:定義第二個規則組
ingresses/status:允許對Ingress資源的狀態進行操作
verbs: update,允許更新在Kubernetes1.18及以后的版本中,extensions/v1beta1 Ingress已經被廢棄,并在Kubernetes 1.22版本中完全移除。
Kubernetes集群版本是1.18或更高,使用networking.k8s.io/v1 API組,并且通常不需要在Role或ClusterRole中包含extensions API組

3.修改nginx-ingress-controller配置

指定 nginx-ingress-controller 運行在 node02 節點

①添加node02節點標簽

[root@master01 ingress]#kubectl label nodes node02 china=zg
node/node02 labeled
#添加標簽
[root@master01 ingress]#kubectl get nodes node02 --show-labels   #查看標簽
NAME     STATUS   ROLES    AGE   VERSION    LABELS
node02   Ready    <none>   18d   v1.20.11   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,china=zg,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

②修改 Deployment 為 DaemonSet ,指定節點運行,并開啟 hostNetwork 網絡

[root@master01 ingress]#vim mandatory.yaml
......
190 apiVersion: apps/v1
191 kind: DaemonSet                                
#修改資源類型為DaemonSet,需要在每個指定的節點上運行ingress-controller,標簽選擇時可以選擇多個節點
192 metadata:
193   name: nginx-ingress-controller
194   namespace: ingress-nginx
195   labels:
196     app.kubernetes.io/name: ingress-nginx
197     app.kubernetes.io/part-of: ingress-nginx
198 spec:
199 #  replicas: 1      #注釋或刪除replicas
200   selector:
201     matchLabels:
.......
204   template:
......
212     spec:
213       # wait up to five minutes for the drain of connections
214       #terminationGracePeriodSeconds: 300    
#定義pod被強制殺死之前應該等待多長時間來優雅地關閉。此處不需要,注釋掉
215       hostNetwork: true   #開啟HostNetwork,使Pod與宿主機之前的網絡建立隧道
216       serviceAccountName: nginx-ingress-serviceaccount
217       nodeSelector:
218         china: zg           #更換指定節點標簽
219       containers:
220         - name: nginx-ingress-controller
221           image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
......

4.創建資源

4.1 創建ingress-controller
[root@master01 ingress]#kubectl apply -f mandatory.yaml 
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
........
[root@master01 ingress]#kubectl get pod -n ingress-nginx -owide
NAME                             READY   STATUS    RESTARTS   AGE    IP              NODE     NOMINATED NODE   READINESS GATES
nginx-ingress-controller-2n7f6   1/1     Running   0          144m   192.168.83.50   node02   <none>           <none>

在node02節點過濾80端口

[root@node02 ~]#netstat -antulp |grep :80
tcp      0    0 0.0.0.0:80      0.0.0.0:*      LISTEN     62842/nginx: master 
tcp6     0    0 :::80           :::*           LISTEN     62842/nginx: master
-------------------------------------------------------------------------------
雖然80端口已經開啟,但是使用客戶端進行訪問會出現404報錯,因為它只是ingress-nginx在監聽宿主機的80端口,本身不提供web服務[root@node02 ~]#netstat -lntp | grep nginx
tcp    0    0 0.0.0.0:80            0.0.0.0:*       LISTEN    62842/nginx: master 
tcp    0    0 0.0.0.0:8181          0.0.0.0:*       LISTEN    62842/nginx: master 
tcp    0    0 0.0.0.0:443           0.0.0.0:*       LISTEN    62842/nginx: master 
tcp    0    0 127.0.0.1:10245       0.0.0.0:*       LISTEN    62787/nginx-ingress 
tcp    0    0 127.0.0.1:10246       0.0.0.0:*       LISTEN    62842/nginx: master 
tcp    0    0 127.0.0.1:10247       0.0.0.0:*       LISTEN    62842/nginx: master 
tcp6   0    0 :::10254              :::*            LISTEN    62787/nginx-ingress 
tcp6   0    0 :::80                 :::*            LISTEN    62842/nginx: master 
tcp6   0    0 :::8181               :::*            LISTEN    62842/nginx: master 
tcp6   0    0 :::443                :::*            LISTEN    62842/nginx: master
-----------------------------------------------------------------------------------
由于配置了hostnetwork,nginx已經在node主機本地監聽80/443/8181端口。
其中8181是nginx-controller 默認配置的一個default backend(Ingress 資源沒有匹配的 rule 對象時,流量就會被導向這個 default backend)。
這樣,只要訪問node主機有公網IP,就可以直接映射域名來對外網暴露服務了。
如果要nginx高可用的話,可以在多個node上部署,并在前面再搭建一套LVS+keepalived做負載均衡
4.2 創建pod與service

此時需要在node02節點上創建一個pod

[root@master01 ingress]#vim pod.yaml 
[root@master01 ingress]#cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx01-ingresslabels:run: nginx-run
spec:nodeName: node02containers:- name: nginximage: nginx:1.20.2ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: in-ng-svc
spec:type: NodePortports:- port: 80targetPort: 80selector:run: nginx-run

創建完畢后,此時四層的服務已經設置完畢

[root@master01 ingress]#kubectl apply -f pod.yaml 
pod/nginx01-ingress created
service/in-ng-svc created
[root@master01 ingress]#kubectl get pod,svc -owide
NAME                  READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
pod/nginx01-ingress   1/1     Running   0          12s   10.244.2.6   node02   <none>           <none>NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/in-ng-svc    NodePort    10.96.9.79   <none>        80:32169/TCP   12s   run=nginx-run
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        18d   <none>
[root@master01 ingress]#curl 10.96.9.79 -I
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Mon, 03 Jun 2024 12:54:15 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 16 Nov 2021 14:44:02 GMT
Connection: keep-alive
ETag: "6193c3b2-264"
Accept-Ranges: bytes
[root@master01 ingress]#kubectl exec -it nginx01-ingress bash
root@nginx01-ingress:/# echo "this is ingress-nginx" >/usr/share/nginx/html/index.html 
#自定義訪問界面
root@nginx01-ingress:/# exit
exit
[root@master01 ingress]#curl 10.96.9.79
this is ingress-nginx
#自定義一個訪問界面 

5.創建ingress規則

[root@master01 ingress]#vim ingress.yaml
[root@master01 ingress]#cat ingress.yaml
apiVersion: networking.k8s.io/v1     #Kubernetes網絡擴展API的版本1,它定義了Ingress資源。
kind: Ingress                        #定義了資源的類型
metadata:name: nginx-ingress
spec:rules:                             #定義Ingress規則,將HTTP/HTTPS請求路由到集群內的服務- host: www.ingress.com            #指定規則適用的主機名http:                            #定義了 HTTP 相關的配置。paths:                         #定義了 HTTP 請求的路徑和它們應該被路由到的后端服務- path: /                      #指定了匹配的路徑,這里使用了/,表示匹配所有路徑pathType: Prefix             #定義了路徑匹配的類型。Prefix表示路徑是基于前綴的匹配backend:                     #定義了當請求匹配上述路徑時應該被路由到的后端服務service:                   #定義了后端服務的配置,即指定轉發帶哪一個servicename: in-ng-svc          #后端服務的名稱,即service的名稱port:                    #定義了后端服務的端口配置number: 80             #指定后端服務的端口號
---------------------------------------------------------------------------------
'host: www.ingress.com'
#當請求的Host頭部為www.ingress.com時,這個規則會被應用。'pathType類型'
#Exact
精確匹配。只有當請求的路徑與定義的路徑完全相同時才進行路由。
如果path定義為/exact-path,并且pathType設置為 Exact
那么只有當請求的URL路徑也是/exact-path 時,該請求才會被路由到對應的后端服務。
類似于nginx配置文件中的location = /path#Prefix
前綴匹配。如果請求的路徑以定義的路徑為前綴,則進行路由。
類似于nginx配置文件中的location ^~ /path#ImplementationSpecific
實現特定匹配。此選項告訴Ingress控制器使用其實現特定的方式進行路徑選擇,這通常是默認值。
由于這是依賴于Ingress 控制器的實現方式,所以并沒有統一的匹配規則。
不同的Ingress控制器可能會有不同的行為。
如果沒有在Ingress資源中明確指定pathType,那么可能會默認使用ImplementationSpecific
使用ImplementationSpecific路徑類型時,需要確保了解所使用Ingress控制器的具體實現和配置要求
由于ImplementationSpecific的行為可能因控制器而異,因此在切換控制器或更新控制器版本時,
需要仔細測試和驗證路徑匹配的行為是否仍然符合預期

創建規則

[root@master01 ingress]#kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/nginx-ingress created
[root@master01 ingress]#kubectl get ingress
NAME            CLASS    HOSTS             ADDRESS   PORTS   AGE
nginx-ingress   <none>   www.ingress.com             80      27s

進入ingress規則進行查看

[root@master01 ingress]#kubectl exec -it nginx-ingress-controller-2n7f6 -n ingress-nginx bash
bash-5.0$ egrep -e 'server_name' -e 'start server' -e 'end server' /etc/nginx/nginx.conf server_names_hash_max_size      1024;server_names_hash_bucket_size   64;# Reverse proxies can detect if a client provides a X-Request-ID header, and pass it on to the backend server.server_name_in_redirect off;## start server _server_name _ ;## end server _## start server www.ingress.comserver_name www.ingress.com;## end server www.ingress.com;
#自動添加域名信息
#從start server www.ingress.com到end server www.ingress.com之間包含此域名用于反向代理的配置

6.客戶端訪問

[root@nfs ~]#vim /etc/hosts
[root@nfs ~]#grep '192.168.83.50' /etc/hosts
192.168.83.50 node02 www.ingress.com
#添加客戶端域名解析信息,使用域名進行訪問,觸發ingress規則
[root@nfs ~]#curl www.ingress.com
this is ingress-nginx
#自定義的web訪問界面

(三)方式三搭建

Deployment+NodePort模式的Service

1.清空環境

清空之前的操作信息防止pod運行沖突

[root@master01 ingress]#kubectl delete -f pod.yaml 
pod "nginx01-ingress" deleted
service "in-ng-svc" deleted
[root@master01 ingress]#kubectl delete -f ingress.yaml 
ingress.networking.k8s.io "nginx-ingress" deleted
[root@master01 ingress]#kubectl delete -f mandatory.yaml 

2.獲取文件

下載 nginx-ingress-controller 和 ingress-nginx 暴露端口配置文件,

官方下載地址

https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

國內 gitee 資源地址?

https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

[root@master01 data]#mkdir in-nodeport
[root@master01 data]#cd in-nodeport/
[root@master01 in-nodeport]#wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
[root@master01 in-nodeport]#wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
[root@master01 in-nodeport]#ls
mandatory.yaml  service-nodeport.yaml

3.創建代理資源

3.1 創建nginx-ingress-controller資源
[root@master01 in-nodeport]#vim mandatory.yaml

[root@master01 in-nodeport]#kubectl apply -f mandatory.yaml 
#創建nginx-ingress-controller資源
#以pod的形式在ingress-nginx命名空間運行
[root@master01 in-nodeport]#kubectl get pod -owide -n ingress-nginx 
NAME                                        READY   STATUS    RESTARTS   AGE    IP             NODE     NOMINATED NODE   READINESS GATES
nginx-ingress-controller-54b86f8f7b-vj8rl   1/1     Running   0          153m   10.244.1.214   node01   <none>           <none>
3.2 創建service資源

查看service-nodeport.yaml 文件,都是默認內容,直接創建即可

[root@master01 in-nodeport]#cat service-nodeport.yaml 
apiVersion: v1
kind: Service
metadata:name: ingress-nginxnamespace: ingress-nginx      #所在命名空間,需要先執行mandatory.yaml文件創建labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:type: NodePortports:- name: httpport: 80targetPort: 80protocol: TCP- name: httpsport: 443targetPort: 443protocol: TCPselector:app.kubernetes.io/name: ingress-nginx         app.kubernetes.io/part-of: ingress-nginx
#此標簽是nginx-ingress-controller的標簽,該service綁定該標簽,
#將nginx-ingress-controller以NodePort的形式暴露出去
---

創建service資源

[root@master01 in-nodeport]#kubectl apply -f service-nodeport.yaml
[root@master01 in-nodeport]#kubectl get svc -n ingress-nginx 
NAME                    TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx   NodePort   10.96.43.71   <none>        80:31705/TCP,443:32391/TCP   31s
[root@master01 in-nodeport]#kubectl describe svc -n ingress-nginx 
Name:                     ingress-nginx
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/name=ingress-nginxapp.kubernetes.io/part-of=ingress-nginx
Annotations:              <none>
Selector:                 app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx
Type:                     NodePort
IP Families:              <none>
IP:                       10.96.43.71
IPs:                      10.96.43.71
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  31705/TCP
Endpoints:                10.244.1.214:80
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  32391/TCP
Endpoints:                10.244.1.214:443   #后端關聯地址為nginx-ingress-controller地址
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

4.創建訪問資源

4.1 創建Deployment
[root@master01 in-nodeport]#vim deployment.yaml 
[root@master01 in-nodeport]#cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx01-ingresslabels:nginx-label: nginx01
spec:replicas: 2selector:matchLabels:nginx-label: nginx01template:metadata:labels:nginx-label: nginx01spec:containers:- name: nginximage: nginx:1.18.0ports:- containerPort: 80
[root@master01 in-nodeport]#kubectl apply -f deployment.yaml 
deployment.apps/nginx01-ingress created
[root@master01 in-nodeport]#kubectl get pod -owide
NAME                               READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
nginx01-ingress-5d89744488-g7v6w   1/1     Running   0          8s    10.244.2.7     node02   <none>           <none>
nginx01-ingress-5d89744488-x66jh   1/1     Running   0          8s    10.244.1.215   node01   <none>           <none>
------------------------------------------------------------------------------------
#自定義web訪問界面
[root@master01 in-nodeport]#kubectl exec -it nginx01-ingress-5d89744488-g7v6w bash
root@nginx01-ingress-5d89744488-g7v6w/~# echo "this is web01" >/usr/share/nginx/html/index.html 
root@nginx01-ingress-5d89744488-g7v6w/~# exit
exit
[root@master01 in-nodeport]#kubectl exec -it nginx01-ingress-5d89744488-x66jh bash
root@nginx01-ingress-5d89744488-x66jh:/# echo "this is web02" >/usr/share/nginx/html/index.html
root@nginx01-ingress-5d89744488-x66jh:/# exit
exit
4.2 創建service
[root@master01 in-nodeport]#vim service.yaml 
[root@master01 in-nodeport]#cat service.yaml 
apiVersion: v1
kind: Service
metadata:name: in-ng-svc
spec:type: NodePort                 #設置類型為NodePort,用于暴露端口ports:- port: 80targetPort: 80selector:nginx-label: nginx01
[root@master01 in-nodeport]#kubectl apply -f service.yaml 
service/in-ng-svc created
[root@master01 in-nodeport]#kubectl get svc in-ng-svc 
NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
in-ng-svc   NodePort   10.96.174.168   <none>        80:32502/TCP   10s
4.3 創建Ingress規則
[root@master01 in-nodeport]#vim ingress.yaml
[root@master01 in-nodeport]#cat ingress.yaml
apiVersion: networking.k8s.io/v1     #網絡API組的v1版本。
kind: Ingress                        #創建一個Ingress 資源
metadata:name: nginx-ingress-test
spec:rules:                       #定義ingress規則- host: www.china.com        #指定當HTTP請求的Host頭部為www.benet.com時觸發規則http:                      #定義HTTP路由規則  paths:                   #定義路徑列表及其對應的后端服務- path: /                #定義要匹配的路徑。這里使用了根路徑,也就是web服務的站點目錄pathType: Prefix       #表示使用前綴匹配方式backend:               #定義與上述路徑匹配時應該路由到的后端服務service:             #指定后端服務的名稱name: in-ng-svc    #port:              #定義后端服務的端口number: 80       #端口號為80
-------------------------------------------------------------------------------------
#上述文件表示,客戶端通過www.china.com訪問時,會觸發定義的ingress規則,
#而后通過ingress-controller轉發到指定的后端服務(service)當中,后端服務再將請求轉發給綁定的pod
[root@master01 in-nodeport]#kubectl apply -f ingress.yaml
ingress.networking.k8s.io/nginx-ingress-test created
[root@master01 in-nodeport]#kubectl get ingress
NAME                 CLASS    HOSTS           ADDRESS   PORTS   AGE
nginx-ingress-test   <none>   www.china.com             80      9s

5.使用客戶端進行訪問

//master01查看ingress的service對外暴露的端口
[root@master01 in-nodeport]#kubectl get svc -n ingress-nginx 
NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.96.43.71   <none>        80:31705/TCP,443:32391/TCP   137m//客戶端使用nginx-ingress-controller的service對外暴露的端口進行訪問
[root@nfs ~]#cat /etc/hosts |grep www.china.com
192.168.83.40 node01 www.china.com     
#添加客戶端的域名解析,IP地址為nginx-ingress-controller的pod所以節點的IP地址
[root@nfs ~]#curl www.china.com:31705 
this is web01
[root@nfs ~]#curl www.china.com:31705
this is web02
[root@nfs ~]#curl www.china.com:31705
this is web01
[root@nfs ~]#curl www.china.com:31705
this is web02
----------------------------------------------------------------------------------
可以看到,訪問的方式,是以輪詢的方式,發送到deployment管理的pod上。因為,它的數據流向是
1.用戶將請求發送到ingress-controller,而后ingress-controller根據請求的Hosst頭部信息,
也就是www.china.com觸發ingress規則
2.ingress-controller通過ingress規則,獲取到關聯的service,以及endpoints關聯地址
3.service會將流量平均分配,而后將地址返回給ingress-controller
4.ingress-controller最后將請求發送給合適的pod

四、虛擬主機

Ingress HTTP 代理訪問虛擬主機,使用同一個nginx-ingress-controller,根據不同的域名,代理到不同的后端服務

例如訪問www.china.com觸發規則后,代理到service-01;訪問www.zg.com觸發規則二

(一)創建pod資源

創建兩個不同的pod資源,或者兩個不同的deployment資源

[root@master01 vhost]#cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx-01labels:nginx: nginx01
spec:containers: - name: nginximage: nginx:1.18.0ports:- containerPort: 80
---
apiVersion: v1
kind: Pod
metadata:name: nginx-02labels:nginx: nginx02
spec:   containers: - name: nginximage: nginx:1.18.0ports:- containerPort: 80
[root@master01 vhost]#kubectl apply -f pod.yaml 
pod/nginx-01 created
pod/nginx-02 created
[root@master01 vhost]#kubectl get pod -owide
NAME        READY  STATUS  RESTARTS  AGE  IP            NODE     NOMINATED NODE   READINESS GATES
nginx-01    1/1    Running  0        14s  10.244.2.8    node02   <none>           <none>
nginx-02    1/1    Running  0        13s  10.244.1.216  node01   <none>           <none>

自定義web訪問頁面

[root@master01 vhost]#kubectl exec -it nginx-01 bash
root@nginx-01:/# echo "this is nginx-01" >/usr/share/nginx/html/index.html 
root@nginx-01:/# exit
exit
[root@master01 in-nodeport]#kubectl exec -it nginx-02 bash
root@nginx-02:/# echo "this is nginx-02" >/usr/share/nginx/html/index.html
root@nginx-02:/# exit
exit
[root@master01 vhost]#curl 10.244.2.8
this is nginx-01
[root@master01 vhost]#curl 10.244.1.216
this is nginx-02

(二)創建service資源

[root@master01 vhost]#vim service.yaml 
[root@master01 vhost]#cat service.yaml 
apiVersion: v1
kind: Service
metadata:name: service-01
spec:ports:- port: 80targetPort: 80selector:nginx: nginx01         #使用標簽選擇,關聯的pod為nginx-01
---
apiVersion: v1
kind: Service
metadata:name: service-02
spec:ports:- port: 80targetPort: 80selector:nginx: nginx02         #使用標簽選擇,關聯的pod為nginx-02
[root@master01 vhost]#kubectl apply -f service.yaml 
service/service-01 created
service/service-02 created
[root@master01 vhost]#kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service-01   ClusterIP   10.96.198.216   <none>        80/TCP    11s
service-02   ClusterIP   10.96.89.179    <none>        80/TCP    11s

(三)創建ingress規則

[root@master01 vhost]#cat ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-vhost-ingress
spec:rules:- host: www.chinese.comhttp:paths:- path: /pathType: Prefixbackend:service: name: service-01port:number: 80- host: www.zg.comhttp:paths:- path: /pathType: Prefixbackend:service: name: service-02port:number: 80
[root@master01 vhost]#kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/nginx-vhost-ingress created
[root@master01 vhost]#kubectl get ingress nginx-vhost-ingress 
NAME                  CLASS    HOSTS                        ADDRESS   PORTS   AGE
nginx-vhost-ingress   <none>   www.chinese.com,www.zg.com             80      12s

(四)客戶端訪問

[root@nfs ~]#cat /etc/hosts |grep www.chinese.com
192.168.83.40 node01 www.china.com www.chinese.com www.zg.com
#同樣在客戶端添加解析信息,而后使用nginx-ingress-controller的31705端口訪問
[root@nfs ~]#curl www.chinese.com:31705
this is nginx-01
[root@nfs ~]#curl www.chinese.com:31705
this is nginx-01
[root@nfs ~]#curl www.zg.com:31705
this is nginx-02
[root@nfs ~]#curl www.zg.com:31705

五、HTPPS代理

要實現 HTTPS 代理,你需要在Ingress 對象中配置 SSL 證書,并確保 Ingress 控制器支持 HTTPS

(一)獲取SSL證書

可以從證書頒發機構(CA)購買 SSL 證書,或者使用 Let's Encrypt 等服務獲取免費證書

[root@master01 data]#mkdir /data/https
[root@master01 data]#cd /data/https
[root@master01 data]#openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
Generating a 2048 bit RSA private key
....................................+++
........+++
writing new private key to 'tls.key'
-----
[root@master01 https]#ls
tls.crt  tls.key
[root@master01 https]#
--------------------------------------------------------------------------------
openssl req #OpenSSL命令行工具的一個子命令,用于創建和處理PKCS#10 證書簽名請求以及自簽名證書
-x509       #指定要生成一個自簽名的證書,而不是一個證書簽名請求(CSR)。
-sha256     #使用SHA-256哈希算法來簽名證書。
-nodes      #在生成私鑰時不加密它。這意味著私鑰將以明文形式存儲在tls.key文件中
-days 365   #設置證書的有效期為 365 天(一年)。
-newkey rsa:2048  #在生成證書的同時,也生成一個新的RSA私鑰,其長度為2048位。
-keyout tls.key   #指定私鑰的輸出文件名為 tls.key。
-out tls.crt      #指定證書的輸出文件名為 tls.crt。
-subj "/CN=nginxsvc/O=nginxsvc"  #設置證書的主題(Subject)字段。
CN(通用名稱)被設置為 nginxsvc,O(組織)也被設置為 nginxsvc。通常,CN 應該是域名或服務器名稱

(二)創建Kubernetes Secret

將 SSL 證書和私鑰存儲在 Kubernetes Secret 中,以便 Ingress 控制器可以訪問它們

[root@master01 https]#kubectl create secret tls my-tls-secret --key tls.key --cert tls.crt
secret/my-tls-secret created
[root@master01 https]#kubectl get secret my-tls-secret 
NAME            TYPE                DATA   AGE
my-tls-secret   kubernetes.io/tls   2      16s
[root@master01 https]#kubectl describe secret my-tls-secret 
Name:         my-tls-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  kubernetes.io/tlsData
====
tls.crt:  1143 bytes
tls.key:  1708 bytes
----------------------------------------------------------------------------------------
kubectl               #Kubernetes 的命令行工具,用于與集群進行交互。
create secret tls     #指示 kubectl 創建一個 TLS 類型的 Secret。
my-tls-secret         #要創建的 Secret 的名稱。
--key tls.key         #指定私鑰文件的路徑。文件處在當前路徑
--cert tls.crt        #指定證書文件的路徑。同樣,文件處在當前路徑

(三)創建pod資源

使用deployment控制器創建,或者直接創建pod

[root@master01 https]#vim pod-https.yaml 
[root@master01 https]#cat pod-https.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-httpslabels:nginx: nginx-https
spec:containers: - name: nginximage: nginx:1.18.0ports:- containerPort: 80
[root@master01 https]#kubectl apply -f pod-https.yaml 
pod/nginx-https created
[root@master01 https]#kubectl get pod nginx-https -owide
NAME          READY  STATUS   RESTARTS AGE  IP          NODE    NOMINATED NODE  READINESS GATES
nginx-https   1/1    Running  0        12s  10.244.2.9  node02  <none>          <none>

自定義web界面

[root@master01 https]#kubectl exec -it nginx-https bash
root@nginx-https:/# echo "this is nginx-https" >/usr/share/nginx/html/index.html 
root@nginx-https:/# exit
exit
[root@master01 https]#curl 10.244.2.9
this is nginx-https

(四)創建service

[root@master01 https]#vim service-https.yaml 
[root@master01 https]#cat service-https.yaml 
apiVersion: v1
kind: Service
metadata:name: service-https
spec:ports:- port: 80targetPort: 80selector:nginx: nginx-https
[root@master01 https]#kubectl apply -f service-https.yaml 
service/service-https created
[root@master01 https]#kubectl get svc service-https 
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service-https   ClusterIP   10.96.128.206   <none>        80/TCP    13s

(五)創建ingress規則

[root@master01 https]#vim ingress-https.yaml 
[root@master01 https]#cat ingress-https.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-https-ingress
spec:tls:- hosts:                       #這是一個列表,指定了哪些主機名應該使用此TLS配置- www.https.com              #指定使用該TSL的主機名稱為www.https.com,可以定義多個secretName: my-tls-secret    #引用Secret,該Secret包含TLS私鑰和證書rules:- host: www.https.com          #與tls中hosts字段定義的主機名一致http:paths:- path: /pathType: Prefixbackend:service: name: service-https  #指定后端service名稱port:number: 80
[root@master01 https]#kubectl apply -f ingress-https.yaml 
ingress.networking.k8s.io/nginx-https-ingress created
[root@master01 https]#kubectl get ingress nginx-https-ingress
NAME                  CLASS    HOSTS           ADDRESS       PORTS     AGE
nginx-https-ingress   <none>   www.https.com   10.96.43.71   80, 443   20s

(六)客戶端訪問

在客戶端添加域名信息,使用https訪問443端口映射的主機端口

使用虛擬機客戶端的web瀏覽器

或者在物理機的?C:\Windows\System32\drivers\etc\hosts 文件添加www.https.com的解析信息

而后使用物理機瀏覽器訪?問https://www.https.com:映射端口

[root@nfs ~]#cat /etc/hosts |grep www.https.com
192.168.83.40 node01 www.china.com www.chinese.com www.zg.com www.https.com
#添加客戶端的解析信息,而后使用虛擬機的web瀏覽器訪問//在master節點,查看443端口映射的宿主機端口
[root@master01 https]#kubectl get svc -n ingress-nginx 
NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.96.43.71   <none>        80:31705/TCP,443:32391/TCP   3h10m
#使用瀏覽器訪問https://www.https.com:32391端口

六、實現BasicAuth

BasicAuth是一種用于在客戶端和服務器之間進行身份驗證的協議,特別是用于HTTP請求的身份驗證

BasicAuth通過在HTTP請求頭中添加一個“Authorization”字段來進行身份驗證。這個字段包含了一個Base64編碼的用戶名和密碼信息

(一)創建認證文件

1.下載htpasswd工具

[root@master01 https]#mkdir /data/basicauth
[root@master01 https]#cd /data/basicauth/
[root@master01 basicauth]#yum install httpd-tools.x86_64 -y
#下載httpd-tools工具包,使用htpasswd命令生成證書文件

2.創建認證文件

[root@master01 basicauth]#htpasswd -c auth xiaoming
New password:                       #輸入密碼
Re-type new password:               #確認密碼
Adding password for user xiaoming
[root@master01 basicauth]#ls
auth                                #生成的證書文件名稱為auth
------------------------------------------------------------------------------
htpasswd #用于創建和更新存儲用戶名和密碼的文件的實用工具
-c       #創建一個新的密碼文件
auth     #存儲用戶信息的文件,文件名稱固定為auth
xiaoming #添加到密碼文件中的用戶名,回車之后下面輸入密碼

(二)創建Secret

創建 secret 資源存儲用戶密碼的認證文件

[root@master01 basicauth]#kubectl create secret generic basic-auth --from-file=auth
secret/basic-auth created
[root@master01 basicauth]#kubectl get secrets basic-auth 
NAME         TYPE     DATA   AGE
basic-auth   Opaque   1      15s
[root@master01 basicauth]#kubectl describe secrets basic-auth 
Name:         basic-auth
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
auth:  47 bytes

(三)創建pod資源

[root@master01 basicauth]#vim pod-auth.yaml 
[root@master01 basicauth]#cat pod-auth.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx-authlabels:nginx: nginx-auth
spec:containers: - name: nginximage: nginx:1.18.0ports:- containerPort: 80
[root@master01 basicauth]#kubectl apply -f pod-auth.yaml 
pod/nginx-auth created
[root@master01 basicauth]#kubectl get pod nginx-auth -owide
NAME         READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
nginx-auth   1/1     Running   0          19s   10.244.1.217   node01   <none>           <none>
[root@master01 basicauth]#kubectl exec -it nginx-auth bash
root@nginx-auth:/# echo "this is auth" >/usr/share/nginx/html/index.html
root@nginx-auth:/# exit
exit
#自定義web界面

(四)創建service

[root@master01 basicauth]#cat service-auth.yaml 
apiVersion: v1
kind: Service
metadata:name: service-auth
spec:ports:- port: 80targetPort: 80selector:nginx: nginx-auth
[root@master01 basicauth]#kubectl apply -f pod-auth.yaml 
pod/nginx-auth created
[root@master01 basicauth]#kubectl apply -f service-auth.yaml 
service/service-auth created
[root@master01 basicauth]#kubectl get svc service-auth 
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service-auth   ClusterIP   10.96.127.61   <none>        80/TCP    15s

(五)創建ingress資源

[root@master01 basicauth]#vim ingress-auth.yaml 
[root@master01 basicauth]#cat ingress-auth.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-auth-ingressannotations:nginx.ingress.kubernetes.io/auth-type: basic#指定認證類型為基本認證(basic)nginx.ingress.kubernetes.io/auth-secret: basic-auth#指定包含基本認證憑據的Secret資源名稱basic-authnginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - xiaoming'#定義了當用戶需要認證時顯示的領域(realm)名稱,即認證窗口提示信息
spec:rules:- host: www.auth.com             #指定主機名觸發條件http:paths:- path: /pathType: Prefixbackend:service: name: service-auth     #關聯的后端服務serviceport:number: 80

添加解析信息后,使用web瀏覽器進行訪問

[root@nfs ~]#cat /etc/hosts |grep www.auth.com
192.168.83.40 node01 www.auth.com

添加完解析信息后,使用瀏覽器訪問80映射的主機端口,即www.auth.com:31705

七、Nginx重寫

當域名更新之后,可以使用重寫功能,使舊域名,跳轉到新的域名當中

例如當訪問www.old.com時,使用重寫功能跳轉到www.new.com

#metadata.annotations 配置說明

nginx.ingress.kubernetes.io/rewrite-target: <字符串>

此注解允許你修改目標服務的請求 URI。這對于重寫來自 Ingress 的流量路徑特別有用,尤其是當你想將流量映射到后端服務的不同路徑時。

<字符串> 通常是一個包含捕獲組的正則表達式,這些捕獲組會被替換為實際請求路徑中的相應部分。

nginx.ingress.kubernetes.io/ssl-redirect: <布爾值>

默認情況下,如果 Ingress 資源配置了 TLS 證書(通過 tls 部分),并且此注解設置為 true,則所有非 SSL 請求都將被重定向到 SSL(HTTPS)。

<布爾值> 可以是 true 或 false。如果設置為 false,即使配置了 TLS 證書,非 SSL 請求也不會被重定向。

nginx.ingress.kubernetes.io/force-ssl-redirect: <布爾值>

即使 Ingress 資源沒有配置 TLS 證書,將此注解設置為 true 也會強制將所有請求重定向到 HTTPS。

<布爾值> 可以是 true 或 false。請注意,將此注解設置為 true 時,你需要確保 Nginx Ingress Controller 能夠處理 HTTPS 請求(例如,通過前端代理或負載均衡器終止 SSL)。

nginx.ingress.kubernetes.io/app-root: <字符串>

如果你的應用程序部署在根路徑(/)之外,但你想將所有根路徑的流量重定向到該應用程序的實際路徑,可以使用此注解。

<字符串> 是你的應用程序的實際根路徑(例如,/myapp/)。

nginx.ingress.kubernetes.io/use-regex: <布爾值>

此注解指示 Ingress 資源中定義的路徑是否使用正則表達式進行匹配。

<布爾值> 可以是 true 或 false。如果設置為 true,paths 下的 path 字段將被視為正則表達式進行匹配

以auth為例,使舊的域名訪問時,跳轉到該域名

[root@master01 data]#mkdir /data/rewrite
[root@master01 data]#cd  /data/rewrite/
[root@master01 rewrite]#vim ingress-rewrite.yaml
[root@master01 rewrite]#cat ingress-rewrite.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-rewriteannotations:nginx.ingress.kubernetes.io/rewrite-target: http://www.auth.com:31705
#重寫目標URL,重寫為http://www.auth.com:31705
spec:rules:- host: www.rewrite.com  #流量應該匹配的主機名,訪問該主機名,將會被重寫http:paths:- path: /pathType: Prefixbackend:service:name: nginx-rewriteport:number: 80
[root@master01 rewrite]#kubectl apply -f ingress-rewrite.yaml 
ingress.networking.k8s.io/nginx-rewrite created
[root@master01 rewrite]#kubectl get ingress nginx-rewrite 
NAME            CLASS    HOSTS             ADDRESS       PORTS   AGE
nginx-rewrite   <none>   www.rewrite.com   10.96.43.71   80      25s

添加解析信息之后使用瀏覽器訪問

[root@nfs ~]#cat /etc/hosts |grep www.rewrite.com
192.168.83.40 node01 www.auth.com www.rewrite.com

更多的重寫機制,可以查閱官方文檔,或者nginx重寫規則進行查看

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22410.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux文件I/O與標準I/O緩沖機制及性能分析

目錄 1、文件I/O 1.1、數據緩沖機制 1.2、性能影響 2、標準I/O 2.1、數據緩沖機制 2.2、性能影響 3、文件I/O與標準I/O的對比 在Linux中&#xff0c;文件I/O和標準I/O是兩種常見的I/O操作方式&#xff0c;它們在數據緩沖的原理和機制上有所不同。理解這些原理和機制對優…

gitea的git庫備份與恢復

文章目錄 gitea庫的備份與恢復概述筆記實驗環境更新git for windows更新 TortoiseGit備份已經存在的gitea的git庫目錄使用gitea本身來備份所有git庫目錄將gitea庫恢復到新目錄m1m2m3啟動gitea - 此時已經恢復完成FETCH_HEAD 中有硬寫位置再查一下app.ini, 是否改漏了。m1m2 總結…

容器中運行ip addr提示bash: ip: command not found【筆記】

容器中運行ip addr提示bash: ip: command not found 原因沒有安裝ip命令。 rootdocker-desktop:/# ip addr bash: ip: command not found rootdocker-desktop:/# apt-get install -y iproute2

谷歌廣告怎么開戶?Google推廣開戶費用、代運營流程、代理開戶、投放價格

谷歌推廣&#xff08;Google Ads廣告&#xff09;是指Google公司面向全球用戶&#xff0c;在其自有搜索引擎、YouTube視頻、Gmail郵箱等各類自有產品提供的廣告位中&#xff0c;展示的各類互聯網廣告。谷歌廣告&#xff0c;有很多種衍生的叫法&#xff1a;谷歌SEM、谷歌競價、谷…

渦輪流量傳感器

渦輪流量傳感器是一種精密的流量測量儀表&#xff0c;廣泛應用于石油、化工、冶金、科研等領域的計量和控制系統。配備有衛生接頭的渦輪流量傳感器還可以應用于制藥行業。該傳感器的主要工作原理基于流體動力學和電磁感應原理&#xff0c;當流體流經傳感器時&#xff0c;流體的…

cron表達式的講解及其在若依定時任務中的使用

目錄 前言介紹一 cron的結構二 各域的含義三 常用cron表達式 實例1 后臺添加定時任務處理類2 前端新建定時任務信息3 點擊執行一次4 啟動定時任務 前言 在實際項目開發中Web應用有一類不可缺少的&#xff0c;那就是定時任務。 定時任務的場景可以說非常廣泛&#xff0c;比如某…

JS跨頁面或跨JS文件對變量賦值

JS跨頁面或跨JS文件對變量賦值&#xff0c;這是很小的一個問題。 但問題雖小&#xff0c;卻總覺得有點不夠自然&#xff0c;不爽。 為什么呢&#xff1f;訪問一個頁面上的變量不是什么難事&#xff0c;比如用parent.變量名&#xff0c;或者windows名.變量名&#xff0c;都可以…

Day42 代碼隨想錄打卡|二叉樹篇---二叉樹的所有路徑

題目&#xff08;leecode T257&#xff09;&#xff1a; 給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根節點到葉子節點的路徑。 葉子節點 是指沒有子節點的節點。 方法&#xff1a;本題需要對二叉樹中的所有路徑進行遍歷&#xff0c;并且是…

vue-router 源碼分析——2. router-link 組件是如何實現導航的

這是對vue-router 3 版本的源碼分析。 本次分析會按以下方法進行&#xff1a; 按官網的使用文檔順序&#xff0c;圍繞著某一功能點進行分析。這樣不僅能學習優秀的項目源碼&#xff0c;更能加深對項目的某個功能是如何實現的理解。這個對自己的技能提升&#xff0c;甚至面試時…

CSS選擇器和樣式

CSS CSS&#xff1a;選擇器&#xff1a;通配符選擇器&#xff1a;基本選擇器&#xff1a;標簽選擇器&#xff1a;類選擇器&#xff1a;ID選擇器&#xff1a;基本選擇器的優先級別: 群組選擇器:派生選擇器&#xff1a;后代選擇器&#xff1a;子代選擇器&#xff1a;相鄰兄弟選擇…

sed批量修改shell腳本內容

需求:郵件服務器腳本ip做了切換,由原先的11.22.33.44,切換為11.22.33.55 需要把所有使用了11.22.33.44該ip的腳本改為11.22.33.55 示例: #建2個測試文件 cat test1.txt 11.22.33.44 hello 11.22.33.44cat test2.txt 11.22.33.44 world#1.先找出哪些腳本包含該ip grep 11.22.3…

正邦科技(day3)

出廠測試 設備校準 這個需要注意的是校準電流、電壓、電感的時候有時候負感器會裝反&#xff0c;mcu會壞&#xff0c;需要flash一下清空內存

【貓狗識別系統】圖像識別Python+TensorFlow+卷積神經網絡算法+人工智能深度學習

貓狗識別系統。通過TensorFlow搭建MobileNetV2輕量級卷積神經算法網絡模型&#xff0c;通過對貓狗的圖片數據集進行訓練&#xff0c;得到一個進度較高的H5格式的模型文件。然后使用Django框架搭建了一個Web網頁端可視化操作界面。實現用戶上傳一張圖片識別其名稱。 一、前言 …

iptables備份

備份 iptables sudo iptables-save > iptables_backup.txt文件還原

【安裝筆記-20240529-Windows-poedit 翻譯編輯器】

安裝筆記-系列文章目錄 安裝筆記-20240529-Windows-Poedit 翻譯編輯器 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240529-Windows-Poedit 翻譯編輯器 前言一、軟件介紹名稱&#xff1a;Poedit主頁官方介紹 二、安裝步驟測試版本&#xff1a;Poedit-3.4.4下載鏈接安裝界面 三、…

華為機械工程師面試問題

在機械工程師的面試中,面試官可能會提出一系列問題,以評估應聘者的專業知識、技能、經驗以及解決問題的能力。以下是一些可能的面試題: 基礎知識與技能: 請解釋機械工程中常用的幾種傳動方式,并比較它們的優缺點。描述一下你在機械設計過程中常用的軟件,并舉例說明你是如…

網絡安全設備常見部署模式介紹

文章目錄 前言串聯模式路由模式透明模式 旁路模式旁路監聽代理模式正向代理透明代理反向代理 前言 網絡安全設備主要有串聯模式和旁路模式。這些模式在網絡安全架構中扮演著關鍵角色&#xff0c;以確保數據傳輸的安全性和高效性。 串聯模式 串聯模式要求所有流量都必須通過安…

程序員為什么會成為工具人——及其一些破局的思考

一、程序員為什么會成為工具人 程序員為什么會成為工具人的因素分析 序號因素分析1 技術從來不是解決用戶價值問題的那個人&#xff0c;產品才是解決用戶需求痛點創造價值問題的那個人 &#xff08;技術只是服務于產品的工具&#xff0c;程序員永遠都是在做最后一公里的搬磚&am…

Linux 命令 find 的深度解析與使用

Linux 命令 find 的深度解析與使用 在 Linux 系統中&#xff0c;find 命令是一個功能強大的工具&#xff0c;用于在文件系統中搜索文件或目錄。無論是基于文件名、文件類型、文件大小、文件權限&#xff0c;還是基于文件的最后修改時間等&#xff0c;find 命令都能提供靈活的搜…

Windows家庭版 WSL2非C盤詳細安裝配置與WSL代理設置+WSL基礎環境CUDA安裝

1 WSL2 配置 1.1 WSL 開啟 注意&#xff1a;需要在windows功能中開啟“Hyper-V”和“適用于Linux的Windows子系統”功能 但是&#xff01;windows家庭版&#xff08;windows home&#xff09;是默認沒有Hyper-V功能的&#xff0c;自己手動安裝&#xff1a; 創建一個記事本&a…