11、Service访问Pod、Service IP原理、DNS访问Service、外部访问service

news2024/11/16 8:38:07
Pod可能因为各种原因发生故障而死掉,Deployment等Controller会通过动态创建和销毁Pod来保障应用整体的健壮性。 Pod是脆弱的,但应用是健壮的
每个Pod都有自己的IP地址,当controller用新的Pod替代发生故障的Pod时,新Pod会分配到新的IP地址,那这时客户端如何找到并访问这个服务呢??-----Service
  

一、创建Service

Kubernetes Service从逻辑上代表一组pod,具体哪些Pod由label挑选。
Service有自己的IP,这个IP是不变的。客户端只需要访问Service的IP, Kubernetes则负责建立和维护Service与Pod的映射关系。无论后端Pod如何变化,对客户端不会有任何影响,因为Service没变。
# 编辑httpd_deployment.yaml  
apiVersion: apps/v1
kind: Deployment
metadata:                  
  name: httpd-deployment
spec:
  selector:
    matchLabels:
      app:  httpd  # 通过标签选择被控制的pod
  replicas:  3
  template:
    metadata:
      labels:
        app: httpd  # 给pod打上标签,Service、Deployment 将会用这个 label 来挑选 Pod
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80  # 转发到后端pod的端口号

Pod分配了各自的IP地址,但这些IP只能被Kubernetes Cluster中的容器与节点访问。

# 编辑httpd_service.yaml  
apiVersion: v1
kind: Service
metadata:
  name: httpd-service # 必填,service名称
spec:
  selector:
    app: httpd # 必填,在selector字段中指定了为哪一个标签的app进行负载均衡
  ports: # 将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议
  - protocol: TCP
    port: 8080      # service监听端口
    targetPort: 80  # 转发到后端pod的端口号

httpd-service分配到一个CLUSTER-IP,可以通过该IP访问后端的httpd Pod

除了我们创建的 httpd-svc,还有一个 Service kubernetes,Cluster 内部通过这个 Service 访问 kubernetes API Server。
kubectl describe service httpd-service  查看service与Pod的对应关系

二、Service IP原理

Service的Cluster IP在哪里配置的?Cluster IP又是怎样与Pod IP映射的??---iptables
Service Cluster-ip是个虚拟的IP,是由kubernetes节点上iptables规则管理的。
通过  sudo iptables-save 命令打印当前节点的 iptables 规则,因输出较多,这里只截取与 httpd-service Cluster IP 10.98.165.152 相关的信息:
$ sudo iptables-save | grep '10.98.165.152'
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.98.165.152/32 -p tcp -m comment --comment "default/httpd-service cluster IP" -m tcp --dport 8080 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.98.165.152/32 -p tcp -m comment --comment "default/httpd-service cluster IP" -m tcp --dport 8080 -j KUBE-SVC-EHNHZY2AA2RZYURI

这两条规则的含义

    1、若Cluster内的Pod(源地址来自10.244.0.0/16)要访问httpd-service,则允许;
    2、其他源地址访问httpd-service(10.98.165.152/32),跳转到规则KUBE-SVC-EHNHZY2AA2RZYURI。
KUBE-SVC-EHNHZY2AA2RZYURI规则如下
-A KUBE-SVC-EHNHZY2AA2RZYURI -m comment --comment "default/httpd-service" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-RWFU5RJRM7QIVQGD
-A KUBE-SVC-EHNHZY2AA2RZYURI -m comment --comment "default/httpd-service" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-CX4QANADYSW4JX2E
-A KUBE-SVC-EHNHZY2AA2RZYURI -m comment --comment "default/httpd-service" -j KUBE-SEP-HGKXYQ3Y7I7MLDXP
  • 1/3的概率跳转到规则KUBE-SEP-RWFU5RJRM7QIVQGD
  • 1/3的概率(剩下2/3的一半)跳转到规则KUBE-SEP-CX4QANADYSW4JX2E
  • 1/3的概率跳转到规则KUBE-SEP-HGKXYQ3Y7I7MLDXP。
