ingress对外服务

news2024/12/24 9:09:22

目录

ingress概念

安装ingress

ingress-nginx暴露服务的方式

1. Deployment+LoadBalncer

2. DaemonSet+HostNetwork+nodeSelector

​编辑

3.deployment+nodePort

​编辑

ingress-nginx的deployment+nodePort+https部署

1.创建ssl的证书

2.ingress+nginx

ingress-nginx的权限控制

实验:ingress提示信息

实验:页面重定向

ingress-traefik插件

ingress-traefik部署

总结


ingress概念

service:在k8s集群当中相当于网关。用标签来匹配pod,还能通过endpoint更新pod的变化,也可以用四层代理实现负载均衡,service暴露的端口只能用于内网访问(局域网内)。

ingress:在k8s当中,它是一个独立的配置。ingress只能通过yaml文件配置。

它的作用是定义请求如何转发到service的规则。

ingress提供对外访问的流程:通过http或者https协议来暴露内部的service,它是给service提供外部的url、负载均衡、 SSL/TLS。它可以实现基于域名的反向代理。

ingress通过ingress-controller来实现上述的i功能。ingress-controller不是k8s自带的组件,这是一种插件的统称。

k8s维护的插件类型:  1. 谷歌云的GCE

                                     2. ingress-nginx:最常用的模式

                                     3. traefik:有可视化界面

ingress对外提供访问数据流向图

ingress对外提供访问的数据流向:ingress指定service的名称,把流量转发到指定的service,然后service再根据pod的标签来匹配pod把流量转发到pod。

安装ingress

三台主机都操作

先把ingree.contro-0.30.0.tar拖入到三台虚拟机中

tar -xf ingree.contro-0.30.0.tar.gz

docker load -i ingree.contro-0.30.0.tar

mkdir ingress

cd ingress/

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

ingress-nginx暴露服务的方式

1. Deployment+LoadBalncer

需要公有云提供负载均衡的ip地址(公网地址)

2. DaemonSet+HostNetwork+nodeSelector

在这个模式下ingress-controller会在每个节点都部署一个pod。ingress-controller直接使用每个节点的80和443端口,不需要做映射,可以直接实现流量的转发和访问。

hostwork就是宿主机之间和service做映射

数据流向图

如果是k8s pod部署的访问域名后面不加端口的,就是用的这个模式。它更适合于外网。

在master主机上部署

cd ingress/

vim mandatory.yaml

kubectl apply -f mandatory.yaml

kubectl get pod -o wide -n ingress-nginx

netstat -antp | grep nginx

注:8081端口是nginx-controller的默认配置端口,当ingress没有资源可以匹配时,会自动转发到这个端口。

vim ingress-nginx1.yaml

#创建pvc请求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi
---
#创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          ports:
            - containerPort: 80
          volumeMounts:
          - name: nfs-pvc
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc
---
#创建service
apiVersion: v1
kind: Service
metadata:
  name: nginx-daemon-svc
spec:
  type: ClusterIP
  ports:
  - protocol: TCP
#协议
    port: 80
#service端口
    targetPort: 80
#容器端口
  selector:
    app: nginx
---
#创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-daemon-ingress
spec:
  rules:
  - host: www.xy102.com
    http:
      paths:
      - path: /
        pathType: Prefix
#prefix:前缀匹配,可以匹配/、/test1、/test1/xy102
        backend:
#匹配的svc的名称
          service:
            name: nginx-daemon-svc
            port:
              number: 80
#这里的80是service的cluserIP的端口

此时的状态:

然后做主机域名映射 vim /etc/hosts

然后到客户机 进入cd /opt/k8s/

此时再回到master主机上访问 curl www.xy102.com 

如果要做nodeSelector选择标签

vim mandatory.yaml

kubectl label node node01 ingress-true  打标签

此时就只能匹配这个标签的node节点

3.deployment+nodePort

ingress根据副本数和调度在节点上部署多个pod,再根据nodeport在每个节点打开一个指定的端口 30000-32767。

nodeport就是nodeport和service做映射

数据流向图

如果是k8s pod部署的访问域名后面加端口号的,就是用的这个模式。它更适合于内网。

在master主机上部署

cd ingress/

vim mandatory.yaml

kubectl apply -f mandatory.yaml 

下载nodeport的yaml文件:

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

这个是service的nodeport

 kubectl apply -f service-nodeport.yaml

kubectl apply -f mandatory.yaml  查看部署位置

vim ingress-nginx2.yaml

