通過Service訪問應用 (2)

  • 2019 年 10 月 3 日
  • 筆記

 

 目錄  

  • 通過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

如上圖所示,部署已經成功,那麼接下來我們可以使用管理工具進行連接訪問:

 

 

往期內容鏈接

集群故障處理之處理思路以及健康狀態檢查(三十二)

集群故障處理之處理思路以及聽診三板斧(三十三)

開源導入導出通用庫Magicodes.ExporterAndImporter發布

使用Kubectl部署應用

通過Service訪問應用 (1)