k8s之service


 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

解析的結果為后端podip

        

 

對於前面service類型為clusterip

dig -t A myapp.default.svc.cluster.local. @10.96.0.10

解析結果為CLUSTER-IP


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM