目錄
一、K8S的Service
1、Service的作用
2、Service類型:
二、ingress
1、ingress的組成:
2、ingress資源的定義項(xiàng):
三、nginx-ingress-controller暴露服務(wù)端的方式
1、Deployment+LoadBalancer模式:
1、工作流程圖:
2、Daemonset+hostnetwork+nodeSelector模式:
1、工作流程圖
2、實(shí)驗(yàn):
3、deployment+NodePort
1、實(shí)驗(yàn):
4、通過(guò)虛擬主機(jī)的方式實(shí)現(xiàn)http代理
5、ingress實(shí)現(xiàn)https代理訪問(wèn):
5.1、nginx的登錄賬戶認(rèn)證:
5.2、nginx的重寫:
6、總結(jié):
四、traefik-ingress暴露服務(wù)端的方式:
1、概念
?2、工作流程圖
3、traefik-ingress暴露服務(wù)端的方式
3.1、Daemonset模式:
3.2、deployment模式:
4、traefik-ingress和nginx-ingress的區(qū)別:
5、實(shí)驗(yàn):
1、deployment模式:
2、Daemonset模式:
五、總結(jié):
一、K8S的Service
1、Service的作用
Service的作用體現(xiàn)在兩個(gè)方面:
1、集群內(nèi)部:不斷跟蹤pod的變化,更新endpoints中的pod對(duì)象,基于pod的IP地址不斷變化的一種服務(wù)發(fā)現(xiàn)機(jī)制
2、集群外部:類似負(fù)載均衡器,可以把流量IP+端口,不涉及轉(zhuǎn)發(fā)url(http、https),把請(qǐng)求轉(zhuǎn)發(fā)到pod中
2、Service類型:
NodePort:容器端口—Service端口—NodePort映射。設(shè)定了NodePort之后每個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)端口被打開(kāi)30000-32767
LoadBalancer:云平臺(tái)上的Service服務(wù)。由云平臺(tái)提供負(fù)載均衡的IP地址
ExternalName:域名映射
ingress:基于域名進(jìn)行映射,轉(zhuǎn)發(fā)的是url請(qǐng)求(http、https)轉(zhuǎn)發(fā)到Service,再由Service轉(zhuǎn)發(fā)到每一個(gè)pod
ingress只需要一個(gè)或者是少量的公網(wǎng)IP或者LB,可以把多個(gè)http請(qǐng)求暴露到外網(wǎng)
他是七層反向代理
可以將ingress理解為,Service的Service。是一組基于域名和url路徑把請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)或者多個(gè)請(qǐng)求轉(zhuǎn)發(fā)到Service的規(guī)則
ingress先七層轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)都Service,Service再四層轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)到pod
二、ingress
1、ingress的組成:
ingress是一個(gè)api對(duì)象,通過(guò)yaml文件來(lái)進(jìn)行配置。ingress作用就是定義請(qǐng)求如何轉(zhuǎn)發(fā)到Service的規(guī)則
ingress通過(guò)http和https暴露集群內(nèi)部的Service,給Service提供一個(gè)外部的url、負(fù)載均衡、ssl/tls(https)的能力,實(shí)現(xiàn)一個(gè)基于域名的負(fù)載均衡
ingress-controller:由這個(gè)組件來(lái)具體的實(shí)現(xiàn)反向代理和負(fù)載均衡的程序,以及對(duì)ingress定義的規(guī)則進(jìn)行解析,根據(jù)ingress的配置的規(guī)則進(jìn)行請(qǐng)求的轉(zhuǎn)發(fā)。
但是這個(gè)ingress-controller不是K8S自帶的組件功能,ingress-controller是一個(gè)統(tǒng)稱(一系列工具)
比如nginx ingress-controller、traefik都是ingress-controller,開(kāi)源的軟件
ingress-controller是pod的方式運(yùn)行在節(jié)點(diǎn)上
2、ingress資源的定義項(xiàng):
- 定義外部流量的路由規(guī)則
- 定義的服務(wù)暴露的方式、主機(jī)名、訪問(wèn)的路徑和其他的一些選項(xiàng)
- 負(fù)載均衡(ingress-controller實(shí)現(xiàn))
三、nginx-ingress-controller暴露服務(wù)端的方式
1、Deployment+LoadBalancer模式:
ingress部署在公有云。ingress配置文件中會(huì)有type。type:LoadBalancer。公有云平臺(tái)會(huì)為這個(gè)LoadBalancer的Service自動(dòng)創(chuàng)建一個(gè)負(fù)載均衡器。綁定公網(wǎng)地址
通過(guò)域名指向公網(wǎng)地址,實(shí)現(xiàn)集群對(duì)外暴露
1、工作流程圖:
2、Daemonset+hostnetwork+nodeSelector模式:
Daemonset:在每個(gè)節(jié)點(diǎn)都會(huì)創(chuàng)建一個(gè)pod
hostnetwork:共享節(jié)點(diǎn)主機(jī)的網(wǎng)絡(luò)命名空間。容器內(nèi)直接使用節(jié)點(diǎn)主機(jī)的IP+端口。pod上的容器可以直接訪問(wèn)主機(jī)上的網(wǎng)絡(luò)資源
nodeSelector:根據(jù)標(biāo)簽選擇部署的節(jié)點(diǎn)。選擇nginx-ingress-controller部署的節(jié)點(diǎn)
缺點(diǎn):直接利用節(jié)點(diǎn)主機(jī)的網(wǎng)絡(luò)和端口資源,一個(gè)node只能部署一個(gè)ingress-controller的pod
適用場(chǎng)景:大并發(fā)場(chǎng)景的生產(chǎn)環(huán)境。性能是最好的
1、工作流程圖
Service和endpoints來(lái)發(fā)現(xiàn)節(jié)點(diǎn)
最終轉(zhuǎn)發(fā)是由ingress-controller來(lái)轉(zhuǎn)發(fā)請(qǐng)求(http)和負(fù)載均衡
用DaemonSet結(jié)合nodeselector來(lái)部署ingress-controller到特定的node上,然后使用HostNetwork直接把該pod與宿主機(jī)node的網(wǎng)絡(luò)打通,直接使用宿主機(jī)的80/433端口就能訪問(wèn)服務(wù)。這時(shí),ingress-controller所在的node機(jī)器就很類似傳統(tǒng)架構(gòu)的邊緣節(jié)點(diǎn),比如機(jī)房入口的nginx服務(wù)器。該方式整個(gè)請(qǐng)求鏈路最簡(jiǎn)單,性能相對(duì)NodePort模式更好。
缺點(diǎn)是由于直接利用宿主機(jī)節(jié)點(diǎn)的網(wǎng)絡(luò)和端口,一個(gè)node只能部署一個(gè)ingress-controller pod。 比較適合大并發(fā)的生產(chǎn)環(huán)境使用。
2、實(shí)驗(yàn):
#mandatory.yaml文件中包含了很多資源的創(chuàng)建,包括namespace、ConfigMap、role,ServiceAccount等等所有部署ingress-controller需要的資源。
官方下載地址:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml
上面可能無(wú)法下載,可用國(guó)內(nèi)的 gitee
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
DaemonSet+HostNetwork具體的部署過(guò)程?
下載安裝ingress-controller pod及相關(guān)資源
每個(gè)節(jié)點(diǎn)上,上傳ingress-contro控制器
解壓安裝
tar -xf ingree.contro-0.30.0.tar.gz
docker load -i ingree.contro-0.30.0.tar
#節(jié)點(diǎn)打標(biāo)簽,用于選擇節(jié)點(diǎn)部署ingress-controller
kubectl label nodes node02 ingress=true
192-215行修改配置文件
啟動(dòng) nginx-ingress-controller,并檢查該pod的運(yùn)行狀況?
kubectl apply -f mandatory.yaml
#nginx-ingress-controller 已經(jīng)運(yùn)行 node02 節(jié)點(diǎn)
kubectl get pod -n ingress-nginx -o wide
kubectl get cm,daemonset -n ingress-nginx -o wide
#到 node02 節(jié)點(diǎn)查看
netstat -lntp | grep nginx
由于配置了 hostnetwork,nginx 已經(jīng)在 node 主機(jī)本地監(jiān)聽(tīng) 80/443/8181 端口。其中 8181 是 nginx-controller 默認(rèn)配置的一個(gè) default backend(Ingress 資源沒(méi)有匹配的 rule 對(duì)象時(shí),流量就會(huì)被導(dǎo)向這個(gè) default backend)。
這樣,只要訪問(wèn) node 主機(jī)有公網(wǎng) IP,就可以直接映射域名來(lái)對(duì)外網(wǎng)暴露服務(wù)了。如果要 nginx 高可用的話,可以在多個(gè) node
上部署,并在前面再搭建一套 LVS+keepalived 做負(fù)載均衡。
創(chuàng)建 ingress 規(guī)則
創(chuàng)建一個(gè)業(yè)務(wù)pod和svc資源和ingress規(guī)則:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-client-storageclass
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx1
spec:
replicas: 3
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: nfs-pvc
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-app-ingress
spec:
rules:
- host: www.test1.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-app-svc
port:
number: 80
#選擇一臺(tái)客戶機(jī),直接添加node02的節(jié)點(diǎn)的IP與pod的域名進(jìn)行映射
vim /etc/hosts
20.0.0.63 www.test1.com
訪問(wèn)curl www.test1.com
3、deployment+NodePort
同樣用deployment模式部署ingress-controller,并創(chuàng)建對(duì)應(yīng)的service,但是type為NodePort。這樣,ingress就會(huì)暴露在集群節(jié)點(diǎn)ip的特定端口上。由于nodeport暴露的端口是隨機(jī)端口,一般會(huì)在前面再搭建一套負(fù)載均衡器來(lái)轉(zhuǎn)發(fā)請(qǐng)求。該方式一般用于宿主機(jī)是相對(duì)固定的環(huán)境ip地址不變的場(chǎng)景
NodePort方式暴露ingress雖然簡(jiǎn)單方便,但是NodePort多了一層NAT,在請(qǐng)求量級(jí)很大時(shí)可能對(duì)性能會(huì)有一定影響
1、實(shí)驗(yàn):
如果做了上一個(gè)操作,就將所有的yaml文件通過(guò)delete進(jìn)行清除。繼續(xù)下面的操作?
下載相關(guān)的ingress和service-nodeport模板
mkdir /opt/ingress/test
cd /opt/ingress/test
#官方下載地址:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
#國(guó)內(nèi) gitee 資源地址:
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
#在所有 node 節(jié)點(diǎn)上傳鏡像包 ingress-controller-0.30.0.tar 到 /opt/ingress-nodeport 目錄,并加載鏡像
docker load -i ingress-controller-0.30.0.tar
直接啟動(dòng)官方模板即可使用
#若是新的mandatory.yaml文件,直接啟動(dòng)即可,若是用上個(gè)實(shí)驗(yàn)的,要還原到最初始
kubectl apply -f mandatory.yaml
還原腳本如下:
在所有節(jié)點(diǎn)上部署ingress-controller
#啟用Service-nodeport
kubectl apply -f service-nodeport.yaml
#//如果K8S Pod 調(diào)度失敗,在 kubectl describe pod資源時(shí)顯示:
Warning ?FailedScheduling ?18s (x2 over 18s) ?default-scheduler ?0/2 nodes are available: 2 node(s) didn't match node selector
解決方案:
1. 給需要調(diào)度的node加上對(duì)應(yīng)標(biāo)簽
# 相對(duì)上面這個(gè)Yaml文件的例子
kubectl label nodes node_name kubernetes.io/os=linux
2. 刪除Yaml文件中的nodeSelector,如果對(duì)節(jié)點(diǎn)沒(méi)有要求的話,直接刪除節(jié)點(diǎn)選擇器即可
進(jìn)行Ingress Http代理訪問(wèn)的操作演示
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-client-storageclass
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx1
spec:
replicas: 3
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: nfs-pvc
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-app-ingress
spec:
rules:
- host: www.test1.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-app-svc
port:
number: 80
訪問(wèn)IP+NodePort端口
工作流程:
每個(gè)節(jié)點(diǎn)都是從controller----接收到解析后的請(qǐng)求IP+端口----ingress-----Service----pod
總結(jié):
nginx-ingress-controller
host—>ingresss的配置找到pod—>controller—>請(qǐng)求發(fā)到pod
nodeport--->controller--->ingress--->service--->pod
NodePort暴露端口的方式最簡(jiǎn)單的方法,NodePort多了一層nat(地址轉(zhuǎn)換)
并發(fā)量大的對(duì)性能會(huì)有一定影響,內(nèi)部都會(huì)用nodePort
4、通過(guò)虛擬主機(jī)的方式實(shí)現(xiàn)http代理
通過(guò)ingress的方式實(shí)現(xiàn):一個(gè)ingress可以訪問(wèn)不同的主機(jī)
我們知道nginx和apache能夠設(shè)置三種虛擬主機(jī),分別為:基于IP,基于域名,基于端口。同樣ingress-nginx這里也可以設(shè)置出這三種虛擬主機(jī)。下面將以最常用的基于域名的虛擬主機(jī)為例子,進(jìn)行操作演示
先創(chuàng)建兩個(gè)pod和Service
虛擬主機(jī)1:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment1
labels:
test: nginx1
spec:
replicas: 1
selector:
matchLabels:
test: nginx1
template:
metadata:
labels:
test: nginx1
spec:
containers:
- name: nginx1
image: nginx:1.22
---
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
test: nginx1
虛擬主機(jī)2將上面標(biāo)簽全部替換
再創(chuàng)建ingress資源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
spec:
rules:
- host: www1.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-1
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress2
spec:
rules:
- host: www2.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-2
port:
number: 80
映射域名:
vim /etc/hosts
#這里任意填寫一個(gè)node節(jié)點(diǎn)的IP即可
20.0.0.62 www.test.com www.abc.com ??
然后就可以基于域名+NodePort端口進(jìn)行訪問(wèn)了
5、ingress實(shí)現(xiàn)https代理訪問(wèn):
需要證書和秘鑰
創(chuàng)建證書 秘鑰
secrets保存密鑰信息,部署pod時(shí)把secrets掛載到pod
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
req:生成證書文件的
x509:生成x.509自簽名的證書
-sha256:表示使用sha-256散列算法
-nodes:表示生成到的秘鑰不加密
-day 365:證書有效期365天
-newkey rsa:2048:RSA的密鑰對(duì),長(zhǎng)度2048為位
-keyout tls.key -out tls.crt:密鑰文件key,證書文件crt
-subj "/CN=nginxsvc/O=nginxsvc":主題,CN: common name O:
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
kubectl describe secrets tls-secret
創(chuàng)建deployment、service、ingress
vim traefik-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-https
labels:
app: https
spec:
replicas: 3
selector:
matchLabels:
app: https
template:
metadata:
labels:
app: https
spec:
containers:
- name: nginx
image: nginx:1.22
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
targetPort: 80
selector:
app: https
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-https
spec:
tls:
- hosts:
- www.123ccc.com
secretName: tls-secret
rules:
- host: www.123ccc.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nginx-svc
port:
number: 80
訪問(wèn)測(cè)試
域名:https端口
curl -k https://www.123ccc.com:32561
?
是基于service-nodeport.yaml完成的,首先要有ingress-nginx
5.1、nginx的登錄賬戶認(rèn)證:
下載http,用htpasswd生成密鑰(這里秘鑰的名字只能值auth)
創(chuàng)建秘鑰
生成新的ingress:
htpasswd -c auth koeda
New password: 123456
Re-type new password: 123456
kubectl create secret generic basic-auth --from-file=auth
vim ingress-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-auth
annotations:
#開(kāi)啟認(rèn)證模塊的配置
nginx.ingress.kubernetes.io/auth-type: basic
#設(shè)置認(rèn)證類型為basic。是k8s自帶的認(rèn)證加密模塊
nginx.ingress.kubernetes.io/auth-secret: basic-auth
#把認(rèn)證的加密模塊導(dǎo)入到ingress當(dāng)中
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required-zyg'
#設(shè)置認(rèn)證窗口的提示信息。
spec:
rules:
- host: www.zyg.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
#使用http創(chuàng)建basic-auth
#開(kāi)啟認(rèn)證加密的文件
#創(chuàng)建ingress開(kāi)啟認(rèn)證模式
#將auth配置文件導(dǎo)入ingress當(dāng)中
做映射www.koeda.com
在虛擬機(jī)訪問(wèn)測(cè)試
5.2、nginx的重寫:
vim ingress-rewrite.yaml(要進(jìn)入加入https端口)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-rewrite
annotations:
nginx.ingress.kubernetes.io/rewrite-target: https://www.123ccc.com:32561
spec:
rules:
- host: www.ddd.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
自定義域名需要映射
通過(guò)www.ddd.com+http端口訪問(wèn)
容器內(nèi)頁(yè)面跳轉(zhuǎn)
到此nginx-ingress-controller全部介紹完畢
6、總結(jié):
ingress兩個(gè)重要的組件:
nginx-ingress-controller
traefik-ingress-controller
都是開(kāi)源的ingress-controller
三種工作方式:
1、deployment+LoadBalancer,需要云平臺(tái)提供一個(gè)負(fù)載均衡的公網(wǎng)地址,公有云上做
2、Daemonset+hostnetwork+nodeSelector,指定節(jié)點(diǎn)部署controller,缺點(diǎn)就是和宿主機(jī)共享網(wǎng)絡(luò),只能是一個(gè)controller的pod
????????hostnetwork這個(gè)配置回合宿主機(jī)共享網(wǎng)絡(luò)資源
3、deployment+NodePort,最常見(jiàn),最常用,也是最簡(jiǎn)單的方式。他是集中一個(gè)NodePort端口,所有的ingress的請(qǐng)求都會(huì)轉(zhuǎn)發(fā)到NodePort,然后由Service把流量轉(zhuǎn)發(fā)到pod
一個(gè)ingress的NodePort可以實(shí)現(xiàn)訪問(wèn)多個(gè)虛擬主機(jī)(域名),和nginx是一樣的
四、traefik-ingress暴露服務(wù)端的方式:
1、概念
traefik是一個(gè)為了讓部署微服務(wù)更加快捷而誕生的一個(gè)http反向代理,負(fù)載均衡
traefik設(shè)計(jì)時(shí)就能實(shí)時(shí)的和K8S的api交互,可以感知后端service以及pod的變化,還可以自動(dòng)更新配置和重載
pod內(nèi)nginx容器,80 8081
traefik的部署方式:
Daemonset和deployment
?2、工作流程圖
3、traefik-ingress暴露服務(wù)端的方式
3.1、Daemonset模式:
用的還是hostnetwork網(wǎng)絡(luò)模式
特點(diǎn):每個(gè)節(jié)點(diǎn)都會(huì)部署一個(gè)traefik。節(jié)點(diǎn)感知,可以自動(dòng)發(fā)現(xiàn),更新容器的配置,不需要手動(dòng)重載
缺點(diǎn):資源占用,大型集群中,Daemonset可能會(huì)運(yùn)行多個(gè)traefik的實(shí)例,尤其是在節(jié)點(diǎn)上不需要大量容器運(yùn)行的情況下。他是沒(méi)有辦法擴(kuò)所容器的
適用于部署對(duì)外集群:因?yàn)閷?duì)外的業(yè)務(wù)會(huì)經(jīng)常變更,使用Daemonset模式可以更好的、自動(dòng)的發(fā)現(xiàn)服務(wù)配置變更
3.2、deployment模式:
用的還是NodePort網(wǎng)絡(luò)模式
優(yōu)點(diǎn):集中控制,可以使用少量的實(shí)例來(lái)運(yùn)行處理整個(gè)集群的流量,更容易升級(jí)和維護(hù)。
缺點(diǎn):
deployment負(fù)載均衡不會(huì)均勻地分布到每個(gè)節(jié)點(diǎn)。
需要手動(dòng)更新,他無(wú)法感知容器的配置變化
適用于部署對(duì)內(nèi)集群:對(duì)內(nèi)的業(yè)務(wù)相對(duì)穩(wěn)定,更新和變化也比較少,適合deployment的方式
一般部署的時(shí)候會(huì)設(shè)置標(biāo)簽:
traffic-type:internal 聲明對(duì)內(nèi)服務(wù)
traffic-type:external 聲明對(duì)外服務(wù)
4、traefik-ingress和nginx-ingress的區(qū)別:
沒(méi)有大區(qū)別
工作原理都一樣,都是七層代理,都可以動(dòng)態(tài)的更新配置,都可以自動(dòng)發(fā)現(xiàn)服務(wù)
nginx-ingress:
自動(dòng)更新的重載模塊相對(duì)較慢
traefik-ingress
自動(dòng)更新的重載模塊更快、更方便
traefik的并發(fā)能力只有nginx-ingress的6成 60%
工作中見(jiàn)得最多的就是nginx-ingress-controller
5、實(shí)驗(yàn):
1、deployment模式:
?wget ?https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-deployment.yaml
wget ?https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-rbac.yaml
wget ?https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-ds.yaml
wget ?https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/ui.yaml
?
#先啟動(dòng)rbac權(quán)限配置
kubectl apply -f traefik-rbac.yaml
#再啟動(dòng)deployment或者Daemonset
kubectl apply -f traefik-deployment.yaml
#最后啟動(dòng)ui工具
kubectl apply -f ui.yaml
vim traefik-ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-traefik
labels:
nginx: traefik
spec:
replicas: 3
selector:
matchLabels:
nginx: traefik
template:
metadata:
labels:
nginx: traefik
spec:
containers:
- name: nginx
image: nginx:1.22
---
apiVersion: v1
kind: Service
metadata:
name: nginx-traefik-svc1
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
nginx: traefik
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-traefik-test1
spec:
rules:
- host: www.yyw.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-traefik-svc1
port:
number: 80
ui查看發(fā)現(xiàn)
2、Daemonset模式:
Daemonset,以及配置更新的自動(dòng)重載
先運(yùn)行traefik-ds.yaml,使用traefik的Daemonset+hostnetwork模式
創(chuàng)建configmap,掛載
worker_processes 2;
events {
worker_connections 1024;
}
http {
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root /usr/share/nginx/html;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
kubectl create configmap nginx-con --from-file=/opt/nginx-configmap/nginx.conf
創(chuàng)建業(yè)務(wù)資源,service和ingress
?
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-app
labels:
app: nginx1
spec:
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/
- name: nginx-mount
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-config
configMap:
name: nginx-con
- name: nginx-mount
hostPath:
path: /opt/html
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-app-ingress
spec:
rules:
- host: www.test1.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-app-svc
port:
number: 80
hostnetwork端口80,nginx監(jiān)聽(tīng)端口也是80
自動(dòng)發(fā)現(xiàn),ingress
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-app
labels:
app: nginx1
spec:
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/
- name: nginx-mount
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-config
configMap:
name: nginx-con
- name: nginx-mount
hostPath:
path: /opt/html
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc
spec:
ports:
- protocol: TCP
port: 8081
targetPort: 8081
selector:
app: nginx1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-app-ingress
spec:
rules:
- host: www.test1.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-app-svc
port:
number: 8081
重新運(yùn)行,將hostnetwork的監(jiān)聽(tīng)端口改成8081
kubectl edit cm nginx-con
更改configmap,將nginx的監(jiān)聽(tīng)端口改成8081
五、總結(jié):
開(kāi)源的ingress控制軟件
nginx-ingress-controller
traefik-ingress-controller
nginx-ingress-controller:
模式:
deployment+LoadBalancer:公有云提供負(fù)載均衡的公網(wǎng)地址
Daemonset+hostnetwork+nodeSelector:和節(jié)點(diǎn)服務(wù)器共享網(wǎng)絡(luò),一個(gè)節(jié)點(diǎn)只能部署一個(gè)controller的pod,使用宿主機(jī)的端口,性能最好,適合大并發(fā)
deployment+NodePort:最常見(jiàn)也是最常用,也是最簡(jiǎn)單的方法。但是性能不太好,多了一層nat地址轉(zhuǎn)發(fā),不太適合大并發(fā)
traefik-ingress-controller:(小集群)
模式:
Daemonset模式:對(duì)外,可以自動(dòng)更新容器的配置。hostnetwork模式,用的是節(jié)點(diǎn)網(wǎng)絡(luò)
deployment模式:對(duì)內(nèi),無(wú)法自動(dòng)更新配置。NodePort網(wǎng)絡(luò)模式
https:
- 生成證書和秘鑰
- 創(chuàng)建Secret保存秘鑰
- 創(chuàng)建ingress的時(shí)候把Secret導(dǎo)入
加密認(rèn)證:
1、借助htpasswd工具,生成名字叫 auth 的秘鑰(文件名只能是auth)
2、創(chuàng)建ingress的兩行代碼文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-800428.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-800428.html
到了這里,關(guān)于【K8S 云原生】K8S的對(duì)外服務(wù)—ingress的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!