#创建pvc请求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi
---
#创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          ports:
            - containerPort: 80
          volumeMounts:
          - name: nfs-pvc
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc
---
#创建service
apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment-svc
spec:
  type: ClusterIP
  ports:
  - protocol: TCP
#协议
    port: 80
#service端口
    targetPort: 80
#容器端口
  selector:
    app: nginx
---
#创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-deployment-ingress
spec:
  rules:
  - host: www.xy102.com
    http:
      paths:
      - path: /
        pathType: Prefix
#prefix:前缀匹配,可以匹配/、/test1、/test1/xy102
        backend:
#匹配的svc的名称
          service:
            name: nginx-deployment-svc
            port:
              number: 80
#这里的80是service的cluserIP的端口

 

 kubectl get svc -o wide -n ingress-nginx

然后访问域名和这个暴露nodeport的端口 www.xy102.com:31835 

ingress-nginx的deployment+nodePort+https部署

1.创建ssl的证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=CHINA/O=NJ"

解释:

req:表示执行证书请求和生成相关文件

-x509:生成自签名的x.509证书

-sha256:表示sha256的散列算法

-nodes:表示生成的私钥不加密

-days 365:表示证书的有效期为365天

-newkey rsa:2048:表示使用RSA的密钥对,长度是2048个单位

-keyout:把私钥保存到tls.key文件

-out:把证书保存到tls.crt文件

-subj:添加证书的主题

执行命令:kubectl create secret tls tls-secret --key tls.key --cert tls.crt

2.ingress+nginx

vim ingress-https.yaml

#创建pvc请求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi
---
#创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          ports:
            - containerPort: 80
          volumeMounts:
          - name: nfs-pvc
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc
---
#创建service
apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment-svc
spec:
  type: ClusterIP
  ports:
  - protocol: TCP
#协议
    port: 80
#service端口
    targetPort: 80
#容器端口
  selector:
    app: nginx
---
#创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-deployment-ingress
spec:
  tls:
    - hosts:
        - www.xy102.com
        secretName: tls-secret
#指定加密通信的域名,上下文要一致,指定secret加密的名称,获取私钥和证书。
  rules:
  - host: www.xy102.com
    http:
      paths:
      - path: /
        pathType: Prefix
#prefix:前缀匹配,可以匹配/、/test1、/test1/xy102
        backend:
#匹配的svc的名称
          service:
            name: nginx-deployment-svc
            port:
              number: 80
#这里的80是service的cluserIP的端口

上面都一样,就是ingress不一样

如果上面只有执行过这个yaml文件不需要kubectl apply -f

kubectl get svc -n ingress-nginx

然后在虚拟机访问https://www.xy102.com:30222

在xshell里面访问https

curl -k

总结:为什么deployment必须要用nodeport?

因为deployment不能保证每个节点上只分配一个pod,如果是deployment+hostnetwork,pod会出现pending

ingress-nginx的权限控制

权限控制:当访问页面的时候,提醒用户要输入账号密码才可以访问页面。

实现这个实验的过程叫basicAuth

实验:ingress提示信息

cd /opt/ingress

yum -y install httpd

htpasswd -c auth gfw

kubectl create secret generic basic-auth --from-file=auth

vim ingress-nginx3.yaml

#创建pvc请求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi
---
#创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          ports:
            - containerPort: 80
          volumeMounts:
          - name: nfs-pvc
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc
---
#创建service
apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment-svc
spec:
  type: ClusterIP
  ports:
  - protocol: TCP
#协议
    port: 80
#service端口
    targetPort: 80
#容器端口
  selector:
    app: nginx
---
#创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-deployment-ingress
  annotations:
#设置认证的类型:
  nginx.ingress.kubernetes.io/auth-type: basic
#设置认证的secret的名称:
  nginx.ingress.kubernetes.io/auth-secret: basic-auth
#设置认证窗口的提示信息:
  nginx.ingress.kubernetes.io/auth-realm: 'hao hao xue xi'
spec:
  tls:
    - hosts:
        - www.xy102.com
        secretName: tls-secret
#指定加密通信的域名,上下文要一致,指定secret加密的名称,获取私钥和证书。
  rules:
  - host: www.xy102.com
    http:
      paths:
      - path: /
        pathType: Prefix
#prefix:前缀匹配,可以匹配/、/test1、/test1/xy102
        backend:
#匹配的svc的名称
          service:
            name: nginx-deployment-svc
            port:
              number: 80
#这里的80是service的cluserIP的端口

kubectl get svc -n ingress-nginx 查看ingress对外开放的端口

然后回到浏览器访问https://www.xy102.com:30628

此时就会出现提示信息,然后你填上面设置的信息就可以了

实验:页面重定向

