k8s之Service資源

1.Service概述node

  service是kubernetes中最核心的資源對象之一,service和pod之間是經過Label串起來,相同的Service的pod的Label是同樣的.同一個service下的全部pod是經過kube-proxy實現負載均衡.而每一個service都會分配一個全局惟一的虛擬ip,也就cluster ip.nginx

在該service整個生命週期內,cluster ip保持不變,而在kubernetes中還有一個dns服務,它會把service的name解析爲cluster ip.redis

service工做模式:userspace(1.1版本以前)、iptables(1.10版本以前)和ipvs(1.11版本以後)vim

類型:ExternalName(集羣內部pod想要訪問外部服務),ClusterIP,NodePort,後端

LoadBalancer:k8s若是部署在公有云上,且公有云支持LBAAS,k8s的CloudControllor會調用IAAS的api,建立service時會按需建立,刪除時會按需刪除,這種類型稱爲負載均衡器類型.api

資源記錄:SVC_NAME.NS_NAME.DOMAIN.LTD.bash

svc.cluster.local. 例如:redis.default.svc.cluster.local.session

2.ClusterIPapp

vim redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: default
spec:
  selector:
    app: redis
    role: logstor
  clusterIP: 10.97.97.97 # 能夠不指定,將會自動分配
  type: ClusterIP
  ports:
  - port: 6379
    targetPort: 6379

port:service的端口
targetPort:pod的端口
nodePort:宿主機的端口

3.NodePort負載均衡

將物理機的端口映射到service的端口,外部可經過宿主機IP+port的方式訪問

client->NodeIP:NodePort->ClusterIP:ServicePort->PodIP:targetPort

vim myapp-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  selector:
    app: myapp
    role: canary
  clusterIP: 10.99.99.99
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080 # 能夠不指定,將會自動分配

kubectl apply -f myapp-svc.yaml
# 打補丁:session綁定,第一次訪問的是哪臺pod,以後訪問時就會一直是這臺pod
# 用sessionAffinity將同一個客戶端會話請求粘滯到一個固定的pod上
# 這樣就不會出現負載均衡現象,至關於nginx的ip_hash功能
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'

# 也能夠直接用edit方法編輯,再改回負載均衡模式
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}'

無頭service--不指定ClusterIP:

無頭service是指service name直接解析爲後面的pod ip,無頭就是沒有cluster ip牽頭

vim myapp-svc-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-svc-headless.yaml
kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   13d
myapp-svc    ClusterIP   None         <none>        80/TCP    6s

# 直接解析爲後端pod ip
dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
myapp-svc.default.svc.cluster.local. 5 IN A	10.244.2.8
myapp-svc.default.svc.cluster.local. 5 IN A	10.244.1.10

kubectl get pods -o wide
NAME                            READY   STATUS    AGE     IP            NODE     
myapp-deploy-65df64765c-6vrjq   1/1     Running   9s      10.244.2.8    k8s-node2
myapp-deploy-65df64765c-88h9d   1/1     Running   9s      10.244.1.10   k8s-node1

  ExternalName類型的服務適用於外部服務使用域名的方式,缺點是不能指定端口,要實現集羣內訪問集羣外服務的這個需求,也能夠實現,由於集羣內的Pod會繼承Node上的DNS解析規則.所以只要Node能夠訪問的服務,Pod中也能夠訪問到.

 

參考博客:http://blog.itpub.net/28916011/viewspace-2214745/

相關文章
相關標籤/搜索