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

技术标签: 云原生  kubernetes  容器  

在 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 = true
      sendAnonymousUsage = 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: traefik
  labels:
    app: traefik
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443
  selector:
    app: traefik


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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik
  labels:
    app: traefik
spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      containers:
      - name: traefik
        image: traefik:latest
        ports:
        - containerPort: 80
        - containerPort: 443
        volumeMounts:
        - name: config
          mountPath: /etc/traefik/traefik.toml
          subPath: traefik.toml
      volumes:
      - name: config
        configMap:
          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 并且 匹配到以下接口为真时,返回403
		    	set $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_body
		  if ngx.arg[2] then
			ngx.var.resp_body = ngx.ctx.buffered
		  end
		';
	}

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 集成。
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45623111/article/details/137233778

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签