概述
service服務也是Kubernetes裏核心字眼對象之一,Kubernetes裏的每個service其實就是咱們常常提起的微服務架構中的一個微服務,以前講解Pod,RC等資源對象其實都是爲講解Kubernetes Service作鋪墊的,下圖爲Pod,RC與Service的邏輯關係html
能夠看到上面的架構圖,service服務經過標籤選擇器定位後端pod,前提是service的selector必須和後端Pod標籤對應上才能找到相對應的Pod,而前段frontend經過service就能夠訪問到後端提供服務的pod了,而service默認IP類型爲主要分爲:node
- ClusterIP:主要是爲集羣內部提供訪問服務的
- NodePort:能夠被集羣外部所訪問,訪問方式爲 宿主機:端口號
下面我建立了一個nginx服務和一個對外提供服務的service,以下:nginx
[root@master ~]# cat nginx.yaml apiVersion: v1 kind: Service metadata: name: serivce-mynginx namespace: default spec: type: NodePort selector: app: mynginx ports: - name: nginx port: 80 targetPort: 80 nodePort: 30080 --- apiVersion: apps/v1 kind: Deployment metadata: name: deploy namespace: default spec: replicas: 2 selector: matchLabels: app: mynginx template: metadata: labels: app: mynginx spec: containers: - name: nginx image: lizhaoqwe/nginx:v1 ports: - name: nginx containerPort: 80
執行yaml文件docker
[root@master ~]# kubectl create -f test.yaml service/serivce-mynginx created deployment.apps/deploy created
查看pod和service狀態編程
[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE deploy-696bccb9fd-9zk2f 1/1 Running 0 138m deploy-696bccb9fd-vcgs5 1/1 Running 0 138m [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d23h serivce-mynginx NodePort 10.103.92.182 <none> 80:30080/TCP 138m
驗證後端
外部訪問service的問題
爲了更加深入理解kubernetes,咱們須要弄明白kubernetes裏的3中IPapi
- NodeIP:NodeIP是kubernetes中每一個節點的物理網卡IP地址,是一個真實存在的物理網絡,全部屬於這個網絡的服務器都能經過這個網絡直接通信,包括集羣外的主機訪問集羣內的主機也須要NodeIP
- PodIP:PodIP是每一個Pod地址,它是docker engine根據docker0網橋的IP地址進行分配的,一般是一個虛擬的二層網絡,因此kubernetes裏的一個Pod裏的容器訪問另一個Pod裏的容器時,就是經過PodIP所在的虛擬二層網絡進行通信的,而真實的TCP/IP流量是經過NodeIP所在的物理網卡流出的
- ClusterIP:他是一個虛擬的IP,但更像是一個「僞造」的IP網絡,緣由有如下幾點:
- ClusterIP僅僅做用於kubernetes service這個對象,並由kubernetes管理和分配ip地址
- ClusterIP沒法被Ping,由於沒有一個實體網絡對象來響應
- ClusterIP只能結合service Port組成一個具體的通信端口,若是集羣外想訪問須要作一些額外的操做
- 在kubernets集羣內,NodeIP、PodIP和ClusterIP網之間通信,採用的是kubernets本身設計的一種編程方式的特殊路由規則