原文地址:Kubernetes系列之理解K8s Service的几种模式

今天给大家介绍下k8s的service的几种访问模式。

概述


我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要互相调用,肯定不能用ip的,因为地址不是固定的, 如何能保障pod之前访问的可靠性,由此就衍生出Service的概念。

在实际生产环境中,一般有两种访问 对集群内部的访问, 集群外部的访问。service现在分为以下类型

ClusterIP

集群内部容器访问地址,会生成一个虚拟IP 与pod不在一个网段。

**NodePort   **

会在宿主机上映射一个端口,供外部应用访问模式。

**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做负载的能力。

往期文章一览

1、Kubernetes集群搭建之系统初始化配置篇

2、Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库

3、Kubernetes集群搭建之Etcd集群配置篇

4、Kubernetes集群搭建之CNI-Flanneld部署篇**

5、Kubernetes集群搭建之Master配置篇

6、Kubernetes系列之Coredns and Dashboard介绍篇

7Kubernetes系列之监控Metres-server实战篇

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!

不要让懒惰占据你的大脑,不让要妥协拖跨你的人生。青春就是一张票,能不能赶上时代的快车,你的步伐掌握在你的脚下,good luck

Kubernetes系列之理解K8s Service的几种模式相关推荐

  1. stm32简明教程系列(二)----GPIO(上)八种模式的区别与应用场合

    一.概述 GPIO全称为通用输入/输出端口.是stm32用于输出信号,输入信号的通道.他有以下八种模式: 输入方式 浮空输入 GPIO_Mode_IN_FLOATING 上拉GPIO_Mode_IPU ...

  2. 使用kubectl port-forward暴露minikube k8s service端口

    kubectl port-forward暴露minikube k8s service端口 第一种方式 minikube service hello-minikube 第二种方式: kubectl po ...

  3. 【云原生Kubernetes系列第五篇】kubeadm v1.20 部署K8S 集群架构(人生这道选择题,总会有遗憾)

    系列文章目录 ??即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔 ??收录至专栏 云原生 ??[云原生Docker系列第一篇]Docker镜像管理 ??[云原生Docker系列第二篇]Do ...

  4. Kubernetes系列之五:使用yaml文件创建service向外暴露服务

    系列链接 Kubernetes系列之一:在Ubuntu上快速搭建一个集群Demo Kubernetes系列之二:将Slave节点加入集群 Kubernetes系列之三:部署你的第一个应用程序到k8s集 ...

  5. Kubernetes 系列之 kubeadm 搭建k8s集群

    Kubeadm 搭建k8s集群 注意:Kubernetes 系列 所采用的kuberntetes版本都是 1.15+ 1 Master 节点安装 1.1 系统环境配置 1.1.1 设置主机名称 hos ...

  6. k8s service type_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷...

    点击上方蓝色"Go语言中文网"关注我们,设个星标,每天学习 Go 语言 前一篇"通过实例快速掌握 k8s(Kubernetes)核心概念[1]"讲解了 k8s ...

  7. 【云原生 | Kubernetes 系列】---Skywalking部署和监控

    [云原生 | Kubernetes 系列]-Skywalking部署和监控 1. 分布式链路追踪概念 在较大的web集群和微服务环境中,客户端的一次请求可能需要经过多个不同的模块,多个不同中间件,多个 ...

  8. 理解 K8s 资源更新机制,从一个 OpenKruise 用户疑问开始

    作者 | 酒祝  阿里云技术专家 背景 OpenKruise 是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment / StatefulSet 等 ...

  9. k8s service服务发现详解:ipvs代理模式、服务类型

    目录 k8s服务发现Service 理解 Service的实现模型 userspace代理模式 iptables代理模式 ipvs代理模式 Service定义 Service配置清单重要字段 创建Cl ...

最新文章

  1. javascript 初学对象
  2. 一个方法可解决两个问题:1:Unity打开时一直加载,不能NEW,只能OPEN; 2:Unity 出现license error,re-active时一直循环报错
  3. 为PHP代码在线加密
  4. 爬虫demo_全自动爬虫,你爱了么!解放双手的时刻
  5. k8s中实现自动数据库初始化(mysql,postgresql)
  6. 静态成员常量的初始化
  7. Android Revolution
  8. 20165309 《网络对抗技术》实验二:后门原理与实践
  9. 3.3 垃圾回收算法
  10. thinkphp 捕捉错误
  11. 框架学习笔记:Unity3D的MVC框架——StrangeIoC
  12. Gif 录制工具:Screen2Gif
  13. IOS逆向-静态分析
  14. 【知乎解密(最新版-rpc版本)】
  15. 带你了解电机驱动板的四大分类
  16. 重新定义“车规级”激光雷达
  17. win7中如何设置默认打印机
  18. 基于微软 SAPI 的 TTS 程序实现
  19. 针对屏幕显示模糊/清晰度不够的3种调节途径
  20. 表中数据的更改量保存视图

热门文章

  1. mysql删除员工_MySQL误删数据救命指南:开发人员必收藏
  2. linux上mysql定时备份数据库数据_Linux下如何实现MySQL数据库每天定时自动备份
  3. 如何和在桌面上添加计算机,怎么在电脑桌面上添加便签?
  4. Media Session API 为当前正在播放的视频,音频,提供元数据来自定义媒体通知
  5. 断路器监控(Hystrix Dashboard)
  6. SEO优化:WordPress发布文章主动推送到百度,加快收录保护原创
  7. Oracle推断值为非数字
  8. 【李宏毅2020 ML/DL】P34 More about explainable AI | Attribution, Heatmap, explainable model
  9. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转
  10. 【数据结构笔记08】哨兵查找、二分查找、树、儿子-兄弟表示法、二叉树的引子