这三个跳转的规则如下
-A KUBE-SEP-RWFU5RJRM7QIVQGD -s 10.244.1.13/32 -m comment --comment "default/httpd-service" -j KUBE-MARK-MASQ
-A KUBE-SEP-RWFU5RJRM7QIVQGD -p tcp -m comment --comment "default/httpd-service" -m tcp -j DNAT --to-destination 10.244.1.13:80
-A KUBE-SEP-CX4QANADYSW4JX2E -s 10.244.1.14/32 -m comment --comment "default/httpd-service" -j KUBE-MARK-MASQ
-A KUBE-SEP-CX4QANADYSW4JX2E -p tcp -m comment --comment "default/httpd-service" -m tcp -j DNAT --to-destination 10.244.1.14:80
-A KUBE-SEP-HGKXYQ3Y7I7MLDXP -s 10.244.2.5/32 -m comment --comment "default/httpd-service" -j KUBE-MARK-MASQ
-A KUBE-SEP-HGKXYQ3Y7I7MLDXP -p tcp -m comment --comment "default/httpd-service" -m tcp -j DNAT --to-destination 10.244.2.5:80
即将请求分别转发到后端的三个 Pod
通过上面的分析,我们得到如下结论:
    iptables 将访问 Service 的流量转发到后端 Pod,而且使用类似轮询的负载均衡策略。
Cluster的每个节点都配置了相同的iptables规则,这样就确保了Cluster都能通过Service的Cluster IP访问Service。

三、DNS访问Service

除了通过Cluster IP访问Service,kubernetes还提供更为方便的DNS访问。
kubeadm 部署时会默认安装 coredns 组件(只在master节点), kubectl get deployment --namespace=kube-system
coredns是个DNS服务器,每当有新的Service被创建,coredns会添加该Service的DNS记录。
Cluster中的Pod可通过<Service_NAME>.<NAMESPACE_NAME>:<PORT>访问Service
可以用httpd-service.default:port访问httpd-service: wget https-service.default:8080
nslookup 查看 httpd-service 的 DNS 的信息:
DNS服务器是httpd-service.default.svc.cluster.local,这实际上就是coredns组件,本身部署在kube-system namespace中的一个service。
httpd-service.default.svc.cluster.local是http-service的完整域名。

四、在指定命名空间部署Service

在 kube-public 中部署 Service httpd2-svc,配置如下:
# 编辑httpd2.yaml  
apiVersion: apps/v1
kind: Deployment
metadata:
    name: httpd2-deployment
    namespace: kube-public # 指定命名空间
spec:
    selector: # 通过标签选择被控制的pod
        matchLabels:
            app: httpd2
    replicas: 2
    template:
        metadata:
            labels:
                app: httpd2 # 给pod打上标签,Service、Deployment 将会用这个 label 来挑选 Pod
        spec:
            containers:
            - name: httpd2
              image: httpd
              ports:
              - containerPort: 80 # 转发到后端pod的端口号

--- # 多个资源可以在一个 YAML 文件中定义,用 --- 分割
apiVersion: v1
kind: Service
metadata:
    name: httpd2-service
    namespace: kube-public # 指定命名空间
spec:
    selector:
        app: httpd2
    ports: # 将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议
    - protocol: TCP
      port: 8080      # service监听端口
      targetPort: 80  # 转发到后端pod的端口号

因为属于不同的 namespace, 必须使用httpd2-service.kube-public:8080才能访问。

五、外部访问Service

Kubernetes集群内部可以通过Cluster IP和DNS访问Service ,那集群外部如何访问Service??
Kubernetes 提供了多种类型的 Service,默认是 ClusterIP。
ClusterIP:
    Service通过Cluster内部的IP对外提供服务,只有Cluster内部的节点跟Pod可以访问
