目錄
引言
一、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來訪問你的服務了
優點:
- 自動化與便捷性:在公有云環境中,創建LoadBalancer類型的Service會自動為你創建負載均衡器,并分配公網IP,簡化了配置過程。
- 高可用性:負載均衡器通常具有容錯和故障轉移的能力,保證服務的穩定性。
- 易于擴展:可以根據需求動態調整LoadBalancer的配置,如增加后端節點等。
缺點:
- 成本:在公有云環境中,使用LoadBalancer通常需要支付額外的費用。
- 環境限制:這種方式主要適用于公有云環境,對于自建Kubernetes集群或者私有云環境可能不適用
方式二:DaemonSet+HostNetwork+nodeSelector
這種方式下,Ingress Controller以DaemonSet的方式部署,通過nodeSelector選擇特定的節點運行。同時,使用HostNetwork將Ingress Controller的Pod與宿主機的網絡打通,直接使用宿主機的80/443端口來提供服務。這樣,Ingress Controller所在的節點就起到了邊緣節點的作用,可以直接接受外部請求,并將請求轉發到集群內的服務。這種方式的優點是請求鏈路簡單,性能較好。但是,由于Ingress Controller直接占用了宿主機的端口,所以一個節點上通常只能運行一個Ingress Controller的Pod。
優點:
- 性能優越:由于直接使用宿主機的網絡和端口,請求鏈路簡單,性能較好。
- 配置簡單:通過DaemonSet和nodeSelector可以很方便地將Ingress Controller部署到指定的節點上。
- 適合大并發環境:對于需要處理大量并發請求的生產環境,這種方式具有更好的性能表現。
缺點:
- 資源限制:由于Ingress Controller直接占用了宿主機的端口,因此一個節點上通常只能運行一個Ingress Controller的Pod。
- 安全性:由于Ingress Controller直接暴露在公網上,需要特別注意安全性問題,如防止DDoS攻擊等。
- 可移植性差:使用HostNetwork和特定節點的方式使得Ingress Controller的部署與特定環境緊密相關,不利于跨環境部署和遷移。
方式三:Deployment+NodePort模式的Service
在這種方式下,Ingress Controller仍然以Deployment的方式部署,但是關聯的Service的類型是NodePort。NodePort類型的Service會將Pod的端口映射到集群中每個節點的特定端口上。然后,你可以通過任意節點的IP地址和該節點上的映射端口來訪問Ingress Controller。由于NodePort映射的端口是隨機選擇的,因此通常還需要在集群外部再部署一個負載均衡器來將流量分發到各個節點上。這種方式適用于節點IP地址相對固定的環境,但需要注意的是,由于NodePort類型的Service在節點之間進行了NAT轉發,因此在請求量很大時可能會對性能產生一定的影響。
優點:
- 靈活性:NodePort類型的Service可以靈活地將Pod的端口映射到集群中每個節點的特定端口上,便于外部訪問。
- 適用于固定IP環境:在節點IP地址相對固定的環境中,這種方式可以很方便地暴露服務。
缺點:
- 性能損耗:由于NodePort類型的Service在節點之間進行了NAT轉發,因此在請求量很大時可能會對性能產生一定的影響。
- 需要額外配置:通常需要在集群外部再部署一個負載均衡器來將流量分發到各個節點上,增加了配置的復雜性。
- 端口管理:由于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重寫規則進行查看