在上面的实验修改一下ingress即可

vim /etc/hosts 做域名映射把www.test1.com添加进去

此时访问https://www.xy102.com:30628就会跳转到https://www.test1.com:30628

ingress-traefik插件

它叫traefik ingress controller。它是专门为了部署k8s微服务开发的http反向代理和负载均衡工具。

它可以自动发现匹配的后端pod的变化,同时有可视化的页面。它能够自动感知变化,实现服务的自动发现。

traefik部署方式:

daemonset+hostnetwork    适用于大集群

deployment+nodeport    适用于内部访问,性能较低

面试题:

ingress-traefik和ingress-nginx之间的区别:

ingress-nginx使用nginx作为前端的负载均衡,它通过ingress-controller和k8s的api交互的方式来实现后端服务器的发现、pod ip地址的变化、动态实现nginx的配置修改。

ingress-traefik本身就能够和k8s的api交互,感知后端service以及pod的变化。traefik更简单,更方便。它本身是go语言写的,和k8s的兼容性更好,并发能力只有ingress-nginx的60%。

ingress-traefik部署

cd /opt/ingress/

mkdir traefik

cd traefik/

wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-deployment.yaml
wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-rbac.yaml
wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-ds.yaml
wget  https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/ui.yaml

此时就会生成以下四个文件:

kubectl apply -f traefik-rbac.yaml

kubectl apply -f traefik-deployment.yaml

kubectl apply -f ui.yaml

cd /opt/ingress/

kubectl delete -f mandatory.yaml

cd -

vim nginx-traefik.yaml

#创建pvc请求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi
---
#创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-traefik
  labels:
    app: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
        - name: nginx1
          image: nginx:1.22
          ports:
            - containerPort: 80
          volumeMounts:
          - name: nfs-pvc
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc
---
#创建service
apiVersion: v1
kind: Service
metadata:
  name: nginx-traefik-svc
spec:
  type: ClusterIP
  ports:
  - protocol: TCP
#协议
    port: 80
#service端口
    targetPort: 80
#容器端口
  selector:
    app: nginx1
---
#创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-traefik-ingress
  annotations:
#设置认证的类型:
  #nginx.ingress.kubernetes.io/auth-type: basic
#设置认证的secret的名称:
  #nginx.ingress.kubernetes.io/auth-secret: basic-auth
#设置认证窗口的提示信息:
  #nginx.ingress.kubernetes.io/auth-realm: 'hao hao xue xi'
  #设定重定向流量的目标连接:
  #nginx.ingress.kubernetes.io/rewrite-target: https://www.test1.com:30628
spec:
#  tls:
#    - hosts:
#        - www.xy102.com
#        secretName: tls-secret
#指定加密通信的域名,上下文要一致,指定secret加密的名称,获取私钥和证书。
  rules:
  - host: www.xy102.com
    http:
      paths:
      - path: /
        pathType: Prefix
#prefix:前缀匹配,可以匹配/、/test1、/test1/xy102
        backend:
#匹配的svc的名称
          service:
            name: nginx-traefik-svc
            port:
              number: 80
#这里的80是service的cluserIP的端口

然后回到浏览器访问192.168.233.31:30437 就会进入traefik可视化界面

总结

ingress是对外提供访问,它可以支持http、https

访问流程:请求——ingress根据service的名称来匹配service——service把请求根据匹配的标签转发到pod

部署方式:deployment+nodeport、daemonset+hostnetwork

类型:ingress+nginx、ingress+traefik

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

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

相关文章

最强AI照片说话Windows一体包下载地址,口型合成音频驱动图片,免安装,下载即用

照片数字一键整合包:点击下载 一键安装包,简单一键启动,即刻使用,秒级体验。 目前效果最好的音频驱动图片说话的软件,比sadtalker、MuseTalk更清晰,效果更好,可以作为DID heygen的开源平替。原…

Vue安装及环境配置【图解版】

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words! 目录 一.node.js的安装…

C语言算法

大纲 算法复杂度 排序算法 经典算法

如何使用ssm实现物流配送人员车辆调度管理系统的设计与实现+vue

TOC ssm618物流配送人员车辆调度管理系统的设计与实现vue 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思…

react和vue区别以及为什么会说react适合大型项目

都说react适合做大型项目,但是什么是大型项目呢。 什么是大型项目 这个所谓的大项目应该是指 多部门,多项目协作。而并不是页面量和工作日,对于大公司,协作所带来的成本,效率问题才是问题 为什么会说react要更适合大型…

开源waf牛了个b之长亭雷池

雷池官网: https://waf-ce.chaitin.cn/

