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的进程,这个进程负责感知servicepod的变化,并将变化的信息写入本地的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-proxykube-proxy负责为service实现一种virtual ip的形式,而这个过程称之为service代理模式不同的kubernetes版本,代理模式的实现方式也不尽相同,前后共有三种模式

  1. userspace:kubernetes v1.0版本使用的是这种代理模式,已过期
  2. iptables:从kubernetes v1.2开始使用iptables
  3. ipvs:kubernetes v1.14开始默认使用ipvs代理

3.1 userspace

从下可以看出客户端想要访问到具体的server pod,需要

  1. 经过防火墙iptables
  2. 经过kube-proxy负责转发
  3. 到达server pod
  • 缺点:对kube-proxy的压力很大

3.2 iptables

3.2.1 原理

从下可以看出客户端想要访问到具体的server pod,需要

  1. 经过iptables直接转发
  2. 到达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,需要

  1. 经过ipvs直接转发
  2. 到达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的更多相关文章

  1. Kubernetes系列之理解K8s Service的几种模式

    今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...

  2. Kubernetes系列之Helm介绍篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来 ...

  3. kubernetes系列之ConfigMap使用方式

    作用理解 核心用途就是容器和配置的分离解耦. 如启用一个mysql容器,mysql容器重要的文件有两部分,一部分为存储数据文件,一部分为配置文件my.cnf,存储数据可以用持久存储实现和容器的分离解耦 ...

  4. kubernetes系列03—kubeadm安装部署K8S集群

    本文收录在容器技术学习系列文章总目录 1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm ...

  5. Kubernetes 系列(四):使用Traefik访问.net core api

    一. 准备 本篇的要求是在前三篇的基础上已经搭建好的本地k8s以及部署了Traefik,我们将会使用Traefik Ingress来访问.net core api,比较简单,做个记录,如果还没有搭建k ...

  6. kubernetes系列(十四) - 存储之PersistentVolume

    1. PersistentVolume(PV)简介 1.1 为什么需要Persistent Volume(PV) 1.2 PersistentVolume(PV)和Volume的区别 1.3 PV和P ...

  7. kubernetes系列(十七) - 通过helm安装dashboard详细教程

    1. 前提条件 2. 配置https证书为secret 3. dashboard安装 3.1 helm拉取dashboard的chart 3.2 配置dashboard的chart包配置 3.3 he ...

  8. 从0到1使用Kubernetes系列(七):网络

    本文是从 0 到 1 使用 Kubernetes 系列第七篇,上一篇<从 0 到 1 使用 Kubernetes 系列(六):数据持久化实战> 介绍了 Kubernetes 中的几种常用储 ...

  9. 从0到1使用Kubernetes系列(八):Kubernetes安全

    本文是从 0 到 1 使用 Kubernetes 系列第八篇,上一篇从0到1使用Kubernetes系列(七):网络介绍了 K8S 网络相关的内容,本文将带你了解 K8S 的安全问题. Kuberne ...

  10. Kubernetes系列(五) Ingress

    作者: LemonNan 原文地址: https://juejin.im/post/6878269825639317517 Kubernetes 系列 Kubernetes系列(一) Pod Kube ...

随机推荐

  1. 初探AI之got-ocr2.0大模型本地部署与遇到的各种坑处理

    一.环境搭建 1.安装cuda,本人使用的是12.1版本,下载地址:https://developer.nvidia.com/cuda-12-1-1-download-archive 2.安装cond ...

  2. charles+Nox

    Charles设置 一.添加SSL证书 ![1](C:\Users\Lifree\Desktop\MD\C\charles zhengshu\1.png) ![2](C:\Users\Lifree\D ...

  3. 选择程序设计(python)

    文章目录 1.基本概念 2.程序基本结构 3.实例 3.1 判断一个人年龄属于未成年人还是成年人 3.2判断是否是闰年 1.基本概念 Python选择程序设计是通过一条或多条语句的执行结果(True或 ...

  4. 使用netsh命令行进行网络管理

    显示网络适配器状态 netsh interface show interface 显示各个网络适配器的名称和状态 启用(禁用)网络适配器 本系列命令需要以"以管理员身份运行". 禁 ...

  5. 2个月搞定计算机二级C语言——真题(10)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题10 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> #pragma warning ...

  6. MathType 使用技巧

    matytype: 一次性更改所有公式的字体. 在安装有MathType的Word中,我们可以选中 mathtype 公式,用 alt+\ 切换为Latex语句,反之亦然.例如:$a_b$ 变为 ab ...

  7. Chapter12 动态内存与智能指针

    目录 12.1.0 介绍 12.1.1 shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动 ...

  8. Nginx支持https访问

    为了提高web应用的安全性,现在基本上都需要支持https访问.在此记录一下自己在nginx下的配置过程 安装Nginx这里就省略了 安装openssl模块 yum -y install openss ...

  9. 2.搭建K8S集群前置知识

    搭建K8S集群 搭建k8s环境平台规划 单master集群 单个master节点,然后管理多个node节点 多master集群 多个master节点,管理多个node节点,同时中间多了一个负载均衡的过 ...

  10. 2023年10月,红米(小米)note 8 pro 优化记

    看了红米的note 13 pro和note 12 turbo的参数和价格后,我决定下单买个note8 pro的手机壳,确实有新手机的感觉了. 我note8 pro手机参数如下 MIUI 12.0.5 ...