Kubernetes系列之理解K8s Service的幾種模式

image

今天給你們介紹下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集羣搭建之系統初始化配置篇

二、Kubernetes集羣搭建之企業級環境中基於Harbor搭建本身的私有倉庫

三、Kubernetes集羣搭建之Etcd集羣配置篇

四、Kubernetes集羣搭建之CNI-Flanneld部署篇**

五、Kubernetes集羣搭建之Master配置篇

六、Kubernetes系列之Coredns and Dashboard介紹篇

7Kubernetes系列之監控Metres-server實戰篇

若是您以爲不錯,請別忘了轉發、分享、點贊讓更多的人去學習, 您的舉手之勞,就是對小編最好的支持,很是感謝!

image

相關文章
相關標籤/搜索