Pod是有生命周期的,使用凡人皆有一死來描述pod很貼切,當一個工作節點(node)銷毀時,節點上運行的pods也會被銷毀, ReplicationController會動態地在其他節點上創建Pod來保持應用程序的運行,每一個Pod都有一個獨立的IP地址,甚至是同一個節點上的Pod,可以看出Pod的IP是動態的,它隨Pod的創建而創建,隨Pod的銷毀而消失,這就引出一個問題:如果由一組Pods組合而成的集群來提供服務,那如何訪問這些Pods呢?
Kubenetes的Service就是用來解決這個問題的。一個Service可以看作一組提供相同服務的Pods的對外訪問接口,Service作用於哪些Pods是通過label selector來定義的,這些Pods能被Service訪問,Pod之間的發現和路由(如應用中的前端和后端組件)由Kubernetes Service處理。
Service有四種type: ClusterIP(默認)、NodePort、LoadBalancer、ExternalName. 其中NodePort和LoadBalancer兩類型的Services可以對外提供服務。
這是使用NodePort來配置
1、創建yaml service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: kube-node-service
labels:
name: kube-node-service
spec:
type: NodePort #這里代表是NodePort類型的
ports:
- port: 8080 #這里的端口和clusterIP對應,即ip:8080,供內部訪問。
targetPort: 8080 #端口一定要和container暴露出來的端口對應
protocol: TCP
nodePort: 32143 # 所有的節點都會開放此端口,此端口供外部調用。
selector:
app: web #這里選擇器一定要選擇容器的標簽,之前寫name:kube-node是錯的。
2、應用yaml
kubectl create -f service.yaml
3、檢驗配置是否正確
//測試主節點訪問
[root@k8s-node1 k8s]# curl 192.168.100.89:32143/index
hello,world
[root@k8s-node1 k8s]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-node-service NodePort 10.96.77.110 <none> 8080:32143/TCP 21m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d
//測試內部訪問(clusterIp:PORT)
curl 10.96.77.110:8080
[root@k8s-node1 k8s]# curl 10.96.77.110:8080/index
hello,world
[root@k8s-node1 k8s]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-node-87dcfc9cf-9kj8j 1/1 Running 0 75m 10.244.1.23 k8s-node3 <none> <none>
kube-node-87dcfc9cf-l2ppz 1/1 Running 0 75m 10.244.2.24 k8s-node2 <none> <none>
[root@k8s-node1 k8s]# curl 10.244.1.23:8080/index
hello,world
[root@k8s-node1 k8s]# curl 10.244.2.24:8080/index
hello,world
//測試slave節點訪問
[root@k8s-node1 k8s]# curl 192.168.100.91:32143/index
hello,world
[root@k8s-node1 k8s]# curl 192.168.100.92:32143/index
hello,world
從瀏覽器訪問測試 http://192.168.100.89:32143/index
http://192.168.100.91:32143/index
http://192.168.100.92:32143/index