我認知的Service是定義各個Pods之間是如何溝通的規則,類似Docker的Network。而它的主要方式就是類似ReplicationController一樣,透過selector來根據Pod的label,使得符合條件的Pod會自動建立Endpoints來配對到這個Service。
而Service主要分為三種類型:
ClusterIP:在集群中產生一個Virtual IP,如果不指定的話,這個IP只能在集群內部訪問。ClusterIP會讓Pod的某個Port對應到這個Virtual IP的某個Port,在YAML中前著為targetPort,而後者為port。這樣如果其他Pod想要訪問這個被Service所綁定的Pod,就可以直接透過這個這個Virtual IP的port來訪問。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 8080 # ClusterIP的Port
targetPort: 80 # Pod的Port
NodePort:將前面ClusterIP的Port映射到某個Port,後面這個Port預設會在所有Nodes上暴露出來,我們稱其為nodePort,另外nodePort的預設範圍會在30000-32767之間。如果不指定的話,會在此範圍中選一個分配給你。
Pod(targetPort: 80) ⇒ Service(port: 8080) ⇒ Nodes(nodePort: 30007)
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 8080
targetPort: 80
nodePort: 30007
此外,如果再spec.externalTrafficPolicy設置Local,那nodePort就會限制在那個Pod所在的節點才能訪問。
LoadBalancer:主要是在使用公有雲的LoadBalancer做搭配時會用到,像是AWS的ELB之類的,而這些公有雲都會有自己的設定方式。如果是在地端的話,設置LoadBalancer的效果是與NodePort相同的。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.0.171.239
type: LoadBalancer