k8s的服務訪問service


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 ~]#

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM