k8s中service对象

news/2024/9/18 21:15:05/ 标签: kubernetes, 容器, 云原生

文章目录

  • 一、Service
    • 简介
    • Service和kube-proxy的作用与区别
      • Service的工作过程
      • kube-proxy的工作过程
      • 总结
  • 二、具体实践
    • ClusterIP
      • ClusterIP 基本概念
      • 应用场景
    • NodePort
      • NodePort 简介
      • 应用场景
    • ExternalName
      • 简介
      • 应用场景


一、Service

简介

Kubernetes (k8s) 中的 Service 对象是一种抽象,它定义了一组 Pod 的逻辑集合和访问它们的策略。Service 为 Pod 提供了一个稳定的网络端点,使得其他 Pod 或外部客户端可以可靠地访问这些 Pod,即使 Pod 的 IP 地址可能会发生变化。
Service的关键概念和特征:

  1. 稳定性和发现:尽管Pod的IP地址可能会因为重启或者扩缩容而变化,但是Service的虚拟IP(ClusterIP)保持稳定,提升了服务发现的稳定性。

  2. 选择器 (Selector):Service通常使用标签选择器来选择需要暴露的Pod集合。这允许动态更新后台Pod集群,而无需手动维护Pod列表。

Service的关键概念和特征:

  1. 服务发现:Service 为一组 Pod 提供一个统一的访问点(通常是 DNS 名称),使得其他组件可以轻松发现和访问这些 Pod。
  2. 负载均衡:当多个 Pod 提供相同的服务时,Service 可以自动在这些 Pod 之间进行负载均衡。
  3. 稳定的网络地址:Service 提供一个稳定的 IP 地址和端口,即使底层 Pod 发生变化,这个地址也保持不变。
  4. 抽象底层实现:Service 使得应用程序可以不必关心具体的 Pod IP 地址,只需要知道 Service 的名称即可。
  5. 支持多种类型:Kubernetes 支持多种类型的 Service,包括 ClusterIP、NodePort、LoadBalancer 和 ExternalName。

Service 的主要类型:

  1. ClusterIP(默认):为 Service 分配一个集群内部的 IP 地址,只能在集群内部访问。
  2. NodePort:在 ClusterIP 的基础上,为 Service 在每个节点上分配一个端口,可以通过 <NodeIP>:<NodePort> 从集群外部访问服务。
  3. LoadBalancer:在 NodePort 的基础上,使用云提供商的负载均衡器,将流量转发到 <NodeIP>:<NodePort>。(公有云使用)
  4. ExternalName:将服务映射到一个外部的 DNS 名称。

Service和kube-proxy的作用与区别

Kubernetes中的Service和kube-proxy都是与网络流量管理密切相关的组件,但它们的功能和工作机制有很大的不同。

Service的工作过程

  1. Service定义:服务在Kubernetes中通过YAML或JSON格式的配置文件来定义。配置文件中通常包括服务的类型(如ClusterIP、NodePort、LoadBalancer)、端口信息、标签选择器等。

  2. 选择Pod:Service根据定义的标签选择器(Selector)来识别需要暴露的Pod。Kubernetes通过这些选择器将流量转发到匹配的Pod。

  3. Endpoints创建:一旦Service被创建或更新,Kubernetes会创建或更新一个Endpoints对象,其中包含当前符合选择条件的Pod的IP和端口。

  4. 流量路由:每个Service都有一个稳定的虚拟IP(ClusterIP),集群内部的请求通过这个IP进入,然后根据Endpoints信息进行内部负载均衡,将流量路由到合适的Pod。

  5. 服务类型扩展

    • ClusterIP:默认类型,仅在集群内部访问。
    • NodePort:通过集群中每个节点的同一端口暴露服务,使得服务可以从外部访问。
    • LoadBalancer:利用云提供商的负载均衡器在外部直接暴露服务。
    • ExternalName:将服务映射到外部DNS名称。

kube-proxy的工作过程

kube-proxy是Kubernetes中的网络代理,它在每个节点上运行,用于实现Kubernetes服务抽象的流量路由。它的工作过程包括:

  1. 监听API服务器:kube-proxy持续监听API服务器,以获取所有Service和Endpoints的最新信息。当这些对象发生变化时,kube-proxy会相应地更新自身的配置。

  2. 网络规则管理:根据服务规则和对应的Endpoints,kube-proxy在节点上设置网络规则。这些规则负责拦截经过的请求并将其转发到适当的Pod。

  3. 实现机制

    • iptables模式(传统):kube-proxy使用iptables为每个Service生成规则。规则通过NAT(网络地址转换)将请求从Service IP和端口重定向到Pod的IP和端口。
    • IPVS模式(更现代):使用Linux内核的IP虚拟服务器(IPVS)来实现更高效的负载均衡。IPVS对大量服务和流量提供了更好的性能。
  4. 负载均衡:根据Endpoints信息,kube-proxy负责在多个后端Pod之间负载均衡来自Service的流量。

总结

  • Service:在Kubernetes中用于将一组Pod作为服务来暴露,提供TCP/IP网络接口,从而实现负载均衡和服务发现。
  • kube-proxy:是一个网络代理,负责具体实现Service所需的流量转发和负载均衡功能。它运行在每个节点上,通过管理底层网络规则,确保集群内部外部的流量能够被正确地路由到相应的Pod。

二、具体实践

下面逐个演示service的四种类型,但LoadBalancer只在公有云环境中使用,故不演示。

ClusterIP

ClusterIP是Kubernetes中服务(Service)资源的默认类型,用于在集群内部提供对服务的稳定访问。

ClusterIP 基本概念

  • 集群内部访问:ClusterIP 为服务分配一个虚拟IP,只能在 Kubernetes 集群内部使用。外部无法直接访问。
  • 服务发现:集群内的其他 Pod 可以通过服务名称来访问这个服务,简单直观。
  • 负载均衡:当服务由多个 Pod 提供时,ClusterIP 会自动在这些 Pod 之间分配流量。

应用场景

  1. 内部服务通信:所有需要在 Kubernetes 内部通信的组件,比如微服务架构中的不同服务,通过 ClusterIP 互相调用。
  2. 数据库接入:集群内部的应用程序可以通过 ClusterIP 来访问数据库服务。
  3. 后端服务调用:前端应用或 API 网关访问后端服务时,利用 ClusterIP 提供稳定的网络路径。
apiVersion: apps/v1  
kind: Deployment  
metadata:  name: nginx-deployment  labels:  app: nginx-dep  
spec:  replicas: 10  selector:  matchLabels:  app: nginx  template:  metadata:  labels:  app: nginx  spec:  containers:  - name: nginx1  image: harbor.hiuiu.com/nginx/nginx:1.22a  imagePullPolicy: IfNotPresent  ports:  - containerPort: 80  
---  上面是启动模板文件,创建10个pod
apiVersion: v1  
kind: Service  
metadata:  name: myapp-service  
spec:  type: ClusterIP  ports:  - port: 80  暴露的端口targetPort: 80  pod的实际端口selector:  app: nginx

在这里插入图片描述

kubectl get service  myapp-service -o wide
查看service的状态

在这里插入图片描述
在这里插入图片描述
结果是集群内部可以访问,集群外部不可以访问。

NodePort

NodePort 简介

  • 什么是 NodePort:
    NodePort 是 Kubernetes 提供的一种服务类型,它允许外部流量通过特定端口访问集群内的服务。

  • 如何工作:

    • 在每个节点上开放一个固定范围的端口(30000-32767)。
    • 可以通过访问任一节点的 IP 和这个端口来访问服务。

应用场景

  1. 快速测试:

    • 在开发或测试环境中快速暴露服务给外部用户。
  2. 简单外部访问:

    • 没有复杂负载均衡需求的小规模或本地网络中使用。
  3. 结合负载均衡:

    • 可以与外部负载均衡器结合使用,提供更好的流量管理。
apiVersion: v1  
kind: Service  
metadata:  name: my-nodeport  
spec:  type: NodePort  selector:  app: nginx  ports:  - port: 80  targetPort: 80  nodePort: 30007
在这里插入代码片

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

ExternalName

ExternalName 是 Kubernetes 中的一种特殊服务类型,用于将集群内的服务请求直接映射到外部的 DNS 名称。

简介

  • DNS 名称映射:

    • ExternalName 服务通过将 Kubernetes 服务名称解析为外部 DNS 名称来工作。这意味着它不生成实际的网络代理,而是直接将域名解析为外部地址。
  • 无需端口或代理:

    • 这种服务类型不涉及 Kubernetes 代理,不需要暴露任何端口,只需简单地做 DNS 级别的转发。

应用场景

  1. 访问外部服务:

    • 当您需要从 Kubernetes 内部访问集群外部的服务时,可以使用 ExternalName 类型。例如,某些第三方 API 或外部数据库服务。
  2. 服务切换/重定向:

    • 在迁移阶段,可以使用 ExternalName 将流量指向临时的外部主机,简化服务切换过程。
  3. 统一服务访问:

    • 可以通过 ExternalName 为 Kubernetes 集群内的服务提供与外部服务一致的访问接口,统一服务调用方式。
apiVersion: v1
kind: Pod
metadata:name: external-pod
spec:containers:- name: external-cimage: harbor.hiuiu.com/linux_system/centos/centos7:7.9.2009command: ["/bin/sh"]args: ["-c","while true; do echo aaa; sleep 10; done"]
---
apiVersion: v1
kind: Service
metadata:name: external(集群内部的域名)
spec:type: ExternalNameexternalName: baidu.com

在这里插入图片描述
进入集群内部,去查看那个域名,解析出来的名字是baidu.com
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1518591.html

相关文章

构建基于I2C与UART通信的智能嵌入式机械臂抓取系统,结合OpenCV技术进行高效物体识别与动作控制的综合解决方案(代码示例)

在现代工业和智能家居中&#xff0c;智能抓取系统的需求日益增长。本项目旨在设计一个能够识别和抓取不同形状和尺寸物体的机械臂。通过视觉识别、夹爪控制和嵌入式系统集成&#xff0c;智能抓取系统能够大幅提升物体处理的效率和准确性。 项目目标与用途 本项目的主要目标是…

第二代骁龙8平台手机nubia Z5拆解

这周末&#xff0c;除非外面下钞票&#xff0c;否则谁也拦不住我玩《黑神话悟空》&#xff08;附&#xff1a;两款可以玩转悟空的显卡推荐&#xff09; 天玑助力联发科力压高通~探秘MTK 5G旗舰智能手机SoC芯片——MT6989&#xff08;天玑9300&#xff09; 第二代骁龙8平台手机…

如何叙述Kotlin这门语言。

Kotlin 是一种现代化的编程语言&#xff0c;由 JetBrains 开发&#xff0c;主要用于 Android 应用开发、服务器端开发和多平台项目。以下是关于 Kotlin 的详细介绍&#xff1a; 一、语言特点 简洁性 Kotlin 语法简洁明了&#xff0c;去除了一些 Java 中繁琐的语法结构。例如&a…

事半功倍:利用增强现实提高工作效率

人们通常认为增强现实只是游戏中的一个强大的功能&#xff0c;然而&#xff0c;研究表明&#xff0c;增强现实在提高工厂的效率和生产力方面也发挥着重要作用。不管增强现实、虚拟现实还是混合现实都能很好地模拟工厂的工作场景&#xff0c;这对于培训、运营、安全和研发方面的…

全局页面数据渲染--SAAS本地化及未来之窗行业应用跨平台架构

一、代码 /* 未来之窗通用数据渲染// 定义了一个名为"未来之窗_人工智能_前端口_数据渲染到界面"的函数 function 未来之窗_人工智能_前端口_数据渲染到界面(obj, 前置参数) {// 开启一个控制台分组&#xff0c;用于组织相关的输出信息console.group("未来之窗…

观察者模式(Observer Pattern)

一.定义 &#xff08;一&#xff09;观察者模式定义 简介&#xff1a;观察者模式也叫做发布订阅模式&#xff0c;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则其所有依赖于它的对象都会收到通知并自动更新。 1.Subject被观察者 定义…

万龙觉醒游戏攻略辅助:VMOS云手机助力战场加速!自动战斗!

在《万龙觉醒》这款游戏中&#xff0c;使用VMOS云手机可以极大提升你的游戏体验。VMOS云手机为这款游戏专属定制了云手机版本&#xff0c;内置了游戏安装包&#xff0c;无需再次下载安装。通过VMOS云手机&#xff0c;你可以实现24小时不间断的云端游戏运行&#xff0c;彻底解放…

MySQL5.7.36之主从复制过滤复制-centos7

1、主库过滤复制(这种不常用) 在生产中在主库上面进行过滤设置,可能会造成数据丢失,无法恢复&#xff1b; 只要在主库的配置文件里面配置就行 binlog_do_dbdatabasename 2、从库过滤复制 从库设置过滤,DDL操作时,出现跨库操作,不会被sql_thread回放 第一步&#xff1a;停止…

【网络安全】服务基础第一阶段——第四节:Windows系统管理基础---- NTFS安全权限与SMB文件共享服务器

目录 一、NTFS安全权限 1.1 文件系统 1.2 格式化磁盘中的文件系统 1.FAT32 2.NTFS 3.EXT 4.XFS 应用场景&#xff1a; 1.3 文件操作权限 1.4 权限管理系统 1.5 特殊权限 1.6 NTFS权限类型 二、权限管理实践 三、SMB文件共享服务器 3.1 文件共享服务器 3.2 常用的…

数据结构代码分享

单向链表 slist.h #ifndef __SLIST_H #define __SLIST_H#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>// 定义单链表结构 typedef int DATA;typedef struct Node {DATA data; // 存储数据---数据域struct N…

英特尔 Arrow Lake Halo 再现,猛堆料对标Strix Halo/苹果M系列

原文转载修改自&#xff1a; Arrow Lake Halo暴力堆料&#xff0c;对标Strix Halo&#xff0c;M系列 根据最近的消息&#xff0c;蓝厂准备于来年1月推出笔记本Arrow Lake-H处理器。虽然在传闻中Arrow Lake-H又是Arc Alchemist架构革新&#xff0c;又是6P8E&#xff0c;但基于…

flutter封装Dio使用

原文地址 封装 DioHttpUtil 类 // ignore_for_file: constant_identifier_namesimport package:dio/dio.dart; import package:flutter/foundation.dart;

使用SparkGraphX进行图计算时的编码问题

使用SparkGraphX进行图计算时的编码问题 在SparkGraphX体系中&#xff0c;要求图网络中的点ID必须为Long类型&#xff0c;不像Python中的networkX工具包支持字符串类型的节点表示&#xff0c;但在现实场景中&#xff0c;有很多情况下&#xff0c;点ID都是字符串类型的&#xf…

网络原理 TCP与UDP协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1.应用层 之前编写完了基本的 java socket &#xff0c;要知道&#xff0c;我们之前所写的所有代码都在应⽤层&#xff0c;都是为了 完成某项…

Ubuntu18.04 下安装CUDA

安装步骤 1.查看是否安装了cuda # 法1 cat /usr/local/cuda/version.txt # 法2 nvcc --version 2.若没有安装&#xff0c;则查看是否有N卡驱动&#xff0c;若无N卡驱动&#xff0c;则到软件与更新 -> 附加驱动中安装驱动 3.查看N卡驱动支持的cuda版本 nvidia-smi 如下…

哪些领域最适合采用音视频私有化解决方案?

随着数字化时代的到来&#xff0c;音视频通信已成为各行各业不可或缺的一部分&#xff0c;从企业内部沟通到在线教育、远程医疗、金融交易等&#xff0c;无一不依赖于稳定、高效且安全的音视频技术。然而&#xff0c;不同的行业对音视频通信的需求各不相同&#xff0c;尤其在数…

微信小程序代码目录结构介绍

文件描述app.js小程序的入口文件&#xff0c;负责监听和处理小程序的生命周期函数&#xff0c;以及定义一些全局的公共方法和数据。app.json公共全局配置文件。app.wxss公共全局样式文件。project.config.json项目的配置文件&#xff0c;包含一些项目级别的配置&#xff0c;如项…

使用Vue创建cesium项目模版该如何选择?

目录 问题描述模版说明及选用建议小结 问题描述 刚入手这个项目&#xff0c;什么都是一知半解。使用Vue,创建Cesium项目的时候&#xff0c;提示需要选择一个模版&#xff08;如下图所示&#xff09;&#xff0c;该如何选择项目模版选&#xff0c;总结如下&#xff1a; 模版说明…

Django+Vue音乐推荐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

Java基础入门【第六章 static、继承、重写、多态】(二)

5.访问控制 对象中的属性和方法&#xff0c;可以根据不同的权限修饰符&#xff08;public > protected > default > private&#xff09;来进行访问控制。 1&#xff09;概述 类中的属性和方法&#xff0c;可以使用以下四种权限修饰符进行访问控制&#xff1a; pu…