Google Code Prettify

2020年1月8日 星期三

部署 RESTful service 到 Kubernetes

這篇將接續「部署 RESTful service 到 docker」,將 docker image 部署到 Kubernetes!
  • push docker image 到 Docker Hub
docker tag steven/hello twleader/hello
docker push twleader/hello
我在 Docker Hub 上有個帳號 --- twleader, 所以先將 docker image 加上標簽,命名為 twleader/hello, 然後推送到 Docker Hub,應該可以在 Docker Hub 看到如下的結果。
  • 部署 docker image 到 Kubernetes
kubectl run hello --image=twleader/hello --port=9080 --generator=run-pod/v1
上述指令指出,要部署的 image 為 twleader/hello,部署上去後 pod 的名稱為 hello,K8S 要 listen 9080 port。使用 kubectl get rc 及 kubectl get pods 指令查看結果,如下圖。Kubernetes 先創建一個 ReplicationController 後,再於其上創建一個 pod。
執行到這,外部還沒辦法訪問到該 REST API,需要創建一個服務,將這個 ReplicatoinController 暴露出來給外部。
  • 創建服務
kubectl expose rc hello --type=LoadBalancer --name hello-http
如上指令,創建一個命名為 hello-http 的服務,將剛剛創建的 rc 暴露給外部。以 kubectl get svc 查看,可以看到如下結果。
如果是在真的 Kubernetes 上執行,應該等個幾分鐘,EXTERNAL-IP 那邊會出現外部的 IP,但是我是用 minikube,要知道暴露給外部的 IP 需要用 minikube service 指令查看,如下圖,得知是 192.168.99.100:31374。
  • 測試
curl 192.168.99.100:31374/hello/Steven
順利得到如下結果:

【番外篇1】
上面創建服務的小節裡,當創建完服務,minikube 主動幫我們配置對外的 IP、port,是否可以繞過 service,直接與 pod 的連線呢? 方法如下:
kubectl port-forward hello-rvx2n 8888:9080
外面對 port 8888 的 request 直接 forward 到 pod hello-rvx2n 的 port 9080,測試一下 ...
【番外篇2】
ReplicationController 即將被淘汰,改用 ReplicaSet 取代,上面建立 rc 的步驟這裡改成用 rs,可以先建立一個 yaml 檔,如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: twleader/hello
然後下以下指令,建立 rs:
kubectl create -f hello-replicaset.yaml
接著建立服務將它暴露給外部:
kubectl expose rs hello --type=LoadBalancer --port 9080 --name hello-http
【番外篇3】
上面用 kubectl expose 建立服務後,Kubernetes 給了這個服務一個外部 IP,讓 Kubernetes 外的程式可以訪問到 pod 裡的 REST API。事實上,Kubernetes 內部所有 Pod 會有個內部 IP,服務也會有個內部 IP,使用 kubectl exec 指令,直接連結到某個 Pod,也可以測試,指令如下:
kubectl exec hello-rvx2n -- curl -s http://10.96.217.26:9080/hello/Steven

沒有留言:

張貼留言