当前位置: 首页 > news >正文

【Kubernetes】Service 概念与实战

Service 概念与实战

  • 1.通过 Service 向外部暴露 Pod
  • 2.Service 的多端口设置
  • 3.集群内部的 DNS 服务
  • 4.无头 Service

在 Kubernetes 中部署的应用可能对应一个或者多个 Pod,而每个 Pod 又具有独立的 IP 地址。Service(服务)能够为一组功能相同的 Pod 提供统一不变的访问地址,使得集群具有稳定的 IP 地址(即 Cluster IP 地址),从而使在集群内部能够通过该 Cluster IP 地址将客户端请求路由到集群中的一个 Pod 上,从而实现客户端与 Pod 的通信。

Service 是 Kubernetes 中非常重要的组成部分,它主要为集群提供 请求的负载均衡Pod 的自动发现 功能。

Service 主要有以下两个作用:

  • Pod 的自动发现:通过标签 Label 与 Pod 关联,实现与 Pod 的通信。
  • 请求的负载均衡:提供不同的访问策略,以实现访问 Pod 请求的负载均衡。

1.通过 Service 向外部暴露 Pod

创建 Service 与创建应用的 Pod,可以被定义在同一个 YAML 文件中,也可以将它们在不同 YAML 文件中分开定义。下面通过使用两个 YAML 文件来分别定义 Service 和 Pod。

使用 Deployment 控制器来部署应用,创建文件 service-demo1.yaml,并在其中输入以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx name: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresent

使用 kubectl apply 命令部署应用。

kubectl apply -f service-demo1.yaml

查看 Pod 的信息。

kubectl get pod -o wide

输出的信息如下:

在这里插入图片描述

创建 Service:编辑文件 service-demo2.yaml,在其中输入以下内容。

apiVersion: v1
kind: Service
metadata:name: service-demo2namespace: default
spec:# 这里使用 NodePort 类型的 Service 将应用程序暴露给外部type: NodePort ports:- name: httpport: 80protocol: TCPtargetPort: 80# 定义标签选择器,将服务 Service 与匹配便签的一组 Pod 关联起来selector:     app: nginx

使用 kubectl apply 命令创建 Service。

kubectl apply -f service-demo2.yaml

查看 Pod、Service 和 Endpoint 的信息。

kubectl get pods,service,endpoints -o wide
kubectl get pods,svc,ep -o wide

输出的信息如下:

在这里插入图片描述

从输出的信息可以看出,在创建 Service 时会自动创建应用的接入点 Endpoint,并将每个 Pod 的 IP 地址自动加入 Endpoint 中。Endpoint 也会自动感知后端 Pod 的 IP 地址,从而实现动态的负载均衡。

🚀 Kubernetes Endpoint 是一个 Kubernetes API 对象,‌它表示一个 Service 的后端集合,用于将流量从 Service 引导到实际运行应用程序的 Pod。‌这个对象包含一组 IP 地址和端口号的列表,‌这些 IP 地址和端口号对应于 Service 后端 Pod 的网络终点。‌当创建一个 Service 时,‌Kubernetes 会自动创建与之关联的 Endpoints 对象,‌并将 Service 的后端 Pod 的 IP 地址和端口号添加到 Endpoints 对象中。‌Endpoints 对象会根据 Service 的选择器自动选择与之关联的 Pod。‌当 Pod 的 IP 地址或端口号发生变化时,‌Kubernetes 会自动更新 Endpoints 对象,‌确保 Service 能够正确路由到后端 Pod。‌通过访问 Service 的 Cluster IP,‌可以从集群内部访问 Service,‌而通过访问 Service 的 Endpoints,‌可以直接访问 Service 的后端 Pod。‌

在这里插入图片描述
🚀 简单来说,‌Kubernetes Endpoint 是 Kubernetes 系统中用于描述 Service 后端 Pod 的网络终点信息的对象,‌它确保了 Service 能够高效地路由到正确的后端 Pod,‌从而实现服务的可用性和可扩展性。‌

在这里插入图片描述

访问任意节点的 31767 端口都可以访问应用。

在这里插入图片描述
在这里插入图片描述

2.Service 的多端口设置

service-demo2.yaml 文件中定义的 Service 只暴露了一个端口,但在很多情况下需要 Service 暴露多个端口,例如同时暴露 HTTP 端口和 HTTPS 端口。Kubernetes 允许在定义 Service 时指定多个端口,但每个端口必须指定一个唯一的名称,以避免产生歧义。

下面是 Kubernetes 官方提供的一个示例。

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: MyAppports:- name: httpprotocol: TCPport: 80targetPort: 9376- name: httpsprotocol: TCPport: 443targetPort: 9377

3.集群内部的 DNS 服务

Service 在实现请求代理和负载均衡时,默认采用的是 Cluster IP 地址。但是 Cluster IP 地址不是永远不变的,因此建议在应用中不要使用 Cluster IP 地址,而使用 Service 的名称。Kubernetes 集群提供的 DNS 服务可以将 Service 的名称解析为 Cluster IP 地址。

下面对 Kubernetes 集群内部的 DNS 服务 进行一个简单的验证。

查看系统命名空间中的 Pod。

kubectl get pods -n kube-system | grep dns

输出的信息如下:

在这里插入图片描述

🚀 在 kube-system 的命名空间中自动启动了 Pod 来运行 DNS 服务。

