如何讓 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 工具去做開放就好了。
今日總結 :