【云原生】K8s Ingress rewrite与TCP四层转发讲解与实战操作

news2024/12/23 21:04:34

文章目录

    • 一、背景
    • 二、K8s Ingress安装
    • 三、K8s Ingress rewrite 讲解与使用
      • 1)配置说明
      • 2)示例演示
        • 1、部署应用
        • 2、配置ingress rewrite转发(http)
        • 3、配置ingress rewrite转发(https)
          • 【1】创建证书(有证书可忽略)
          • 【2】创建 Secret
          • 【3】Ingress引用Secret资源实现HTTPS
    • 四、K8s Ingress TCP四层转发
      • 1)开启tcp/udp转发
      • 2)部署应用(mysql)
      • 3)更改ingress-nginx的service,声明tcp和udp用的端口号
      • 3)定义configmap
      • 4)检查

一、背景

其实在实际使用k8s ingress时,rewrite重定向和TCP转发是非常常见的,所以有必要了解基本的使用,关于Nginx Ingress更详细的介绍,可以参考我之前的文章:Kubernetes(k8s)Ingress原理

二、K8s Ingress安装

前提也是需要k8s环境,k8s环境部署可以参考我这篇文章:Kubernetes(k8s)最新版最完整版环境部署+master高可用实现(k8sV1.24.1+dashboard+harbor)

  • ingress 官方网站:https://kubernetes.github.io/ingress-nginx/
  • ingress 仓库地址:https://github.com/kubernetes/ingress-nginx

在这里插入图片描述

### 1、下载yaml部署文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml

### 2、可以先把镜像下载,再安装
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1

### 3、修改镜像地址
sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.2.0\(.*\)@registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0@' deploy.yaml
sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1\(.*\)$@registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@' deploy.yaml

### 4、还需要修改两地方
#1、kind: 类型修改成DaemonSet
#2、在dnsPolicy: ClusterFirst下面添加,去掉dnsPolicy: ClusterFirst:
#dnsPolicy: ClusterFirstWithHostNet
#hostNetwork: true
#3、把LoadBalancer修改成NodePort
#4、在--validating-webhook-key下面添加- --watch-ingress-without-class=true

kubectl apply -f deploy.yaml

三、K8s Ingress rewrite 讲解与使用

1)配置说明

Ingress rewrite实现是通过在annotations下添加对应的字段,annotations 参数说明:

字段字段类型字段说明
nginx.ingress.kubernetes.io/rewrite-target字符串必须重定向流量的目标URI
nginx.ingress.kubernetes.io/ssl-redirect布尔值指示位置部分是否仅可访问sSL(当Ingress包含证书时,默认为true)
nginx.ingress.kubernetes.io/force-ssl-redirect布尔值即使Ingress未启用rLS,也强制重定向到HTTPS
nginx.ingress.kubernetes.io/app-root字符串定义controller必须重定向的应用程序根,如果它在’/'上下文中
nginx.ingress, kubernetes.io/use-regex布尔值指示Ingress.上定义的路径是否使用正则表达式

想了解更多annotations参数,可以参考官方文档:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

2)示例演示

在这里插入图片描述

1、部署应用

# 添加chart源
helm repo add bitnami https://charts.bitnami.com/bitnami

# 安装Nginx 
helm pull bitnami/nginx --version 13.2.1
helm install my-nginx-1 ./nginx-13.2.1.tgz

# 安装Apache
helm pull bitnami/apache --version 9.2.7
helm install my-apache-1 ./apache-9.2.7.tgz

2、配置ingress rewrite转发(http)

【示例1】

cat >ingress-http-test1.yaml<<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: my-nginx-1
            port:
              number: 80
EOF

在这里插入图片描述

【示例2】域名转发

cat >ingress-http-test2.yaml<<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: http-ingress-test
  annotations:   # 注解
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"  # 重写
spec:
  ingressClassName: "nginx"  # 控制器选择为Nginx
  rules:
  - host: ingress-http-test2.com
    http:
      paths:
      - path: /nginx-1/(.*)$
        pathType: Prefix
        backend:
          service:
            name: my-nginx-1
            port:
              number: 80
      - path: /apache-1/(.*)$
        pathType: Prefix
        backend:
          service:
            name: my-apache-1
            port:
              number: 80
EOF

配置hosts

192.168.182.110 ingress-http-test2.com

http://ingress-http-test2.com/nginx-1/
在这里插入图片描述
http://ingress-http-test2.com/apache-1/
在这里插入图片描述

3、配置ingress rewrite转发(https)

【1】创建证书(有证书可忽略)

首先需要证书,如果没有证书,可以按照下面命令创建证书

openssl genrsa -out ingress-http-test2.key 2048
openssl req -new -x509 -key ingress-http-test2.key -out ingress-http-test2.cert -days 360 -subj /CN=ingress-http-test2.com
【2】创建 Secret
kubectl create secret tls https-tls-test --cert=ingress-http-test2.cert --key=ingress-http-test2.key
【3】Ingress引用Secret资源实现HTTPS
cat >ingress-https-test.yaml<<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: https-ingress-test
  annotations:   # 注解
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"  # 重写
spec:
  ingressClassName: "nginx"  # 控制器选择为Nginx
  rules:
  - host: ingress-http-test2.com
    http:
      paths:
      - path: /nginx-1/(.*)$
        pathType: Prefix
        backend:
          service:
            name: my-nginx-1
            port:
              number: 80
      - path: /apache-1/(.*)$
        pathType: Prefix
        backend:
          service:
            name: my-apache-1
            port:
              number: 80
  tls:   # tls资源
  - hosts:
    - ingress-http-test2.com
    secretName: https-tls-test
EOF

https://ingress-http-test2.com/nginx-1/
在这里插入图片描述
https://ingress-http-test2.com/apache-1/
在这里插入图片描述

四、K8s Ingress TCP四层转发

Ingress配置转发端口本质,还是利用service nodePort能力,通过暴露ingress的本地端口来转发。Ingress 默认不支持TCP or UDP services。因此Ingress controller使用--tcp-services-configmap--udp-services-configmap这两个配置达到转发端口的目的。

1)开启tcp/udp转发

检查nginx-ingress是否开启tcp/udp转发,如果没开启,需要修改deployment ingress-nginx的参数配置,添加–tcp-service-configmap,如下:
在这里插入图片描述
执行更新

kubectl apply -f deploy.yaml

2)部署应用(mysql)

helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/mysql --version 9.4.4
tar -xf mysql-9.4.4.tgz

helm install my-mysql ./mysql --version 9.4.4 --set global.storageClass='nfs-client' --set architecture='replication'

3)更改ingress-nginx的service,声明tcp和udp用的端口号

### 先查看
kubectl get svc -n ingress-nginx
### 添加对应配置
kubectl edit svc ingress-nginx-controller -n ingress-nginx

### 再查看
kubectl get svc -n ingress-nginx

在这里插入图片描述

3)定义configmap

格式为<ingress-controller-svc-port>:"<namespace>/<service-name>:<port>"。
例如下面配置的data第一行表示将default命名空间下的kuard服务的9527端口映射到ingress-controller service的30880端口,即可通过ingress-controller的service ip加30880端口访问到kuard服务。

cat >tcp-services.yaml<<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  30336: "default/my-mysql-primary:3306"
EOF

4)检查

进入nginx-ingress容器查看TCP services处会出现对应的负载配置

kubectl exec -it -n ingress-nginx `kubectl get pods -n ingress-nginx |grep ingress-nginx-controller|head -1|awk '{print $1}'` -- cat nginx.conf

在这里插入图片描述
从上面看用nginx ingress做tcp转发还是比较麻烦的,所以这里推荐使用istio,有不清楚的istio的,可以参考我这篇文章:【云原生】Kubernetes(k8s)Istio Gateway 介绍与实战操作

