k8s---对外服务 ingress

news2024/11/25 20:53:33

目录

目录

目录

ingress与service

ingress的组成

ingress-controller:

ingress暴露服务的方式

2.方式二:DaemonSet+hostnetwork+nodeSelector

DaemonSet+hostnetwork+nodeSelector如何实现

3.deployment+NodePort:

虚拟主机的方式实现http代理

总结

deploymentit+loadbalancer:

daemonset+hostnetwork+nodeselector:

deployment+nodeport:


ingress与service

service作用体现在两个方面:

1.集群内部:不断跟踪pod的变化,更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。

2.集群外部:类似负载均衡,把流量IP+端口,不涉及转发url(http https),把请求转发到pod当中。

service:

nodeport:容器端口---service端口---nodeport,每个节点都会有一个端口被打开(30000-32767)

IP+端口:节点IP+30000-32767实现负载均衡

loadbalancer:云平台上的一种service服务。云平台提高负载均衡的IP地址。

externalname:域名映射。

通过ingress基于域名映射,把url(http,https)请求转发到service,再由service把请求转发到每一个pod。

ingress只要一个或者是少量的公网IP或者LB,可以把多个http请求暴露到外网,七层反向代理。

ingress是service的service,是一组基于域名和URL路径,把一个或者多个请求(基于域名和URL的请求)转发到service的一种规则。

先是七层代理(ingress)----四层代理(service)---pod(nginx)

ingress的组成

ingress是一个api对象,通过yaml文件来进行配置。

ingress的作用-->定义请求如何转发到service的规则。

ingress通过http和https暴露集群内部的service,给service提供一个外部的url,负载均衡,ssl/tls(https)的能力,实现一个基于域名的负载均衡。

ingress-controller:

具体的实现反向代理和负载均衡的程序。对ingress定义的规则进行解析,根据ingress的配置规则进行请求的转发。

ingress-controller不是K8s自带的组件功能,ingress-controller一个统称。

nginx ingress controller traefik都是ingress-controller,开源。

ingress暴露服务的方式

1.deployment+LoadBalancer模式,ingress部署在公有云。会ingress配置文件里面会有一个type,type:loadbalancer。

公有云平台会为这个loadbalancer的service创建一个负载均衡器。绑定一个公网地址。

通过域名指向这个公网地址就可以实现集群对外暴露。

2.方式二:DaemonSet+hostnetwork+nodeSelector

DaemonSet:在每个节点都会创建一个pod。

hostnetwork:pod共享节点主机的网络命名空间。容器内直接使用节点主机的IP+端口。pod中的容器可以直接访问主机上的网络资源。

nodeSelector:根据标签来选择部署的节点。nginx-ingress-controller部署的节点。

缺点:直接利用节点主机的网络和端口,一个node只能部署一个controller的pod。比较适合大并发的生产环境。性能是最好的。

解析出来的域名到ingress-controller,再到Ingress的配置,根据标签service匹配来对容器进行发现和监控。controller实现请求转发和负载均衡。

ingress-controller的安装

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

DaemonSet+hostnetwork+nodeSelector如何实现

查看端口,只有node02有

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany:
  storageClassName: nfs-client-storageclass
  resources:
    request:
      storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          volumeMounts:
          - name: nfs-pvc
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app-svc
spec:
  ports:
  - protocol: Tcp
    port: 80
    targetPort: 80
  selector:
    app: nginx1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-app-ingress
spec:
  rules:
  - host: www.test1.com
    http:
      path: /
      pathType: Prefix
#根据前缀进行匹配。以/为开头都能匹配

3.deployment+NodePort:

host--->ingress的配置找到Pod--->controller--->请求发到pod

nodeport---controller---ingress---service---pod

nodeport暴露端口的方式是最简单的方法,nodeport 多了一层nat(地址转换),并发量大的对性能会有一定影响。内部都会用nodeport

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
现在执行这个yaml文件,会生成一个service,在ingress-nginx这个命名空间生成一个service,所有的controller的请求都会从这个定义的service的nodeport的端口,把请求转发到自定义的service的Pod

ingress--nodeport的端口---service---pod

入口:nodeport不再是创建pod的deployment传附件的,是ingress的service创建的

数据流向图

虚拟主机的方式实现http代理

