【云原生】k8s Service 实现服务发现和负载均衡

文章目录

  • 前言
  • Service 介绍
  • Service 的四种类型及使用方式
  • Service 的定义和使用
    • 通过命令创建服务
    • 查看创建的服务情况
  • 不指定 Selectors 的服务
  • Headless 服务
  • Service 工作原理及原理图
  • Ingress 讲解
  • 集群外部如何访问服务
  • 总结

前言

在容器编排系统中,如 Kubernetes,Pod 是最小的部署单元。而一组 Pod 通常对外提供某种服务。在 Kubernetes 中,Service 就是用来对外暴露一组 Pod 的服务的资源对象。Service 可以通过 IP 地址和端口号访问,从而对外提供服务。

Service 介绍

Service 是 Kubernetes 中一个非常重要的概念,它可以将一组 Pod 封装成一个逻辑服务单元。

Service 可以通过定义的 Label Selector,将一组 Pod 绑定到一起,形成一个 Service。通过 Service,用户可以方便地访问这个服务,不需要关心 Pod 的具体 IP 地址和端口号,也不需要担心 Pod 的数量变化会影响服务的访问。

Service 的四种类型及使用方式

Kubernetes 中的 Service 一共有四种类型,分别是 ClusterIP、NodePort、LoadBalancer 和 ExternalName。

  • ClusterIP:是 Service 的默认类型,它会为 Service 创建一个 Cluster IP,这个 IP 只能在集群内部访问。通过 ClusterIP,用户可以访问该 Service 关联的 Pod。
  • NodePort:在每个节点上绑定一个端口,从而将 Service 暴露到集群外部。用户可以通过任意一个节点的 IP 地址和该端口号来访问 Service。
  • LoadBalancer:在云厂商提供的负载均衡器上创建一个 VIP,从而将 Service 暴露到集群外部。用户可以通过该 VIP 地址来访问 Service。
  • ExternalName:可以将 Service 映射到集群外部的一个 DNS 名称上,从而将 Service 暴露到集群外部。

另外,也可以将已有的服务以 Service 的形式加入到 Kubernetes 集群中来,只需要在创建 Service 的时候不指定 Label selector,而是在 Service 创建好后手动为其添加 endpoint。

Service 的定义和使用

Service 也是可以通过 yaml 来定义的。

以下是带有 selector 和 type 的 YAML 文件定义一个名为 nginx 的 Service,将服务的 80 端口转发到 default namespace 中带有标签 run=nginx 的 Pod 的 80 端口:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    run: nginx
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

其中,type 为 Service 的类型,可以取值为 ClusterIP、NodePort、LoadBalancer 和 ExternalName。

本例中的 type 为 ClusterIP,表示该 Service 的类型为 ClusterIP。

以下是通过命令创建及查看创建的服务情况的操作步骤和预期的展示内容。

通过命令创建服务

  1. 使用 kubectl create 命令创建一个名为 nginx 的服务,并将服务的 80 端口转发到 default namespace 中带有标签 run=nginx 的 Pod 的 80 端口。运行以下命令:
kubectl create service clusterip nginx --tcp=80:80 --dry-run=client -o yaml > nginx-service.yaml

这个命令将在当前目录下生成一个名为 nginx-service.yaml 的 YAML 文件,其中包含了创建 Service 所需的配置信息。

预期展示内容:

service/nginx created (dry run)
  1. 使用 kubectl apply 命令创建 Service。运行以下命令:
kubectl apply -f nginx-service.yaml

这个命令将根据 YAML 文件中的配置信息创建一个名为 nginx 的 Service。

预期展示内容:

service/nginx created

查看创建的服务情况

  1. 使用 kubectl get 命令查看已经创建的 Service。运行以下命令:
kubectl get services

这个命令将显示所有已经创建的 Service,包括它们的名称、类型、Cluster IP、端口等信息。
预期展示内容:

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    4h19m
nginx        ClusterIP   10.96.58.173   <none>        80/TCP     1m
  1. 使用 kubectl describe 命令查看指定 Service 的详细信息。运行以下命令:
kubectl describe service nginx

这个命令将显示名为 nginx 的 Service 的详细信息,包括它的类型、Cluster IP、端口、Selector 等信息。

预期展示内容:

Name:              nginx
Namespace:         default
Labels:            run=nginx
Annotations:       <none>
Selector:          run=nginx
Type:              ClusterIP
IP:                10.96.58.173
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.7:80
Session Affinity:  None
Events:            <none>

不指定 Selectors 的服务

当用户创建 Service 的时候,可以不指定 Label Selector,这种 Service 被称为无选择器服务(no selector service)。无选择器服务不能和 Pod 绑定,而只是提供一个固定的 IP 和端口,用于访问后端服务。这种服务通常用于代理到外部的服务,如数据库、消息队列等。

Headless 服务

Kubernetes 中的 Service 还有一个特殊的类型,叫做 Headless 服务。Headless 服务的 ClusterIP 为 None,它不会为 Service 创建 Cluster IP。通过 Headless 服务,用户可以直接访问该 Service 关联的 Pod,而不需要通过 Service 进行访问。

Service 工作原理及原理图

Service 的工作原理是通过代理模式实现的,即 kube-proxy 负责将 service 负载均衡到后端 Pod 中。
当用户通过 Service 的 IP 和端口访问 Service 时,请求会先到达 Service 代理,然后由代理将请求转发给后端的 Pod。
当 Pod 发生变化时,Service 会自动更新 Endpoint,从而保证请求能够正确地到达后端 Pod。
以下是 Service 工作原理的原理图:
在这里插入图片描述

Ingress 讲解

Ingress 是 Kubernetes 中另一个重要的资源对象,它用于将集群外部的 HTTP(S) 流量路由到集群内部的 Service。通过 Ingress,用户可以在集群外部定义一个域名,然后将该域名路由到 Service 中。Ingress 可以实现灰度发布、负载均衡、SSL 终止等功能。

集群外部如何访问服务

当用户需要从集群外部访问 Kubernetes 中的 Service 时,可以通过 NodePort、LoadBalancer 或 Ingress 来实现。具体方式如下:

  • NodePort

用户可以通过任意一个节点的 IP 地址和该节点上绑定的端口号来访问 Service。例如,如果 NodePort 的端口为 30080,节点 IP 地址为 192.168.0.10,则用户可以通过 http://192.168.0.10:30080 访问该 Service。

  • LoadBalancer

当 Service 的类型为 LoadBalancer 时,云厂商会在其提供的负载均衡器上为 Service 创建一个 VIP,用户可以通过该 VIP 地址来访问 Service。

  • Ingress

通过 Ingress,用户可以在集群外部定义一个域名,并将该域名路由到 Service 中。用户可以通过该域名来访问 Service。

总结

以上是关于 Kubernetes 中的 Service 的介绍,包括 Service 介绍和定义、Service 的四种类型 Service 工作原理、Ingress 讲解以及集群外部如何访问服务。

在使用 Service 时,用户不需要关心 Pod 的具体 IP 地址和端口号,也不需要担心 Pod 的数量变化会影响服务的访问。

通过 Ingress,用户可以在集群外部定义一个域名,然后将该域名路由到 Service 中,从而实现灰度发布、负载均衡、SSL 终止等功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NLP / LLMs中的Temperature 是什么?

ChatGPT, GPT-3, GPT-3.5, GPT-4, LLaMA, Bard等大型语言模型的一个重要的超参数 大型语言模型能够根据给定的上下文或提示生成新文本&#xff0c;由于神经网络等深度学习技术的进步&#xff0c;这些模型越来越受欢迎。可用于控制生成语言模型行为的关键参数之一是Temperature …

思维导图软件哪个好?安利八款好用的思维导图软件

当你需要表达和整理复杂的想法、计划和项目时&#xff0c;思维导图软件可以是非常有用的工具。不同的思维导图软件有不同的功能和特点&#xff0c;选择适合自己的软件可以让你更高效地工作和学习。但是你了解思维导图软件哪个好呢&#xff1f;下面就给大家安利八款简单好用的思…

Python 自动化指南(繁琐工作自动化)第二版:十二、网络爬取

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter12/ 在那些没有 Wi-Fi 的罕见、可怕的时刻&#xff0c;我意识到我在电脑上做的事情有多少是我在互联网上做的。出于纯粹的习惯&#xff0c;我会发现自己试图查看电子邮件&#xff0c;阅读朋友的 Twitter 信息&am…

C生万物 | 校招热门考点 —— 结构体内存对齐

文章目录一、前言结构体偏移量计算&#xff1a;offsetof二、规则介绍例题的分解与细说三、习题演练1、练习①2、练习②四、为什么存在内存对齐?1、平台原因(移植原因)2、性能原因五、如何修改默认对齐数六、实战演练✍一道百度笔试题&#xff1a; offsetof 宏的实现&#x1f4…

AIGC技术周报|ChatDoctor:哪里不舒服;HuggingGPT:连接大模型和机器学习社区;ChatGPT真的鲁棒吗?

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 1.ChatDoctor&#xff1a;哪里不舒服&#xff1f; 通用领…

双周赛101(模拟、动态规划、中位数贪心+裴蜀定理、BFS)

