Service 和 Ingress

文章目录

  • Service 和 Ingress
    • Service
      • Endpoint
      • service 的定义
      • 代理集群外部服务
      • 反向代理外部域名
      • Service 常用类型
    • Ingress
      • Ingress-nginx
      • 安装
      • 使用

Service 和 Ingress

service 和 ingress 是kubernetes 中用来转发网络请求的两个服务,两个服务用处不同,service 主要提供集群内部网络调用、负载均衡(四层负载),ingress 提供外部访问,反向代理,负载均衡(七层负载)

在这里插入图片描述

Service

在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。

为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务

可以说 Service 是一个应用服务的抽象,定义了 Pod 逻辑集合和访问这个 Pod 集合的策略。Service 代理 Pod 集合,对外表现为一个访问入口,访问该入口的请求将经过负载均衡,转发到后端 Pod 中的容器。

Endpoint

每一个service 都会有一个 Endpoint controller , 在endponit 里面会维护 address,targetPort 和 容器之间的关系。整个访问链是 通过 service -> endpoint -iptables->kube-proxy -> 容器

在这里插入图片描述

service 的定义

Yaml 文件案例

apiVersion: v1
kind: Service
metadata:name: nginx-svc  # service namelabels:app: nginx-svc  # service 自己的标签
spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCPport: 1080 # service 自己的端口targetPort: 80 # 目标 pod 的端口type: NodePort # 默认是ClusterIP 类型,只能在集群内部使用  # NodePort 用于将服务暴露给外部访问selector: # 选中当前 service 匹配哪些 pod,对哪些 pod 的东西流量进行代理app: nginx

使用命令

# 创建 service
kubectl create -f nginx-svc.yaml# 查看 service 信息,通过 service 的 cluster ip 进行访问
kubectl get svc # 查看 pod 信息,通过 pod 的 ip 进行访问
kubectl get po -owide# 创建其他 pod 通过 service name 进行访问(推荐)
kubectl exec -it busybox -- sh
curl http://nginx-svc# 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
curl http://nginx-svc.default

代理集群外部服务

用于解决外部服务迁移到k8s 集群,各个环境访问名称统一,容器内部访问外部服务等需求

实现方式:

  1. 编写 service 配置文件时,不指定 selector 属性

    apiVersion: v1
    kind: Service
    metadata:name: nginx-svc  # service namelabels:app: nginx-svc  # service 自己的标签
    spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCPport: 1080 # service 自己的端口targetPort: 80 # 目标 pod 的端口type: ClusterIP # 默认是ClusterIP 类型,只能在集群内部使用  # NodePort 用于将服务暴露给外部访问
    
  2. 自己创建 endpoint

apiVersion: v1
kind: Endpoints
metadata:labels:app: nginx-svc-external # 与 service 一致name: nginx-svc-external # 与 service 一致namespace: default # 与 service 一致
subsets:  # 子网设置
- addresses:- ip: <target ip> # 目标 ip 地址ports: # 与 service 一致- name: http  # service 中ports.name 属性保持一致port: 80protocol: TCP

反向代理外部域名

直接通过在容器内部直接通过外部域名去访问

apiVersion: v1
kind: Service
metadata:labels:app: baidu-external-domainname: baidu-external-domain
spec:type: ExternalNameexternalName: www.baidu.com

Service 常用类型

Type用途补充
ClusterIP只能在集群内部使用,不配置类型的话默认就是 ClusterIP
ExternalName返回定义的 CNAME 别名,可以配置为域名
LoadBalancer使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务
NodePort在所有安装了 kube-proxy 的节点都绑定一个端口,此端口可以代理至对应的 Pod,集群外部可以使用任意节点 ip + NodePort 的端口号访问到集群中对应 Pod 中的服务。一般用于测试环境,生产环境使用ingress

补充:

NodePort 映射是一个O(N) 的时间复杂度,当节点数越多的时候,效率越低,内部代码是通过轮询来处理的

当类型设置为 NodePort 后,可以在 ports 配置中增加 nodePort 配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口

端口范围:30000~32767

端口范围配置在 /usr/lib/systemd/system/kube-apiserver.service 文件中

Ingress

Ingress 可以提供外网访问 Service 的能力。可以把某个请求地址映射、路由到特定的 service。

ingress 需要配合 ingress controller 一起使用才能发挥作用,ingress 只是相当于路由规则的集合而已,真正实现路由功能的,是 Ingress Controller,ingress controller 和其它 k8s 组件一样,也是在 Pod 中运行。

在这里插入图片描述

Ingress-nginx

Ingress 是一个更高层的抽象,具体实现还需要借助于Ingress controller 列如 Ingress-nginx 其他控制器参考 官网文档 https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers

安装

