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做负载的能力。
往期文章一览
2、Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库
4、Kubernetes集群搭建之CNI-Flanneld部署篇**
6、Kubernetes系列之Coredns and Dashboard介绍篇
7、Kubernetes系列之监控Metres-server实战篇
如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!
Kubernetes系列之理解K8s Service的几种模式的更多相关文章
- Windows玩转Kubernetes系列3-Centos安装K8S
以往文章参考: Windows玩转Kubernetes系列1-VirtualBox安装Centos Windows玩转Kubernetes系列2-Centos安装Docker 安装K8S yum in ...
- Windows玩转Kubernetes系列4-搭建K8S Dashboard
下载官方yaml文件 最新的配置文件v2.0.0-beta8版本recommended.yaml,UI地址 wget https://raw.githubusercontent.com/kuberne ...
- 让外部网络访问K8S service的四种方式
本文基于kubernetes 1.5.2版本编写 kube-proxy+ClusterIP kubernetes版本大于或者等于1.2时,配置: 修改master的/etc/kubernetes/pr ...
- k8s service的四种类型
ClusterIp 默认类型,每个Node分配一个集群内部的Ip,内部可以互相访问,外部无法访问集群内部. NodePort 基于ClusterIp,另外在每个Node上开放一个端口,可以从所有的位置 ...
- kubernetes系列03—kubeadm安装部署K8S集群
本文收录在容器技术学习系列文章总目录 1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm ...
- 对k8s service的一些理解
服务service service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务 举个例子一个a服务运行3个pod,b服务怎么访问a服务的pod, ...
- kubernetes系列(十四) - 存储之PersistentVolume
1. PersistentVolume(PV)简介 1.1 为什么需要Persistent Volume(PV) 1.2 PersistentVolume(PV)和Volume的区别 1.3 PV和P ...
- 从0到1使用Kubernetes系列(七):网络
本文是从 0 到 1 使用 Kubernetes 系列第七篇,上一篇<从 0 到 1 使用 Kubernetes 系列(六):数据持久化实战> 介绍了 Kubernetes 中的几种常用储 ...
- Kubernetes系列之Helm介绍篇
本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来 ...
随机推荐
- Liunx系统下的进程与线程
1. 进程.线程的概念 a. 进程是操作系统进行资源分配的单位. b. 线程(Thread)是程序中独立的指令流,是CPU调度和分派的基本单位. c. 多进程是指同时运行多种 ...
- 基于ASP.NET MVC 下的Extjs的Combbox加载速率问题,终于解决啦:)
在实际的开发项目中,自己遇到一个让自己苦恼很久的问题,一直也未解决,先简单介绍一下这个问题吧.当在表单里有多个combbox的时候(表单中的combbox是经过封装的控件,从后台请求同一个方法获取数据 ...
- zabbix编译安装
第一部分zabbix安装部署,实现分布式监控及网络知识 #yum install lrzsz.x86_64 传送文件 安装mysql脚本 #!/bin/bash DIR = pwd NAME = ...
- 测试工作之--adb代码
1.抓log方法 (bat文件) mkdir D:\logcatset /p miaoshu=请描述操作:adb logcat -v threadtime > D:\logcat\%miaosh ...
- DS博客作业01—日期抽象数据类型设计与实现
1.本章学习总结 1.1 思维导图 1.2学习体会 开学就来了个大作业,还要求用的是c++语法,作为一个只听过没学过的未知语法,靠着CSDN和寝室大佬的帮助下渐渐地了解了一些c++的使用,现在也可以使 ...
- 难受的ESlint语法检测
相信写过vue的各位小白都有过这样的体验,明明引入的文件语法是对的,明明自己写的代码是对的,但是总会报语法错误,没错,就是ESlint代码检测搞的鬼, 就算你在注释后面多打一个空格,它都会去搞事情,简 ...
- Python制作微信小助手
网址: https://mp.weixin.qq.com/s/uWSgeD5FyzXV3LsMNus01Q
- JSTree如何实现第二级菜单异步从数据库读取。
参考文档: https://www.cnblogs.com/luozhihao/p/4679050.html http://jsfiddle.net/vakata/2kwkh2uL/5/ 核心的关键点 ...
- DW1000 用户手册中文版 附录2 IEEE-802.15.4 MAC层
由于已经在wode中排版无法直接复制到博客中,故本节博客发布使用了图片. 论坛可下载PDF http://bphero.com.cn/forum.php?mod=viewthread&tid ...
- 数据分析 大数据之路 五 pandas 报表
pandas: 在内存中或对象,会有一套基于对象属性的方法, 可以视为 pandas 是一个存储一维表,二维表,三维表的工具, 主要以二维表为主 一维的表, (系列(Series)) 二维的表, ...