NodePort:
    Service通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过<NodeIP>:<NodePort>访问Service。
LoadBalancer:
    Service利用cloud provider特有的load balancer对外提供服务,cloud provider 负责将 load balancer 的流量导向 Service。
    目前支持的 cloud provider 有 GCP、AWS、Azur 等。

5.1、使用NodePort让外部访问Service

# 编辑httpd3.yaml  
apiVersion: apps/v1
kind: Deployment
metadata:
    name: httpd3-deployment
    namespace: kube-public # 指定命名空间
spec:
    selector: # 通过标签选择被控制的pod
        matchLabels:
            app: httpd3
    replicas: 1
    template:
        metadata:
            labels:
                app: httpd3 # 给pod打上标签,Service、Deployment 将会用这个 label 来挑选 Pod
        spec:
            containers:
            - name: httpd3
              image: httpd
              ports:
              - containerPort: 80 # 转发到后端pod的端口号

--- # 多个资源可以在一个 YAML 文件中定义,用 --- 分割
apiVersion: v1
kind: Service
metadata:
    name: httpd3-service
    namespace: kube-public # 指定命名空间
spec:
    type: NodePort # 添加NodePort类型的Service
    selector:
        app: httpd3
    ports: # 将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议
    - protocol: TCP
      port: 8080      # service监听端口
      targetPort: 80  # 转发到后端pod的端口号
httpd3-service的TYPE为 NodePort,表示可通过 Cluster 每个节点自身的 IP 访问 Service。
PORT(S)为 8080:30150/TCP,8080是ClusterIp监听的端口,30150是节点上监听的端口, Kubernetes会 从 30000-32767 中分配一个可用的端口,每个节点都会监听此端口并将请求转发给 Service
测试 NodePort 是否正常工作:通过三个节点 IP + 端口都能够访问 httpd3-service

5.2、Kubernetes 是如何将 <NodeIP>:<NodePort> 映射到 Pod 的呢?

跟Cluster IP一样,也是 借助iptables
$ sudo iptables-save | grep 'httpd3-service'
-A KUBE-NODEPORTS -p tcp -m comment --comment "kube-public/httpd3-service" -m tcp --dport 30150 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "kube-public/httpd3-service" -m tcp --dport 30150 -j KUBE-SVC-X5MD3Z6GVRFIQV4Q

规则的含义:访问当前节点30150端口的请求会被应用规则KUBE-SVC-X5MD3Z6GVRFIQV4Q

KUBE-SVC-X5MD3Z6GVRFIQV4Q规则如下
-A KUBE-SVC-X5MD3Z6GVRFIQV4Q -m comment --comment "kube-public/httpd3-service" -j KUBE-SEP-CA4JWI7MMTWMJLYK 
KUBE-SEP-CA4JWI7MMTWMJLYK规则如下:
-A KUBE-SEP-CA4JWI7MMTWMJLYK -s 10.244.1.27/32 -m comment --comment "kube-public/httpd3-service" -j KUBE-MARK-MASQ
-A KUBE-SEP-CA4JWI7MMTWMJLYK -p tcp -m comment --comment "kube-public/httpd3-service" -m tcp -j DNAT --to-destination 10.244.1.27:80

NodePort默认的是从 30000-32767 中随机分配一个可用的端口,但我们可以用nodePort指定某个特定的端口:

# 编辑httpd3.yaml  
apiVersion: apps/v1
kind: Deployment
metadata:
    name: httpd3-deployment
    namespace: kube-public # 指定命名空间
spec:
    selector: # 通过标签选择被控制的pod
        matchLabels:
            app: httpd3
    replicas: 1
    template:
        metadata:
            labels:
                app: httpd3 # 给pod打上标签,Service、Deployment 将会用这个 label 来挑选 Pod
        spec:
            containers:
            - name: httpd3
              image: httpd
              ports:
              - containerPort: 80 # 转发到后端pod的端口号