创建 Service。

kubectl apply -f service-demo2.yaml

输出的信息如下:

在这里插入图片描述

使用 busybox1.28.4 版本创建一个 Pod,并进入 Pod 的内部。

kubectl run -it --image=busybox:1.28.4 --rm --restart=Never sh

busybox 的 Pod 中查找 service-demo2 服务,集群内部的 DNS 服务将返回 Service 的域名信息。

nslookup service-demo2

在这里插入图片描述

这里的 10.100.69.136 就是 Service service-demo2 对应的 Cluster IP。

🚀 nslookup 命令可以从 本地 DNS 服务器 中查看所有的 IP 地址和域名 信息(它就像一本互联网电话簿)。

4.无头 Service

每一个 Service 都会有一个 Service 名称,并最终由 DNS 解析成 Cluster IP 地址。连接到 Service 的客户端最终通过 Cluster IP 地址被转发到后端一个随机选择的 Pod 上。因此,这时客户端并不清楚后端 Pod 的 IP 地址。但是对于一些有状态的客户端来说,需要清楚地知道后端每个 Pod 的 IP 地址才能与其直接进行通信。这时就需要使用无头 Service(Headless Service)。

在这里插入图片描述
无头 Service 的运行机制核心是:去掉了 DNS 解析 Cluster IP 地址这个过程,直接返回后端 Pod 的 IP 地址。

创建部署描述文件 headless-service.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Service
metadata:name: headless-service
spec:selector:name: busybox# 设置为无头服务 Service	clusterIP: Noneports:- name: demo port: 1234targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:name: headless-service-pod-1labels:name: busybox
spec:hostname: headless-service-pod-1containers:- image: busyboxcommand:- sleep- "3600"name: busybox
---
apiVersion: v1
kind: Pod
metadata:name: headless-service-pod-2labels:name: busybox
spec:hostname: headless-service-pod-2containers:- image: busyboxcommand:- sleep- "3600"name: busybox

执行 kubectl apply -f 命令。

kubectl apply -f headless-service.yaml

在这里插入图片描述

查看 Service 和 Pod 的信息。

kubectl get svc,pod -o wide

输出的信息如下:

在这里插入图片描述

🚀 可以看到,service/headless-service 的 Cluster IP 的值是 None(即这是一个无头 Service),在它的后面有两个 Pod,以及每个 Pod 实际的 IP 地址。

使用 kubectl exec 命令进入其中一个 Pod 内部。

kubectl exec pod/headless-service-pod-1 -it /bin/sh

在 Pod 内部查看所使用的 DNS 服务器信息(也可以用 nslookup headless-service 查询)。

more /etc/resolv.conf

输出的信息如下:

在这里插入图片描述

在这里可以看到,使用的 DNS 服务器的 IP 地址是 10.96.0.10

  • search:配置的是集群的域名后缀。
  • nameserver:配置的是 kube-dns 服务的 IP 地址。

那么,这些配置从哪里来的呢?kubelet 的启动的配置文件 --config=/var/lib/kubelet/config.yaml 中有两个参数,分别用于指定域名服务的 IP 和集群域名。kubelet 在创建容器时才可以将这些配置传入进去。

在这里插入图片描述

在宿主机上使用 dig 命令访问无头 Service。

dig @10.96.0.10 headless-service.default.svc.cluster.local

输出的信息如下:

在这里插入图片描述

可以看到,在 ANSWER SECTION 中直接返回了后端两个 Pod 的 IP 地址。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React 中 useEffect 语法详解
  • 人工智能在子宫内膜癌领域的研究进展|顶刊速递·24-08-12
  • QT移除窗体的最大化和最小化按钮
  • Unity Audio
  • 实验25.创建文件
  • linux中信号的相关概念
  • 利用QT和FFmpeg实现一个简单的视频播放器
  • android视频播放,(一)MediaPlayer视频播放示例
  • 微调LLama 3.1——七月论文审稿GPT第5.5版:拿早期paper-review数据集微调LLama 3.1
  • Docker的卸载|安装|启动|停止|重启
  • vue防止鼠标左键拖动选中页面的元素
  • Elasticsearch 文档修改:全量更新与增量更新
  • C语言 | Leetcode C语言题解之第329题矩阵中的最长递增路径
  • LeetCode Pow(x, n)
  • HTTP的场景实践
  • Google 是如何开发 Web 框架的
  • 【css3】浏览器内核及其兼容性
  • 2018一半小结一波
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angularjs之国际化
  • Asm.js的简单介绍
  • django开发-定时任务的使用
  • iOS 系统授权开发
  • Java编程基础24——递归练习
  • Js基础——数据类型之Null和Undefined
  • React 快速上手 - 07 前端路由 react-router
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 半理解系列--Promise的进化史
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 讲清楚之javascript作用域
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • postgresql行列转换函数
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (003)SlickEdit Unity的补全
  • (3) cmake编译多个cpp文件
  • (a /b)*c的值
  • (补充)IDEA项目结构
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十六)视图变换 正交投影 透视投影
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Sql Server 保留几位小数的两种做法
  • .NET Framework .NET Core与 .NET 的区别
  • .NET MVC第三章、三种传值方式
  • .Net 垃圾回收机制原理(二)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .project文件
  • @Transactional 参数详解
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码