K8s Ingress rewrite与TCP四层转发讲解与实战操作就先到这里了,有疑问的小伙伴欢迎留言,后续会持续更新【大数据+云原生】相关的文章~

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

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

相关文章

音视频- iOS图像采集

本文主要总结一下&#xff0c;如何使用AVFoundation的功能来实现图像的采集&#xff0c;主要用到了AVFoundation中的一些类&#xff0c;采集的结构如下图&#xff0c;引用自iOS开发者官网&#xff1a; AVCaptureSession 采集会话&#xff0c;其主要功能从整体上来掌管图像采集的…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(五)交流耦合栅极驱动电路

交流耦合栅极驱动电路 1.计算耦合电容 2.耦合电容器的启动瞬变 3.总结 栅极驱动路径中的交流耦合可为栅极驱动信号提供简单的电平位移。交流耦合的主要作用是修改主MOSFET 的开通和关断栅极电压&#xff0c;而高侧栅极驱动则不同&#xff0c;它最需要关注的是缩小较大的电势差…

软件安全测试-web安全测试基础

目录 1. Web安全的测试范围 2.Web安全的四要素 3. Web安全的分类 4. Web安全的类别排名​ 5. 零时差攻击 6. Web安全的载体 7. 了解软件安全测试相关的Cooike&#xff0c;Session&#xff0c;Token 7.1 会话级鉴权及认证技术 7.2 会话安全管理需要授权和鉴权两个步骤 …

单例模式(史上最全)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

0121 动态规划 Day10

剑指 Offer 46. 把数字翻译成字符串 给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &#xff0c;1 翻译成 “b”&#xff0c;……&#xff0c;11 翻译成 “l”&#xff0c;……&#xff0c;25 翻译成 “z”。一个数字可能有多个翻译。…

Python——翻转字符串

题目介绍 以空格为分割&#xff0c;将字符串中的每个单词的字母位置不变&#xff0c;单词顺序从后往前翻转 例如&#xff1a;I am a student. 变成&#xff1a;student. a am I Python中的标准库是为了提高程序员开发效率&#xff0c;减少学习成本&#xff0c;而设计的一系列方…

spring——Spring Bean定义

在 XML 配置的<beans> 元素中可以包含多个属性或子元素&#xff0c;常用的属性或子元素如下表所示。 属性名称描述idBean 的唯一标识符&#xff0c;Spring IoC 容器对 Bean 的配置和管理都通过该属性完成。id 的值必须以字母开始&#xff0c;可以使用字母、数字、下划线等…

SpringCloud Gateway网关的使用与介绍

目录 1. gateway简介 1.1 是什么 1.2 作用 1.3 主要特征 1.4 与zuul的主要区别 1.5 主要组件 1.6 架构图 2. 开发示例 2.1 创建一个gateway模块 2.2 与nacos结合使用 2.2.1 默认规则 2.2.2 通过配置文件配置路由 2.2.3 动态路由 1. gateway简介 1.1 是什么 Spri…

Vulnhub靶机:PRIME_ 1

目录介绍信息收集主机信息探测主机信息探测网站探测目录爆破排雷dirsearch强制访问文件包含漏洞利用WordPress提权wordpress配置文件内核提权介绍 系列&#xff1a;Prime&#xff08;此系列共1台&#xff09; 发布日期&#xff1a;2019年9月1日 难度&#xff1a;初-中 运行环境…

在 Istio 服务网格中使用 Argo Rollouts 实现智能的渐进式发布

1 Argo Rollouts 介绍 Kubernetes 原生的 Deployment 利用 Rolling Update 滚动更新的策略在应用升级时提供基本的安全保证&#xff08;例如就绪探针&#xff09;。然而默认的滚动更新策略存在着一些明显的缺点&#xff0c;例如&#xff1a; 无法控制流向新版本的流量。无法控…

