Pod是有lifecycle的,當worker node死亡時,包含在內的pod也會一起消失
而一個ReplicaSet是動態的驅動cluster回到期望的狀態,以維持app的運作
Service在k8s內是一種抽象層,他定義pod邏輯以及policy來決定如何訪問
服務再依賴的pod之間實現鬆散的耦合,並使用YAML(首選) or JSON來定義
雖然每個pod都有獨立的ip address,且能夠暴露ip在cluster之外不需要依賴service
Service允許你的app接收流量,以及透過不同的方式將服務裸露
ClusterIP (default) - Exposes the Service on an internal IP in the cluster. This type makes the Service only reachable from within the cluster.
NodePort - Exposes the Service on the same port of each selected Node in the cluster using NAT. Makes a Service accessible from outside the cluster using :. Superset of ClusterIP.
LoadBalancer - Creates an external load balancer in the current cloud (if supported) and assigns a fixed, external IP to the Service. Superset of NodePort.
ExternalName - Maps the Service to the contents of the externalName field (e.g. foo.bar.example.com), by returning a CNAME record with its value. No proxying of any kind is set up. This type requires v1.7 or higher of kube-dns, or CoreDNS version 0.0.8 or higher.
此外需要注意,再有時候service並沒有定義selector,,當service沒有與selector一起創建,將不會產生endpoint,這可以使你手動service對應到特定endpoint上
此外沒有selector可能是採用嚴格的type: ExternalName
service使用lables以及selectors匹配pod,而這將允許你在k8s中的objects進行分組
Labels是採用key/value的形式附加在objects上
舉例來說,可以使用labels將以下的objects進行分組
首先取得pods kubectl get pods
取得cluster中的service kubectl get services
此時的service是turtorial創建的,接著要使用NodePort做為參數創建service並exposekubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
成功後會在console看到 service/kubernetes-bootcamp exposed
再次運行 kubectl get services
會看到有兩個service以及接收一個獨立的ip以及內部和外部對應的port
接著查看有有哪些藉由NodePort選項而暴露的port kubectl describe services/kubernetes-bootcamp
將NodePort導出為環境變數
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
curl $(minikube ip):$NODE_PORT
Deployment會為pod創建label,所以先查看deployment的狀況 kubectl describe deployment
接著取得pod列表,使用-l的參數帶入在deployment內查看到的label kubectl get pods -l app=kubernetes-bootcamp
service也能用同樣的方法查詢 kubectl get services -l app=kubernetes-bootcamp
將pod name導出為環境變數
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ echo Name of the Pod: $POD_NAME
加入新的label kubectl label pods $POD_NAME version=v1
再次查看pod會發現有新的label kubectl describe pods $POD_NAME
也能用新的label取得pod kubectl get pods -l version=v1
使用標籤刪除service kubectl delete service -l app=kubernetes-bootcamp
可以再刪除前先下 kubectl get services
在執行刪除
再次取得services list kubectl get services
可以發現有service被刪除
確認由NodePort暴露的Service被刪除 curl $(minikube ip):$NODE_PORT
此時證明了從外部無法透過service訪問app,此時可以在k8s內部下達指令查看app是否正常 kubectl exec -ti $POD_NAME -- curl localhost:8080