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

實(shí)際上,ingress相當(dāng)于一個(gè)7層的負(fù)載均衡器,是k8s對(duì)反向代理的一個(gè)抽象。大概的工作原理也確實(shí)類似于Nginx,可以理解成在 Ingress 里建立一個(gè)個(gè)映射規(guī)則 , ingress Controller 通過(guò)監(jiān)聽 Ingress這個(gè)api對(duì)象里的配置規(guī)則并轉(zhuǎn)化成 Nginx 的配置(kubernetes聲明式API和控制循環(huán)) , 然后對(duì)外部提供服務(wù)。
ingress包括:ingress controller和ingress resources
ingress controller:核心是一個(gè)deployment,實(shí)現(xiàn)方式有很多,比如nginx, Contour, Haproxy, trafik, Istio,需要編寫的yaml有:Deployment, Service, ConfigMap, ServiceAccount(Auth),其中service的類型可以是NodePort或者LoadBalancer。ingress resources:這個(gè)就是一個(gè)類型為Ingress的k8s api對(duì)象了,這部分則是面向開發(fā)人員。
Kubernetes給出的方案就是Ingress,Ingress包含了兩大主件Ingress Controller和Ingress。
Ingress解決的是新的服務(wù)加入后,域名和服務(wù)的對(duì)應(yīng)問(wèn)題,基本上是一個(gè)ingress的對(duì)象,通過(guò)yaml進(jìn)行創(chuàng)建和更新進(jìn)行加載。
Ingress Controller是將Ingress這種變化生成一段Nginx的配置,然后將這個(gè)配置通過(guò)Kubernetes API寫到Nginx的Pod中,然后reload.(注意:寫入 nginx.conf 的不是service的地址,而是service backend 的 pod 的地址,避免在 service 在增加一層負(fù)載均衡轉(zhuǎn)發(fā))

從上圖中可以很清晰的看到,實(shí)際上請(qǐng)求進(jìn)來(lái)還是被負(fù)載均衡器攔截,比如 nginx,然后 Ingress Controller 通過(guò)跟 Ingress 交互得知某個(gè)域名對(duì)應(yīng)哪個(gè) service,再通過(guò)跟 kubernetes API 交互得知 service 地址等信息;綜合以后生成配置文件實(shí)時(shí)寫入負(fù)載均衡器,然后負(fù)載均衡器 reload 該規(guī)則便可實(shí)現(xiàn)服務(wù)發(fā)現(xiàn),即動(dòng)態(tài)映射
了解了以上內(nèi)容以后,這也就很好的說(shuō)明了我為什么喜歡把負(fù)載均衡器部署為 Daemon Set;因?yàn)闊o(wú)論如何請(qǐng)求首先是被負(fù)載均衡器攔截的,所以在每個(gè) node 上都部署一下,同時(shí) hostport 方式監(jiān)聽 80 端口;那么就解決了其他方式部署不確定 負(fù)載均衡器在哪的問(wèn)題,同時(shí)訪問(wèn)每個(gè) node 的 80 都能正確解析請(qǐng)求;如果前端再 放個(gè) nginx 就又實(shí)現(xiàn)了一層負(fù)載均衡。
Ingress Controller 會(huì)根據(jù)你定義的 Ingress 對(duì)象,提供對(duì)應(yīng)的代理能力。業(yè)界常用的各種反向代理項(xiàng)目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已經(jīng)為Kubernetes 專門維護(hù)了對(duì)應(yīng)的 Ingress Controller。

2. ingress-nginx 部署
ingress調(diào)度的是后端的service,而不是pod
ingress controller 是與k8s集群做交互的,感知etcd的變化
首先拉取 ingress-controller鏡像至harbor倉(cāng)庫(kù)


部署nginx-ingress-controller
拿到y(tǒng)aml文件 應(yīng)用ingress controller定義文件
[kubeadm@server1 ingress]$ ls mandatory.yaml [kubeadm@server1 ingress]$
編輯此文件,把鏡像的位置換成本地倉(cāng)庫(kù)中鏡像的位置

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


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


查看信息


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

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

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

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

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


5. 通過(guò)不同的域名定義到不同的后端
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-myapp
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: reg.westos.org/k8s/myapp:v2
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
type: ClusterIP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-example
spec:
rules:
- host: www2.westos.org
http:
paths:
- path: /
backend:
serviceName: myservice
servicePort: 80


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

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

訪問(wèn)不同的域名,訪問(wèn)到的后端service不同,負(fù)載到不同的pod后端
6. 訪問(wèn)同一域名,不同的path時(shí),調(diào)度到不同的后端
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-hello
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: www3.westos.org
http:
paths:
- path: /1
backend:
serviceName: ingress-nginx
servicePort: 80
paths:
- path: /2
backend:
serviceName: myservice
servicePort: 80



總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
k8s如何使用NFS作為StorageClass提供動(dòng)態(tài)存儲(chǔ)
本文主要介紹了k8s中的StorageClass,包括其定義、引入的原因、實(shí)現(xiàn)方式、定義方法以及回收策略對(duì)數(shù)據(jù)的影響等,首先,StorageClass是在K8s集群中創(chuàng)建用于動(dòng)態(tài)PV的管理,可以鏈接至不同的后端存儲(chǔ),對(duì)存儲(chǔ)的請(qǐng)求可以指向StorageClass2024-09-09
k8s整合istio配置gateway入口、配置集群內(nèi)部服務(wù)調(diào)用管理(最新推薦)
這篇文章主要介紹了k8s整合istio配置gateway入口、配置集群內(nèi)部服務(wù)調(diào)用管理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
在AWS-EC2中安裝Minikube集群的詳細(xì)過(guò)程
這篇文章主要介紹了在AWS-EC2中安裝Minikube集群,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Hadoop 2.x與3.x 22點(diǎn)比較,Hadoop 3.x比2.x的改進(jìn)
本文介紹了Hadoop3版本中添加的新功能,Hadoop 2和Hadoop 3的區(qū)別,在這篇文章中,我們將討論Hadoop 2.x與Hadoop 3.x之間的比較。感興趣的朋友跟隨小編一起看一下2018-09-09
k8s編排之DaemonSet知識(shí)點(diǎn)詳解
這篇文章主要為大家介紹了k8s編排之DaemonSet知識(shí)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