通过ingress的方式实现:一个ingress可以访问不同的主机

vim pod1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
  labels:
    test: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      test: nginx1
  template:
    metadata:
      labels:
        test: nginx1
    spec:
      containers:
        - name: nginx1
          image: nginx:1.22
---
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec: 
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    test: nginx1

kubectl apply -f pod1.yaml




vim pod2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment2
  labels:
    test: nginx2
spec:
  replicas: 1
  selector:
    matchLabels:
      test: nginx2
  template:
    metadata:
      labels:
        test: nginx2
    spec:
      containers:
        - name: nginx1
          image: nginx:1.22
---
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec: 
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    test: nginx2
wq

kubectl apply -f pod2.yaml








vim pod-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
    - host: www.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-1
            port:
              number:80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
spec:
  rules:
    - host: www.test2.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-2
            port:
              number:80
              
              
wq
kubectl apply -f pod-ingress.yaml

vim /etc/hosts

curl www.


wq

总结

ingress的核心组件

nginx-ingress-controller

traefik

都是开源的ingress-controller

deploymentit+loadbalancer:

需要云平台提供一个负载均衡的公网地址,公有云上做($$$$$$)

daemonset+hostnetwork+nodeselector:

指定节点部署controller,缺点是和宿主机共享网络,只能是一个controller的pod。

hostnetwork会和宿主机共享网络

deployment+nodeport:

最常用,最常见,最简单的方式。

集中一个nodeport端口,所有的ingress的请求都会转发到nodeport,然后把service把流量转到pod。

一个ingress的nodeport,可以实现访问多个虚拟主机。

和nginx一样。

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

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

相关文章

戴森持续深耕室内空气质量研究,携手商业空间打造全场景的洁净呼吸新体验

[2024年 1 月 18 日, 中国上海] 随着气温的日渐下降,家人陪伴和好友相聚也逐渐回归室内。和三两好友一起动手做些烘焙美食,相约美术馆看展,或室内亲子乐园成为不少家庭冬日生活的新风尚。为了进一步洞察消费者生活方式背后对于健康呼吸的多样…

Mybatis----面向接口

让mybatis自动生成dao层接口的实现类 这是dao层接口的实现类,在mybatis中我们可以省略这种实现接口的方式,直接面向接口操作数据库,mybatis可以帮我们自动生成接口的实现类,也就是下面这个实现类mybatis帮我们生成了。 1、修改se…

鸿蒙开发之状态管理

State 组件内状态 State装饰的变量,会和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。在状态变量相关装饰器中,State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源。 装…

数据库事务隔离级别的总结

一、数据库四种隔离级别 RU(READ-UNCOMMITTED) 读取事务未提交的数据。RC(READ-COMMITTED) 读取到事务已提交的数据。RR(REPEATABLE-READ) 可重复读SR(SERIALIZABLE) 串行化 二、四…

chisel入门初步1——基4的booth编码的单周期有符号乘法器实现

