如何讓 Pods 提供外部服務連入,這邊就要使用到 Service,相關資訊可以參考 建立外部服務與Pods的溝通管道 - Services。針對連接 Service 的對象分為兩種。一種是叢集之外的外部對象,另一種則是叢集內的其他對象。
以叢集內部來說,假如其他 Pod 想要存取某個 Pod 的服務,雖然透過 IP 直接連接是可行的(因為網路連接預設不阻擋),但 IP 可能會變動,並非存取最好的方式。此時 Service 可以建立 ClusterIP,則其他 Pod 可以透過 Cluster IP 去連接該 Pod 所提供的服務。
如果是叢集外部的話,則可以透過 NodePort 或是 LoadBalancer 的方式來提供服務。因為本系列不談維運,所以這邊就以最快能夠看到成果的 NodePort 來進行測試跟開放服務。其他比較部分可以參考 Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?
ClusterIP
NodePort
建立第一個對外的 Service 服務
apiVersion: v1
kind: Service
metadata:
name: hello-shell
spec:
type: NodePort
ports:
- port: 8081
nodePort: 30390
protocol: TCP
targetPort: 30089
selector:
app: shell-server
apiVersion: v1
kind: Pod
metadata:
name: client-pod
labels:
app: client
spec:
containers:
- name: my-client
image: aeifkz/my-ubuntu:v1.0
ports:
- containerPort: 30089
kubectl get service ;
kubectl exec -it client-pod bash ;
nc [pod IP] 30089 ;
nc [cluster IP] 8081 ;
nc hello-shell 8081 ;
nc [node IP] 30390 ;
# 取得 minikube 內 service 開放的 url
minikube service hello-shell --url
# 或是用 kubectl port-forward 指令也是可以的
# 只是這樣開的話要從外部的機器去做測試。
kubectl port-forward svc/hello-shell 30390:8081 --address='0.0.0.0' ;
#連接開放服務的 IP 位址
nc [your_ip] [your_port] ;
我個人偏好第二種啦,就統一使用 kubectl 工具去做開放就好了。
今日總結 :