For K8S Beginner EP 9:部署Kubernetes Service來提供服務
前言
此前,已經針對Pod的管理做了說明,包括使用ReplicaSet來建立一組Pod,使用Deployment來管理ReplicaSet部署版本,但仍無法提供服務,需要一個組件協助這群Pod來提供“服務”,在Kubernetes中,有一種資源叫”Service”,它負責讓一群相同Pod提供服務給客戶端使用,透過不同的設定,可以是Kubernetes內部或是外部的客戶端。
通常,講Kubernetes Service前要先了解Kubernetes的網路架構,但這裡特別先講Kubernetes Service再說明網路架構,因為輸出服務是對開發者最重要的事情,簡單說,先把骨架、重要臟器搞懂,再研究循環系統!
Kubernetes Service官方說明:Link
Kubernetes Service
Kubernetes Service是一個把服務抽象化的資源類型,它把一群相同Pod捆在一起,以統一的IP或DNS名稱作為對外服務的入口,並且提供負載平衡的功能,有點像是F5 Load Balancer。
從上圖可以發現,Kubernetes Service與Deployment、ReplicaSet是不同層次但卻可以同時存在的一種資源類型,前者主要提供應用服務,後兩者提供管理功能。
Kubernetes Service使用相同Label (標籤)來匡住Pod,並用Port對接與Pod之間的通訊,如下圖:
部署Kubernetes Service
本篇部署範例以下圖為目標:
注意:本篇所部署的範例,只能提供Kubernetes內存取,無法提供Kubernetes環境以外的服務存取;若要對外,後面講述網路架構的時候會提到,屆時將再詳述一次,並實際操作一次!
步驟1:創建Deployment,參考前篇【For K8S Beginner EP 8:部署Kubernetes Deployment,並使用版本管理與回滾機制】,調整一下YAML內容,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-server-deployment
labels:
app: frontend
env: production
spec:
selector:
matchLabels:
app: frontend
replicas: 2
template:
metadata:
name: nginx-server
labels:
app: frontend
spec:
containers:
- name: nginx-server
image: nginx
ports: # 增加ports節點,用於描述這個Pod提供的Port有哪些
- containerPort: 80 # 指定這個Pod提供80 Port作為通訊使用
步驟2:創建一個service.yaml檔案,用於建立Kubernetes Service資源使用,內容如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector: # 透過selector指定要對應的Pod
app: frontend # 指定label (標籤)是app=frontend的Pod
ports:
- name: nginx-service-port # 給這個對外提供服務一個DNS名稱
port: 80 # Service的Port
targetPort: 80 # 目標Pod的Port
步驟3:使用kubectl create指令來建立並啟動Deployment與Service。
$ kubectl create -f deployment.yaml
$ kubectl create -f service.yaml
步驟4:使用kubectl get all指令觀察啟動結果。
NAME READY STATUS RESTARTS AGE
pod/nginx-server-deployment-66c88b758b-jdqgw 1/1 Running 0 28m
pod/nginx-server-deployment-66c88b758b-w5bdf 1/1 Running 0 28m
# 多一個nginx-service的Kubernetes Service資源
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d
service/nginx-service ClusterIP 10.109.101.171 <none> 80/TCP 29m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-server-deployment 2/2 2 2 33m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-server-deployment-66c88b758b 2 2 2 33m
步驟5:使用kubectl describe來觀察Service的細節。
$ kubectl describe service nginx-service
Name: nginx-service
Namespace: default
Labels: <none>
Annotations: <none>
# 將Service對應到一樣擁有app=frontend標籤的Pod
Selector: app=frontend
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.109.101.171
IPs: 10.109.101.171
# 在Kubernetes環境內,可以透過DNS名稱來存取這個服務
Port: nginx-service-port 80/TCP
# Pod的Port是80
TargetPort: 80/TCP
# 列出對應到的Pod的IP以及Port
Endpoints: 172.17.0.4:80,172.17.0.5:80
Session Affinity: None
Events: <none>
透過Minikube瀏覽服務(Nginx)頁面
因為Minikube是Lab環境,無法直接提供服務,可以透過Minikube提供的網路繞送方式解決這個問題,其實非常簡單,只有2個步驟:
步驟1:使用minukube service指令獲得存取的網址,指令語法如下:
minikube service [服務名稱] --url
本篇實際指令如下:
$ minikube service nginx-service --url
讓Minikube跑一下,會提示如下資訊:
# 不用理會這個告警,後面的章節會說明Node Port的用途及設定
! service default/nginx-service has no node port
# 下面就是可以存取服務的網址,Minikube會幫忙把網路繞送進去
http://127.0.0.1:50800
# 為什麼需要繞送,這個說明非常清楚,主因是透過Docker模擬的關係,但這並不影響練習喔!
! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
步驟2:開啟瀏覽器,連到上述的網址 (本篇範例是http://127.0.0.1:50800),就可以看到Nginx的首頁預設畫面囉!
~ END ~