k8s Service服务详解

news2024/10/6 20:25:45

1. Service 的概念:

  • k8s中Service定义了这样一种抽象:一个pod的逻辑分组,一种可以访问他们的策略—通常称为微服务。这一组pod能够被Service访问到,通常是通过Label Selector

在这里插入图片描述

  • Service能够提供负载均衡的能力,但是在使用上有以下限制:

    • 只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡不支持的。

2. Service的类型:

  • Service在k8s中有以下四种类型:

    • ClusterIp:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP。
    • NodePort:在ClusterIp基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort来访问该服务。
    • LoadBalancer:在NodePort的基础上,借助Cluster Provider创建一个外部负载均衡器,并将请求转发到NodeIP:NodePort
    • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用,没有任何类型代理被创建,这里只有k8s1.7或更高版本的kube-dns才支持。

在这里插入图片描述

3. Vip和Service代理

  • 在k8s集群中,每个Node运行一个kube-proxy进程。kube-proxy负责为service实现一种VIP(虚拟IP)的形式,而不是ExternalName的形式。在k8s V1.0版本,代理完全在userspace。在k8s V1.1版本,新增了Iptables代理 ,但不是默认的运行模式。从k8s V1.2版本起,默认就是Iptables代理,在k8s V1.8.0-beta.0中,添加了ipvs代理。在k8s V1.14版本开始模式使用ipvs代理。
  • 在k8s v1.0版本,Service是“4层”(TCP/UDP over IP)概念。在K8s v1.1版本,新增了Ingress API(beta版),用来表示“7层”(HTTP)服务

4. 代理模式的分类:

4.1. userspace代理模式:

在这里插入图片描述

4.2. iptables代理模式:

在这里插入图片描述

4.3. Ipvs代理模式

  • 这种模式,kube-proxy会监视k8s service对象和Endpoints,调用netlink接口以相应的创建ipvs规则并定期与k8s service对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将重定向到后端pod。

  • 与iptables类似,ipvs与netfilter的hook功能,但使用哈希表作为底层数据结构并在内核空间工作。这意味着ipvs可以更快的重定向流量,并且在同步代理规则时具有更好的性能。此外ipvs为负载均衡算法提供了更多选项,例如:

    • rr:轮询调度
    • lc:最小连接数
    • dh:目标哈希
    • sh:源哈希
    • sed:最短期望延迟
    • nq:不排队调度
  • 注意:ipvs模式假定在运行kube-proxy之前在节点上都已经安装了ipvs内核模块。当kube-proxy以ipvs代理模式启动时,kube-proxy将验证节点是否安装ipvs模块,如果未安装,则kube-proxy 将退到iptables代理模式。
    在这里插入图片描述

5. ClusterlP

  • clusterlP主要在每个node节点使用iptables,将发向clusterlP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口

在这里插入图片描述

  • 为了实现图上的功能,主要需要以下几个组件的协同工作:

    • apiserver用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到情求后将数据存储到etcd中
    • kube-proxy kubernetesl的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables规则中
    • iptables使用NAT等技术将virtuallP的流量转至endpoint中

    5.1. 实例:

vim  nginx.yaml

apiVersion: apps/v1  #指定使用的API版本
kind: Deployment     #指定对象类型为Deployment
metadata:   #元数据部分,包含名称和命名空间等信息
  name: nginx-deployment  #定义deployment的名称为nginx-deployment
  namespace: default  #指定创建所在的命名空间
spec:    #指定 deployment 对象的配置信息
  selector:  #选择器,用于选择要部署的Pod
    matchLabels:  #匹配标签,选择具有指定标签的Pod
      app: nginx  
      release: stabel  
  replicas: 3   #指定要创建的Pod副本数量
  template:    #Pod的模板,定义了要创建的Pod的规范
    metadata:  #Pod元数据部分,包含标签等信息
      labels:  #Pod 标签
        app: nginx
        release: stabel
    spec:   #Pod 配置信息
      containers:  #容器列表信息
      - name: nginx  #容器名称
        image: nginx:latest  #指定容器的镜像
        imagePullPolicy: IfNotPresent #指定容器拉取镜像策略,本地不存在镜像时才尝试拉取新镜像
        ports: #容器暴露的端口列表
        - name: http  #端口名称
          containerPort: 80  #容器的端口号