tensorflow入门(四)如何用tensorflow训练神经网络

参考 如何用tensorflow训练神经网络 - 云社区 - 腾讯云 在使用神经网络解决实际的分类或回归问题时需要设置好参数取值。下面介绍使用监督学习的方式来合理地设置参数取值&#xff0c;同时也将给出tensorflow程序来完成这个过程。设置神经网络参数的过程就是神经网络的训练过…

基于JDBC的MySQL数据库编程

✨博客主页: 荣 ✨系列专栏: MySQL ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录一. JDBC概述二. JDBC前置工作1. 准备好MySQL驱动包2. 创建项目三. JDBC的使用步骤1. 创建数据源DataSourece2. 连接数据库3. 构造并执行sql语句4. 释放资源5. sql语句不要写死(以插入为例)…

C++入门基础07:函数定义与声明、函数传参(传值、传地址、传引用)、函数重载

C入门基础07&#xff1a;函数定义与声明、函数传参&#xff08;传值、传地址、传引用&#xff09;、函数重载 1、函数定义与声明 函数是一起执行一个任务的一组语句。每个程序&#xff08;C/C&#xff09;都有一个主函数 main() &#xff0c; 所有简单的程序都可以定义其他额…

1563_AURIX_TC275_EVR的控制寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 1. 连续的写入必须确保是解锁状态&#xff0c;否则的话可能会导致所有的总线阻塞。 2. 多核系统中&#xff0c;尽量写入之后再读取一下确认写入的状态。 这里是过压以及欠压的几个监控结果…

if、for、while结构的用法

分支与循环的流程控制一、分支流程控制1. if分支语句结构1). 单分支2). 双分支3). 三元运算符&#xff08;双分支的简化&#xff09;4). 多分支二. 循环流程控制1. while循环语句语法结构1.while循环用法2.while 的死循环3. while else的用法2. for循环语句语法结构1. for和ran…

嵌入式开发学习之--串口通讯(上)

提示&#xff1a;本篇开始学习各种通讯方式&#xff0c;重中之重。 文章目录前言一、 串口通讯协议简介1.1 物理层1.2 协议层1.2.1 基本组成。1.2.2 波特率1.2.3 起始和终止位1.2.4 有效数据1.2.5 数据校验二、USART结构体详解总结前言 作为一个嵌入式的开发者&#xff0c;解析…

网页木马挂马的实现与防范

一、网页挂马是什么 不少用户都碰到过这样的现象&#xff1a;打开一个网站&#xff0c;结果页面还没显示&#xff0c;杀毒软件就开始报警&#xff0c;提示检测到木马病毒。有经验的朋友会知道这是网页恶意代码&#xff0c;这就是典型的网页挂马现象。那么是什么原因导致了这种…

数据库概论之MySQL表的增删改查 - 进阶版本1

MySQL表的增删改查 - 进阶1、数据库约束1.1 约束类型1.2 NULL约束1.3 UNIQUE约束1.4 DEFAULT约束1.5 PRIMARY约束1.6 FOREIGN KEY外键约束1.6.1 语法1.6.2 工作原理2、表的设计2.1 一对一2.2 一对多2.3 多对多大家好&#xff0c;已经好久没更新了 , 学校的学业有点忙 , 没有额外…

[论文解析] Denoising Diffusion Probabilistic Models

文章目录OverviewsWhat problem is addressed in the paper?What is the key to the solution?What is the main contribution?Contents扩散概率模型背景算法实验结论Overviews What problem is addressed in the paper? We present high quality image synthesis result…

【Java面试】说说类加载机制(流程)

文章目录加载流程装载(Load)链接(Link)验证(Verify)准备(Prepare)解析(Resolve)初始化(Initialize)卸载(Unload)加载流程 类的加载流程如下&#xff1a; 转载(Load)->链接(Link)->初始化(Initialize)->使用(Use)->卸载(Unload) 其中链接又包含验证(Verify)&#x…