kubernetes系列(九) - 深入掌握Service
1. Service概念
通过创建service
可以为一组相同功能的容器应用提供一个统一的入口,并将请求均衡负载发送到后端的各个容器应用上
- 通常是通过
label selector
来实现选中具体哪些容器的 - 均衡负载算法默认是RR (
Round-Robin 轮询调度
) - 还可以通过设置
service.spec.sessionAffinity
=ClientIp
来启用SessionAffinity
策略 service
只提供4层负载均衡能力(只能基于ip地址和端口进行转发
),而没有7层功能(不能通过主机名及域名的方案去进行负载均衡
),但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的
2. Service的类型
2.1 ClusterIP(默认)
在集群的内部ip上公开服务。这种类型使得只能从集群内访问服务
2.1.1 原理
clusterIP主要在每个node节点使用iptables(新版本模式是ipvs
),将发向clusterlP
对应端口的数据,转发到kube-proxy
中。然后kube-proxy
自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口
为了实现图上的功能,需要以下几个组件协调工作:
api-server
:用户通过kubectl
命令向apiserver
发送创建service
的命令,apiserver
接收到请求后将数据存储到etcd
中kube-proxy
:kubernetes
的每个节点中都有一个叫做kube-porxy
的进程,这个进程负责感知service
,pod
的变化,并将变化的信息写入本地的iptables
规则中iptables
: 使用NAT
等技术将virtuallP
的流量转至endpoint
中
2.1.2 ClusterIP资源清单
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
2.2 NodePort
在每个node上的相同端口上公开服务,可以从集群外部访问服务。ClusterIP的超集
, 最常用
2.2.1 NodePort资源清单
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: NodePort
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
- iptables查询nodeport
iptables -t nat -nvL KUBE-NODEPORTS
2.3 LoadBalancer
在NodePort
的基础上,在当前云中创建一个外部负载平衡器(如果支持),并为该服务分配一个固定的外部IP。NodePort的超集
即使用云服务商均衡负载服务,需要付费
2.4 ExternalName
通过返回具有该名称的CNAME记录,使用任意名称(在规范中指定)公开服务。不使用代理。此类型需要v1.7或更高版本kube-dns
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: default
spec:
type: ExternalName
externalName: hub.coreqi.cn
3. Service代理模式
在kubernetes集群中,为每个节点运行了一个kube-proxy
,kube-proxy
负责为service
实现一种virtual ip
的形式,而这个过程称之为service代理模式
。不同的kubernetes版本,代理模式的实现方式也不尽相同,前后共有三种模式:
userspace
:kubernetes v1.0版本使用的是这种代理模式,已过期iptables
:从kubernetes v1.2开始使用iptablesipvs
:kubernetes v1.14开始默认使用ipvs代理
3.1 userspace
从下可以看出客户端想要访问到具体的server pod
,需要
- 经过防火墙iptables
- 经过
kube-proxy
负责转发 - 到达
server pod
- 缺点:对
kube-proxy
的压力很大
3.2 iptables
3.2.1 原理
从下可以看出客户端想要访问到具体的server pod
,需要
- 经过
iptables
直接转发 - 到达
server pod
- 这过程中
kube-proxy
只负责维护iptables
的对应规则
3.2.2 查看iptables代理规则
iptables -t nat -nvl
iptables -t nat -nvL KUBE-NODEPORTS
3.3 ipvs
3.3.1 原理
从下可以看出客户端想要访问到具体的server pod
,需要
- 经过
ipvs
直接转发 - 到达
server pod
ipvs这种模式,kube-proxy
会监视Kubernetes service
对象和Endpoints
,调用netlink
接口以相应地创建ipvs
规则并定期与Kubernetes service对象
和Endpoints 对象
同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端 Pod
与iptables类似,ipvs于netfilter
的hook功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如
- rr:轮询调度
- 1c:最小连接数
- dh:目标哈希
- sh:源哈希
- sed:最短期望延迟
- nq:不排队调度
注意: ipvs需要节点上的ipvs内核模块
支持,如果未安装,则kube-proxy
将回退到iptables
代理模式
3.3.2 查看ipvs代理规则
ipvsadm -Ln
4. Headless Service
Headless Service
也是一种Cluster IP
,只不过是一种特殊的Cluster IP
4.1 存在的意义
- 有时不需要或不想要负载均衡,以及单独的Service IP。遇到这种情况,可以通过指定
ClusterIP(spec.clusterIP)
的值为None
来创建Headless Service
。这类Service
:- 并不会分配
Cluster IP
** kube-proxy
不会处理它们- 平台也不会为它们进行负载均衡和路由
- 并不会分配
- 主要的特点是通过无头服务的方式去解决hostname和portname的变化问题,也就是通过它去进行绑定
4.2 Headless Service资源清单
apiVersion: v1
kind: Service
metadata:
name: myapp-headless
namespace: default
spec:
selector:
app: myapp
clusterIP: "None"
ports:
- port: 80
targetPort: 80
kubernetes系列(九) - 深入掌握Service的更多相关文章
- Kubernetes系列之理解K8s Service的几种模式
今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...
- Kubernetes系列之Helm介绍篇
本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来 ...
- kubernetes系列之ConfigMap使用方式
作用理解 核心用途就是容器和配置的分离解耦. 如启用一个mysql容器,mysql容器重要的文件有两部分,一部分为存储数据文件,一部分为配置文件my.cnf,存储数据可以用持久存储实现和容器的分离解耦 ...
- kubernetes系列03—kubeadm安装部署K8S集群
本文收录在容器技术学习系列文章总目录 1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm ...
- Kubernetes 系列(四):使用Traefik访问.net core api
一. 准备 本篇的要求是在前三篇的基础上已经搭建好的本地k8s以及部署了Traefik,我们将会使用Traefik Ingress来访问.net core api,比较简单,做个记录,如果还没有搭建k ...
- kubernetes系列(十四) - 存储之PersistentVolume
1. PersistentVolume(PV)简介 1.1 为什么需要Persistent Volume(PV) 1.2 PersistentVolume(PV)和Volume的区别 1.3 PV和P ...
- kubernetes系列(十七) - 通过helm安装dashboard详细教程
1. 前提条件 2. 配置https证书为secret 3. dashboard安装 3.1 helm拉取dashboard的chart 3.2 配置dashboard的chart包配置 3.3 he ...
- 从0到1使用Kubernetes系列(七):网络
本文是从 0 到 1 使用 Kubernetes 系列第七篇,上一篇<从 0 到 1 使用 Kubernetes 系列(六):数据持久化实战> 介绍了 Kubernetes 中的几种常用储 ...
- 从0到1使用Kubernetes系列(八):Kubernetes安全
本文是从 0 到 1 使用 Kubernetes 系列第八篇,上一篇从0到1使用Kubernetes系列(七):网络介绍了 K8S 网络相关的内容,本文将带你了解 K8S 的安全问题. Kuberne ...
- Kubernetes系列(五) Ingress
作者: LemonNan 原文地址: https://juejin.im/post/6878269825639317517 Kubernetes 系列 Kubernetes系列(一) Pod Kube ...
随机推荐
- myBatis插入操作获取不到返回的自增id问题
myBatis插入操作后想返回自增 id 有多种方式 其中一种使用率较高的就是: 在<insert></insert> 标签中添加 useGeneratedKeys 和 key ...
- 洛谷 P1540 [NOIP2010 提高组] 机器翻译
题目概括 给定 N 个整数,和一个容量为 M 的"字典",从头到尾依次翻译,每次翻译先看自家字典,没有的话再看别人的字典并存到自家字典,如果自家字典满了,当前单词的翻译会代替最早进 ...
- Mysql导出文本文件
使用mysqldump命令导出文本文件 mysqldump -u root -pPassword -T 目标目录 dbname [tables] [option]; 其中: Password 参数表示 ...
- 为数据集而生的 SQL 控制台
随着数据集的使用量急剧增加,Hugging Face 社区已经变成了众多数据集默认存放的仓库.每月,海量数据集被上传到社区,这些数据集亟需有效的查询.过滤和发现. 每个月在 Hugging Face ...
- 2024/9/16 CSP-S模拟赛试题
A 这题是很有意思的一个题,思路就是你考虑kt的位置只可能在四个角,因为这种情况下,他的距离才会最远对吧,所以你就暴力找另一个人fengwu的点的位置,然后计算他们之间的距离然后你求一个\(\max\ ...
- Clickhouse副本及分片
副本 副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据 配置副本 1. zookeeper集群准备 2. Clickhouse准备两个 ...
- 用“tar | split ”将文件分包压缩
1.一次打包: tar cjf - directory/ | split -b 100m -d -a 1 - filename.tar.bz2. (directory/):待压缩的目录名. (spli ...
- Spring-Event入门实践及执行原理
一.入门案例 1. 添加依赖首先,在 pom.xml 文件中添加 Spring Boot 和 Spring Event 的依赖: <dependencies> <dependency ...
- 想学习建个网站?WAMP Server助你在Windows上快速搭建PHP集成环境
我想只要爬过几天网的同学都会知道PHP吧,异次元的新版本就是基于PHP的WordPress程序制造出来的,还有国内绝大部分论坛都是PHP的哦.据我所知很多同学都想要试着学习一下PHP,无奈要在Wind ...
- Windows下的终端工具-Terminal
文档:https://docs.microsoft.com/zh-cn/windows/terminal/ Windows 终端是一个面向命令行工具和 shell(如命令提示符.PowerShell ...