kubernetes k8s container ReplicaSet Deployment Rolling Update Kubectl Create Service

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

從上圖可以發現,Kubernetes Service與Deployment、ReplicaSet是不同層次但卻可以同時存在的一種資源類型,前者主要提供應用服務,後兩者提供管理功能。

Kubernetes Service使用相同Label (標籤)來匡住Pod,並用Port對接與Pod之間的通訊,如下圖:

Kubernetes Service

部署Kubernetes Service

本篇部署範例以下圖為目標:

kubectl service deployment replicaset

注意:本篇所部署的範例,只能提供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跑一下,會提示如下資訊:

Minikube service --url
# 不用理會這個告警,後面的章節會說明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的首頁預設畫面囉!

Kubernetes Service Minikube service --url nginx

~ END ~


,

Related posts

Latest posts