Service用來提供Pod一個固定的連線入口。因為Pod重新建立後IP可能會改變,如果其他Pod直接使用Pod IP連線,就可能在Pod更新或故障後失效。
Service會依照Label 找到符合條件的Pod,並提供固定的IP與DNS名稱。其他應用程式只要連到Service,就不需要知道後方實際是哪一個Pod。
下面為常見的Service類型
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx-demo
ports:
- port: 80
targetPort: 80
type: ClusterIP
selector中的app: nginx-demo必須和Deployment建立的Pod Label相同,Service才能找到要轉送流量的 Pod。
port是Service對外提供的連接埠,targetPort則是實際轉送到Pod容器的連接埠。這個範例中兩者都是 80。
套用後輸入kubectl get service來查看Service
不過因為ClusterIP是只能從叢集內部存取,所以這裡建立一個測試用的Pod
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox:1.36
command: ["sh", "-c", "sleep 3600"]
套用後輸入kubectl exec -it test-pod -- sh進去Pod內部。
輸入wget -qO- http://nginx-service來測試Service。
會看到回傳的html這樣就代表這個Service是正常運作的