基4的booth编码乘法器原理说明 基2的booth编码 本质来说就是一个裂项重组,乘法器最重要的设计是改变部分积的数量,另外在考虑有符号数的情况下,最高位符号位有特别的意义。 (注:部分积是指需要最后一起加和的所有部分…

Qt6入门教程 8:信号和槽机制(连接方式)

目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 一.一个信号与槽连接…

统信UOS上使用liveCD解决系统使用问题

原文链接:统信UOS上使用liveCD解决系统使用问题 大家好!继我们上次关于UDOM工具箱的深入探讨之后,今天我带来了另一项实用的技巧——在统信UOS上使用liveCD来解决系统相关的问题。 liveCD是一个非常强大的工具,它可以让您在不影响…

Skywalking链路追踪

目录 一、简介1.1、APM系统1.2、SkyWalking 简介 二、快速入门2.1、下载、启动2.2、界面认识 三、持久化存储四、告警通知五、自定义追踪-细粒度追踪service方法 一、简介 1.1、APM系统 APM(Application Performance Monitoring)系统是一种用于监控和管…

QT中操作word文档

QT中操作word文档: 参考如下内容: C(Qt) 和 Word、Excel、PDF 交互总结 Qt对word文档操作总结 QT中操作word文档 Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成: QAxContainer模…

vue3 实现简单计数器示例——一个html文件展示vue3的效果

目的&#xff1a;作为一个新手开发&#xff0c;我想使用 Vue 3 将代码封装在 HTML 文件中时&#xff0c;进行界面打开展示。 一、vue计数示例 学了一个简单计数器界面展示&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head&…

SSM(Spring,SpringMVC,MyBatis)整合项目

文章目录 SSM(Spring,SpringMVC,MyBatis)整合项目1.创建表2.创建工程3.pom.xml4.log4j.properties5.db.properties6.applicationContext-dao.xml7.applicationContext-tx.xml8.applicationContext-service.xml9.springmvc.xml10.web.xml11.pojo12.mapper13.service14.controlle…

【小笔记】算法训练基础超参数调优思路

【学而不思则罔&#xff0c;思维不学则怠】 本文总结一下常见的一些算法训练超参数调优思路&#xff08;陆续总结更新&#xff09;&#xff0c;包括&#xff1a; batchsize学习率epochsdropout&#xff08;待添加&#xff09; Batch_size 2023.9.29 简单来说&#xff0c;较…

(C++)大数计算问题

文章目录 一、实验目的、内容二、实验程序设计及结构1.需求分析类变量函数 2.设计结构或流程图 三、设计过程四、测试分析第一组第二组实验中出现的bug及解决方案 五、设计的特点和结果 一、实验目的、内容 大数是超过整数表示范围的整数&#xff0c;针对正整数运算&#xff0…

VSCODE使用CMAKE显示命令无法找到

背景&#xff1a;使用了code server&#xff0c;安装CMAKE和CMAKE TOOLS&#xff0c;但是通过ctrlshiftp打开命令面板&#xff0c;运行随便一个cmake指令&#xff0c;都出现了指令无法找到。具体为“命令"CMake: 配置"导致错误 (command ‘cmake.configure’ not fou…

Tomcat10.X部署老版本axis2 webservice项目不生效

目录 一、使用场景 二、问题描述 三、原因排查 四、解决方案 一、使用场景 原来项目是OpenJDK8tomcat9构建&#xff0c;现在需要升级到OpenJDK17tomcat10的组合。原来的webservice项目打包成aar格式&#xff0c;通过axis2部署在tomcat上。 二、问题描述 在配置好jdk和to…

【办公类-21-01】20240117育婴员操作题word合并1.0

背景需求&#xff1a; 最近学校组织老师们学习“育婴员”高级&#xff0c;每周学习2题操作&#xff0c;所以我是把每个学习内容单独做在一个word文件里 上周8套保健操作学完了&#xff0c;需要整理&#xff0c;并将8份Word文件合并 第一步&#xff1a;doc装docx 合并时程序报…

Kafka-消费者-KafkaConsumer分析-ConsumerCoordinator

在前面介绍了Kafka中Rebalance操作的相关方案和原理。 在KafkaConsumer中通过ConsumerCoordinator组件实现与服务端的GroupCoordinator的交互&#xff0c;ConsumerCoordinator继承了AbstractCoordinator抽象类。 下面我们先来介绍AbstractCoordinator的核心字段&#xff0c;如…

mysql 容器化安装(docker)离线和在线

前言&#xff1a;在部署hive或airflow 升级过程中&#xff0c;总需要一个对应的数据库存储元数据&#xff0c;一个轻量级的mysql容器刚刚好。轻量、可快速移植、具有隔离性。 文章目录 1、查看机器版本2、安装 docker3、启动docker 服务4、docker 常用命令docker5、拉取mysql …

更适合3D项目的UI、事件交互!纯国产数字孪生引擎持续升级中!!!

UI和事件交互是3D可视化项目中最常见的模块&#xff0c;主要用于信息添加、展示&#xff0c;用来确保按照用户需求呈现内容并完成交互。 平时工作在进行UI和交互设计时&#xff0c;经常出现以下问题&#xff1a;UI过于复杂导致3D项目内交互效率低下&#xff0c;或者是结合3D项目…

ubuntu18.04 安装mysql(命令)

1.安装MySQL #命令1 sudo apt-get update #命令2 sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 2.2 检查mysql服务状态 systemctl status mysql.service 3.配置远程访问 在Ubuntu下MySQL缺省是只允许本地访问的 3.1 首先用根用户进入…