图解Kubernetes的服务(Service)

这篇具有很好参考价值的文章主要介绍了图解Kubernetes的服务(Service)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pod 准备:
图解Kubernetes的服务(Service)

不要直接使用和管理Pods:

  • 当使用ReplicaSet水平扩展scale时,Pods可能被terminated
  • 当使用Deployment时,去更新Docker Image Version,旧Pods会被terminated,然后创建新Pods

0 啥是服务(Service)

Kubernetes 中 Service 是 将运行在一个或一组 [Pod]上的网络应用程序公开为网络服务的方法。

Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种不熟悉的服务发现机制。 你可以在 Pod 集合中运行代码,无论该代码是为云原生环境设计的,还是被容器化的老应用。 你可以使用 Service 让一组 Pod 可在网络上访问,这样客户端就能与之交互。

如果你使用 [Deployment]运行应用, Deployment 可动态创建和销毁 Pod。 在任何时刻,你都不知道有多少个这样的 Pod 正在工作以及它们健康与否; 你可能甚至不知道如何辨别健康的 Pod。 Kubernetes Pod 的创建和销毁是为了匹配集群的预期状态。 Pod 是临时资源(你不应期待单个 Pod 可靠又耐用)。

每个 Pod 会获得属于自己的 IP 地址(Kubernetes 期待网络插件来保证这一点)。 对集群中给定的某个 Deployment,这一刻运行的 Pod 集合可能不同于下一刻运行该应用的 Pod 集合。

这就带来问题:若某组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”) 集合提供功能,前端要如何发现并跟踪要连接的 IP 地址,以便其使用负载的后端组件呢?

1 Kubernetes 中的 Service

Service API 是 Kubernetes 的组成部分,它是一种抽象,帮助你将 Pod 集合在网络上公开。 每个 Service 对象定义端点的一个逻辑集合(通常这些端点就是 Pod)以及如何访问到这些 Pod 的策略。

如考虑一个无状态的图像处理后端,其中运行 3 个副本(Replicas)。 这些副本是可互换的 —— 前端不需要关心它们调用的是哪个后端。 即便构成后端集合的实际 Pod 可能会发生变化,前端客户端不应该也没必要知道这些, 而且它们也不必亲自跟踪后端的状态变化。

Service 抽象使这种解耦成为可能。

Service 所对应的 Pod 集合通常由你定义的选择算符来确定。 若想了解定义 Service 端点的其他方式,查阅不带选择算符的 Service。

如果你的工作负载使用 HTTP 通信,你可能选用 Ingress 来控制 Web 流量如何到达该工作负载。Ingress 不是一种 Service,但它可用作集群的入口点。 Ingress 能让你将路由规则整合到同一个资源内,这样你就能将工作负载的多个组件公开出去, 这些组件使用同一个侦听器,但各自独立地运行在集群中。

用于 Kubernetes 的 Gateway API 能够提供 Ingress 和 Service 所不具备的一些额外能力。 Gateway 是使用 CustomResourceDefinitions 实现的一系列扩展 API。 你可以添加 Gateway 到你的集群中,之后就可以使用它们配置如何访问集群中运行的网络服务。

1.1 云原生服务发现

如果你想要在自己的应用中使用 Kubernetes API 进行服务发现,可以查询 APIServer, 寻找匹配的 EndpointSlice 对象。 只要 Service 中的 Pod 集合发生变化,Kubernetes 就会为其更新 EndpointSlice。

对于非本地应用,Kubernetes 提供了在应用和后端 Pod 之间放置网络端口或负载均衡器的方法。

无论采用那种方式,你的负载都可以使用这里的服务发现机制找到希望连接的目标。

对比Spring Cloud

Spring Cloud 中的微服务也通常使用服务名称进行通信,而不需要关心具体的IP地址。这是通过服务发现机制实现的,其中服务注册中心维护了服务名称与实际服务实例的映射关系。

在Spring Cloud中,服务通常会注册到服务注册中心(例如Eureka、Consul等),并且客户端通过服务名称来发现和调用服务,而不是直接使用硬编码的IP地址。这种做法使得微服务的位置可以更加灵活地变化,而不影响客户端的调用方式。

