通過Service訪問應用 (2)
目錄
-
通過NodePort Service在外部訪問叢集應用
-
通過LoadBalancer Service在外部訪問叢集應用
-
Microsoft SQL Server資料庫部署
為了便於理解和學習,請先閱讀上一篇《通過Service訪問應用 (1)》再繼續學習本篇內容。
通過NodePort Service在外部訪問叢集應用
這時候我們就可以使用NodePort型別的Service了。NodePort服務型別允許在每個節點的IP(任意節點IP)上使用靜態埠(NodePort)公開服務,我們可以在叢集之外通過請求<NodeIP>:<NodePort>來訪問服務。
YAML定義如下所示:
kind: Service #資源型別 apiVersion: v1 metadata: #標準元資料 name: nodeport-service #服務名稱 spec: #規範定義 type: NodePort #服務型別,這裡是節點埠 ports: #埠列表 - port: 80 #當前埠 nodePort: 31001 #節點埠,注意預設的埠範圍為“30000-32767”,注意不要衝突 selector: #標籤選擇器 app: demo
接下來,我們來執行Service的建立並查詢Service:
kubectl create -f nodePortService.yaml kubectl get services nodeport-service
如上圖所示,我們建立了名為“nodeport-service”的Service,該Service對映“31001”節點埠,並且建立了“11.3.138.104”的叢集IP,也就是說,Service可以通過“節點IP:節點埠”或“叢集IP(spec.clusterIp):埠”進行訪問。
接下來,在叢集外部的計算機,我們通過節點IP和節點埠(172.16.2.201:31001)即可訪問剛剛部署的Demo應用:
雖然我們可以在外部訪問叢集中的應用,但是也可以看到該方案有不少不足:
-
每個埠僅能支援一個服務,不能衝突
-
埠範圍必須為“30000-32767”,非常不友好
-
如果節點IP發生變化,服務也將無法訪問
因此,用於開發測試還說得過去,用於生產的話,會影響“升職加薪贏取白富美”!我們得尋求更佳方案。
通過LoadBalancer Service在外部訪問叢集應用
LoadBalancer Service是暴露服務到外部(Internet)的標準方式,它可以完美的解決我們上面的問題,不過使用之前,我們得有一個loadBalancerIP——負載均衡IP。一般的雲廠商都能夠提供這個服務。這裡我們以騰訊云為例進行講解。
首先,我們需要在騰訊雲的k8s叢集建立一個Demo Deployment,配置參考上文。
接下來,我們需要建立一個負載均衡服務,以便得到負載均衡IP:
有了IP,我們就可以建立LoadBalancer Service了,YAML定義如下所示:
apiVersion: v1 #api版本 kind: Service #Service metadata: #標準元資料 name: demo #名稱 namespace: default #名稱空間 spec: #規範 clusterIP: 10.3.255.28 #叢集IP loadBalancerIP: 106.52.99.55 #負載均衡IP ports: #埠列表 - name: tcp-80-80 nodePort: 31504 #節點IP port: 80 #Pod埠 protocol: TCP #協議 targetPort: 80 #服務埠 selector: #選擇器 app: demo k8s-app: demo qcloud-app: demo type: LoadBalancer #服務型別,這裡為負載均衡服務型別
如上述定義所示,我們進行建立Service。該定義設定了叢集IP為“10.3.255.28”,負載均衡IP(loadBalancerIP)為“106.52.99.55”,節點埠為“31504”。Service定義好了,我們對負載均衡服務進行配置,配置一個TCP監聽器如下所示:
接下來,我們就可以盡情訪問了。通過節點IP和埠訪問:
通過負載均衡IP訪問:
通過繫結域名訪問(請設定域名解析為負載均衡IP):
Microsoft SQL Server資料庫部署
為了讓大家更好的使用上述物件進行部署,本節筆者使用大家熟知的Microsoft SQL Server資料庫來進行部署。
-
部署目標
完成Linux版本的Microsoft SQL Server 2017的部署
使用節點目錄“/var/mssql”來儲存資料庫檔案
設定初始密碼為“123456abcD”
開放1433埠,並且允許外部應用通過節點埠“30338”訪問資料庫
-
YAML定義
接下來,我們需要定義YAML檔案。根據部署目標,我們確定可以使用Deployment物件和Service物件來完成本次部署。YAML檔案定義如下如下所示:
apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: mssql name: mssql #當前Deployment物件名稱,同一個名稱空間下必須唯一 spec: replicas: 1 #副本集數量 revisionHistoryLimit: 2 #保留的歷史記錄數,設定為0將清理部署的所有歷史記錄,無法回滾 strategy: type: Recreate template: metadata: labels: app: mssql spec: containers: - env: #環境變數設定 - name: ACCEPT_EULA value: "Y" - name: SA_PASSWORD #sa密碼設定 value: 123456abcD image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu #映象 imagePullPolicy: Always name: mssql ports: - containerPort: 1433 #容器埠,SQLServer資料庫預設埠為1433 resources: #資源限制 limits: cpu: "2" memory: 2096Mi requests: cpu: 100m memory: 827Mi volumeMounts: - mountPath: /var/opt/mssql/ name: data-vol restartPolicy: Always terminationGracePeriodSeconds: 30 #Pod結束時等待時長(單位為秒) volumes: - name: data-vol hostPath: #使用主機目錄 path: /var/mssql --- apiVersion: v1 kind: Service metadata: labels: app: mssql name: mssql #服務名稱 spec: ports: - name: tcp-1433-1433 nodePort: 30338 #節點埠,注意預設的埠範圍為“30000-32767”,注意不要衝突 port: 1433 #埠 protocol: TCP targetPort: 1433 #目標埠 selector: #Pod標籤選擇器 app: mssql sessionAffinity: None type: NodePort #服務型別,這裡是負載均衡型別
-
執行部署
接下來,我們使用命令執行部署:
kubectl apply -f mssqlserver.yaml
“kubectl apply”命令既可以建立資源,也可以用於更新資源物件。接下來我們通過命令可以檢視部署狀態:
kubectl get svc -o wide -lapp=mssql kubectl get po -o wide -lapp=mssql kubectl get deployment -o wide -lapp=mssql
如上圖所示,部署已經成功,那麼接下來我們可以使用管理工具進行連線訪問:
往期內容連結
Docker+ Kubernetes已成為雲端計算的主流(二十五)
容器化之後如何節省雲端成本?(二十六)
瞭解Kubernetes主體架構(二十七)
使用Minikube部署本地Kubernetes叢集(二十八)
使用kubectl管理k8s叢集(二十九)
使用Kubeadm建立k8s叢集之部署規劃(三十)
使用Kubeadm建立k8s叢集之節點部署(三十一)
叢集故障處理之處理思路以及健康狀態檢查(三十二)
叢集故障處理之處理思路以及聽診三板斧(三十三)
開源匯入匯出通用庫Magicodes.ExporterAndImporter釋出
使用Kubectl部署應用
通過Service訪問應用 (