在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;
圖片
對于測試「Tes」環境或者生產「Pro」環境,出于安全或者環境隔離性來考慮,在正常情況下只會開放網關服務,而「注冊、配置」中心并不會對外暴露;
對于架構中的其它業務服務一般不會對外開放,在K8S集群內部服務間是可以正常通信的,對于「Dev」環境來說,研發會使用「注冊、配置」中心,網關是系統的訪問入口;
在K8S集群中,通過Service組件,可以快速簡單的實現服務發現和負載均衡;
在K8S集群中是通過Pod組件來部署應用服務,Deployment組件實現Pod編排管理,Service組件實現應用的訪問;
圖片
【Pod】自身的特點是臨時的,使用過后直接拋棄的實體,這樣在Pod創建和銷毀的狀態中,會導致IP地址發生變化,即無法使用固定的IP進行應用訪問;
【Deployment】控制器通過管理ReplicaSet間接實現Pod管理,比如發布方式,更新和回滾策略,維持Pod副本數量,對應用進行快速的編排,但是并沒有涉及應用的訪問;
【Service】是將運行在一個或一組Pod上的網絡應用程序公開為網絡服務的方法,可以在不修改現有應用程序的情況下,使用服務發現機制訪問到該應用;
基于Pod、Deployment、Service三個組件的協作,同一個應用的部署腳本可以在開發、測試、生產不同環境中復用;
這里提供一個簡單的【Service】語法做參考;
圖片
需要注意的是:在該腳本中沒有指定服務類型即ServiceType,默認采用的是ClusterIP,通過集群的內部IP暴露服務,選擇該值時服務只能夠在集群內部訪問;
基于【Deployment】組件,創建「auto-serve」應用;
apiVersion: apps/v1kind: Deploymentmetadata: name: serve-deployment labels: app: auto-servespec: replicas: 1 selector: matchLabels: app: auto-serve template: metadata: labels: app: auto-serve spec: containers: - name: auto-serve image: auto-serve:latest imagePullPolicy: Never ports: - containerPort: 8082 name: auto-serve-port
執行創建命令
kubectl apply -f serve-deployment.yaml
簡單的腳本文件:app-service.yaml;
apiVersion: v1kind: Servicemetadata: name: app-servicespec: selector: app: auto-serve ports: - name: app-service-port protocol: TCP port: 8082 targetPort: auto-serve-port
創建【Service】
kubectl apply -f app-service.yaml
查看【Service】,可以使用命令行或者界面;
kubectl describe svc app-service
圖片
刪除【Service】
kubectl delete -f app-service.yaml
在上面已經說明,當Type不指定時采用的是ClusterIP,只能在集群內部訪問,集群外部的網絡是無法訪問的;
在【auto-client】服務中提供一段訪問【auto-serve】接口的代碼,并制作鏡像【auto-client:3.3.3】,完成部署后查看日志打印;
@Componentpublic class HttpServiceJob { private static final Logger LOG = LoggerFactory.getLogger(HttpServiceJob.class.getName()) ; private static final String SERVER_NAME = "http://app-service:8082/serve"; private static final String SERVER_IP = "http://10.103.252.94:8082/serve"; /** * 每30秒執行一次 */ @Scheduled(fixedDelay = 30000) public void systemDate () { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(3000); factory.setConnectTimeout(6000); RestTemplate restTemplate = new RestTemplate(factory); try { Map<String, String> paramMap = new HashMap<>(); String result = restTemplate.getForObject(SERVER_NAME, String.class, paramMap); LOG.info("service-name-resp::::" + result); } catch (Exception e) { e.printStackTrace(); } try { Map<String, String> paramMap = new HashMap<>(); String result = restTemplate.getForObject(SERVER_IP, String.class, paramMap); LOG.info("service-ip-resp::::" + result); } catch (Exception e) { e.printStackTrace(); } }}
在代碼中通過服務名:端口和IP:端口都可以正常訪問,在Pod中查看兩個應用的日志,請求和響應都正常;
圖片
指定類型為NodePort的腳本:app-np-service.yaml;
apiVersion: v1kind: Servicemetadata: name: app-np-servicespec: type: NodePort selector: app: auto-serve ports: - protocol: TCP port: 8082 targetPort: 8082 nodePort: 30010
創建【Service】
kubectl apply -f app-np-service.yaml
使用NodePort類型,K8S控制平面會在指定的范圍內分配端口,如果需要特定的端口號可以指定nodePort字段中的值,但是該類型需要自己設置負載均衡解決方案;
指定類型為LoadBalancer的腳本:app-lb-service.yaml;
apiVersion: v1kind: Servicemetadata: name: app-lb-servicespec: type: LoadBalancer selector: app: auto-serve ports: - protocol: TCP port: 8082 targetPort: 8082
創建【Service】
kubectl apply -f app-lb-service.yaml
查看【Service】
在查看「app-lb-service」時,值得注意一下Endpoints的字段屬性,這里就是Pod選擇器選中的Pod;
kubectl get svc app-lb-service -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORapp-lb-service LoadBalancer 10.111.65.220 localhost 8082:30636/TCP 6m49s app=auto-servekubectl describe svc app-lb-serviceName: app-lb-serviceNamespace: defaultLabels: <none>Annotations: <none>Selector: app=auto-serveType: LoadBalancerIP Family Policy: SingleStackIP Families: IPv4IP: 10.111.65.220IPs: 10.111.65.220LoadBalancer Ingress: localhostPort: <unset> 8082/TCPTargetPort: 8082/TCPNodePort: <unset> 30636/TCPEndpoints: 10.1.0.160:8082,10.1.0.161:8082,10.1.0.162:8082Session Affinity: NoneExternal Traffic Policy: ClusterEvents: <none>kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE serve-deployment-f6f6c5bbd-9qvgr 1/1 Running 0 39m 10.1.0.162 docker-desktopserve-deployment-f6f6c5bbd-w7nj2 1/1 Running 0 39m 10.1.0.161 docker-desktopserve-deployment-f6f6c5bbd-x7v4d 1/1 Running 0 39m 10.1.0.160 docker-desktop
圖片
文檔倉庫:https://gitee.com/cicadasmile/butte-java-note腳本倉庫:https://gitee.com/cicadasmile/butte-auto-parent
本文鏈接:http://www.tebozhan.com/showinfo-26-88-0.htmlK8S | Service服務發現
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com