在这方面,Kubernetes 中的 Service 与 Spring Cloud 中的服务注册中心的角色有些相似。Kubernetes Service 提供了一种将一组 Pod 暴露为一个网络服务的机制,通过 Service 名称来访问这组 Pod,而不需要关心具体的 Pod IP 地址。这有助于实现微服务架构中的服务发现和解耦。

因此,无论是在Kubernetes中的Service还是Spring Cloud中的微服务,服务的抽象层级都允许更灵活、可扩展和解耦的服务通信。

2 Service类型

图解Kubernetes的服务(Service)

kubectl expoese给我们的pod创建一个Service,供外部访问。

2.1 ClusterIP

默认Service类型,它将Pods公开为k8s集群内部的服务。要创建ClusterIP Service,可用kubectl expose指定--type=ClusterIP。

如myapp Deployment暴露为ClusterIP Service:

kubectl expose deployment myapp --port=80 --target-port=8080 --type=ClusterIP

2.2 NodePort

图解Kubernetes的服务(Service)

将Pods公开为k8s集群外部的服务。它会在每个节点上打开一个端口,并将请求转发到后端Pods。

创建NodePort Service,使用kubectl expose命令,并指定--type=NodePort选项。

如将myapp Deployment暴露为NodePort Service:

[root@javaedge-k8s-node-1 ~]#  kubectl expose deployment javaedge-nginx  --port=90 --target-port=80 --type=NodePortservice/javaedge-nginx exposed

这个命令的作用是在 k8s 集群中将名为 javaedge-nginx 的 Deployment 暴露为一个 Service,该 Service 使用 NodePort 类型,并将容器端口 80 映射到 Service 的端口 90。这个命令的完整语法为:

kubectl expose deployment <deployment-name> --port=<service-port> --target-port=<container-port> --type=NodePort

其中,<deployment-name> 是要暴露的 Deployment 的名称,<service-port> 是要创建的 Service 的端口,<container-port> 是要映射到 Service 端口的容器端口,--type=NodePort 表示创建的 Service 类型为 NodePort。

2.3 外部的LoadBalancer

图解Kubernetes的服务(Service)

LoadBalancer Service将Pods公开为k8s集群外部的服务,并使用云提供商的公网的负载均衡器(固定的公网ip)来将请求路由到后端Pods。要创建Load Balancer Service,可用kubectl expose命令,并指定--type=LoadBalancer。

如将myapp Deployment暴露为LoadBalancer Service:

kubectl expose deployment myapp --port=80 --target-port=8080 --type=LoadBalancer

这些命令将创建一个名为myapp的Deployment,并将其公开为LoadBalancer Service。

使用LoadBalancer Service,需在云提供商的环境中运行Kubernetes集群,并且需要正确配置云提供商的负载均衡器。也可使用DNS,但需要DNS的add-on。

3 实战

kubectl create -f pod_nginx.yml
kubectl create -f pod_busybox.yml
[root@javaedge-monitor-platform-dev k8s]# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
busybox-pod                         1/1     Running   0          49s     10.244.0.24   minikube   <none>           <none>
nginx-pod                           1/1     Running   0          6s      10.244.0.25   minikube   <none>           <none>
[root@javaedge-monitor-platform-dev k8s]# kubectl expose pods nginx-pod
service/nginx-pod exposed

4 外部的LoadBalancer 模式的缺点

  • LoadBalancer+一个 ip 只能暴露一个服务。若需暴露多个服务,就需要申请多个LoadBalancer加上IP,成本剧增
  • 如果将K8s内部服务直接暴露给外网的客户,就会导致前端和后端耦合

于是,k8s 引入 Ingress。

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-777090.html

