Traefix介绍(摘自网络)

traefik 是一个前端负载均衡器,对于微服务架构尤其是 kubernetes 等编排工具具有良好的支持;同 nginx 等相比,traefik 能够自动感知后端容器变化,从而实现自动服务发现。

traefix的架构如下:

Traefix的部署使用

部署环境:

k8s-node1(master):192.168.232.130

k8s-node2(node): 192.168.232.131

k8s-node2(node): 192.168.232.129

部署步骤:

一:创建ClusterRole以及ClusterRoleBinding。(在kubernets1.6之后启用了RBAC鉴权机制,因此需配置ClusterRole以及ClusterRoleBinding来对api-server的进行相应权限的鉴权)

#vi traefik-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: ingress
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: ingress
subjects:
- kind: ServiceAccount
name: ingress
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io # kubectl create -f traefik-rbac.yaml
serviceaccount "ingress" created
clusterrolebinding.rbac.authorization.k8s.io "ingress" created
 

二:部署traefix,这里使用Deployment方式,定义2个副本,使每个node都运行traefix服务。

# vi traefik-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: traefik-ingress-lb
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
replicas: 2
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
terminationGracePeriodSeconds: 60
hostNetwork: true
restartPolicy: Always
serviceAccountName: ingress
containers:
- image: traefik
name: traefik-ingress-lb
resources:
limits:
cpu: 200m
memory: 30Mi
requests:
cpu: 100m
memory: 20Mi
ports:
- name: http
containerPort: 80
hostPort: 80
- name: admin
containerPort: 8580
hostPort: 8580
args:
- --web
- --web.address=:8580
- --kubernetes # kubectl create -f traefik-deployment.yaml
deployment.extensions "traefik-ingress-lb" created # kubectl get deployment.extensions --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kube-system kube-dns 1 1 1 0 6d
kube-system kubernetes-dashboard 1 1 1 1 3d
kube-system traefik-ingress-lb 2 2 2 2 23s # kubectl get pods -n kube-system -l k8s-app=traefik-ingress-lb -o wide
NAME READY STATUS RESTARTS AGE IP NODE
traefik-ingress-lb-756f5f956b-pmzlb 1/1 Running 0 6m 192.168.232.131 k8s-node2
traefik-ingress-lb-756f5f956b-xpmcl 1/1 Running 0 6m 192.168.232.129 k8s-node3
 

这里创建了一个traefix的Deployment,设置了2个副本,使用hostport的方式在运行traefix的node上监听了80(traefix服务端口)和8050(traefix-ui界面)端口,并且两个node上都存在一个traefix的pod。

三:traefix ui界面。

部署完traefix之后,就可以使用node上的8050端口来访问traefix的ui界面了,从两个node都可以访问,如下:

这里我们可以发布一个traefix-web-ui的ingress,使我们可以通过域名的方式来访问traefix ui界面:

# vi traefik-ui.yaml
---
apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- name: web
port: 80
targetPort: 8580
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
rules:
- host: traefik-ui.k8s
http:
paths:
- path: /
backend:
serviceName: traefik-web-ui
servicePort: web # kubectl create -f traefik-ui.yaml
service "traefik-web-ui" created
ingress.extensions "traefik-web-ui" created # kubectl describe ingress traefik-web-ui -n kube-system
Name: traefik-web-ui
Namespace: kube-system
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
traefik-ui.k8s
/ traefik-web-ui:web (192.168.232.129:8580,192.168.232.131:8580)
Annotations:
Events: <none>
 

我们发布了一个host,名为traefix-ui.k8s,后端traefix-web-ui的service,可以看到关联到了pod地址192.168.232.129:8580和192.168.232.131:8580。

修改host,使我们可以通过traefix-ui.k8s域名来访问traefix-ui:

192.168.232.129 traefik-ui.k8s
192.168.232.131 traefik-ui.k8s
 

四:发布其他web服务。

部署完traefix之后,就可以通过它来发布我们自己的web应用了。这里我有两个简单的tomcat服务镜像test1和test2。访问他们,分别返回字符串tomcat_test1和tomcat_test2。首先,我先创建tomcat-test1和tomcat-test2的pod和service,其中8080为tomcat的http端口,8443为tomcat的https端口,本例中仅使用http端口测试。