参考官网地址:https://kubernetes.github.io/ingress-nginx/deploy/#using-helm

官网默认采用helm,因此需要先安装helm

  1. 下载安装包 wget https://get.helm.sh/helm-v3.14.2-linux-amd64.tar.gz
  2. tar -zxvf helm-v3.2.3-linux-amd64.tar.gz
  3. cp helm /usr/local/bin/
# 添加ingree 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx# 查看仓库列表
helm repo list# 搜索 ingress-nginx
helm search repo ingress-nginx# 下载安装包
helm pull ingress-nginx/ingress-nginx  --version 4.4.2# 解压安装包
tar -zxvf ingress-nginx-4.4.2.tgz# 解压后,进入解压完成的目录
cd ingress-nginx# 修改 values.yaml镜像地址:修改为国内镜像registry: registry.cn-hangzhou.aliyuncs.comimage: google_containers/nginx-ingress-controllerimage: google_containers/kube-webhook-certgentag: 两个image 版本保持一致 或者 不动也行hostNetwork: truednsPolicy: ClusterFirstWithHostNet修改部署配置的 kind: /DaemonSet    # Deployment 改成 DaemonSetnodeSelector:ingress: "true" # 增加选择器,如果 node 上有 ingress=true 就部署将 admissionWebhooks.enabled 修改为 falseservice 中的 type 由 LoadBalancer 修改为 ClusterIP,如果服务器是云平台才用 LoadBalancer# 为 ingress 专门创建一个 namespace
kubectl create ns ingress-nginx# 为需要部署 ingress 的节点上加标签
kubectl label node k8s-master ingress=true# 安装 ingress-nginx
helm install ingress-nginx -n ingress-nginx .

使用

apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:name: demo-nginx-ingressannotations:kubernetes.io/ingress.class: "nginx"nginx.ingress.kubernetes.io/rewrite-target: /  # 重写路径
spec:rules: # ingress 规则配置,可以配置多个- host: k8s.demo.cn #域名配置,可以使用通配符 *   可以配置多个host  也可以不配置host 直接通过ip:port 方式访问 配置了host 就只能通过host 不能选择ip:port 的形式http:paths: # 相当于 nginx 的 location 配置,可以配置多个 paths- path: /api # 等价于 nginx 中的 location 的路径前缀匹配pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配backend:service: name: nginx-svc # 代理到哪个 serviceport:   # 可以直接写 80 也可以如下写法number: 80 # service 的端口

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

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

相关文章

去哪儿前端一面

谈谈你对mvvm的理解 MVVM分为三个部分:分别是M(Model,模型层 ),V(View,视图层),VM(ViewModel,V与M连接的桥梁,也可以看作为控制器) 1、 M:模型层,主要负责业务数据相关; 2、 V:视图层,顾名思义,负视图相关,细分下来就是html+css层; 3、 VM:V与M沟通的…

数据结构学习——二叉树

1. 树概念及结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&…

用户下单操作

一&#xff1a;用户下单需求分析和设计&#xff1a; 用户下单业务说明&#xff1a; 在电商系统中&#xff0c;用户是通过下单的方式通知商家&#xff0c;用户已经购买了商品&#xff0c;需要商家进行备货和发货。 用户下单后会产生订单相关数据&#xff0c;订单数据需要能够体…

如何使用多协议视频汇聚/视频安防系统EasyCVR搭建智慧园区视频管理平台?

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化&#xff0c;将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…

保护公司机密:避免员工带着数据说拜拜

公司的核心资产之一就是数据。无论是客户信息、研发代码、内部决议、财务报告、商业合同、设计图纸等都是公司的重要资产。如果这些数据在员工离职时被带走&#xff0c;或在员工在职期间不当行为导致数据泄露&#xff0c;将给公司带来重大损失。 然而&#xff0c;保护这些数据…

软考143-下午题-【试题二】:E-R图、关系模式

一、分值与目标 15分&#xff0c;目标10 二、题目形式 示例&#xff1a; 三、E-R图的基本图形元素 示例&#xff1a; 3-1、实体 1、弱实体 在现实世界中有一种特殊的联系&#xff0c;这种联系代表实体间的所有 (Ownership) 关系&#xff0c;例如&#xff1a;职工与家属的联系…

STC8增强型单片机开发 【第一个程序 - 点亮第一盏灯】

目录 一、创建项目 1. 创建一个新的项目 ​编辑 2. 配置开发板信息 ​编辑 3. 取消汇编配置 4. 项目结构 二、编码实现 1. 项目准备 2. 代码实现 点灯&#xff1a; 熄灯&#xff1a; 3. 编译烧录运行 配置编译输出 保存和编译代码 ​编辑 烧录 一、创建项目 1. …

【Arduino IDE 2】Windows平台安装ESP8266 NodeMCU LittleFS Uploader(文件上传插件)