---

apiVersion: v1    #指定使用的API版本 
kind: Service     #指定对象类型为Service
metadata:         #元数据部分,包含名称和命名空间等信息
  name: nginx-service  #定义service的名称为nginx-service
  namespace: default   #指定service创建所在的命名空间
spec:     #指定 service对象的配置信息
  type: ClusterIP  #指定Service类型为ClusterIP,即集群内部访问
  selector:    #选择器,用于选择要关联的Pod
    app: nginx   #匹配具有指定标签的Pod
    release: stabel  #匹配具有指定标签的Pod
  ports:  #Service暴露的端口列表
    - name: http  #端口名称
      protocol: TCP  #端口协议
      port: 80    #Service的端口号
      targetPort: 80  #将流量转发到Pod的端口号

  • 这个示例中,Deployment创建了3个副本的nginx Pod,并将它们的标签设置为app: nginx和release: stabel。Service使用相同的标签选择与这些Pod关联,并在集群内部暴露端口80,以便其他Pod可以通过nginx-service:80的方式访问这些Pod。

5.2. 创建

[root@master1 yaml]# kubectl apply -f nginx.yaml

[root@master1 yaml]# kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.10.0.1       <none>        443/TCP   8h
nginx-service   ClusterIP   10.10.156.191   <none>        80/TCP    12s

[root@master1 yaml]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-77fd88977b-2rlkk   1/1     Running   0          3m3s
nginx-deployment-77fd88977b-979tp   1/1     Running   0          3m3s
nginx-deployment-77fd88977b-g57b5   1/1     Running   0          3m3s


[root@master1 yaml]# curl 10.10.156.191
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

6. Headless Service

  • 有时不需要或不想要负载均衡,以及单独的Service IP。遇到这种情况,可以通过指定ClusterIP(spec.clusterlP)的值为"None"来创建Headless Service。这类Service并不会分配ClusterIP,kube-proxy不会处理它们,而且平台也不会为它们进行负载均衡和路由
vim  nginx-service-headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-headless-service
  namespace: default
spec:
  selector:
    app: nginx
    release: stabel
  clusterIP: "None"
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80

6.1. 创建

      targetPort: 80
[root@master1 yaml]# kubectl apply -f nginx-service-headless.yaml
service/nginx-headless-service created
[root@master1 yaml]# kubectl get svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes               ClusterIP   10.10.0.1       <none>        443/TCP   29h
nginx-headless-service   ClusterIP   None            <none>        80/TCP    8s    ---可以看的出来clusterIP是空的
nginx-service            ClusterIP   10.10.196.214   <none>        80/TCP    42m

6.2. 验证:

[root@master1 yaml]# yum -y install bind-utils.x86_64
用dns服务解析nginx-headless-service.default.svc.cluster.local.这个域名下是不是有三个pod的IP地址
[root@master1 yaml]# dig -t A nginx-headless-service.default.svc.cluster.local. @10.244.0.6

在这里插入图片描述

7. NodePort

  • nodePort的原理在于在node上开了一个端口,将向该端口的流量导入到kube-proxy,然后由kube-proxy进一步到给对应的pod
vim  nginx-service-nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: nginx
    release: stabel
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080

7.1. 创建:

[root@master1 yaml]# kubectl apply -f nginx-service-nodeport.yaml
service/nginx-nodeport-service created
[root@master1 yaml]# kubectl get svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes               ClusterIP   10.10.0.1       <none>        443/TCP        30h
nginx-headless-service   ClusterIP   None            <none>        80/TCP         26m
nginx-nodeport-service   NodePort    10.10.113.141   <none>        80:30080/TCP   7s
nginx-service            ClusterIP   10.10.196.214   <none>        80/TCP         68m

7.2. 验证:

在这里插入图片描述

8. LoadBalancer

  • loadBalancer和nodePort其实是同一种方式。区别在于loadBalancer比nodePor片多了一步,就是可以调用cloud provider去创建LB来向节点导流

在这里插入图片描述

9. ExternalName

  • 这种类型的Service通过返回CNAME和它的值,可以将服务映射到externalName字段的内容(例如:hub.atguigu.com)。ExternalName Service是Service的特例,它没有selector,也没有定义任何的端口和Endpoint。相反的,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务