# vi tomcat-test1.yaml
#-----Deployment----------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-test1
labels:
app: tomcat-test1
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-test1
template:
metadata:
labels:
app: tomcat-test1
spec:
containers:
- name: tomcat-test1
image: tomcat_test1:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8443
- containerPort: 8080
---
#------service---------------
apiVersion: v1
kind: Service
metadata:
name: tomcat-test1
labels:
name: tomcat-test1
spec:
ports:
- port: 8443
targetPort: 8443
selector:
app: tomcat-test1
ports:
- port: 8080
targetPort: 8080
selector:
app: tomcat-test1 # more tomcat-test2.yaml
#-----Deployment----------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-test2
labels:
app: tomcat-test2
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-test2
template:
metadata:
labels:
app: tomcat-test2
spec:
containers:
- name: tomcat-test2
image: tomcat_test2:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8443
- containerPort: 8080
---
#------service---------------
apiVersion: v1
kind: Service
metadata:
name: tomcat-test2
labels:
name: tomcat-test2
spec:
ports:
- port: 8443
targetPort: 8443
ports:
- port: 8080
targetPort: 8080
selector:
app: tomcat-test2 # kubectl create -f tomcat-test1.yaml
deployment.apps "tomcat-test1" created
service "tomcat-test1" created
# kubectl create -f tomcat-test2.yaml
deployment.apps "tomcat-test2" created
service "tomcat-test2" created # kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
tomcat-test1 1 1 1 1 52m
tomcat-test2 1 1 1 1 47m
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d
tomcat-test1 ClusterIP 10.103.134.175 <none> 8080/TCP 52m
tomcat-test2 ClusterIP 10.97.4.120 <none> 8080/TCP 47m
 

创建test1的ingress,来发布tomcat-test1服务:

# vi ingress-tomcat1.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tomcat-test1-web
namespace: default
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: tomcat.test1.k8s
http:
paths:
- path: /
backend:
serviceName: tomcat-test1
servicePort: 8080 # kubectl create -f ingress-tomcat.yaml
ingress.extensions "tomcat-test1-web" created
 

从traefix-ui界面上,可以看到已经有了一个tomcat.test1.k8s的域名规则。

修改hosts,使用tomcat.test1.k8s来访问tomcat-test1应用:

192.168.232.129 tomcat.test1.k8s
192.168.232.131 tomcat.test1.k8s
 

五:ingress配置之,同域名分路径代理不同web应用。

很多使用我们不想配置太多的域名来区别应用,使用同域名分路径的方式来区别应用就简洁方便很多。ingress也提供了相关的配置。

从上文可以知道,我们有两个应用tomcat-test1和tomcat-test2。这里可配置域名tomcat.test.k8s,通过路径test1、test2来分别代理两个tomcat应用。其中,分路径配置需添加配置:traefik.frontend.rule.type: PathPrefixStrip

# vi ingress-tomcat.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tomcat-test-web
namespace: default
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
- host: tomcat.test.k8s
http:
paths:
- path: /test1/
backend:
serviceName: tomcat-test1
servicePort: 8080
- path: /test2/
backend:
serviceName: tomcat-test2
servicePort: 8080 # kubectl create -f ingress-tomcat.yaml
ingress.extensions "tomcat-test-web" created # kubectl describe ingress tomcat-test-web
Name: tomcat-test-web
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
tomcat.test.k8s
/test1/ tomcat-test1:8080 (<none>)
/test2/ tomcat-test2:8080 (<none>)
Annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
Events: <none>
 

从describe信息和ui界面上可以看到,tomcat.test.k8s分别有了/test1/和/test2/的域名代理以及相对应的后端,可以修改hosts测试一下分路径是否生效:

192.168.232.129 tomcat.test.k8s
192.168.232.131 tomcat.test.k8s
 

后记

     本章只是初步实现了traefix的http访问代理,如果开启traefix的https代理以及怎么对traefix进行更多的配置,将在后续的博文中来讨论。

 

