首先我們要清楚什么是Service 和 Ingress。簡(jiǎn)單來(lái)說(shuō),這兩個(gè)組件都是用來(lái)做流量負(fù)載的。那么什么又是流量負(fù)載呢?當(dāng)我們?cè)诩簝?nèi)部已經(jīng)通過(guò) pod 部署了我們的應(yīng)用服務(wù),那么下一步要干啥?那就是讓用戶訪問(wèn)到我們的應(yīng)用服務(wù),這個(gè)才是最重要的,不然你部署完了,用戶卻訪問(wèn)不了,那豈不是無(wú)用功~
一、Service
在 k8s 中,pod 是應(yīng)用程序的載體,我們可以通過(guò) pod的 IP 來(lái)訪問(wèn)我們的應(yīng)用程序,但是我們已經(jīng)清楚了 pod 是具有生命周期的,一旦 pod 出現(xiàn)問(wèn)題,pod控制器將會(huì)將pod銷毀進(jìn)行重新創(chuàng)建。那么這個(gè)時(shí)候 pod 的Ip就會(huì)發(fā)生變化,因此利用 pod IP 訪問(wèn)應(yīng)用程序的方式直接 pass了,那么為了解決這個(gè)問(wèn)題,k8s 引入了 Service 的資源概念,通過(guò)這個(gè)資源,可以整合多個(gè)pod,提供一個(gè)統(tǒng)一的入口地址,通過(guò)訪問(wèn) Service 的入口地址就能訪問(wèn)到后面的 pod服務(wù)!
在 iptables 模式下,kube-proxy 會(huì)為 Service 后端的每個(gè) pod 都創(chuàng)建對(duì)應(yīng)的 iptable 規(guī)則,直接將發(fā)往 Cluster IP 的請(qǐng)求重定向到一個(gè) pod IP 上。該模式下 kube-proxy 不承擔(dān)四層負(fù)載均衡器的角色,只負(fù)責(zé)創(chuàng)建 iptables 的規(guī)則。該模式的優(yōu)點(diǎn)便是較 userspace 模式來(lái)說(shuō)效率更高,但是不能提供靈活的 LB 策略。當(dāng)后端Pod不可用的時(shí)候也無(wú)法進(jìn)行重試。
10.108.230.12 是 service 提供的訪問(wèn)入口,當(dāng)訪問(wèn)這個(gè)入口的時(shí)候,可以發(fā)現(xiàn)后面有三個(gè) pod 的服務(wù)在等待調(diào)用,kube-proxy 會(huì)基于 rr(輪詢)的策略,將請(qǐng)求分發(fā)到其中一個(gè)pod上去,這個(gè)規(guī)則會(huì)同時(shí)在集群內(nèi)的所有節(jié)點(diǎn)上都生成,所以在任何一個(gè)節(jié)點(diǎn)上訪問(wèn)都可以!
此模式必須安裝 ipvs 內(nèi)核模塊,否則會(huì)降低為 iptables
開(kāi)啟 ipvs:
kubectl edit cm kube-proxy -n kube-system
編輯后保存(:wq) 退出
kubectl delete pod -l k8s-app=kube-proxy -n kube-system
ipvsadm -Ln
2)Service 使用
上面已經(jīng)介紹完了 Service 的幾種工作模式。下面我們進(jìn)入Service 的使用階段。我們上面已經(jīng)做了簡(jiǎn)單的實(shí)踐,創(chuàng)建了一個(gè) Deploy ,一個(gè) Service ,然后我們可以通過(guò) serviceIp + targetPort 或 nodeIp + nodePort訪問(wèn)資源
但是在學(xué)習(xí) Service 的使用,僅僅這個(gè)是不夠的,Service又分為5種類型,下面將一一介紹。
Endpoint 是 k8s 中的一個(gè)資源對(duì)象,存儲(chǔ)在etcd中,用來(lái)記錄一個(gè) service 對(duì)應(yīng)的所有Pod 的訪問(wèn)地址,它是根據(jù) service 配置文件中 selector 描述產(chǎn)生的。一個(gè)Service由一組Pod組成,這些Pod通過(guò) Endpoint 暴露出來(lái),可以說(shuō) Endpoint 是實(shí)際實(shí)現(xiàn)服務(wù)的端口的集合。通俗來(lái)說(shuō),Endpoint 是 service 和 pod 之間的橋梁
既然是一個(gè)資源,那么我們就可以獲取到
負(fù)載分發(fā)
我們上面已經(jīng)成功的實(shí)現(xiàn)了通過(guò) Service 訪問(wèn)到Pod 資源,那么我們?cè)僮鲆恍┬薷模謩e進(jìn)入3個(gè)pod編輯 usr/share/nginx/index.html 文件:
# pod01 Pod01 : ip - 10.244.1.73 # pod02 Pod01 : ip - 10.244.1.73 # pod03 Pod03 : ip - 10.244.2.63
很多服務(wù)都需要支持定制化,如果將產(chǎn)品定位為服務(wù),那么這個(gè)產(chǎn)品毋庸是成功。在某些場(chǎng)景中,開(kāi)發(fā)人員并不想要使用 service 提供的負(fù)載均衡功能,而是希望自己來(lái)控制負(fù)載均衡策略。針對(duì)這種情況的發(fā)生,k8s也是很好的支持了,引入了 HeadLiness Service,這類 Service 不會(huì)分配 ClusterIp,如果想要訪問(wèn) service,只能通過(guò) Service 域名進(jìn)行查詢。
我們來(lái)看下 HeadLiness 的資源清單模板:
唯一跟 ClusterIp 不同的便是 clusterIP: None 屬性的變化。
通過(guò)創(chuàng)建后可以發(fā)現(xiàn),ClusterIP并未分配,我們繼續(xù)查看 Service 的詳情