--- # 多个资源可以在一个 YAML 文件中定义,用 --- 分割
apiVersion: v1
kind: Service
metadata:
    name: httpd3-service
    namespace: kube-public # 指定命名空间
spec:
    type: NodePort # 添加NodePort类型的Service
    selector:
        app: httpd3
    ports: # 将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议
    - protocol: TCP
      port: 8080      # Service(Cluster IP)上监听端口
      targetPort: 80  # 转发到后端pod的监听端口号、
      nodePort: 30150 # 节点上监听的端口

最终,Node 和 ClusterIP 在各自端口上接收到的请求都会通过 iptables 转发到 Pod 的 targetPort。

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

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

相关文章

【Linux】Ubuntu、Debian下对deb包进行修改后重新打包——以MySQL安装包为例

需求 关于MySQL的lower_case_table_names参数&#xff0c;在Windows系统下和在Linux系统下&#xff0c;默认值是不同的。 Unix&#xff0c;Linux下默认为0&#xff0c;大小写敏感。创建的库表名将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录&#xff0…

Java项目:SSH在线水果商城平台含管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;分为普通用户与管理员两个角色&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员…

webpack5 Core-js解决async 函数、promise 对象等兼容问题

为什么Core-js 过去我们使用 babel 对 js 代码进行了兼容性处理&#xff0c;其中使用babel/preset-env 智能预设来处理兼容性问题。 它能将 ES6 的一些语法进行编译转换&#xff0c;比如箭头函数、点点点运算符等。但是如果是 async 函数、promise 对象、数组的一些方法&#x…

《FFmpeg Basics》中文版-06-填充视频

正文 填充视频意味着向视频帧添加额外的区域以包含额外的内容。当输入应在具有不同宽高比的显示器上播放时&#xff0c; 通常需要填充视频。 填充视频基础知识 对于视频填充&#xff0c;我们使用表格中描述的填充过滤器。 描述在输入视频帧中添加彩色填充&#xff0c;该帧位…

HTML+CSS+JS大作业:商城网购网站设计——淘宝1页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&a…

微信小程序获取用户头像昵称组件封装(最新版)

一、前言 微信小程序将在2022年11月08日对获取用户头像昵称信息的API再一次进行改动&#xff0c;这次的改动比较大。 更多详情查看公告&#xff1a;公告直达链接 我的项目比较多&#xff0c;而且大部分都是只需要获取用户的头像以及昵称&#xff0c;并不需要像官方的“最佳实…

袋鼠云数栈UI5.0体验升级背后的故事:可用性原则与交互升级

最近&#xff0c;我们袋鼠云的UED部⻔小伙伴们&#xff0c;不声不响地⼲了⼀件⼤事——升级了全新设计语言「数栈UI5.0」。 众所周知&#xff0c;用户在使用产品时&#xff0c;是一个动态的过程&#xff0c;用户和产品之间进行交互的可用性&#xff0c;能否让用户愉悦、快速地…

uni-app - H5 页面路由不存在时,跳转到自己定制的 404.vue 页面(当路由不存在时自动重定向到自定义的 404 组件)超详细简约高效的解决方案

前言 在 uni-app 开发 H5 移动端项目中,如果访问一个不存在的路由路径后,自定跳转重定向到自己定义的 404 页面。 本文带您从 0-1 一路复制,仅需 2 步完成 当页面 router 路由不存在,自动跳转到指定的 404 页面, 用最简单且最高效的方式完成,助您轻松完成该功能, 如下图…

【好文鉴赏】初创公司到底值不值得去?从以下几点考虑

关键词&#xff1a;【初创公司】【职业发展】【就业】 原文链接&#xff1a; https://tech.sina.cn/csj/2018-09-10/doc-ihiixyeu5565677.d.htmlhttps://www.zhihu.com/question/312725868/answer/693656577 有人说初创公司管理不成熟&#xff0c;未来不稳定&#xff1b; 有…

