k8s实战之Service
一、概述
為了適應(yīng)快速的業(yè)務(wù)需求,微服務(wù)架構(gòu)已經(jīng)逐漸成為主流,微服務(wù)架構(gòu)的應(yīng)用需要有非常好的服務(wù)編排支持,k8s中的核心要素Service便提供了一套簡(jiǎn)化的服務(wù)代理和發(fā)現(xiàn)機(jī)制,天然適應(yīng)微服務(wù)架構(gòu),任何應(yīng)用都可以非常輕易地運(yùn)行在k8s中而無(wú)須對(duì)架構(gòu)進(jìn)行改動(dòng);
k8s分配給Service一個(gè)固定IP,這是一個(gè)虛擬IP(也稱為ClusterIP),并不是一個(gè)真實(shí)存在的IP,而是由k8s虛擬出來(lái)的。虛擬IP的范圍通過(guò)k8s API Server的啟動(dòng)參數(shù) --service-cluster-ip-range=19.254.0.0/16配置;
虛擬IP屬于k8s內(nèi)部的虛擬網(wǎng)絡(luò),外部是尋址不到的。在k8s系統(tǒng)中,實(shí)際上是由k8s Proxy組件負(fù)責(zé)實(shí)現(xiàn)虛擬IP路由和轉(zhuǎn)發(fā)的,所以k8s Node中都必須運(yùn)行了k8s Proxy,從而在容器覆蓋網(wǎng)絡(luò)之上又實(shí)現(xiàn)了k8s層級(jí)的虛擬轉(zhuǎn)發(fā)網(wǎng)絡(luò)。
服務(wù)代理:
在邏輯層面上,Service被認(rèn)為是真實(shí)應(yīng)用的抽象,每一個(gè)Service關(guān)聯(lián)著一系列的Pod。在物理層面上,Service有事真實(shí)應(yīng)用的代理服務(wù)器,對(duì)外表現(xiàn)為一個(gè)單一訪問(wèn)入口,通過(guò)k8s Proxy轉(zhuǎn)發(fā)請(qǐng)求到Service關(guān)聯(lián)的Pod。
Service同樣是根據(jù)Label Selector來(lái)刷選Pod進(jìn)行關(guān)聯(lián)的,實(shí)際上k8s在Service和Pod之間通過(guò)Endpoint銜接,Endpoints同Service關(guān)聯(lián)的Pod;相對(duì)應(yīng),可以認(rèn)為是Service的服務(wù)代理后端,k8s會(huì)根據(jù)Service關(guān)聯(lián)到Pod的PodIP信息組合成一個(gè)Endpoints。
1 #kubectl get service my-nginx 2 #kubectl get pod --selector app=nginx 3 k8s創(chuàng)建Service的同時(shí),會(huì)自動(dòng)創(chuàng)建跟Service同名的Endpoints: 4 #kubectl get endpoints my-nginx -o yaml 5 #kubectl describe service my-nginx
Service不僅可以代理Pod,還可以代理任意其他后端,比如運(yùn)行在k8s外部的服務(wù)。加速現(xiàn)在要使用一個(gè)Service代理外部MySQL服務(wù),不用設(shè)置Service的Label Selector。
Service的定義文件: mysql-service.yaml:
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: mysql 5 spec: 6 ports: 7 - port: 3306 8 targetPort: 3306 9 protocol: TCP
同時(shí)定義跟Service同名的Endpoints,Endpoints中設(shè)置了MySQL的IP:192.168.3.180;
Endpoints的定義文件mysql-endpoints.yaml:
1 apiVersion: v1 2 kind: Endpoints 3 metadata: 4 name: mysql 5 subsets: 6 - addresses: 7 - ip: 192.168.39.175 8 ports: 9 - port: 3306 10 protocol: TCP
#kubectl create -f mysql-service.yaml -f mysql-endpoints.yaml
微服務(wù)化應(yīng)用的每一個(gè)組件都以Service進(jìn)行抽象,組件與組件之間只需要訪問(wèn)Service即可以互相通信,而無(wú)須感知組件的集群變化。
這就是服務(wù)發(fā)現(xiàn);
#kubectl exec my-pod -- nslookup my-service.my-ns --namespace=default
#kubectl exec my-pod -- nslookup my-service --namespace=my-ns
二、Service發(fā)布
k8s提供了NodePort Service、 LoadBalancer Service和Ingress可以發(fā)布Service;
NodePort Service
NodePort Service是類型為NodePort的Service, k8s除了會(huì)分配給NodePort Service一個(gè)內(nèi)部的虛擬IP,另外會(huì)在每一個(gè)Node上暴露端口NodePort,外部網(wǎng)絡(luò)可以通過(guò)[NodeIP]:[NodePort]訪問(wèn)到Service。
LoadBalancer Service (需要底層云平臺(tái)支持創(chuàng)建負(fù)載均衡器,比如GCE)
LoadBalancer Service是類型為L(zhǎng)oadBalancer的Service,它是建立在NodePort Service集群基礎(chǔ)上的,k8s會(huì)分配給LoadBalancer;Service一個(gè)內(nèi)部的虛擬IP,并且暴露NodePort。除此之外,k8s請(qǐng)求底層云平臺(tái)創(chuàng)建一個(gè)負(fù)載均衡器,將每個(gè)Node作為后端,負(fù)載均衡器將轉(zhuǎn)發(fā)請(qǐng)求到[NodeIP]:[NodePort]。
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: my-nginx 5 spec: 6 selector: 7 app: nginx 8 ports: 9 - name: http 10 port: 80 11 targetPort: 80 12 protocol: TCP 13 type: LoadBalancer
負(fù)載均衡器由底層云平臺(tái)創(chuàng)建提供,會(huì)包含一個(gè)LoadBalancerIP, 可以認(rèn)為是LoadBalancer Service的外部IP,查詢LoadBalancer Service:
#kubectl get svc my-nginx
Ingress
k8s提供了一種HTTP方式的路由轉(zhuǎn)發(fā)機(jī)制,稱為Ingress。Ingress的實(shí)現(xiàn)需要兩個(gè)組件支持, Ingress Controller和HTTP代理服務(wù)器。HTTP代理服務(wù)器將會(huì)轉(zhuǎn)發(fā)外部的HTTP請(qǐng)求到Service,而Ingress Controller則需要監(jiān)控k8s API,實(shí)時(shí)更新HTTP代理服務(wù)器的轉(zhuǎn)發(fā)規(guī)則;
1 apiVersion: extensions/v1beta1 2 kind: Ingress 3 metadata: 4 name: my-ingress 5 spec: 6 rules: 7 - host: my.example.com 8 http: 9 paths: 10 - path: /app 11 backend: 12 serviceName: my-app 13 servicePort: 80
Ingress 定義中的.spec.rules 設(shè)置了轉(zhuǎn)發(fā)規(guī)則,其中配置了一條規(guī)則,當(dāng)HTTP請(qǐng)求的host為my.example.com且path為/app時(shí),轉(zhuǎn)發(fā)到Service my-app的80端口;
#kubectl create -f my-ingress.yaml; kubectl get ingress my-ingress
NAME RULE BACKEND ADDRESS
my-ingress -
my.example.com
/app my-app:80
當(dāng)Ingress創(chuàng)建成功后,需要Ingress Controller根據(jù)Ingress的配置,設(shè)置HTTP代理服務(wù)器的轉(zhuǎn)發(fā)策略,外部通過(guò)HTTP代理服務(wù)就
可以訪問(wèn)到Service;
總結(jié)
以上是生活随笔為你收集整理的k8s实战之Service的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设计模式(十三):从“FQ”中来认识代理
- 下一篇: 重庆俗语(有趣的重庆俚俗语)