1.Service概述
service是kubernetes中最核心的資源對象之一,service和pod之間是通過Label串起來,相同的Service的pod的Label是一樣的.同一個service下的所有pod是通過kube-proxy實現負載均衡.而每個service都會分配一個全局唯一的虛擬ip,也就cluster ip.
在該service整個生命周期內,cluster ip保持不變,而在kubernetes中還有一個dns服務,它會把service的name解析為cluster ip.
service工作模式:userspace(1.1版本之前)、iptables(1.10版本之前)和ipvs(1.11版本之后)

類型:ExternalName(集群內部pod想要訪問外部服務),ClusterIP,NodePort,
LoadBalancer:k8s如果部署在公有雲上,且公有雲支持LBAAS,k8s的CloudControllor會調用IAAS的api,創建service時會按需創建,刪除時會按需刪除,這種類型稱為負載均衡器類型.
資源記錄:SVC_NAME.NS_NAME.DOMAIN.LTD.
svc.cluster.local. 例如:redis.default.svc.cluster.local.
2.ClusterIP
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/