最小二乘法,加权最小二乘法,迭代重加权最小二乘法

文章目录一&#xff1a;最小二乘法&#xff08;OLS&#xff09;1&#xff1a;概述2&#xff1a;代数式3&#xff1a;矩阵式&#xff08;推荐&#xff09;3.1&#xff1a;实现代码二&#xff1a;加权最小二乘法&#xff08;WLS&#xff09;1&#xff1a;增加对角矩阵 W1.1&#…

oracle数据库控制语言—DCL

文章目录1、授予系统权限1.1 授予创建其他对象权限2、撤销系统权限2.1 示例3、oracle 中的角色3.1 什么时角色3.2 创建角色并且授予权限给角色3.2.1 创建角色3.2.1.1 示例3.2.2 授予权限给一个角色3.2.2.1 示例3.2.3 授予一个角色给用户3.2.3.1 示例一3.2.3.2 示例二3.2.3.3 示…

基于MySQL的事务管理

目录 概念&#xff1a;多条语句组成一个执行单位 事务的基本操作 MySQL中的事务必须满足A,C,I,D这四个基本特性 事务操作举例——&#xff08;转账&#xff09; 事务保存点——SAVEPOINT 事务隔离级别——多线程(并发同时访问) 总结 概念&#xff1a;多条语句组成一个执…

Mongo的数据操作

文章目录一&#xff0c;创建数据库二&#xff0c;插入数据&#xff08;一&#xff09;插入单条数据1&#xff0c;insert2&#xff0c;save&#xff08;二&#xff09;插入多条数据三&#xff0c;修改数据四&#xff0c; 更新所有找到匹配的数据五&#xff0c;数据删除&#xff…

极速Go语言入门(超全超详细)-基础篇

文章目录 GoLang概述 Go语言三大牛谷歌创造Golang的原因Golang 的发展历程Golang 的语言的特点 Go语言开发工具Go开发环境配置(sdk下载及配置) 使用开发工具创建第一个Go项目 Go 程序开发的注意事项 官方参考文档 Go学习 Go变量 数据类型 标识符 运算符 键盘输入语句 程序流程…

[附源码]计算机毕业设计JAVA高校贫困生认定系统

[附源码]计算机毕业设计JAVA高校贫困生认定系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myba…

列表的嵌套--Python

#列表的嵌套&#xff1a;在每一个列表中都包含其他列表元素 #获取李四所在列表的值? #获取李四所在的子列表索引&#xff0c;并通过索引获取改子列表值 name_list [[小明,小红,小绿],[Tom,Lily,Rose],[张三,李四,王五]] print(name_list[2]) #在从子列表中通过李四所在的索引…

[翻译] 使用FXGL创建一个非常基本的游戏

游戏要求 首先&#xff0c;让我们为我们的简单游戏定义一些要求: 一个600x600的窗口。屏幕上的玩家&#xff0c;由蓝色矩形表示。可以通过按键盘上的W、S、A或D来移动玩家。UI由一行文本表示。当玩家移动时&#xff0c;UI文本会更新以显示玩家在其生命周期内移动了多少像素。 …

今天给在家介绍一篇基于jsp的旅游网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

zookeeper报错length is greater than jute.maxbuffer=1048575

1、场景 最近在给上云项目部署系统&#xff0c;通过压测都已经正式上生产后发现kafka存在异常错误&#xff0c;经排查发现zookeeper也存在错误&#xff0c;怀疑kafka的问题可能是由于zk异常到的&#xff0c;报错如下 2022-11-17 06:26:43,052 [myid:] - WARN [NIOWorkerThr…

HTML学生个人网站作业设计:游戏网站设计——原神首页 1页 带轮播图

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游戏官网 | 游戏网站 | 电竞游戏 | 游戏介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 …