百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-08-14 14:49 2 浏览

一、背景

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

二、K8s Ingress安装

前提也是需要k8s环境,k8s环境部署可以参考我这篇文章:「云原生」Kubernetes(k8s)最完整版环境部署(V1.24.1)

  • 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 介绍与实战操作_大数据老司机的博客-CSDN博客

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

相关推荐

为3D手游打造, Visual Studio Unity扩展下载

IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...

由ArcMap属性字段自增引出字段计算器使用Python的技巧

1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...

微软首次回答 HoloLens 相关问题,终于爆料了

fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...

C#指针的应用(c#指针类型)

C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...

C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)

C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...

欢迎回来:Fortran意外重回流行编程语言20强榜单

TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...

C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案

简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...

C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤

在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...

C# (一)状态机模式(状态机代码实现)

最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...

C# 中 Predicate 详解(c#中的replace)

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...

C#中$的用法?(c#中&&什么意思)

文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...

C#并行编程:Parallel类(c# 并行处理)

在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...

颠覆认知!用Span重构foreach循环竟让数据处理快如闪电

在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...

Unity3D手游开发实践《腾讯桌球》客户端开发经验总结

本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...

.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...