iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 10

Day10 深入淺出Kubernetes(三)

  • 分享至 

  • xImage
  •  

昨天學會了如何觀測並排查錯誤,但是要訪問APP總不可能都用Proxy監聽吧。所以呢,今天就要來學習何謂Services以及如何expose我們的APP。

Service

是一個能夠將Pod上的應用程序公開的方法。僅需要撰寫好YAML檔,K8s就會自動幫我們運作。在公開的時候K8s會為Pod提供屬於自己的IP address以及一個DNS名稱。

那為甚麼要公開我們的應用程序呢?

假設今天後端跟前端各有自己的Pod,當他們之間要互相交互的時候就必須透過某個方式找到對方,尤其是當今天後端有許多的Pod,每次運行的時候都會使用到不同的Pod,就需要自己來連接後端的Pod到前端;但是今天我們只需要公開Pod,那剩下的事情K8s就會幫我們解決。

首先查看一個Service的範例YAML檔,當我們運行此檔案時,Service selector的controller會不斷尋找跟selector匹配的label(如例則是app = my-first-app)以及TCP port為9487的Pod,再將所有Pod發佈到"first-service"的地方。

apiVersion: v1
kind: Service
metadata:
  name: first-service
spec:
  selector:
    app: my-first-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9487

而Service也可以公開多個ports,只要稍微修改YAML檔的設定,如下則是公開了http以及https兩個port。

apiVersion: v1
kind: Service
metadata:
  name: first-service
spec:
  selector:
    app: my-first-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9487
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8484

當然還有許多Service YAML檔的設定方法,想要了解的就再去深入摟。Service介紹

公開APP

首先,先依照前幾天的作法將我們的APP deploy好。
再確認好APP running之後,先來學習使用查看service狀態的命令。

kubectl get services

執行完的輸出的Kubernetes就是我們K8s本體。

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   52m

1.公開
再來就來使用expose命令公開我們的APP。

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

output

service/kubernetes-bootcamp exposed

2.查看公開後狀態
公開完再來查看一次我們的services,可以看到我們的APP已經公開了,並且公開在30177 PORT。

kubectl get services

output

NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1        <none>        443/TCP          57m
kubernetes-bootcamp   NodePort    10.104.239.126   <none>        8080:30177/TCP   5s

除了可以從get services看到PORT,也能透過describe查看PORT以及更多詳細資訊。

kubectl describe services/kubernetes-bootcamp

output

Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   app=kubernetes-bootcamp
Annotations:              <none>
Selector:                 app=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.104.239.126
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30177/TCP
Endpoints:                172.18.0.2:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

如果是執行在本機端就能直接訪問了,但是我們是建立在docker上的因此還需要建立外部訪問Pod的通道。
透過minikube提供的service命令就能建立通道了。

minikube service kubernetes-bootcamp --url

output

?  Starting tunnel for service kubernetes-bootcamp.
|-----------|---------------------|-------------|------------------------|
| NAMESPACE |        NAME         | TARGET PORT |          URL           |
|-----------|---------------------|-------------|------------------------|
| default   | kubernetes-bootcamp |             | http://127.0.0.1:55754 |
|-----------|---------------------|-------------|------------------------|
http://127.0.0.1:55754
❗  Because you are using a Docker driver on windows, the terminal needs to be open to run it.

接下來訪問localhost:55754就能看到我們的APP了!!

label

查看label
還記得我們上面提過label,如果沒有指定的話,在我們部屬的時候K8s會為我們自動建立名稱,能夠透過describe指令查看deployment,就可以找到我們的label。

kubectl describe deployment

output

Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Wed, 23 Sep 2020 22:59:30 +0800
Labels:                 app=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=kubernetes-bootcamp
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
...(省略)

修改label
在部屬完後想要修改也是可以的,只要使用label指令即可(Pods詳細名稱從describe取得)。

kubectl label pod kubernetes-bootcamp-57978f5f5d-s9pkm test=v1

output

pod/kubernetes-bootcamp-57978f5f5d-s9pkm labeled

再來查看修改後的label,可以看到已經將test=v1增加進去了。

kubectl describe pods kubernetes-bootcamp-57978f5f5d-s9pkm

output

Name:         kubernetes-bootcamp-57978f5f5d-s9pkm
Namespace:    default
Priority:     0
Node:         minikube/172.17.0.3
Start Time:   Wed, 23 Sep 2020 22:59:30 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=57978f5f5d
              test=v1
Annotations:  <none>
Status:       Running
IP:           172.18.0.2
IPs:
  IP:           172.18.0.2
Controlled By:  ReplicaSet/kubernetes-bootcamp-57978f5f5d
Containers:
...(省略)

刪除service

如同Day6所學的可以使用delete指令再搭配今天學的label來指定刪除service,刪除之後就不能透過外部來訪問Pod了。

kubectl delete service -l app=kubernetes-bootcamp

output

service "kubernetes-bootcamp" deleted

總結:

今天了解了Service、label以及expose pod的方法,明天就來學習如何How to scale my app以及透過Rolling Update來更新APP。

參考文獻:
Kubernetes官方文件


上一篇
Day9 深入淺出Kubernetes(二)
下一篇
Day11 深入淺出Kubernetes(四)
系列文
自我學習Docker的30天奇幻旅程24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言