在Arduino IDE 2&#xff08;2.2.1或更高版本&#xff09;上&#xff0c;如何安装基于ESP8266 NodeMCU的LittleFS文件系统上传插件&#xff0c;以及如何将文件上传到ESP8266 NodeMCU板文件系统。 一、LittleFS简介 LittleFS是一个为微控制器创建的轻量级文件系统&#xff0c;可…

实验五 Spark Structured Streaming编程实践

一、编写程序 (1). 按照tag分组统计生成的日志数。 在新开的终端内输入 vi spark_exercise_testsyslog1.py &#xff0c;贴入如下代码并运行。运行之前需要关闭“tail终端”内的tail命令并重新运行tail命令&#xff0c;否则多次运行测试可能导致没有新数据生成。 #!/usr/bin…

onlyoffice容器打包成镜像

书接上篇&#xff0c;onlyoffice容器已经更改在本地docker环境中了&#xff0c;之后需要部署到测试环境的docker中&#xff0c;采用容器打包成本地镜像 1、本地docker 查看容器&#xff1a;docker ps 生成镜像&#xff1a;docker commit -p blissful_lichterman 重命名镜像&a…

【大学物理】双语合集听课笔记

7.5 angular momentu(角动量)_哔哩哔哩_bilibili 6.4Energy in Rotation Motion 有质量有速度的物体有动能&#xff0c;是不是很有道理 international system&#xff08;from French systeme international&#xff0c;acronym&#xff0c;SI&#xff09;of ineria kg*m^2 转…

pycharm中导入rospy(ModuleNotFoundError: No module named ‘rospy‘)

1. ubuntu安装对应版本ros ubuntu20.04可参考&#xff1a; https://wiki.ros.org/cn/noetic/Installation/Ubuntuhttps://zhuanlan.zhihu.com/p/515361781 2. 安装python3-roslib sudo apt-get install python3-roslib3.在conda环境中安装rospy pip install rospkg pip in…

【Git】Git学习-17:git rebase,且解决合并冲突

学习视频链接&#xff1a;【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 理论 git rebase 目标分支&#xff1a;把当前分支的提交&#xff0c;从与目标分支的共同主祖先处断开…

js如何控制一次只加载一张图片,加载完成后再加载下一张

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 原文&#xff1a;https://juejin.cn/post/7340167256267391012 今天看到一个面试题&#xff0c;是关于img图片加载方面的&#xff0c;有必要记录一下。其实关于这个问题&#xff0c;只要知道图片什么时候加载完成就…

分割模型Maskformer系列

maskformer&#xff1a;Per-Pixel Classification is Not All You Need for Semantic Segmentation 论文地址&#xff1a;https://arxiv.org/pdf/2107.06278 1.概述 传统的语义分割方法通常采用逐像素分类&#xff08;per-pixel classification&#xff09;&#xff0c;而实…

linux安装Redis 7.2.4笔记

一.保姆级安装 1.下载Redis 7.2.4安装包 sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz2.解压&#xff0c;可以指定 sudo tar -zvxf redis-7.2.4.tar.gz 3.检测并安装 GCC 编译器&#xff1a; yum 是基于 Red Hat 的 Linux 发行版&#xff08;如 CentOS、…

CSRF漏洞简介

csrf简介 CSRF 全称为跨站请求伪造&#xff08; Cross-site request forgery &#xff09;&#xff0c;是一种网络攻击方式&#xff0c;在 CSRF 的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;&#xff0c;然后欺骗目标用户进行点击&#xf…

Lora基础炼丹学习笔记

1、收集数据集 20-30张人物各个角度、各个姿势的图片 2、图片预处理 裁剪 打标签 裁剪必须也要512 * 512 &#xff0c;因为sd1.5就是用这个尺寸训练的&#xff0c;可以使用后期处理 打标可以勾选这个&#xff0c;Deepbooru对二次元画风更友好 打标也可以使用wb14-tagger的…

Flink checkpoint 源码分析- Checkpoint snapshot 处理流程

背景 在上一篇博客中我们分析了代码中barrier的是如何流动改的。Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析-CSDN博客 最后跟踪到了代码org.apache.flink.streaming.runtime.io.checkpointing.CheckpointedInputGate#handleEvent 现在我们接着跟踪相应代…

FTTR(光猫)ITMS注册NCE纳管

ITMS注册 TR069交互过程&#xff1a; 1.1. TR069交互—主动连接机制 主动连接机制是指CPE主动发出请求连接事件(事件可以为&#xff1a; 0 BOOTSTRAP&#xff1b; 1 BOOT; PERIODIC等等)给ACS。在连接建立之后才能进行业务处理(通过调用RPC方法实现)。 备注&#xff1a;政企…