網頁

2024/1/2

Kubernates 使用Service曝露應用程式

本篇參考官方教學Using a Service to Expose Your App進行操作。


Kubernates的Service是用來定義邏輯Pods組與存取這些Pods政策的抽象,藉此來解耦不同Pods組之間的依賴,並依此對外曝露Pods的應用程式。Service使用YAML或JSON來定義,並使用label selector(標籤選擇器)來決定所代表的Pods。


範例環境:

  • MacBook Pro Apple M1 Pro (ARM64)
  • macOS Ventura 13.0.1
  • Docker Desktop 4.21.1


事前要求

參考「Kubernates 使用Deployment部署應用程式」建立Deployement。


查看Services

在終端機輸入kubectl get services檢視Service清單,目前只有一個minkube啟動(minikube start)kubernates時產生的預設kubernetes Service。

% kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5d18h

建立Service

目前有一個已部署的Deployment kubernetes-bootcamp

輸入kubectl expose deployment <DEPLOYMENT_NAME> --type="NodePort" --port 8080建立Service,也就是將Deployment的Pods對外曝露。<DEPLOYMENT_NAME>為Deployment的名稱。例如下面將Deployment kubernetes-bootcamp對外曝露為Service。

% kubectl expose deployment kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed

查看Service

再次輸入kubectl get services可看到新建的Service名稱為kubernetes-bootcamp

% kubectl get services
NAME                  TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1     <none>        443/TCP          5d18h
kubernetes-bootcamp   NodePort    10.97.91.51   <none>        8080:31162/TCP   30m

輸入kubectl describe services <SERVICE_NAME>可查看Service詳細資訊,<SERVICE_NAME>為Service名稱。

例如下面查看Service kubernetes-bootcamp的詳細資訊。

% kubectl describe services kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   app=kubernetes-bootcamp
Annotations:              <none>
Selector:                 app=kubernetes-bootcamp
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.97.91.51
IPs:                      10.97.91.51
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31162/TCP
Endpoints:                10.244.0.9:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

NodePort為對外曝露的port,為31162

輸入minikube ip檢視node的外部ip。

% minikube ip
192.168.49.2

所以Service所代表的Pods對外曝露的IP和port為192.168.49.2:31162


取得Service URL

由於運行在Docker容器環境的minikube與本機網路是隔離的,所以必須建立本機與minikube的Service的通道(tunnel)才能從本機連到Service。開啟新的終端機,輸入minikube service <SERVICE_NAME> --url取得在minikube cluster中Service的URL。

% minikube service kubernetes-bootcamp --url

http://127.0.0.1:50552
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it

由上得知Service kubernetes-bootcamp的URL為127.0.0.1:50552


存取應用程式

輸入curl http://127.0.0.1:50552存取Service所代表Pods中的應用程式。

% curl http://127.0.0.1:50552
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-f95c5b745-ckkdz | v=1


沒有留言:

張貼留言