K8s三種網絡: node network
pod network
cluster network --> virtual ip --> service 規則
service: kube-proxy監控api-server,api-server數據發生改變,相應的kube-proxy就會改變service規則,
service有三種工作模式:userspace, 1.1版本之前
iptables, 1.10之前
ipvs ,1.11版本之后
kubectl delete svc redis
service service名
kubectl explain service
kubectl explain service.spec
service類型:
ExternalName, 集群外的服務引用到集群內 外部服務名稱
ClusterIP, 僅用於集群內通信
NodePort, 用於與集群外通信
LoadBalancer,部署到虛擬機,虛擬機工作在環境中,雲環境支持負載均衡,lbaas, 類似nodeport負載均衡
清單文件創建service
ClusterIP, 僅用於集群內通信 訪問時service先指向clusterip,在指向pod ip
kubectl explain service.spec.ports
vim redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis service名稱
namespace: default
spec:
selector: 選取的pod標簽 關聯到pod
app: redis
role: logstor
clusterIP: 10.97.97.97 設定clusterip
type: ClusterIP 選取clusterip類型的service
ports:
- port: 6379 service端口 引用的service端口與后端pod建立關系
targetPort: 6379 指定的pod的端口
kubectl apply -f redis-svc.yaml 創建service
kubectl get svc 查詢service
kubectl describe svc redis service-redis的詳細信息
Endpoints: 10.244.1.66:6379 后端地址,即關聯的pod地址
資源記錄:SVC_NAMe.NS_NAME.DOMAIN.LTD.
服務名 名稱空間 集群域名后綴
集群域名默認后綴 svc.cluster.local.
比如:剛創建的service 名為redis, 那么域名為:
redis.default.svc.cluster.local.
直接訪問域名就可以訪問服務了,並解析pod地址了
nodeport默認分配端口 30000-32797
創建nodeport服務
引用前面deploy控制器myapp-deploy創建的pod
cp redis-svc.yaml myapp-svc.yaml
vim myapp-svc.yaml
apiVersion: v1
kind: Service
metadata: service屬性
name: myapp
namespace: default
spec:
selector:
app: myapp 關聯pod
release: canary
clusterIP: 10.99.99.99 指定clusterip
type: NodePort 指定service類型
ports:
- port: 80 service端口
targetPort: 80 關聯的pod端口
nodePort: 30080 外部訪問node的端口
kubectl create -f myapp-svc.yaml 創建service
kubectl get svc
80:30080/TCP
service端口80 映射 node端口30080
測試
在外面訪問任一節點 比如192.168.81.10:30080
while true; do curl http://192.168.81.30:30080/hostname.html;sleep 1;done
ExternalName
集群內的pod訪問集群外的資源,
kubectl explain svc.spec.externalName
sessionAffinity
kubectl explain svc.spec
sessionAffinity <string> 保持會話IP 同一個IP請求始終發往同一個后端pod
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'
kubectl describe svc myapp 查看是否加上sessionAffinity
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}' 改回None,就不會始終發往一個pod
headless 無頭service 無頭服務 service直接指向pod IP
cp myapp-svc.yaml myapp-headless.yaml
vim myapp-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: None
ports:
- port: 80
targetPort: 80
kubectl apply -f myapp-headless.yaml
kubectl get svc
安裝dig命令 yum install bind-utils -y
查詢coreDns
kubectl get svc -n kube-system
解析service
dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
服務域名 @指定coredns
解析的結果為后端pod的ip
對於前面service類型為clusterip的
dig -t A myapp.default.svc.cluster.local. @10.96.0.10
解析結果為CLUSTER-IP