用過Kubernetes的人應該都會知道Service服務的好處。在前幾天我們試過用deployments管理多個Pod,而service就是一個接口可以讓外部的服務透過這個接口存取到後面的Pod。有了service管理可以省掉很多事情,想想看使用deployments管理Pod時,如果Pod重啟的話就會換一組cluster-ip,這樣如果你透過cluster-ip去連接到後面的Pod進行服務,就會受到cluster-ip變動的影響,當你用了service後他就會固定指向deployment底下的Pod,不會受到ip改變的影響。
我們以下面的YAML為例子:
# k8s-nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-nginx-deploy
namespace: default
labels:
app: k8s-nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: k8s-nginx-deploy
template:
metadata:
labels:
app: k8s-nginx-deploy
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
nodeSelector:
name: k8s-node02
---
apiVersion: v1
kind: Service
metadata:
name: k8s-nginx-service # service的名字
spec:
selector:
app: k8s-nginx-deploy # 指定有哪些tag的Pod可以提供服務
ports:
- name: http #幫這個port取一個名字
port: 7777 #給定這個service對應出來的port
targetPort: 80 #給定由Pod對應出來的port
protocol: TCP #連線類型,提供TCP以及UDP
在26~37行部份新增了Service的設定。在這部份的設定中,selector指定了有這些標籤的Pod提供服務,所以不會受到Pod cluster-IP的變動影響(由deployment重啟的Pod其標籤不變)
kuebctl apply -f k8s-nginx-deploy.yaml
這裡我們可以看到Pod部屬完成後,以及service的狀態:
可以看到新增了一個名為k8s-nginx-service的服務,他的使用方式也很簡單:
用service的cluster-ip以及他的port就可以連線。
那同樣好用的東西在KubeEdge上能不能用呢?我們在KubeEdge上面再做一次同樣的實驗:
# edge-nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubeedge-nginx-deploy
namespace: default
labels:
app: kubeedge-nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: kubeedge-nginx-deploy
template:
metadata:
labels:
app: kubeedge-nginx-deploy
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
nodeSelector:
name: edge
---
apiVersion: v1
kind: Service
metadata:
name: kubeedge-nginx-service
spec:
selector:
app: kubeedge-nginx-deploy
ports:
- name: http
port: 6666
targetPort: 80
protocol: TCP
kuebctl apply -f edge-nginx-deploy.yaml
確認過服務跟Pod有正常運行後,我們試試看:
curl 10.109.63.238:6666
由此可知KubeEdge沒辦法用Service。