關於Service的概念及其實例,可以參考這篇文章【K8S】Service概念及其實例
一句話概括Service的作用,Service負責將客戶端的請求轉發到具有特定標籤的Pod上。
但是Service和Pod並不是直接相連的,Pod的ip及端口會被保存在Service的EndPoints列表中,查看一個Service的EndPoints的命令是
kubectl get endpoints service名稱 -n 命名空間
那麼外界如何訪問這個Service呢?或者說,怎麼將Service暴露給外部呢?
第一種方式,可以使用NodePort方式。
顧名思義,在某個節點上開放一個端口,用於將請求轉發到對應的Service端口上,Service再查詢EndPoints列表,最後將請求轉發到具體的Pod上。
採用NodePort方式的簡單Service樣例
apiVersion: v1
kind: Service
metadata:
name: Service-nodePort
spec:
clusterIp: 100.10.10.9
type: NodePort //設置爲NodePort
ports:
- port: 80
targetPort: 8080
nodeport: 30123 //通過節點的30123端口可以訪問該Service
selector:
app: test
只要我們訪問這個節點的ip:30123,然後流量會轉發到該service的clusterIp:80端口上,再轉發到endPoints列表中的地址(即pod的ip:端port)上,此時流量已經到了pod上,pod最後將流量下發到該Pod上的容器的8080端口上,由容器完成對請求的處理。
但是nodeport的值只能在【30000,30767】之間。
第二種方式,通過Ingress暴露服務
Ingress更像是請求的引路人,可以依據請求的地址,轉發到對應的service上。
一個簡單的實例
apiVersion: v1
kind: Ingress
metadata:
name: Ingress-test
spec:
rules:
- host: test.example.com
http:
paths:
- path: /a //對test.example.com/a請求轉發至s1服務
backend:
serviceName: s1
servicePort:80
- path: /b //對test.example.com/b請求轉發至s2服務
backend:
serviceName: s2
servicePort:80
該ingress實例,可以將對一個主機的不同訪問路徑轉發到不同的服務上
當然,這裏的host爲數組,說明Ingress可以將對不同主機的不同訪問路徑轉發到不同的服務上,更加靈活。
Service類型
headLess,顧名思義,無頭服務。
無頭服務不需要配置clusterIp,那麼配置一個headLess類型的Service時,只需要將spec.clusterIp設置爲None。
這種類型的Service所管轄的每一個Pod,都會有一個域名,所以這些Pod可以通過域名互相訪問。
未完