vim  externalname-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-external-service
  namespace: default
spec:
  type: ExternalName
  externalName: example.com

9.1. 创建:

[root@master1 yaml]# kubectl apply -f externalname-service.yaml
service/my-external-service created
[root@master1 yaml]# kubectl get svc
NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes               ClusterIP      10.10.0.1       <none>        443/TCP        31h
my-external-service      ExternalName   <none>          example.com   <none>         4s
nginx-headless-service   ClusterIP      None            <none>        80/TCP         86m
nginx-nodeport-service   NodePort       10.10.113.141   <none>        80:30080/TCP   60m
nginx-service            ClusterIP      10.10.196.214   <none>        80/TCP         129m

9.2. 验证:

[root@master1 yaml]# dig -t A my-external-service.default.svc.cluster.local. @10.244.0.6

在这里插入图片描述

  • 当查询主机my-external-service.default.svc.cluster.local(SVC_NAME.NAMESPACE.svc.cluster.local)时,集群的DNS服务将返回一个值my.database.example.com的CNAME记录。访问这个服务的工作方式和其他的相同,唯一不同的是重定向发生在DNS层,而且不会进行代理或转发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二章 逻辑代数基础--数电(期末复习笔记)

第二章 逻辑代数基础 2.1 概述 逻辑&#xff1a;事物间的因果关系。 逻辑运算&#xff1a;逻辑状态按照指定的某种因果关系进行推理的过程。 逻辑变量&#xff1a;用字母表示&#xff0c;取值只有0和1。此时&#xff0c;0和1不再表示数量的大小&#xff0c;只代表两种不同的状…

人工智能期末复习(简答)

第1章 人工智能概述 1.什么是人工智能&#xff1f; 人工智能&#xff08;Artificial Intelligence, AI&#xff09;,又称机器智能&#xff08;MI&#xff0c;Machine Intelligence&#xff09;&#xff0c; 主要研究用人工的方法和技术开发智能机器或智能系统&#xff0c;以模…

交换机配置DHCP服务(华为交换机)

#三层交换机互联互通 配置 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #启动DHCP功能 [Huawei]dhcp enable #创建vlan 10 并配置 vlanif 地址 [Huawei]vlan 10 [Huawei-vlan10]int vlanif 10 [Huawei-Vlanif10]ip addr…

软考A计划-网络工程师-专业英语

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

初识轻量级分布式任务调度平台 xxl-job

文章目录 前言xxl-job的目录结构项目依赖 (父 pom.xml)xxl-job-admin 启动xxl-job-executor-sample (项目使用示例)xxl-job-executor-sample-frameless : 不使用框架的接入方式案例xxl-job-executor-sample-springboot : springboot接入方案案例 xxl-job执行器器启动流程分析调…

python高效使用方法03_pandas中的rolling.mean滚动求均值效率究竟如何?

先上图来说明pandas.rolling(n).mean()滚动求均值的方法效率其实并不是最高的&#xff0c;我自己尝试使用cython把滚动求均值的方法重新编译了一下&#xff0c;发现效率总体上是pandas的三倍以上。 总结&#xff1a;pandas比较合适用于普通的研究分析工作&#xff0c;如果用到追…

AcWing802:详解

原题引出 题解分析 首先毫无置疑的是本体需要用到离散化的知识&#xff0c;将输入的索引下标放到一个vector当中存起来&#xff0c;在该vector当中&#xff0c;利用其本身的索引我们对称构造两个数组a和s&#xff08;用于求前缀和&#xff09;。那么最关键的一个问题就是如何通…

NodeJS Socket编程⑩③

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Socket编程1、WebSocket VS HTTP请求2、浏览器支持3、WebSocket Practice4、WebSocket 授权验证5、SocketIO模块 &#x1f5e1; Express~WebSokcetIOServ…

Java中不支持多重继承原因

在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。 这是非常经典的问题&#xff0c;与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。 为什么Java不支持类多重继承, 可以考…

UML基本图例

UML基本图例 软件流程和UML基本图例软件流程&#xff1a;下面是九种常用的UML图&#xff1a;1.用例图&#xff08;UseCase Diagrams&#xff09;2.类图&#xff08;Class Diagram&#xff09;3.对象图&#xff08;Object Diagrams&#xff09;4.状态图&#xff08;Statechart D…

