今天給你們介紹下k8s的service的幾種訪問模式。前端
概述node
咱們知道pod的ip不是固定的,是根據所在宿主機的docker0網卡生成的,每次重啓,更新,調度等狀況IP都會變,那pod與pod之間須要互相調用,確定不能用ip的,由於地址不是固定的, 如何能保障pod以前訪問的可靠性,由此就衍生出Service的概念。nginx
在實際生產環境中,通常有兩種訪問 對集羣內部的訪問, 集羣外部的訪問。service如今分爲如下類型docker
ClusterIP 後端
集羣內部容器訪問地址,會生成一個虛擬IP 與pod不在一個網段。api
NodePort 負載均衡
會在宿主機上映射一個端口,供外部應用訪問模式。less
Headless CluserIP 學習
無頭模式,無serviceip,即把spec.clusterip設置爲None 。測試
LoadBalancer
使用外部負載均衡。
Port類型
咱們先理解Service Port的幾種類型。
NodePort
指定暴露到宿主機的端口,不指定的話會隨機分配個,分配的IP在apiserver的配置文件中指定了--service-node-port-range=30000-50000,表示只容許分配30000-50000之間的端口。
好比一個nginx應用須要能被外部訪問,就須要配置類型爲type=NodePort,而且須要配置下nodePort: 30002(指定固定端口),這樣的話外部使用http://ip:30002就能夠訪問這個應用了。
也有一些內部服務是須要外部訪問的,那就不須要到使用NodePort模式了。
apiVersion: v1
Port
集羣內部服務之間訪問的端口。
好比一個nginx容器暴露了80端口,可是其餘容器須要經過nginx:80訪問,就須要配置port:80 ,外部是無法訪問這個端口的,由於沒有對外開放端口。
apiVersion: v1
targetPort
容器自己暴露的端口,和dockerfile中的expose意思同樣
例子說明
接下來咱們經過幾個例子來理解說明
建立NodePort類型Service
若是選擇了「NodePort」,那麼 Kubernetes master 會分配一個區域範圍內,(默認是30000-32767),而且,每個node,都會代理(proxy)這個端口到你的服務中,咱們能夠在spec.ports[*].nodePort 找到具體的值
若是咱們指定一個端口,咱們能夠直接寫在nodePort上,系統就會給你指派指定端口,可是這個值必須是指定範圍內的。
Cluster service 的 IP 地址是虛擬的,所以,只能從node節點上使用該IP 地址訪問應用。爲了從集羣外訪問應用,K8S 提供了使用 node 節點的IP 地址訪問應用的方式。
基本上,NodePort 服務與普通的 「ClusterIP」 服務 YAML 定義有兩點區別。 首先,type 是 「NodePort」。還有一個稱爲 nodePort 的附加端口,指定在節點上打開哪一個端口。 若是你不指定這個端口,它會選擇一個隨機端口。
該端口號的範圍是 kube-apiserver 的啓動參數 –service-node-port-range指定的,在當前測試環境中其值是 30000-50000。表示只容許分配30000-50000之間的端口。
ps:通常使用NodePort 都會在外部搭建負載均衡來代理多個node節點。
建立一個Deployment
[root@master-01 ~]# cat nginx-deploy.yaml
建立service
[root@master-01 ~]# cat ng-svc.yaml
查看詳情
[root@master-01 ~]# kubectl describe svc nginx
查看狀態
[root@master-01 ~]# kubectl get po,ep,svc
訪問測試
# 經過endpoint 訪問
在pod中也能夠經過service的名稱訪問(通常都這樣使用)
建立ClusterIP類型Service
會生成一個集羣內部的虛擬IP(網段和pod不一樣)只是給集羣內部和pod之間訪問的,外部沒法訪問,網段經過配置文件指定。
ClusterIP也是Kubernetes service的默認類型。
原理
用戶經過kubectl命令向apiserver發送建立service的命令,apiserver接收到請求之後將數據存儲到etcd中。
每一個節點中都有一個叫作kube-proxy的進程,這個進程負責感知service,pod的變化,並將變化的信息寫入本地的iptables中。
iptables 使用NAT等技術將virtualIP的流量轉至endpoint中。
建立pod
[root@master-01 ~]# cat nginx-deployment.yaml
建立Service
[root@master-01 ~]# cat ng-svc-clusterip.yaml
建立HeadlessClusterIP類型Service
有時候咱們可能不須要一個固定的IP和分發,這個時候咱們只須要將spec.clusterIP的值設置爲none就能夠了,經過設置標籤綁定到pod的方式完成,對於這樣的服務來講,集羣IP沒有分配,這個時候當你查詢服務的名稱的時候,DNS會返回多個A記錄,這些記錄都是指向後端Pod的。Kube-proxy代理不會處理這個服務,在服務的前端也沒有負載均衡器。可是endpoints controller仍是會建立Endpoints,在訪問服務的時候返回後端的所有的Pod IP地址。
建立pod
[root@master-01 ~]# cat busybox-deploy.yaml
建立service
[root@master-01 ~]# cat busybox-svc-headless.yaml
查看狀態
能夠看到CLUSTER-IP 爲None了,
[root@master-01 ~]# kubectl get svc,ep,po
以上能夠看出後端的pod列表已經加到該svc。
咱們進容器中經過service名字是否可以解析訪問到pod
查看dns域
root@busybox-deploy-b47575595-khxsp:/# cat /etc/resolv.conf
能夠看到以上的A記錄,解析出的是pod的ip地址
1.普通 Service:解析成 ClusterIP
2.Headless Service:解析爲指定 Pod的IP列表,Serivce域名也起到了經過dns作負載的能力。
往期文章一覽
二、Kubernetes集羣搭建之企業級環境中基於Harbor搭建本身的私有倉庫
四、Kubernetes集羣搭建之CNI-Flanneld部署篇**
六、Kubernetes系列之Coredns and Dashboard介紹篇
7、Kubernetes系列之監控Metres-server實戰篇
若是您以爲不錯,請別忘了轉發、分享、點贊讓更多的人去學習, 您的舉手之勞,就是對小編最好的支持,很是感謝!