文章目录6327. 从两个数字数组里生成最小数字模拟6328. 找到最大开销的子字符串同向双指针动态规划(相似)[53. 最大子数组和](https://leetcode.cn/problems/maximum-subarray/)&#x1f383;[6329. 使子数组元素和相等](https://leetcode.cn/problems/make-k-subarray-sums-eq…

042:cesium加载Eris地图(多种形式)

第042个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载加载Eris地图。这里显示4种形式的地图,分别为:World_Imagery、World_Street_Map、World_Terrain_Base、World_Physical_Map。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示…

C++之继承

文章目录前言一、继承的概念和定义1.概念2.定义1.格式2.继承关系和访问限定符3.继承方式的变化二、基类和派生类对象的赋值转换三、继承中的作用域四、派生类的默认成员函数1.构造函数2.拷贝构造3.赋值运算符重载4.析构函数五、友元六、静态成员七、菱形继承和菱形虚拟继承1.单…

ctfshow web入门 命令执行web54-58

1.web54 正则加入了.*尽可能多匹配,flag绕过方式就不可以了&#xff0c;但是可以用&#xff1f;代替&#xff0c;nl也被匹配了 比如说cat&#xff0c;.*当出现cat这个整体时才会进行匹配&#xff0c;会尽可能匹配较多字符&#xff0c;ca&#xff0c;c之类的字符不会进行匹配&a…

【LeetCode】剑指 Offer 44. 数字序列中某一位的数字 p225 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/ 1. 题目介绍&#xff08;44. 数字序列中某一位的数字&#xff09; 数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中&#xff0c;第5位&#xf…

Atlassian Server用户新选择 | 迁移到数据中心版前,您需要做这些准备(2)

2024年2月&#xff0c;也就是一年不到&#xff0c;Atlassian将终止对Server产品及插件的所有支持。 此公告发布后&#xff0c;许多用户需要了解怎样的前进方向才是最适合企业的。为此&#xff0c;Atlassian不仅提供云版&#xff0c;还提供了本地部署的数据中心&#xff08;Data…

【音视频】zlmediakit总结二---webrtc编译

目录 linux下安装 实操 windows下编译 libsrtp 的编译与install 很重要 visual studio的设置 观察点一&#xff1a; WebApi.cpp ​编辑观察点二&#xff1a; CMakeCache.txt 观察点三&#xff1a; CMakeLists.txt 实操 参考资料。 linux下安装 参考参考资料 &#x…

【06】卷积

1. 卷积原理 ① Conv1d代表一维卷积&#xff0c;Conv2d代表二维卷积&#xff0c;Conv3d代表三维卷积。 ② kernel_size在训练过程中不断调整&#xff0c;定义为3就是3 * 3的卷积核&#xff0c;实际我们在训练神经网络过程中其实就是对kernel_size不断调整。 ③ 可以根据输入…

mysql数据库简介

1.什么是数据库&#xff1a;数据仓库。访问必须只能用SQL语句来访问。数据库也是一个文件的系统。 2.数据库的作用&#xff1a;存储数据的作用。开发任何的应用&#xff0c;都有数据库。 3.关系型的数据库&#xff1a;数据库中保存的都是实体与实体之间的关系。 4.常见的数据库…

UE4 Sequence学习

1.常用轨道 1.1 Camera轨道 Camera轨道可以理解为Camera Cuts轨道和Camera Actor轨道&#xff0c;一般点击Sequencer上的摄像机图标可以自动创建&#xff1a; Camera Cuts轨道&#xff0c;可以进行不同相机机位的切换&#xff0c;一般会随着Camera Actor轨道自动创建&#x…

微软新Bing AI,带chat聊天写作等功能的搜索引擎简介

文章目录可选前置操作将系统对软件的位置获取禁止更改默认区域尝试更改现有MS账户注册地&#xff08;亲测不行&#xff09;在GPT和bing AI中搜索按步骤更改MS账户注册地址设置 / 账户管理右上角头像 / 我的个人资料国家或地区 / 编辑结果重新注册MS账户&#xff0c;设置注册地为…

Nodejs+vue+elementui网上租车网站 vscode汽车租赁系统

一开始&#xff0c;本文就对系统内谈到的基本知识&#xff0c;从整体上进行了描述&#xff0c;并在此基础上进行了系统分析。为了能够使本系统较好、较为完善的被设计实现出来&#xff0c;就必须先进行分析调查。基于之前相关的基础&#xff0c;在功能上&#xff0c;对新系统进…

Zookeeper

一、Zookeeper 概述 1、Zookeeper 定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 2、Zookeeper 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家…

Java多线程基础汇总(上)

目录 一. 概念 二.线程的创建 三. Thread类的常见方法 1.启动一个线程 2.终止一个线程 3.等待一个线程 四. 线程安全问题 1.导致线程安全的原因&#xff1a; 2.如何解决线程安全问题 2.1 synchronized关键字 2.2 volatile关键字 3. wait 和 notify 4.wait 和 slee…

你写的C语言代码被翻译成可执行程序,需要这几步

本篇博客会讲解C语言的灵魂知识点&#xff1a;你写出来的C语言代码究竟是如何让计算机识别并且执行的。C语言是一门计算机语言&#xff0c;可以方便程序员和计算机沟通&#xff0c;但是&#xff0c;计算机只认得二进制&#xff0c;怎么会认得你写的C语言代码是什么意思呢&#…
最新文章