7. kubernetes Service資源
[TOC]
本文基于馬哥的docker和k8s視頻總結, 在此致謝馬哥.
Service
工作模式: userspace, iptables, ipvs -> 四層代理
- userspace: 1.1 -
- iptables: 1.10 -
- ipvs: 1.11 +
四種類型:
-
ClusterIP
: 僅用于集群內部通信 -
NodePort
: 接入集群外的流量 -
LoadBalancer
: 依賴于底層LBAAS的云計算環(huán)境 -
ExternalName
: 把集群外的服務引入集群內部, 可在集群內部直接使用
資源記錄:
-
SVC_NAME.NS_NAME.DOMAIN.LTD.
(LTD: 資源域名后綴, 默認是svc.cluster.local.
或cluster.local.
)- 例如:
redis.default.svc.cluster.local.
- 例如:
kubectl explain svc
ClusterIP
apiVersion: v1
kind: Service
metadata:
name: redis # svc name
namespace: default
spec:
selector: # Service.spec.selector比較特殊, 只支持等值關系
app: redis
role: logstor
clusterIP: 10.97.97.97 # 固定地址, 但此種方法極易沖突, 建議不指定, 讓系統(tǒng)自動分配
type: ClusterIP
# sessionAffinity: 默認是None(隨機調度), 定義為ClientIP時會將來自同一個client的IP調度至同一個后端pod
ports:
- name: redis-pod # 指明pod名稱
port: 6379 # 對外提供服務的端口, 即service地址上的端口
targetPort: 6379 # 容器的端口, 即pod地址上的端口
# nodePort: 指明節(jié)點上的端口, 只有類型是NodePort才使用此項(在集群外被訪問時使用)
# protocol: TCP 默認就是TCP
kubectl apply -f svc-demo.yml
kubectl describe svc redis
Name: redis
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"redis","namespace":"default"},"spec":{"clusterIP":"10.97.97.97","...
Selector: app=redis,role=logstore
Type: ClusterIP
IP: 10.97.97.97
Port: redis-pod 6379/TCP
TargetPort: 6379/TCP
Endpoints: 10.244.1.34:6379 # 被Selector匹配到的后端地址
Session Affinity: None
Events: <none>
NodePort
- Client請求 -> NodeIP:NodePort -> ServiceIP:ServicePort -> PodIP:ContainerPort
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
selector:
app: mynginx
release: canary
type: NodePort
clusterIP: 10.99.99.99
ports:
- port: 80
targetPort: 80
nodePort: 30080 # 可以不指定, 系統(tǒng)動態(tài)分配, 默認范圍30000 - 32767
# 此時可被集群外訪問, 可看到請求會被負載均衡至node上的各pod
while true; do curl http://192.168.200.201:30080/hostname.html; sleep 1; done
ExternalName
- FQDN 被coreDNS解析 (CNAME -> 真正的FQDN)
kubectl explain svc.spec.externalName
headless-Service
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: mynginx
release: canary
clusterIP: None # 使用無頭service時這樣定義
ports:
- port: 80
targetPort: 80
dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
# 可看到地址直接被10.96.0.10的DNS服務器解析為myapp的pod的IP
dig -t A myapp.default.svc.cluster.local. @10.96.0.10
# 可以對比有頭服務