在 Kubernetes 中使用 Traefik 作为入口点并将流量路由到您的应用程序服务

在 Kubernetes 中使用 Traefik 作为入口点并将流量路由到您的应用程序服务

您可以按照以下步骤操作:
 
1. 确保您已经在 Kubernetes 集群中部署了 Traefik。

在Kubernetes集群中部署Traefik,您可以按照以下步骤操作:

1. 创建一个Traefik ConfigMap文件(traefik-config.yaml):

apiVersion: v1
kind: ConfigMap
metadata:name: traefik-config
data:traefik.toml: |[global]checkNewVersion = truesendAnonymousUsage = false[entryPoints][entryPoints.http]address = ":80"[entryPoints.http.redirect]entryPoint = "https"[entryPoints.https]address = ":443"[entryPoints.https.tls][[entryPoints.https.tls.certificates]]certFile = "/ssl/tls.crt"keyFile = "/ssl/tls.key[providers][providers.kubernetesIngress]namespace = "default"[accessLog]

注: 其中tls.crt和tls.key就是证书文件,注意必须要改为这个文件名,否则会报错

[entryPoints.http.redirect]  entryPoint = "https" 的配置是把入口为http的访问强制转为https. 

可以用其他方式实现:将配置文件中的[entryPoints.http.redirect] entryPoint = "https" 去掉,在ingress的annotations中配置:ingress.kubernetes.io/ssl-redirect: "true" 。就可以将入口为http的访问强制转为https。

私签证书:

kubectl create secret generic traefik-cert --from-file=rsa_private_key.pem --from-file=ca-cert.pem -n kube-system

注:由于secret是不能跨命名空间的,如果应用是部署在default命名空间,那还需要在default命名空间创建一个该secret,去掉上面最后面的-n kube-system即可

2. 创建一个Traefik服务(traefik-service.yaml):

apiVersion: v1
kind: Service
metadata:name: traefiklabels:app: traefik
spec:type: LoadBalancerports:- name: httpport: 80targetPort: 80- name: httpsport: 443targetPort: 443selector:app: traefik