到了这里,关于图解Kubernetes的服务(Service)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Service Mesh和Kubernetes:加强微服务的通信与安全性

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容: 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 Kubernetes已经成为云原生应用程序的事实标准,它为容器编排和管

    2024年02月08日
    浏览(43)
  • 【Spring Cloud Kubernetes】使用k8s原生service实现服务注册和发现

    @TOC 现在微服务开发模式应用的越来越广泛,注册中心 Eureka 也逐渐被其它注册中心产品替代,比如阿里出品的 Nacos 。随着云原生相关技术的普及, k8s 迅猛发展,我们把 K8s 中的 Pod 暴露给外部访问,通过少了 Service ,这也是今天的主角。 有没有发现,其实 Service 已经解决了

    2024年02月12日
    浏览(85)
  • 【Kubernetes】第二十二篇 - k8s 部署 MySQL 服务(secret、deployment、service)

    上一篇,介绍基于 k8s 项目部署流程设计; 本篇,介绍 MySQL 服务的部署; 部署 MySQL 可以为指定 node 添加污点,专门用于 mysql 部署(当前只有一个节点,不考虑); 为了保证mysql容器重启时数据不会丢失:创建 mysql 数据目录,用于存储 mysql 数据,实现 MySQL 数据的持久化;

    2024年02月03日
    浏览(60)
  • (二十八)Kubernetes集群服务发现之Service资源ClusterIP/NodePort/HeadLiness/ExternallName类型详解

    目录 1.service介绍 1.1.service原理 1.2.kube-proxy支持的三种工作模式 1.3.开启ipvs模式 2.service资源清单文件 3.准备一个deployment资源 4.service资源详细配置 4.1.ClusterIP类型的Service 4.1.1.Endpoints资源 4.1.2.service亲和性负载策略 4.2.HeadLiness类型的Service 4.3.NodePort类型的Service 4.4.ExternalName类型的

    2024年02月21日
    浏览(36)
  • Kubernetes 启动Pod的方法-Pod的调度算法-Pod间的通信-k8s的控制器-Pod资源控制-发布Service服务

    目录 Pod 参考文档:Pod | Kubernetes Pod配置文件:simple-pod.yaml 对master进行如下操作 Pod的状态有: 参考文档:(70条消息) Pod生命周期中的状态解释_pod状态_闹玩儿扣眼珠子的博客-CSDN博客 进入Pod内的nginx容器: 当我们创建一个Pod,其中的步骤是什么?(启动Pob的流程) 大概步骤:

    2024年02月13日
    浏览(71)
  • 大数据Doris(四):直接编译(CentOS/Ubuntu)准备

    文章目录 直接编译(CentOS/Ubuntu)准备 一、环境准备

    2024年02月03日
    浏览(26)
  • 【云原生 • Kubernetes】kubernetes 核心技术 - Service

    1. Service 的定义 Service 是 Kubernetes 的核心概念之一,创建一个 Service 可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。 完整 yaml 格式的 Service 定义文件如下: 2. Service 的基本用法 一般情况下,对外部提供服务的应用

    2024年02月01日
    浏览(39)
  • root密码忘记了怎么办?不要慌,一招教你解决!!!(注:红色加粗部分可直接复制粘贴使用)

    (1)将ro修改为 “ rw ” (2) 末尾添加 “ init=/bin/sh ” (1)输入 “ passwd ” (2)输入密码 “ 密码 ” (3)再次确认 “ 密码 ” (1)强行添加写入权限 “ mount -o remount,rw /sysroot ” (2)查看是否成功添加写入权限 “ mount | grep sysroot ” (3)进入子目录 “ chroot /sysroot/ ”

    2024年02月04日
    浏览(57)
  • vue2、3 开发项目前的准备,可直接拷贝(分享)

    1. Vue2 因为最近都是做的 pc 端的项目,所以就按 pc 端常用的来配,都是架子可以直接拷贝 1.1 安装依赖 1.2 配置 element-ui element-ui 官网点击这里 1.3 配置 axios axios 官网点击这里 1.4 配置 vue-router vue-router3 的使用点击这里 1.5 配置 vuex vuex3 的使用点击这里 2. Vue3 2.1 安装依赖 其他安

    2024年02月08日
    浏览(79)
  • Kubernetes Service的过程

    在了解Service之前,需要先了解一些额外的知识: 命令: ip route show table all DNAT IPVS和iptables 基础的网络知识(网关,网段或子网,转发) 1. 命令 ip route show table all 这条命令会列出主机内所有的路由.内容展示包含了对应的网段或者IP,要通过那个虚拟设备发送出去.示例: 摘取一条,比如:

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包