K8s部署Nginx集群,通過Ingress實現(xiàn)HTTPS域名訪問過程
架構(gòu)
客戶端 → Ingress Controller (處理 TLS) → Service: nginx → Nginx Pod (提供靜態(tài)內(nèi)容)
service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
我們創(chuàng)建的 Service 類型默認(rèn)是 ClusterIP,Ingress 控制器可以通過 ClusterIP 訪問到 Pod。
secret存儲TLS證書
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=dong.nginx.com" kubectl create secret tls nginx-ssl-cert --cert=tls.crt --key=tls.key --namespace=default
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
tls:
- hosts:
- dong.nginx.com
secretName: nginx-tls-secret
rules:
- host: dong.nginx.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
在Ingress配置中,設(shè)置了注解?nginx.ingress.kubernetes.io/force-ssl-redirect: "true"?,這會導(dǎo)致Ingress控制器將HTTP請求重定向到HTTPS。
我們使用的是?kubernetes.io/ingress.class: "nginx"?,這通常是由NGINX Ingress控制器處理的。NGINX Ingress控制器默認(rèn)會監(jiān)聽80和443端口,并且當(dāng)你配置了TLS和強(qiáng)制重定向時,80端口的請求會被重定向到443。
在host字段中指定了域名,需要通過域名才可以訪問(只有Host頭匹配的請求才會被路由到此服務(wù),如果直接訪問Ingress Controller的IP,由于缺少Host頭,請求不會被正確路由)。
訪問 ?HTTP? 端口 -> 被告知“請走 ?HTTPS?”
返回308永久重定向,說明HTTP被強(qiáng)制跳轉(zhuǎn)到HTTPS,這是常見的做法。服務(wù)器明確告訴客戶端:“你訪問的這個 ?http? 地址已經(jīng)不再使用了,請永久地使用另一個地址(通常是 ?https? 地址)來訪問我。”這是現(xiàn)代Web服務(wù)的標(biāo)準(zhǔn)做法,為了安全,強(qiáng)制將不安全的 ?HTTP? 協(xié)議跳轉(zhuǎn)到安全的 ?HTTPS? 協(xié)議。
308 重定向需要客戶端(如瀏覽器)自動跟隨重定向,但 curl 默認(rèn)不會自動跟隨重定向。
Ingress Controller:處理 TLS 終止和路由
通常 Ingress 控制器會使用它自己的 TLS 證書,而 Pod 內(nèi)部的 nginx 不需要配置 SSL,可以只作為靜態(tài)文件服務(wù)器,因為 Ingress 控制器會處理 SSL 終止。
在Kubernetes中,通常訪問服務(wù)是通過Ingress控制器提供的入口。Ingress控制器會監(jiān)聽80和443端口(或者你配置的其他端口),然后根據(jù)Ingress規(guī)則路由流量。
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
default.conf: |
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
autoindex off;
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
}
在 ConfigMap 中,我們只配置了一個 HTTP 服務(wù)器(監(jiān)聽 80 端口),并且沒有配置 SSL。因此,Pod 內(nèi)的 nginx 只會處理 HTTP 流量。而 Ingress 控制器會將 HTTPS 流量終止并轉(zhuǎn)發(fā)給 Service(即 Pod)的 80 端口。
nginx-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: html-pvc
spec:
storageClassName: nfs-client
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
存儲管理-PV動態(tài)供給見–有狀態(tài)應(yīng)用-MySQL主從復(fù)制集群
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-web-cluster
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: config
configMap:
name: nginx-config
- name: html
persistentVolumeClaim:
claimName: html-pvc
用戶訪問
訪問前需要在用戶的主機(jī)上修改hosts文件進(jìn)行域名解析,添加:Ingress節(jié)點IP 及 域名。
通過Ingress節(jié)點IP地址(kubectl get ingress)加上Ingress控制器的Service上(kubectl get svc -n ingress-nginx)的暴露端口,用戶可以從集群外部訪問Ingress控制器。(這里需要通過域名訪問或者攜帶主機(jī)頭,如下:)
curl -H "Host:dong.nginx.com" https://192.168.1.73:31237 -k #證書是自簽名的,不在curl的CA信任庫中,需要通過-k或--insecure選項來跳過證書驗證
當(dāng)前Ingress-controller的服務(wù)類型是NodePort,它會在每個節(jié)點上開放一個端口,所以訪問時必須帶上端口號。
1.http://dong.nginx.com:31441? → 308 重定向到 HTTPS
2.https://dong.nginx.com:31237? → Ingress → Service:nginx → Nginx Pod → 返回網(wǎng)頁內(nèi)容
curl默認(rèn)不會跟隨重定向。所以,當(dāng)您使用curl訪問HTTP時,您看到的是308重定向的響應(yīng)體,而不是跟隨重定向后的內(nèi)容。
在瀏覽器中訪問http://dong.nginx.com:31441,瀏覽器會自動重定向到HTTPS并顯示頁面,用戶不會看到308的頁面。
# 1. 查看重定向信息 curl -I http://dong.nginx.com:31441 # 2. 自動跟隨重定向獲取最終內(nèi)容 curl -L http://dong.nginx.com:31441 # 3. 或者使用詳細(xì)模式查看整個過程 curl -v -L http://dong.nginx.com:31441
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法
這篇文章主要介紹了某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-01-01
Rainbond部署組件Statefulset的使用官方文檔
這篇文章主要為大家介紹了官方文檔Rainbond部署組件Statefulset的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