IVF 视频文件格式

IVF IVF有两种定义,一种是 Intel创建,用于封装其Indeo编解码器。Indeo是一系列视频编解码器,由英特尔在1990年代开发,主要用于视频游戏和早期的互联网视频流;Indeo编解码器以其高压缩率和良好的视频质量而闻名&#x…

三好夫人 | 茶香月饼甜  浓情赏月圆

在这个金风送爽、丹桂飘香的中秋佳节,家家户户都沉浸在团圆与温馨的氛围之中。月饼,作为中秋的传统美食,承载着无数人对家的思念与美好祝愿。而今,当传统遇见创新,“三好夫人”——一个以男士滋补茶闻名遐迩的品牌&…

AI做梦,探索并还原你的梦

本文由 ChatMoney团队出品 作为一个爱幻想爱做白日梦的 i人,我常常就在想,什么时候能利用Al来帮助我找回一些被遗忘的、或者模糊不清的记忆? 有没有可能进入别人的梦境里瞧一瞧? 为什么世界上还有这么多的冲突和摩擦? 是不是因为人与人之间能够达到的…

OpenCV GUI常用函数详解

在OpenCV的High_level GUI模组中有很多GUI函数,下面介绍几个常用的函数。 图像显示窗口相关函数 生成图像显示窗口函数nameWindow() nameWindow()函数的原型如下: 函数用以创建一个给定名的图像显示窗口(后面简单叫做图像窗口)…

qt使用对数坐标的例子,qchart用QLogValueAxis坐标不出图解决

硬件:ThinkPad T15 系统:win10 专业版 qt版本:Qt 5.14.1 , QtCreator 4.11.1 软件界面放了一个QPushButton,一个QVBoxLayout,如下: 主要代码如下,我添加了两条曲线,…

Spring扩展点系列-SmartInstantiationAwareBeanPostProcessor

文章目录 简介源码分析示例 简介 spring容器中Bean的生命周期内所有可扩展的点的调用顺序 扩展接口 实现接口ApplicationContextlnitializer initialize AbstractApplicationContext refreshe BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry B…

Python基础学习(1)

目录 一,表达式和变量 1,表达式 2,变量 二,类型 1,前言 2,动态性特征 一个技巧让python变量类型更加明确 3,变量的类型 1,整型 2,float 3,布尔型 4&…

border制作渐变色边框

border也可以做出渐变色效果 .themeConfig {width: 250px;height: 117px;border: 1.5px solid transparent !important;border-radius: 8px !important;background-clip: padding-box, border-box;background-origin: padding-box, border-box;background-image: linear-gradi…

linux第一课(操作系统核心)

一.关于linux (1)linux是一款开源的操作系统(是多用户,多任务,多线程)。 (2)一般所说的linux指的是linux核心,即对计算机硬件资源负责调度管理,主要职责是进程管理,内存管理文件系统,设备驱动&#xff0c…

轧钢测径仪对热轧产线实现温度系数自动修正!

钢材在轧制过程中,需要检测外径时,很多都处于高温状态,甚至是1000℃以上,这对轧钢测径仪是个巨大的考验,但测径仪在解决高温、水雾、氧化铁皮、震动等对测量影响的同时,还要考虑钢材热态下的膨胀造成的测量…

揭秘同态加密 (HE):你需要知道什么?

鉴于苹果公司发布了重要的 Swift 同态加密公告,Zama 高级软件工程师 Agns Leroy 详细解释了 HE 是什么、不同的方案及其功能,以及它在未来可能的用途。 7 月底,苹果隐私保护技术团队宣布了一项令人兴奋的新成果:‘swift-homomorp…

什么是WSL?

WSL(Windows Subsystem for Linux)是一个为在 Windows 10 和 Windows 11 上能够原生运行 Linux 二进制可执行文件的兼容层。 主要特点和功能包括: 一、运行 Linux 环境 允许用户在 Windows 系统上直接运行 Linux 命令行工具、脚本和应用程…

springboot系列--自动配置原理

一、容器功能 一、组件添加功能 一、Configuration Configuration有两种模式,Full模式与Lite模式。 1、配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断 2、配置类组件之间有依赖关系,方法会被调用得到之前单实例组件&#…

linux 操作系统下cupsdisable命令介绍和使用案例

linux 操作系统下cupsdisable命令介绍和使用案例 cupsdisable 命令是 Linux 操作系统中用于禁用 CUPS(通用打印服务)打印机的命令。它允许用户将指定的打印机设置为不可用状态,从而阻止任何新的打印作业被发送到该打印机 cupsdisable 命令概…