3. 创建一个Traefik Deployment(traefik-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:name: traefiklabels:app: traefik
spec:replicas: 1selector:matchLabels:app: traefiktemplate:metadata:labels:app: traefikspec:containers:- name: traefikimage: traefik:latestports:- containerPort: 80- containerPort: 443volumeMounts:- name: configmountPath: /etc/traefik/traefik.tomlsubPath: traefik.tomlvolumes:- name: configconfigMap:name: traefik-config


4. 应用配置:

kubectl apply -f traefik-config.yaml
kubectl apply -f traefik-service.yaml
kubectl apply -f traefik-deployment.yaml


这样,Traefik就被成功部署到Kubernetes集群中了。您可以通过访问`http://<traefik-service-ip>`或`https://<traefik-service-ip>`来测试Traefik是否正常工作。请注意,实际部署时,您可能需要根据您的具体需求对配置文件和Service进行相应的修改。

2. 创建一个应用程序服务。以下是一个示例 YAML 文件 `example-service.yaml`,其中包含一个简单的应用程序服务:

apiVersion: v1 
kind: Service 
metadata:name: example-service 
spec:selector:app: example-app ports:- protocol: TCP port: 80 targetPort: 8080 

3. 创建一个对应的 Deployment,用于运行应用程序。以下是一个示例 YAML 文件 `example-deployment.yaml`:

apiVersion: apps/v1 
kind: Deployment 
metadata:name: example-app 
spec:replicas: 1 selector:matchLabels:app: example-app template:metadata:labels:app: example-app spec:containers:- name: example-app image: <your-image-repo>/example-app:<tag>ports:- containerPort: 8080 

4. 将上述 YAML 文件应用于 Kubernetes 集群:

kubectl apply -f example-service.yaml 
kubectl apply -f example-deployment.yaml 

5. 创建一个 Ingress 资源,以将流量从 Traefik 路由到您的应用程序服务。创建一个名为 `example-ingress.yaml` 的文件,内容如下:

apiVersion: networking.k8s.io/v1 
kind: Ingress 
metadata:name: example-ingress annotations:kubernetes.io/ingress.class: "traefik"
spec:rules:- host: example.com http:paths:- path: /pathType: Prefix backend:service:name: example-service port:name: http 

6. 将 `example-ingress.yaml` 文件应用于 Kubernetes 集群:

kubectl apply -f example-ingress.yaml 

现在,您应该可以访问您的应用程序服务,流量将通过 Traefik 入口点进行路由。请注意,您需要将 `example.com` 替换为您实际的域名或 IP 地址。

在 Kubernetes 中使用 Traefik 并通过 Nginx 进行代理

1. 部署 Traefik 到 Kubernetes 集群,参考上一个回答中的步骤。确保您已经创建了 Traefik ConfigMap 和 Deployment。
 
2. 创建一个 Nginx 配置文件,例如 `nginx.conf`,并将其放置在可访问的位置。在此文件中,定义 Nginx 的基本配置以及 Traefik 的代理设置: 

server {listen 8088;proxy_http_version 1.1;location / {proxy_set_header Host dd.de.com;proxy_pass http://k8s_traefik/;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;set $Interface "";   #定义限制字段if ($ip != a ) {    # 判断不等于定义的IP 并且 匹配到以下接口为真时,返回403set $Interface I;}if ($request_uri 
~* (.*)/(.*/|)(env|beans|health|auditevents|conditions|configprops|flyway|httptrace|loggers|liquibase|metrics|mappings|scheduledtasks|sessions|shutdown|threaddump|heapdump|jolokia|logfile|prometheus|trace|refresh|dump|autoconfig|resume|eatures|restart|features.json|refresh.json|dump.json|heapdump.json|autoconfig.json|resume.json|configprops.json|restart.json)$) {set $Interface "${Interface}P";}if ( $Interface = IP ) {return 403;}}location / {proxy_set_header Host $http_host;proxy_pass http://web/;}location /manager/ {proxy_set_header Host $http_host;proxy_pass http://web_manager/;}lua_need_request_body on;set $resp_body "";body_filter_by_lua 'local resp_body = string.sub(ngx.arg[1], 1, 200000)ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_bodyif ngx.arg[2] thenngx.var.resp_body = ngx.ctx.bufferedend';}

3. 创建一个 Nginx Docker 镜像,将 `nginx.conf` 文件复制到镜像中的适当位置。您可以使用以下 `Dockerfile`:

FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf

4. 构建并推送 Nginx Docker 镜像到您的私有或公共镜像仓库。
 
5. 创建一个 Nginx Deployment,在其中使用您刚刚构建的 Nginx 镜像。创建一个名为 `nginx-deployment.yaml` 的文件,内容如下:

apiVersion: apps/v1 
kind: Deployment 
metadata:name: nginx 
spec:replicas: 1 selector:matchLabels:app: nginx template:metadata:labels:app: nginx spec:containers:- name: nginx image: <your-image-repo>/nginx:<tag>ports:- containerPort: 80 


6. 应用 `nginx-deployment.yaml` 配置文件以在 Kubernetes 集群中创建 Nginx 服务:

kubectl apply -f nginx-deployment.yaml 


7. 确保 Traefik 和 Nginx 服务正在运行。您可以使用以下命令检查服务的状态:

kubectl get pods 

现在,您应该有一个运行在 Kubernetes 集群中的 Nginx 服务,它将把所有请求代理到 Traefik 服务。您可以配置 Ingress 资源,以使用 Traefik 作为入口点并将流量路由到您的应用程序服务。
 

创建一个 Ingress 资源,以将流量从 Traefik 路由到您的应用程序服务,并实现路径重写

创建一个名为 example-ingress.yaml 的文件,内容如下:
 

apiVersion: networking.k8s.io/v1 
kind: Ingress 
metadata:name: example-ingress annotations:kubernetes.io/ingress.class: "traefik"traefik.ingress.kubernetes.io/rule-type: PathPrefix 
spec:rules:- host: example.com http:paths:- path: /rewritten-path pathType: Prefix backend:service:name: example-service port:name: http 

将 example-ingress.yaml 文件应用于 Kubernetes 集群:

kubectl apply -f example-ingress.yaml 

现在,当您访问 http://example.com/rewritten-path 时,流量将被路由到您的应用程序服务。请注意,您需要将 example.com 替换为您实际的域名或 IP 地址。

在 Kubernetes 中,您可以使用自定义注解来配置 Traefik

以下是如何为 Traefik Ingress 资源添加自定义注解的示例:

创建一个 Ingress 资源,以将流量从 Traefik 路由到您的应用程序服务,并添加自定义注解。创建一个名为 `example-ingress.yaml` 的文件,内容如下:

apiVersion: networking.k8s.io/v1 
kind: Ingress 
metadata:name: example-ingress annotations:kubernetes.io/ingress.class: "traefik"traefik.ingress.kubernetes.io/custom-annotation: "custom-value"
spec:rules:- host: example.com http:paths:- path: /pathType: Prefix backend:service:name: example-service port:name: http 

将 `example-ingress.yaml` 文件应用于 Kubernetes 集群:

kubectl apply -f example-ingress.yaml 

在这个示例中,我们添加了一个名为 `traefik.ingress.kubernetes.io/custom-annotation` 的自定义注解,并将其值设置为 `custom-value`。您可以根据您的需求添加更多自定义注解和相应的值。
 
请注意,您需要将 `example.com` 替换为您实际的域名或 IP 地址。

在 Kubernetes 中部署多实例 Traefik

1. 安装 Helm:Helm 3:curl -fsSL https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz | tar xz 
sudo mv linux-amd64/helm /usr/local/bin/helm Helm 2:curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-2.sh | bash 2. 将 Traefik 图片添加到您的本地图片仓库:helm repo add traefik https://helm.traefik.io/traefik 3. 创建一个 `values.yaml` 文件来自定义 Traefik 部署。在此示例中,我们将部署两个 Traefik 实例:replicas: 2 4. 使用 Helm 安装 Traefik:helm install my-traefik-traefik traefik/traefik --create-namespace -n my-namespace -f values.yaml 这将在 `my-namespace` 命名空间中创建一个名为 `my-traefik-traefik` 的 Traefik 部署,其中包含两个 Traefik 实例。5. 验证 Traefik 部署:kubectl get deployment -n my-namespace 您应该看到一个名为 `my-traefik-traefik` 的部署,其中包含两个副本(实例)。现在,您已经成功在 Kubernetes 中部署了多个 Traefik 实例。请注意,您可能需要根据您的集群环境和需求进一步自定义 Traefik 配置。

在 Kubernetes 中,您可以使用 Traefik 作为 ingress controller,实现多个服务之间的负载均衡

1. 创建多个应用程序服务。以下是一个示例 YAML 文件 `example-service-1.yaml`,其中包含一个简单的应用程序服务:

注:example-service-1.yaml 和example-service.yaml相同,修改app名字即可

创建另一个类似的 YAML 文件 `example-service-2.yaml`,但将名称更改为 `example-service-2`,并将 selector 和 port 名称相应地更改。

2. 创建相应的 Deployment,用于运行应用程序。以下是一个示例 YAML 文件 `example-deployment-1.yaml`:

 注:example-deployment-1.yaml 和example-deployment.yaml相同,修改app名字即可

创建另一个类似的 YAML 文件 `example-deployment-2.yaml`,但将名称更改为 `example-app-2`,并将 selector 和 port 名称相应地更改。 

4. 创建一个 Ingress 资源,以将流量从 Traefik 路由到这些应用程序服务。创建一个名为 `example-ingress.yaml` 的文件,内容如下:

apiVersion: networking.k8s.io/v1 
kind: Ingress 
metadata:name: example-ingress annotations:kubernetes.io/ingress.class: "traefik"
spec:rules:- host: example.com http:paths:- path: /pathType: Prefix backend:service:name: example-service-1 port:name: http - path: /service-2 pathType: Prefix backend:service:name: example-service-2 port:name: http

在这个示例中,我们创建了一个名为 `example-ingress` 的 Ingress 资源,它将流量从 `example.com` 路径路由到名为 `example-service-1` 的服务,将 `/service-2` 路径的流量路由到名为 `example-service-2` 的服务。确保将 `example.com` 替换为您实际的域名或 IP 地址。
 
现在,Traefik 已经在多个服务之间实现了负载均衡。当您拥有更多服务时,可以添加更多路径到 Ingress 资源,将它们与 Traefik 集成。
 

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

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

相关文章

安卓主板MT8390(Genio 700)_MTK联发科Linux开发板方案

MediaTek Genio 700 &#xff08;MT8390&#xff09;是一款高性能的边缘 AI 物联网平台&#xff0c;专为智能家居、互动零售、工业与商业应用而设计。提供快速响应的边缘计算能力、先进的多媒体功能、广泛的传感器和连接方式&#xff0c;且支持多任务操作系统。 MT8390安卓核心…

IDA Pro *(_QWORD *)和*(_BYTE *)表达式解释

在IDA Pro&#xff08;一个交互式的反汇编器和调试器&#xff09;或其他类似的低级代码分析工具中&#xff0c;*(_QWORD *) 这种表达式通常用于类型转换和解引用。 这里的 _QWORD 通常表示一个64位的无符号整数类型&#xff08;在64位系统上&#xff09;。* 是解引用操作符&am…

在Linux或类Unix系统中获取帮助的命令

man <name>&#xff1a;该命令显示指定命令或主题的手册页面。例如&#xff0c;man ls 显示 ls 命令的手册页面。man <section> <name>&#xff1a;此命令允许你为手册页面指定一个部分编号。例如&#xff0c;man 2 open 显示位于手册第 2 部分的 open 系统调…

如何同时使用多个Gmail账号而不被关联?

您的业务活动需要多个 Gmail 帐户吗&#xff1f;出海畅游&#xff0c;Gmail账号是少不了的工具之一&#xff0c;可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台&#xff0c;可以说是海外网络的“万能锁”。但是大家都知道&#xff0c;以上这些平台注册多账号如果产生关…

Linux:入门篇

文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么&#xff1f;4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手&#xff0c;不知道从何开始学习&#xff0c;相信这篇文章将会为你提供一个清晰的思路。…

如何在Python中实现多线程和多进程?

如何在Python中实现多线程和多进程&#xff1f; 在Python中&#xff0c;多线程和多进程是实现并发编程的两种主要方式。它们各自有其特点和适用场景。下面将分别介绍如何在Python中实现多线程和多进程&#xff0c;并探讨它们的优缺点。 一、多线程 Python的标准库提供了thre…

【SpringBoot整合系列】SpirngBoot整合EasyExcel

目录 背景需求发展 EasyExcel官网介绍优势常用注解 SpringBoot整合EaxyExcel1.引入依赖2.实体类定义实体类代码示例注解解释 3.自定义转换器转换器代码示例涉及的枚举类型 4.Excel工具类5.简单导出接口SQL 6.简单导入接口SQL 7.复杂的导出&#xff08;合并行、合并列&#xff0…

C++小代码

//新生训练 //欧几里得法求最大公约数 #include <bits/stdc.h> #include <iostream> #include <algorithm> using namespace std; int main(){int a,b;cin>>a>>b;int r a%b;while (r!0){a b;b r;r a%b;}cout<<b<<endl;return …

碧昂丝的新专辑《Cowboy Carter》是对人工智能音乐的反对声明

碧昂丝的《牛仔卡特》才发行几天&#xff0c;但很明显我们将在未来几年里谈论它——它打破了流媒体平台的记录&#xff0c;艺术家本人称其为“最好的音乐[她是 ] 做过。” 但在《牛仔卡特》的新闻稿中&#xff0c;碧昂斯出人意料地发表了反对人工智能在音乐中日益增长的声明。 …

音视频处理相关基础概念

1. RTP协议 RTP协议&#xff0c;即实时传输协议&#xff08;Real-time Transport Protocol&#xff09;&#xff0c;是一种用于实时传输音频和视频数据的协议。它运行在UDP协议之上&#xff0c;通过将音频和视频数据分成小的数据包&#xff0c;并添加一些头部信息&#xff08;…

mysql 本地电脑服务部署

前提&#xff1a; 下载mysql 新建配置文档 在安装mysql目录新建 my.ini [mysqld] # 设置3306端口 port3306#设置mysql的安装目录 basedirC:\Program Files\MySQL\MySQL Server 8.3 #切记此处一定要用双斜杠\\,单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有…

Docker容器与虚拟化技术:OpenEuler 部署 Docker UI

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…

动态规划——计数类dp

例题&#xff1a;acwing900整数划分 完全背包解法 #include <iostream> #include <algorithm>using namespace std;const int N 1010, mod 1e9 7;int n; int f[N];int main() {cin >> n;f[0] 1;for (int i 1; i < n; i )for (int j i; j < n; …

Golang 哈希表底层实现原理

1、本文讨论Golang的哈希表 Golang哈希表的实现&#xff0c;底层数据结构是数组单链表&#xff0c;链表节点由8个key、value和键的高八位组成的。为了方便理解&#xff0c;先简单看一个图快速理解。 我们来看一下Golang哈希表的结构体定义 简单介绍一下结构体中几个关键的…

C#的await常用和扩展方法

await 是 C# 中用于等待异步操作完成的关键字。它通常与 async 一起使用&#xff0c;用于异步方法中等待异步操作的完成&#xff0c;并且在异步操作完成后&#xff0c;恢复执行该方法。 下面是对 await 的详细介绍以及一些示例代码&#xff1a; 1. 基本用法&#xff1a; await…

(C语言) fgetc与fputc函数详解

目录 1 fgetc函数详解 1.1 从文件流中读取数据 1.2 从标准输入流中读取数据 2 fputc函数详解 2.1 向文件流中写入数据 2.2 向标准输出流中写入数据 1 fgetc函数详解 头文件&#xff1a;stdio.h 该函数只有一个参数&#xff1a;stream 作用&#xff1a;从输入流中获得一个…

函数调用实现小米汽车智能语音助手

上周小米汽车发布&#xff0c;其中有一个特色功能就是智能语音&#xff0c;小爱同学整合了语音大模型&#xff0c;实现智能座舱体验。 雷老板的PPT也演示了&#xff0c;一些口语化的对话就能触发各种指令&#xff0c;无论是开空调、播放音乐&#xff0c;还是找手机、识别前方汽…

strlen与sizeof区别

1.sizeof操作符的结果类型是size_t&#xff0c;它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是取字节运算符&#xff08;关键字&#xff09;&#xff0c;strlen是函数。 3.sizeof可以用类型做参数&#xff0c;strlen只能…

PyTorch学习之:深入理解神经网络

使用torch.nn模块构建网络架构 在PyTorch中&#xff0c;torch.nn模块是构建神经网络的核心。使用这个模块&#xff0c;你可以轻松地定义网络层、激活函数、损失函数等。以下是使用torch.nn构建一个简单神经网络架构的步骤&#xff1a; 步骤1: 定义网络结构 首先&#xff0c;…