1. 程式人生 > 實用技巧 >Kubernetes 0-1 瞭解Service

Kubernetes 0-1 瞭解Service

Service介紹

按照官方文件的說法,在K8S中,Service是將執行在叢集中的一組Pod的應用公開為網路服務的抽象方法,是K8S的核心概念之一,Service的主要作用是使客戶端發現Pod並與之通訊。

簡單理解起來就是,由Service提供統一的入口地址,然後將請求負載分發到後端Pod的容器應用。

為什麼有Service

叢集中部署了Pod,應用是成功的部署起來了,但是隻是至此的話,Pod提供服務訪問存在以下一些問題。

  • Pod是短暫的,可能會被銷燬或重新排程,這使得Pod的IP是隨時變動和更新的;
  • 部署多個Pod的伸縮問題,流量分配問題;
  • 叢集外部客戶端無法直接訪問Pod。

這時候就需要Service,Pod作為Service的後端提供服務。所以我們可以想象,Service需要完成的事情:

  • 服務發現,通過Pod的lable查詢目標Pod,將查詢的Pod的註冊到自己的後端列表,Pod的IP資訊發生更改,後端列表也同步更新;
  • 負載均衡,請求到達Service之後,將請求均衡轉發的後端列表;
  • 服務暴露:對外提供統一的請求地址。

建立Service

在建立Sercvice之前我們首先建立service代理的Pod,nginx-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80

先給到一個簡單的Service定義例項nginx-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

spec.ports.port是Service對外提供服務的埠,spec.ports.targetPort是轉發到Pod內的訪問埠;

通過spec.selector發現同一名稱空間下帶有app=nginx的label的Pod作為後端。

建立命令:

kubectl apply -f nginx-service.yaml

Service作為Pod的負載均衡器,使用service.spec.selector欄位去匹配Pod,上面示例中,nginx Service將通過app: nginx的label查詢Pod作為後端。

建立Service之後,檢視Service的後端:

kubectl get svc -o wide
kubectl describe svc nginx

在建立Sercvice之前,我已經建立了一個帶有app: nginxlabel的Pod,所以可以看到Service的EndPoints中已經有了一個後端(10.244.1.25)了,Endpoint也是一種K8S資源,可以使用kubectl get ep命令檢視。

除了以上使用yaml定義Service之外,還可以使用以下命令建立Service:

# 暴露Pod
kubectl expose pod nginx --name=nginx --port=80 --target-port=80 --protocol=TCP --type=NodePort
# 或者Deployment管理的Pod
kubectl expose deploy nginx --name=nginx --port=80 --target-port=80 --protocol=TCP --type=LoadBalancer

Service型別

通過Service.spec.type定義,最常用的三種:ClusterIP(預設),NodePort、LoadBalancer。

CLusterIP

指定type為ClusterIP時,它將被分配一個叢集內部的IP,在叢集內部通過訪問它來訪問後端Pod,這種Service一般只供叢集內部訪問。

NodePort

指定type為NodePort時,會在所有節點分配一個埠(預設從30000-32767)作為service的入口,訪問方式: