https://www.jianshu.com/p/6416d9414988
https://blog.csdn.net/weixin_33910385/article/details/93936136
http://www.mamicode.com/info-detail-1710856.html
1 Service簡介
一句話:pod不能被外網訪問,service是訪問入口。
為了適應快速的業務需求,微服務架構已經逐漸成為主流,微服務架構的應用需要有非常好的服務編排支持,k8s中的核心要素Service便提供了一套簡化的服務代理和發現機制,天然適應微服務架構,任何應用都可以非常輕易地運行在k8s中而無須對架構進行改動;
Service是Kubernetes里最核心的資源對象之一,Service定義了一個服務的訪問入口地址,前端的應用(Pod)通過這個入口地址訪問其背后的一組由Pod副本組成的集群實力。 Service與其后端Pod副本集群之間則是通過Label Selector來實現"無縫對接"。而RC的作用實際上是保證Service 的服務能力和服務質量處於預期的標准。
1.1 原理
在Kubernetes中,在受到RC調控的時候,Pod副本是變化的,對於的虛擬IP也是變化的,比如發生遷移或者伸縮的時候。這對於Pod的訪問者來說是不可接受的。Kubernetes中的Service是一種抽象概念,它定義了一個Pod邏輯集合以及訪問它們的策略,Service同Pod的關聯同樣是居於Label來完成的。Service的目標是提供一種橋梁, 它會為訪問者提供一個固定訪問地址,用於在訪問時重定向到相應的后端,這使得非 Kubernetes原生應用程序,在無須為Kubemces編寫特定代碼的前提下,輕松訪問后端。
Service同RC一樣,都是通過Label來關聯Pod的。當你在Service的yaml文件中定義了該Service的selector中的label為app:my-web,那么這個Service會將Pod-->metadata-->labeks中label為app:my-web的Pod作為分發請求的后端。當Pod發生變化時(增加、減少、重建等),Service會及時更新。這樣一來,Service就可以作為Pod的訪問入口,起到代理服務器的作用,而對於訪問者來說,通過Service進行訪問,無需直接感知Pod。
需要注意的是,Kubernetes分配給Service的固定IP是一個虛擬IP,並不是一個真實的IP,在外部是無法尋址的。真實的系統實現上,Kubernetes是通過Kube-proxy組件來實現的虛擬IP路由及轉發。所以在之前集群部署的環節上,我們在每個Node上均部署了Proxy這個組件,從而實現了Kubernetes層級的虛擬轉發網絡。
1.2 kubernetes中的三種IP
Node IP:Node節點IP地址
Pod IP:Pod的IP地址
Cluster IP:Service的IP地址
Node IP是Kubernetes集群中每個節點的物理網卡的IP地址,這是一個真實存在的物理網絡,所有屬於這個網絡的服務器之間都能通過這個網絡直接通訊,不管他們中間是否含有不屬於Kubernetes集群中的節點。想Kubernetes之外的節點訪問Kubernetes集群內的節點或者TCP/IP服務時,必須通過Node IP
Pod IP是每個Pod的IP地址,它是Docker Engine 根據docker0網橋的IP地址段進行分配的,通常是一個虛擬的二層網絡,Kubernetes要求位於不同Node上的Pod能夠彼此直接通訊,所以Kubernetes里一個Pod里的容器訪問另外一個Pod里的容器,就是通過Pod IP所在的虛擬二層網絡進行通信,而真實的TCP/IP流量則是通過Node IP所在的物理網卡流出
Cluster IP,它是一個虛擬IP,但更像是一個偽造的IP網絡
(1)Cluster IP僅僅作用於Kubernetes Service對象,並由Kubernetes管理和分配IP地址(來源於Cluster IP地址池)
(2)Cluster IP無法被Ping,因為沒有一個"實體網絡對象"來影響
(3)在Kubernetes集群內,Node IP、Pod IP、Cluster IP之間的通信,采用的是Kubernetes自己設計的特殊路由規則
Service的虛擬IP是由Kubernetes虛擬出來的內部網絡,外部是無法尋址到的。但是有些服務又需要被外部訪問到,例如web前段。這時候就需要加一層網絡轉發,即外網到內網的轉發。Kubernetes提供了NodePort、LoadBalancer、Ingress三種方式。
NodePort,在之前的Guestbook示例中,已經延時了NodePort的用法。NodePort的原理是,Kubernetes會在每一個Node上暴露出一個端口:nodePort,外部網絡可以通過(任一Node)[NodeIP]:[NodePort]訪問到后端的Service。
LoadBalancer,在NodePort基礎上,Kubernetes可以請求底層雲平台創建一個負載均衡器,將每個Node作為后端,進行服務分發。該模式需要底層雲平台(例如GCE)支持。
Ingress,是一種HTTP方式的路由轉發機制,由Ingress Controller和HTTP代理服務器組合而成。Ingress Controller實時監控Kubernetes API,實時更新HTTP代理服務器的轉發規則。HTTP代理服務器有GCE Load-Balancer、HaProxy、Nginx等開源方案。
2.2 根據deployment的Selector創建svc文件並啟動
[root@k8s-master k8s]# cat myweb-svc.yaml apiVersion: v1 kind: Service metadata: name: nginx spec: type: NodePort ports: - port: 80 nodePort: 30001 selector: #標簽選擇器 run: nginx-deployment2
[root@k8s-master nginx]# kubectl create -f myweb-svc.yaml
service "nginx" created
2.5 為什么是30001端口?
Service從30000開始隨機分配,默認不填寫,自動分配30000-32767內任意一端口
2.6 Svc縮容—通過修改deployment修改副本數為1
[root@k8s-master k8s]# kubectl scale deployment nginx-deployment2 --replicas=1 k8s]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deployment2-3516246156-k09ch 1/1 Running 0 19h 172.16.73.2 k8s-node-1 [root@k8s-master k8s]# #只有一個節點也不影響訪問的 [root@k8s-master k8s]# curl -s -I 192.168.0.138:30023| grep 200 HTTP/1.1 200 OK [root@k8s-master k8s]# curl -s -I 192.168.0.137:30023| grep 200 HTTP/1.1 200 OK [root@k8s-master k8s]#
2.7 Svc擴容—通過修改deployment修改副本數為6
[root@k8s-master k8s]# kubectl scale deployment nginx-deployment2 --replicas=6 deployment "nginx-deployment2" scaled [root@k8s-master k8s]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deployment2-3516246156-bc7pq 1/1 Running 0 36s 172.16.73.3 k8s-node-1 nginx-deployment2-3516246156-k09ch 1/1 Running 0 19h 172.16.73.2 k8s-node-1 nginx-deployment2-3516246156-l5p51 1/1 Running 0 37s 172.16.47.3 k8s-node-2 nginx-deployment2-3516246156-llhsn 1/1 Running 0 37s 172.16.73.4 k8s-node-1 nginx-deployment2-3516246156-sgpgj 1/1 Running 0 37s 172.16.47.4 k8s-node-2 nginx-deployment2-3516246156-txf3s 1/1 Running 0 37s 172.16.47.2 k8s-node-2 [root@k8s-master k8s]#
2.8 負載均衡測試
[root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deployment2-3516246156-gjkml 1/1 Running 0 9m 172.16.73.3 k8s-node-1 nginx-deployment2-3516246156-nchs3 1/1 Running 0 9m 172.16.47.2 k8s-node-2 [root@k8s-master ~]# kubectl exec -it nginx-deployment2-3516246156-gjkml /bin/bash root@nginx-deployment2-3516246156-gjkml:/# echo 'web01' > /usr/share/nginx/html/index.html root@nginx-deployment2-3516246156-gjkml:/# root@nginx-deployment2-3516246156-gjkml:/# ^C root@nginx-deployment2-3516246156-gjkml:/# exit [root@k8s-master ~]# kubectl exec -it nginx-deployment2-3516246156-nchs3 /bin/bash root@nginx-deployment2-3516246156-nchs3:/# echo 'web02' > /usr/share/nginx/html/index.html root@nginx-deployment2-3516246156-nchs3:/# ^C root@nginx-deployment2-3516246156-nchs3:/# exit [root@k8s-master ~]#