1. 程式人生 > 實用技巧 >五、Service詳解

五、Service詳解

Service存在的意義

如果有好幾組pod,前端要怎麼正確的找到對應的pod呢?

  防止Pod失聯(服務發現)

  定義一組Pod的訪問策略(負載均衡)

  通常應用前端都需要訪問後端,那麼後端同時有好幾個Pod IP,前端無法通過某個ip去訪問,這個時候就通過LB(負載均衡器)提供一個統一的入口IP,供前端訪問,現在Service提供了這個功能

理解負載均衡四層和七層區別   四層就是基於IP+埠的負載均衡;即在OSI第4層(TCP層)工作。此種Load Balance不理解應用協議(如HTTP/FTP/MySQL等等)。例子:LVS,F5。   七層就是基於URL等應用層資訊的負載均衡;OSI的最高層,應用層。此時,該Load Balancer能理解應用協議。例子: haproxy,MySQL Proxy。   也就是四層通過虛擬IP+埠接收請求,然後再分配到真實的伺服器;七層通過虛擬的URL或主機名接收請求,然後再分配到真實的伺服器。 Pod與Service的關係
  通過label-selector(標籤)相關聯   通過Service實現Pod的負載均衡(TCP/UDP 4層)    檢視service與pod的對應關係 比如當前端對應多個後端容器的時候,service提供了統一的IP(通過kubectl get svc檢視)供前端訪問,然後service找到對應IP(通過kubectl get endpoints檢視對應IP)將請求負載均衡到每個後端 service轉發流程 通過ClusterIP訪問   使用者->ClusterIP->iptables/ipvs->pod 通過NodePort訪問   使用者->nodeport->iptables/ipvs->pod
#
api版本 apiVersion: v1 # 訪問的資源型別 kind: Service # 元資料資訊 metadata: # 一般與delpoyment中的名稱一樣 name: java-demo2 spec: selector: # 標籤選擇器,與delpoyment中的一致 project: blog app: java-demo ports: - protocol: TCP # 設定Service對叢集內部提供服務的埠 port: 80 # 指定容器中的埠 targetPort: 8080 # 指定叢集外部訪問的埠
nodePort:30001 # NodePort型別 type: NodePort

Service三種常用型別 ClusterIP:叢集內部使用   預設型別,分配一個穩定的IP地址(虛擬IP,無法ping通),即VIP,只能在叢集內部訪問(同Namespace內的Pod) NodePort:對外暴露應用 ,埠範圍可以在api-server配置檔案中更改   在每個node上啟用一個埠來暴露服務,可以在叢集外部訪問。也會分配一個穩定內部叢集IP地址   NodePort存在的問題?   1、埠需要規劃,否則應用之間容器互相佔用埠   2、提供LB對外暴露   通過LoadBalancer可解決上述問題 LoadBalancer:對外暴露應用,適用公有云   與NodePort類似,在每個節點上啟用一個隨機埠來 暴露服務。除此之外,Kubernetes會請求底層雲平臺上的負載均衡 器,將每個Node([NodeIP]:[NodePort])作為後端新增進去 service代理模式 service主要通過kube-proxy實現的 使用者請求通過k8s中的iptables負載均衡規則轉發到具體的pod上 k8s預設使用iptables代理模式 如果是kubeadeam部署的,要改成IPVS,就需要修改kube-proxy,kubectl edit cm kube-proxy -n kube-system,裡面有一個mode,將值改成ipvs 如果是二進位制部署的,直接修改yaml檔案,然後刪除pod:kubectl delete pods {kube-proxy名稱} -n kube-system,會自動重建,最後可以安裝:yum install ipvsadm -y,通過ipvsadm -Ln檢視負載均衡規則 Iptables和IPVS對比   Iptables:     靈活,功能強大     規則遍歷匹配和更新,呈線性時延 ,pod較多時規則太多,導致效能下降   IPVS:     工作在核心態,有更好的效能 ,一般都是用ipvs     排程演算法豐富:rr,wrr,lc,wlc,ip hash Service DNS名稱 CoreDNS: 是一個DNS伺服器,Kubernetes預設採用,以Pod部署在叢集中,CoreDNS服務監視Kubernetes API,為每一個Service建立DNS記錄用於域名解析 如果解析的是叢集外部的DNS,還是會走宿主機的DNS進行解析 提供的功能有: 配置完之後,前端連結後端介面時可以通過名稱去連結 CoreDNS YAML檔案: https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns ClusterIP A記錄格式: ..svc.cluster.local 示例:my-svc.my-namespace.svc.cluster.local