云原生時(shí)代微服務(wù)的正確姿勢
今天主要講講云原生時(shí)代,微服務(wù)的正確站姿!在Spring Cloud Kubernetes之實(shí)戰(zhàn)二服務(wù)注冊與發(fā)現(xiàn) 一文中,講過spring-cloud 如何結(jié)合 K8s 來實(shí)現(xiàn)服務(wù)的注冊與發(fā)現(xiàn)。但如果非 springcloud 框架,或者非 Java 語言呢?那該如何使用 K8s 來實(shí)現(xiàn)服務(wù)的注冊與發(fā)現(xiàn)呢?
1. K8s 組件
configMap kube-apiserver scheduler etcd controller kube-proxy

K8s 中主要通過 kube-proxy 負(fù)責(zé)為 Service 提供 cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡,它是 K8s 集群內(nèi)部的負(fù)載均衡器,也是一個(gè)分布式代理服務(wù)器,在 K8s 的每個(gè)節(jié)點(diǎn)上都有一個(gè),這一設(shè)計(jì)體現(xiàn)了它的伸縮性優(yōu)勢,需要訪問服務(wù)的節(jié)點(diǎn)越多,提供負(fù)載均衡能力的 kube-proxy 就越多,高可用節(jié)點(diǎn)也隨之增多。通過 K8s service 的 "ClusterIP" 來實(shí)現(xiàn)集群內(nèi)服務(wù)的 LB,當(dāng)然,如果集群外需要訪問 Service 對應(yīng)的所有具有相同功能的 pod 應(yīng)用程序,則可以通過 K8s service 的另外一種方式來實(shí)現(xiàn):"NodePort"。
2. 基于 Service 實(shí)現(xiàn)微服務(wù)負(fù)載均衡
在 Java 語言,或其它語言中,通常需要做很多繁重的組件來實(shí)現(xiàn)服務(wù)的 LB。例如:Dubbo、SpringCloud、甚至 SpringCloudAlibaba 等。當(dāng)然,對于 Python、Go 等語言,也有其 Restful API,所以也會(huì)集成標(biāo)準(zhǔn)的代理插件來進(jìn)行做傳統(tǒng)的 LB。但對于云原生時(shí)代的到來,服務(wù)容器化讓微服務(wù)的訪問更好了。K8s Service 提供的 LB,即為無語言邊際的負(fù)載均衡,不用考慮任何語言的阻礙,只要是通用的 Restful API,即可借助 service 來進(jìn)行處理集群內(nèi)部微服務(wù)之間的 LB。
在 K8s 集群中,如果內(nèi)部訪問,可以簡單的通過 servicename 來進(jìn)行訪問。例如:
apiVersion: v1
kind: Service
metadata:
name: web-server-service
namespace: default
spec:
ports:
- name: web-server
port: 80
targetPort: web-server-port
selector:
app: web-server
通過 selector 將 service 與服務(wù) pod 對應(yīng)起來,創(chuàng)建一個(gè)微服務(wù)的 service,默認(rèn)其形式是:ClusterIP,則可以通過如下來訪問該 service 對應(yīng)的后端 pod:
curl http://$service_name.$namespace.svc.cluster.local:$service_port/api/v1/***
這里,K8s 通過虛擬出一個(gè)集群 IP,利用 kube-proxy 為 service 提供 cluster 內(nèi)的服務(wù)發(fā)現(xiàn)和負(fù)載均衡,上面說了 kube-proxy 的功能。
Name: web-server-service
Namespace: default
Type: ClusterIP
IP: 20.16.249.134
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 20.162.35.223:80
Session Affinity: None
Events: <none>
3. 高可用案例
3.1 傳統(tǒng)微服務(wù)請求案例
傳統(tǒng)的微服務(wù)中,不同語言構(gòu)建的微服務(wù)架構(gòu)很多,一般直接通過 http 協(xié)議進(jìn)行訪問,在同一種語言中,又會(huì)出現(xiàn)一種集成框架模式來實(shí)現(xiàn)微服務(wù)架構(gòu)。如:Java 中 Dubbo、Springcloud 等,但其繁瑣的框架結(jié)構(gòu)導(dǎo)致了服務(wù)的繁重。
3.2 跨語言間微服務(wù)的互通
在 k8s 集群內(nèi),通過 kube-proxy 結(jié)合 service 等一些功能組件來實(shí)現(xiàn)微服務(wù)之間的調(diào)用,不管是同語言也好,跨語言也罷。都會(huì)很好的進(jìn)行處理,包括實(shí)現(xiàn)高可用以及負(fù)載均衡、服務(wù)治理等。
任何一個(gè) k8s 集群中的 pod 都可以通過 http 協(xié)議來訪問其它 pod 的服務(wù):
root@rest-server-ver2-ds-vcfc7:/usr/src/app# curl http://web-server-service.kube-system.svc.cluster.local:80/api/v1/healthz
{
"status": {
"code": 0,
"msg": "success"
},
"data": "success"
}root@rest-server-ver2-ds-vcfc7:/usr/src/app#
其中的權(quán)限有的可以通過 namespace 來控制,有的可以通過服務(wù)本身的訪問權(quán)限來控制,但一切都可以進(jìn)行訪問,不存在語言的差別對待。
