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: nginx
label的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的入口,訪問方式: