Kubernetes(k8s)容器编排Service

news2024/11/17 0:02:40

目录

  • 1 Service概述
    • 1.1 为什么要有Service
    • 1.2 Service实现原理
  • 2 Service 的类型
  • 3 Service示例
    • 3.1 准备工作
      • 3.1.1 创建deployment
      • 3.1.2 启动deployment
      • 3.1.3 访问测试
    • 3.2 ClusterlP类型
      • 3.2.1 编辑资源清单
      • 3.2.2 应用Service
      • 3.2.3 访问测试
      • 3.2.4 删除Pod
      • 3.2.5 访问测试
    • 3.3 NodePort
      • 3.3.1 编辑资源清单
      • 3.3.2 应用Service
      • 3.3.3 访问测试
      • 3.3.4 删除Pod
      • 3.3.5 访问测试
      • 3.3.6 外网访问
  • 4 端口号区分
    • 4.1 应用位置不同
    • 4.1 port
    • 4.2 targetport
    • 4.3 nodeport
    • 4.4 小结


1 Service概述

在这里插入图片描述

Kubernetes service 定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务,这一组 pod 能够被 Service 访问到,通常是通过 Label selector

在这里插入图片描述

Service能够提供负载均衡的能力,但是在使用上有以下限制:

  • 只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的

Kubernetes Service 从逻辑上代理了一组 Pod,具体是哪些 Pod 则是由 label 来挑选,Service 有自己 IP,而且这个 IP 是不变的。

  • 客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系。
  • 无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变

1.1 为什么要有Service

当Pod宕机后重新生成时,其IP等状态信息可能会变动,Service会根据Pod的Label对这些状态信息进行监控和变更,保证上游服务不受Pod的变动而影响。

​ Kubernetes Pods 是有生命周期的,他们可以被创建,而且销毁不会再启动, 如果您使用Deployment来运行您的应用程序,则它可以动态创建和销毁 Pod。

​ 一个Kubernetes的Service是一种抽象,它定义了一组Pods的逻辑集合和一个用于访问它们的策略 - 有的时候被称之为微服务,一个Service的目标Pod集合通常是由Label Selector 来决定的。

​ 如下图所示,当Nginx Pod作为客户端访问Tomcat Pod中的应用时,IP的变动或应用规模的缩减会导致客户端访问错误。而Pod规模的扩容又会使得客户端无法有效的使用新增的Pod对象,从而影响达成规模扩展之目的。为此,Kubernetes特地设计了Service资源来解决此类问题。

在这里插入图片描述

1.2 Service实现原理

Service资源基于标签选择器将一组Pod定义成一个逻辑组合,并通过自己的IP地址和端口调度代理请求至组内的Pod对象之上,如下图所示,它向客户端隐藏了真实的、处理用户请求的Pod资源,使得客户端的请求看上去就像是由Service直接处理并响应一样。

在这里插入图片描述

Service对象的IP地址也称为Cluster IP,它位于Kubernetes集群配置指定专用IP地址的范围之内,是一种虚拟IP地址,它在Service对象创建后既保持不变,并且能够被同一集群中的Pod资源所访问。Service端口用于接收客户端请求并将其转发至其后端的Pod中的相应端口之上,因此,这种代理机构也称为“端口代理”(port proxy)或四层代理,工作于TCP/IP协议栈的传输层。

Service资源会通过API Server持续监视着(watch)标签选择器匹配到的后端Pod对象,并实时跟踪各对象的变动,例如,IP地址变动、对象增加或减少等。Service并不直接链接至Pod对象,它们之间还有一个中间层——Endpoints资源对象,它是一个由IP地址和端口组成的列表,这些IP地址和端口则来自由Service的标签选择器匹配到的Pod资源。当创建service对象时,其关联的Endpoints对象会自动创建。

2 Service 的类型

Service 在 K8s 中有以下四种类型

  • Clusterlp:默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP
  • NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过:NodePort 来访问该服务
  • LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到:NodePort
  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7或更高版本的 kube-dns 才支持

3 Service示例

3.1 准备工作

3.1.1 创建deployment

vi nginx-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1 # 只有一个副本
  selector:
    matchLabels:
        app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:    #定义存储卷
      - name: html # 定义存储名称
        hostPath:  # 定义存储类型
          path: /tmp/k8s/data/volumn1 # 宿主机存储路径
          type: DirectoryOrCreate     # 不存在路径创建路径
      containers:
      - name: nginx
        image: nginx:1.20
        volumeMounts:    #在容器中定义挂载存储卷的名和路径
        - name: html
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80

3.1.2 启动deployment

kubectl apply -f nginx-deployment.yml

kubectl get pods -o wide

在这里插入图片描述

3.1.3 访问测试

curl 10.244.2.54

在这里插入图片描述

3.2 ClusterlP类型

类型为ClusterIP的service,这个service有一个Cluster-IP,其实就一个VIP,具体实现原理依靠kubeproxy组件,通过iptables或是ipvs实现。

注意:这种类型的service 只能在集群内访问

在这里插入图片描述

3.2.1 编辑资源清单

vi cluster-iP-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: default
  labels:
    app: nginx-service
spec:
  type: ClusterIP
  ports:
  - port: 8000      # Service 暴漏端口
    targetPort: 80  # 代理的对象的端口
  selector:
    app: nginx # 绑定标签是nginx的对象

3.2.2 应用Service

kubectl apply -f cluster-iP-service.yml

kubectl get service -o wide

在这里插入图片描述

3.2.3 访问测试

curl 10.1.206.66:8000

在这里插入图片描述

3.2.4 删除Pod

删除pod让Pod的节点漂移再次访问Service节点

kubectl delete pod nginx-deployment-6897679c4b-2hqmk

在这里插入图片描述

3.2.5 访问测试

我们发现虽然pod的IP以及节点变化了但是Service访问IP没有任何变化

curl 10.1.206.66:8000

在这里插入图片描述

3.3 NodePort

当我们需要集群外业务访问,那么ClusterIP就满足不了了,NodePort当然是其中的一种实现方案

在这里插入图片描述

3.3.1 编辑资源清单

vi node-port-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-node-port-service
  namespace: default
  labels:
    app: nginx-service
spec:
  type: NodePort
  ports:
  - port: 8000      # Service 暴漏端口
    targetPort: 80  # 代理的对象的端口
  selector:
    app: nginx # 绑定标签是nginx的对象

3.3.2 应用Service

kubectl apply -f node-port-service.yml

kubectl get service -o wide

在这里插入图片描述

3.3.3 访问测试

curl 10.1.137.200:8000

在这里插入图片描述

3.3.4 删除Pod

删除pod让Pod的节点漂移再次访问Service节点

kubectl delete pod nginx-deployment-6897679c4b-2hqmk

在这里插入图片描述

3.3.5 访问测试

我们发现虽然pod的IP以及节点变化了但是Service访问IP没有任何变化

curl 10.1.137.200:8000

在这里插入图片描述

3.3.6 外网访问

NodePort的最主要功能是进行外网访问,我们是不能通过访问8000端口访问的,他是内网端口,外网访问需要访问映射出来的端口8000:31337/TCP这里映射出来的nodeport31337,还可以通过指定nodePort来指定端口,要求端口必须大于30000

curl 192.168.64.160:31337

在这里插入图片描述

通过浏览器访问

在这里插入图片描述

4 端口号区分

k8s 中 portnodePorttargetPort有什么区别呢

4.1 应用位置不同

  • port:是service的的端口
  • targetport:是pod也就是容器的端口
  • nodeport:是容器所在宿主机的端口(实质上也是通过service暴露给了宿主机,而port却没有)

4.1 port

k8s集群内部服务之间访问service的入口,即clusterIP:port是service暴露在clusterIP上的端口

​ 主要作用是集群内其他pod访问本pod的时候,需要的一个port,如nginx的pod访问mysql的pod,那么mysql的pod的service可以如下定义,由此可以这样理解,port是service的port,nginx访问service的33306

apiVersion: v1
 kind: Service
 metadata:
  name: mysql-service
 spec:
  ports:
  - port: 33306
    targetPort: 3306
  selector:
   name: mysql-pod

4.2 targetport

容器的端口(最终的流量端口)。targetPort是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

​ 看上面的targetport,targetport说过是pod暴露出来的port端口,当nginx的一个请求到达service的33306端口时,service就会将此请求根据selector中的name,将请求转发到mysql-pod这个pod的3306端口上

4.3 nodeport

nodeport就很好理解了,它是集群外的客户访问,集群内的服务时,所访问的port,比如客户访问下面的集群中的nginx,就是这样的方式,ip:30001

​ 外部流量访问k8s集群中service入口的一种方式(另一种方式是LoadBalancer),即nodeIP:nodePort是提供给外部流量访问k8s集群中service的入口

​ 比如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的type=NodePort,nodePort=30001。其他用户就可以通过浏览器http://node:30001访问到该web服务。而数据库等服务可能不需要被外界访问,只需被内部服务访问即可,那么我们就不必设置service的NodePort。

apiVersion: v1 
kind: Service 
metadata: 
    name: nginx-service 
spec: 
    type: NodePort # 有配置NodePort,外部流量可访问k8s中的服务 
    ports: 
    - port: 30080 # 服务访问端口 
      targetPort: 80 # 容器端口 
      nodePort: 30001 # NodePort 
    selector: name: nginx-pod 

4.4 小结

​ nodeport是集群外流量访问集群内服务的端口类型,比如客户访问nginx,apache,port是集群内的pod互相通信用的端口类型,比如nginx访问mysql,而mysql是不需要让客户访问到的,最后targetport,顾名思义,目标端口,也就是最终端口,也就是pod的端口。

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

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

相关文章

Python学习——类与对象

一、编程的两大思想 (1)面向过程 事物比较简单,用简单的线性思维即可解决 (2)面向对象 事物比较复杂,用简单的线性思维无法解决 (3)两者之间的关系 在面对复杂的问题时,宏…

gcc编译过程详解

以一个简单的C代码为例,详细讲解gcc整个编译过程。 1、预处理 主要处理#开头的东西,例如头文件处理、条件编译处理、将宏定义进行替换,还可以去掉注释、添加行号等。预处理的命令如下: gcc -E hello.c -o hello.i #-E表示预处理…

全志V3S嵌入式驱动开发(解决kernel 5.2.y wifi驱动问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 wifi模块,之前测试的时候,开发板上用的是esp 8089,当时内核时4.14.y,测试结果也是通过的。印象不是…

《C++ Primer》--学习10

反向迭代器 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器,递增一个反向迭代器会移动到前一个元素 反向迭代器需要递减运算符 我们只能从既支持也支持--的迭代器来定义反向迭代器,除了 forward_list 外的标准容器都支持 流迭代器不支持递减…

【分布式存储】聊聊共识和一致性

在分布式存储系统中,对于提高性能、可用性、可拓展性来说都有相关机制可以保证,比如复制、切片等,但是一旦涉及到分布式系统中选主的问题,就比较难,因为网络是不可靠的,并且可能还有拜占庭将军问题。所以如…

JAVA8-lambda表达式7:重要的函数接口

从什么是好代码讲起 最近又在看《clean code》&#xff0c;回顾了一下里面提到的整洁代码的标准。 然后审视了一下现在的项目代码&#xff0c;里面还有很多if&#xff0c;for循环。比如&#xff1a; // 查询用户列表 List<User> userList userService.list(); // 打印…

VSC++: 验证身份证

缘由https://ask.csdn.net/questions/1082358 void 验证身份证() {//缘由https://ask.csdn.net/questions/1082358int 权重[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }, 个 0, j 0, a 0, he 0;char M[] "10X98765432", 身份号[100][20]{};//…

如何备份 Kubernetes MySQL Operator 集群

Oracle 的MySQL Operator for Kubernetes 是在集群内自动化 MySQL 数据库配置的便捷方法。该运营商的主要功能之一是集成的自动备份支持,可提高您的弹性。备份会定期将数据库复制到外部存储。 本文将引导您完成设置到与 Amazon S3 兼容的对象存储服务的备份。您还将了解如何将…

C/C++结构体内存对齐的一些思考

在C中&#xff0c;结构体的内存对齐是为了提高访问结构体成员变量的效率和保证硬件的要求。 结构体对齐 C/C C 结构体内存对齐的示例代码C/C结构体内存对齐的原则结合汇编代码分析结构体的内存对齐问题 C 结构体内存对齐的示例代码 #include <iostream>struct Test_Stru…

运维必学 | 初识介绍-从零开始学Windows批处理(Batch)编程系列教程

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1…

ACL 2023长文 | 基于能量超球体模型提升以事件为中心的结构化预测

论文标题&#xff1a; SPEECH: Structured Prediction with Energy-Based Event-Centric Hyperspheres 收录会议&#xff1a; ACL 2023 Main Conference 论文链接&#xff1a; https://arxiv.org/abs/2305.13617 开源链接&#xff1a; https://github.com/zjunlp/SPEECH 总述 以…

硬件知识:条码打印机5大接口类型介绍

目录 1、串口 2、并行接口 &#xff08;并口&#xff09; 3、USB接口 4、网口 5、PS/2接口 接口选择的不同&#xff0c;其打印输出的速度也不同。 条码打印机与计算机之间都是通过接口连接的&#xff0c;条码打印机常见的分为5种接口&#xff1a;串口&#xff08;也有称之…

分布式学习第五条 Nginx + FastDFS

使用nginx和FastDFS可以实现下载&#xff0c;类似百度网盘&#xff0c;需要对环境进行配置&#xff0c;nginx作为代理服务器&#xff0c;fastDFS负责执行上传下载操作。 1. 文件上传下载流程 文件上传流程 文件下载流程 优化 优化思路: 直接让客户端连接fastDFS的存储节点, …

Flutter之 Bloc实战实现购物车功能

Flutter之 Bloc实现购物车功能 前言商品列表模块状态设置UI设计业务逻辑测试代码购物车模块状态设置业务逻辑UI设计加入购物车测试代码参考资料前言 本篇以官方购物车项目为例,说明Bloc在Flutter的应用。该项目很简单,就两个模块,一个是商品列表页面模块catalog,一个是购物…

使用gradio库的File模块实现文件上传和展示

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

MATLAB迭代

目录 黄金分割比 习题 符号运算 固定点 WHY hello world Goldrect 黄金分割比 format for循环 %% For loopx 42for k 1:12x sqrt(1x);disp(x)end while循环 %% While loopx 42;k 1;while abs(x-sqrt(1x)) > 5e-5x sqrt(1x);k k1;endk 绘图语句 %% Plotx -pi:…

现在的前端,到底是技术深度重要,还是技术广度重要?

前言 大家好&#xff0c;&#xff0c;用最通俗易懂的话讲最难的知识点是我的座右铭&#xff0c;基础是进阶的前提是我的初心。 前几天跟朋友讨论“技术广度和技术深度哪个重要”&#xff0c;再想想自己像过山车一般的前端历程&#xff0c;有感而发&#xff0c;想给小兄弟们一…

简单的学习下 JavaScript 录屏API

学习如何使用这个简单易用的API进行屏幕共享、屏幕录制等操作。尽管需要对JavaScript有一定的了解&#xff0c;但我相信你已经具备了这方面的知识。 1、开始录制 让我们创建一个按钮&#xff1a; <button id"recording-toggle">Start recording</button>…

BUUCTF变异凯撒

根据题目可以得知&#xff0c;这道题使用的是凯撒密码 凯撒密码&#xff0c;是一种位移加密方式&#xff0c;只对26个字母进行位移替换加密&#xff0c;规则简单&#xff0c;容易破解。 但是根据题目下发的文件看来&#xff0c;出现了关于除字母以外的字符&#xff0c;结合题目…

综合评价算法 | Matlab实现基于变异系数法的综合评价算法

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 综合评价算法 | Matlab实现基于变异系数法的综合评价算法 研究内容 变异系数法是根据统计学方法计算得出系统各指标变化程度的方法,是一种客观赋权法。根据该方法变化差异较大的指标权重较大,变化差异较…