6道常见hadoop面试题

Q1.什么是Hadoop&#xff1f;   Hadoop是一个开源软件框架&#xff0c;用于存储大量数据&#xff0c;并发处理/查询在具有多个商用硬件&#xff08;即低成本硬件&#xff09;节点的集群上的那些数据。总之&#xff0c;Hadoop包括以下内容&#xff1a;   HDFS&#xff08;Ha…

Chiplet技术概览

一、概览 chiplet技术顺应了芯片生产与集成技术发展的趋势&#xff0c;也开拓了半导体技术发展的新的发展方向&#xff0c;将创造出一种新的芯片设计和商业模式 1.1 芯片生产与集成技术发展的趋势 &#xff08;1&#xff09;低半径高带宽的物理连线(bandwidth / memory wall…

打开win10“启动”文件夹的2种方式

方式1&#xff1a;通过CMD命令 1.输入代码 按WinR键打开运行窗口&#xff0c;输入“shell:Common Startup”代码。 2.点击确定 点击下面的确定按钮&#xff0c;运行代码。 3.打开文件夹 弹出文件夹即为系统启动文件夹。 方式2&#xff1a;输入路径 1.打开文件管理器 打…

【城市开发者职业成长交流 - 重庆】加强交流,共创成长:重庆程序员的线下交流会总结

周五睡觉前&#xff0c;我把窗帘拉的严严实实&#xff0c;所有的闹钟全部取消&#xff0c;甚至另外一只电话直接关机掉&#xff0c;为的是第二天可以好好的躺到自然醒&#xff0c;我其实也不知道具体的几点&#xff0c;就感觉连上被踩&#xff01;无奈的睁开眼睛&#xff0c;看…

基于WEB的院校课程管理系统设计与实现(论文+源码)_kaic

摘要 课程管理是学校管理工作的核心&#xff0c;是最为繁琐也最容易出错的工作&#xff0c;开发和 应用课程管理系统能够让课程管理工作人员从繁琐的工作中解脱出来&#xff0c;提高课程 管理的工作效率[1]&#xff0c;实现课程管理的信息化。虽然目前高职院校应用的课程管理系…

bigdata.com《大数据计算框架》样题

容量单位从小到大的顺序依次为&#xff1a;TB、PB、EB、ZB。 . 用于设置环境变量的文件是 .bash_profile . 将HDFS文件下载到本地的命令是 hadoop fs -get。 . 不需要Java环境的支持是 MySQL . 通配符是用于模糊匹配的特殊字符&#xff0c;可以在关键字查询中使用。在MySQL…

助你面试一臂之力,认识银行测试

我们知道软件测试是为了保证软件的质量和可靠性而在新软件系统上线之前对软件进行的质量检测工作。通过软件测试这个过程找出软件中的错误&#xff0c;分析错误的产生原因和容易产生错误的区域&#xff0c;进而有针对性的设计测试方法提高软件测试的效率。 以上简单讲述了一下…

k8s 之网络组件-Calico(十九)

下载资源 &#xff1a;安装 kubernetes 网络组件-Calico 一&#xff0c;简介 Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择&#xff0c;但Calico以其性能、灵活性而闻名。Calico的功能更为全面&#xff0c;不仅提供主机和pod之间的网…

【深入浅出密码学】离散对数

群相关知识点 离散对数相关 ## 蛮力搜索 对于解决 α x β \alpha^{x} \beta αxβ,我们不断地选取合适地 x x x,计算 a x a^x ax&#xff0c;直到找到满足这个等式的 x x x&#xff0c;时间复杂度 O ( ∣ G ∣ ) O(|G|) O(∣G∣). Baby-Step Giant-Step 对于解决 α x β…

卡尔曼滤波器使用一维与二维以及代码编写

注&#xff1a;要视频学习可以去B站搜索“DR_CAN”讲解的卡尔曼滤波器&#xff0c;深有体会&#xff01; 链接&#xff1a; 1、【学习心得|基于卡尔曼滤波的MPU6050姿态解算】https://www.bilibili.com/video/BV1sL411F7fu?p2&vd_source3d0b47bb7325b7b3a156ba92207bbd6…