昨天學會了如何觀測並排查錯誤,但是要訪問APP總不可能都用Proxy監聽吧。所以呢,今天就要來學習何謂Services以及如何expose我們的APP。
是一個能夠將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 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,如果沒有指定的話,在我們部屬的時候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:
...(省略)
如同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官方文件