kubernetes使用Traefik暴露web服务-转载51cto的更多相关文章

  1. 用 Java 技术创建 RESTful Web 服务--转载

    简介 JAX-RS (JSR-311) 是为 Java EE 环境下的 RESTful 服务能力提供的一种规范.它能提供对传统的基于 SOAP 的 Web 服务的一种可行替代. 在本文中,了解 JAX ...

  2. idea/eclipse下Maven工程集成web服务(tomcat、jetty)

     idea/eclipse下Maven工程集成web服务 转载请注明出处:http://www.cnblogs.com/funnyzpc/p/8093554.html 应用服务器最常用的一般有这哥仨: ...

  3. 使用Spring进行远程访问与Web服务

    1.1. 简介   Spring为各种远程访问技术的集成提供了整合类.Spring使得开发具有远程访问功能的服务变得相当容易,而这些远程访问服务由普通Spring POJO实现.目前,Spring支持 ...

  4. Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务

    一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...

  5. 外网如何访问vmware虚拟机的web服务(转载)

    目的: 主机上安装了VMware,VMware上安装了Linux虚拟机(我安装的是Centos7).我想让虚拟机向外提供Web服务.本文记录如何让我的主机和外网用户可以访问VM虚拟机上的Web. 网络 ...

  6. 采用动态代理方式调用WEB服务(转载+整理)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 戏说WSGI(Python Web服务网关接口)--[转载]

    戏说WSGI(Python Web服务网关接口) 当你在Python的世界中冒险,突然遭遇一只Web怪兽,你会选择什么武器对付它?在兵器谱上,下列兵器可谓名列前茅: Zope,厚重的长枪.较早出现的武 ...

  8. WSDL(Web服务描述语言)详细解析(全文转载学习用)

    WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务 ...

  9. Kubernetes环境Traefik部署与应用

    本作品由Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可.由原作者转载自个人站点. 概述 本文用于整理基于Kubernetes环境的Traefik部署与应用, ...

随机推荐

  1. windows系统下同时安装mysql5.5和8.0.11

    前提:电脑已安装5.5,增安装8.0.11 zip版本 1.官网下载mysql10.8.0.11 —找到mysql community server 为下载页面URL:https://dev.mysq ...

  2. opengl读取灰度图生成三维地形并添加光照

    转自:https://www.cnblogs.com/gucheng/p/10152889.html 准备第三方库 glew.freeglut.glm.opencv 准备一张灰度图 最终效果 代码如下 ...

  3. ADB 常用命令及详解

    1.pull文件 adb pull (文件路径) (想要pull的路径) MacBook-Pro:~ caris$ adb pull /sdcard/Android/data/com.xiwi.log ...

  4. python递归函数(10)

    一个函数在函数体内部调用自己,这样的函数称为递归函数,递归的次数在python是有限制的,默认递归次数是997次,超过997次会报错:RecursionError. 一.递归函数案例 案例一:计算数字 ...

  5. TCP报文格式+UDP报文格式+MAC帧格式

    TCP和UDP的区别: 1)TCP是面向连接的,而UDP是无连接的 2)TCP提供可靠服务,而UDP不提供可靠服务,只是尽最大努力交付报文 3)TCP面向字节流,TCP把数据看成一串无结构的字节流,而 ...

  6. call、apply、bind的区别,模拟call、apply和bind的实现

    bind:bind绑定完this的指向后会返回一个新的函数体,不会被立即调用   call&apply:绑定完this的指向后会立即调用   call与apply的区别:     call:第 ...

  7. 顶级Apache Kafka术语和概念

    1.卡夫卡术语 基本上,Kafka架构  包含很少的关键术语,如主题,制作人,消费者, 经纪人等等.要详细了解Apache Kafka,我们必须首先理解这些关键术语.因此,在本文“Kafka术语”中, ...

  8. 『Go基础』第4节 VS Code配置Go语言开发环境

    VS Code 是微软开源的一款编辑器, 本文主要介绍如何使用VS Code搭建Go语言的开发环境. 下载与安装VS Code 官方下载地址: https://code.visualstudio.co ...

  9. 使用Git管理版本

    原文地址:廖雪峰的网站 Git 是目前世界上最先进的分布式版本控制系统 Git 的历史 集中式 vs 分布式 集中式的版本库是集中存放在中央服务器的.缺点是必须联网.网速慢的情况就会让人抓狂. 分布式 ...

  10. Spring Cloud--Hystrix服务熔断(线程隔离/服务降级)代码实现

    一旦服务阻塞就进行服务降级或线程隔离.要不然就会导致大面积服务的瘫痪,Hystrix就是干这个的,一出现不健康的服务就进行熔断,不阻塞后面线程的执行. 引入依赖: 加注解: 这三个注解可以用一个注解搞 ...