◆Service的工作模式:userspace, iptables, ipvs
•userspace: 1.1以前;已被淘汰。
•iptables: 1.10以前
• 靈活,功能強大
• 規則遍歷匹配和更新,呈線性時延
• 可擴展性
•ipvs: 1.11以後,若沒有配置ipvs,則降級為iptables;
• 工作在內核態,有更好的性能
• 調度算法豐富:rr,wrr,lc,wlc,ip hash
◆Service的類型:即服務的對外暴露方式。
•ExternalName:當Service類型是ExternalName時,Service所關聯的不是本地Pod應用,而是集羣外部的服務。從而實現集羣內部的Pod應用調用集羣外部的服務,可以把集羣外部的服務當作內部服務一樣去調用它。當Service類型是ExternalName時,spec.externalName字段才生效。
•ClusterIP:默認,自動分配一個僅cluster內部可以訪問的虛擬IP,用於集羣內部通信。
•NodePort:分配一個內部集羣IP地址,並在每個節點上啓用一個端口來暴露服務,可以在集羣外部訪問。 訪問地址:node端口範圍30000-32067。
流:Client→NodeIP:NodePort→ClusterIP:ServicePort→PodIP:containerPort。
•LoadBalancer:分配一個內部集羣IP地址,並在每個節點上啓用一個端口來暴露服務。 Kubernetes會請求底層雲平台上的負載均衡器,將每個Node([NodeIP]:[NodePort])作為後端添加進去。
◆service例(類型:ClusterIP/redis-svc.yaml)
1 apiVersion: v1
2 kind: Service
3 metadata:
4 name: redis
5 namespace: default
6 spec:
7 selector:
8 app: redis
9 role: logstor
10 clusterIP: 10.96.97.97
11 type: ClusterIP
12 ports:
13 - port: 6379
14 targetPort: 6379
View Code
●確認
創建:kubectl apply -f redis-svc.yaml
查看服務:kubectl get svc
kubectl describe svc redis
查看端口:ss -tnl
◆service例(類型:NodePort/nginx-svc.yaml)
1 apiVersion: v1
2 kind: Service
3 metadata:
4 name: nginx
5 namespace: default
6 spec:
7 selector:
8 app: nginx
9 clusterIP: 10.96.97.97
10 type: NodePort
11 ports:
12 - port: 80
13 targetPort: 80
14 nodePort: 30080
View Code
•測試方法:#while true; do curl http://node:30080/; sleep 1; done
▶無頭(headless)service
1 apiVersion: v1
2 kind: Service
3 metadata:
4 name: nginx
5 namespace: default
6 spec:
7 selector:
8 app: nginx
9 clusterIP: None #無頭service僅支持類型為clusterIP。
10 ports:
11 - port: 80
12 targetPort: 80
View Code
◆資源記錄:
格式:SVC_NAME.NS_NAME.DOMAIN.LTD.
svc.cluster.local.
------山的那一邊