jsp网站开发实例与发布,磐安县建设局网站,广州网站优化排名,住建厅官方网一、先来介绍下Ingress
Ingress 这个东西是 1.2 后才出现的#xff0c;通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务#xff0c;以下详细说一下 Ingress#xff0c;毕竟 traefik 用的就是 Ingress
使用 Ingress 时一般会有三个组件: …一、先来介绍下Ingress
Ingress 这个东西是 1.2 后才出现的通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务以下详细说一下 Ingress毕竟 traefik 用的就是 Ingress
使用 Ingress 时一般会有三个组件:
反向代理负载均衡器 Ingress Controller Ingress
1.1、反向代理负载均衡器
反向代理负载均衡器很简单说白了就是 nginx、apache 什么的在集群中反向代理负载均衡器可以自由部署可以使用 Replication Controller、Deployment、DaemonSet 等等不过个人喜欢以 DaemonSet 的方式部署感觉比较方便
1.2、Ingress Controller
Ingress Controller 实质上可以理解为是个监视器Ingress Controller 通过不断地跟 kubernetes API 打交道实时的感知后端 service、pod 等变化比如新增和减少 podservice 增加与减少等当得到这些变化信息后Ingress Controller 再结合下文的 Ingress 生成配置然后更新反向代理负载均衡器并刷新其配置达到服务发现的作用
1.3、Ingress
Ingress 简单理解就是个规则定义比如说某个域名对应某个 service即当某个域名的请求进来时转发给某个 service;这个规则将与 Ingress Controller 结合然后 Ingress Controller 将其动态写入到负载均衡器配置中从而实现整体的服务发现和负载均衡
有点懵逼那就看图 从上图中可以很清晰的看到实际上请求进来还是被负载均衡器拦截比如 nginx然后 Ingress Controller 通过跟 Ingress 交互得知某个域名对应哪个 service再通过跟 kubernetes API 交互得知 service 地址等信息综合以后生成配置文件实时写入负载均衡器然后负载均衡器 reload 该规则便可实现服务发现即动态映射
了解了以上内容以后这也就很好的说明了我为什么喜欢把负载均衡器部署为 Daemon Set因为无论如何请求首先是被负载均衡器拦截的所以在每个 node 上都部署一下同时 hostport 方式监听 80 端口那么就解决了其他方式部署不确定 负载均衡器在哪的问题同时访问每个 node 的 80 都能正确解析请求如果前端再 放个 nginx 就又实现了一层负载均衡
二、Traefik 使用
由于微服务架构以及 Docker 技术和 kubernetes 编排工具最近几年才开始逐渐流行所以一开始的反向代理服务器比如 nginx、apache 并未提供其支持毕竟他们也不是先知所以才会出现 Ingress Controller 这种东西来做 kubernetes 和前端负载均衡器如 nginx 之间做衔接即 Ingress Controller 的存在就是为了能跟 kubernetes 交互又能写 nginx 配置还能 reload 它这是一种折中方案而最近开始出现的 traefik 天生就是提供了对 kubernetes 的支持也就是说 traefik 本身就能跟 kubernetes API 交互感知后端变化因此可以得知: 在使用 traefik 时Ingress Controller 已经无卵用了所以整体架构如下 关于traefik 简介
traefik 是一个前端负载均衡器对于微服务架构尤其是 kubernetes 等编排工具具有良好的支持
同 nginx 等相比traefik 能够自动感知后端容器变化从而实现自动服务发现。 traefik部署在k8s上分为daemonset和deployment两种方式各有优缺点
daemonset 能确定有哪些node在运行traefik所以可以确定的知道后端ip但是不能方便的伸缩 deployment 可以更方便的伸缩但是不能确定有哪些node在运行traefik所以不能确定的知道后端ip 一般部署两种不同类型的traefik:
面向内部(internal)服务的traefik建议可以使用deployment的方式 面向外部(external)服务的traefik建议可以使用daemonset的方式 建议使用traffic-type标签
traffic-type: external traffic-type: internal traefik相应地使用labelSelector
traffic-typeinternal traffic-typeexternal 已经从大体上搞懂了 Ingress 和 traefik那么部署起来就很简单
安装traefik
下载traefik-1.7.34地址https://download.csdn.net/download/weixin_45623111/89045897
mkdir traefik cd traefik
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/traefik-rbac.yaml# 配置rbac
kubectl apply -f traefik-rbac.yaml# 以下两种方式选择一个
# 80 提供正常服务8080 是其自带的 UI 界面# 以daemonset方式启动traefik
# 会在所有node节点启动一个traefik并监听在80端口
# master节点不会启动traefik
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/traefik-ds.yaml
kubectl apply -f traefik-ds.yaml# 以deployment方式启动traefik
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/traefik-deployment.yaml
kubectl apply -f traefik-deployment.yaml# 查看状态
kubectl get pods -n kube-system# 访问测试如果有响应说明安装正确
# 应该返回404
# 如果以daemonset方式启动traefik使用如下方式验证
# 11.11.11.112为任何一个node节点的ip
curl 11.11.11.112# 如果以deployment方式启动traefik
# 访问node:nodeport或者集群ip验证
部署Træfik Web UI
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/ui.yaml
kubectl apply -f ui.yaml# 访问webui
# 需要先配置host
# 11.11.11.112为任何一个node节点的ip
11.11.11.112 traefik-ui.minikube# 浏览器访问如下地址
http://traefik-ui.minikube/
使用basic验证
# 生成加密密码如果没有安装htpasswd可以在线生成
# https://tool.lu/htpasswd/
htpasswd -c ./auth myusername
cat auth
myusername:$apr1$78Jyn/1K$ERHKVRPPlzAX8eBtLuvRZ0# 从密码文件创建secret
# monitoring必须和ingress rule处于同一个namespace
kubectl create secret generic mysecret --from-file auth --namespacemonitoring# 创建ingress
cat prometheus-ingress.yamlEOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: prometheus-dashboardnamespace: monitoringannotations:kubernetes.io/ingress.class: traefikingress.kubernetes.io/auth-type: basicingress.kubernetes.io/auth-secret: mysecret
spec:rules:- host: dashboard.prometheus.example.comhttp:paths:- backend:serviceName: prometheusservicePort: 9090
EOFkubectl create -f prometheus-ingress.yaml -n monitoring
官方实例
1. 根据域名(host)路由
# deployment
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/cheese-deployments.yaml
kubectl apply -f cheese-deployments.yaml# service
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/cheese-services.yaml
kubectl apply -f cheese-services.yaml# ingress
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/cheese-ingress.yaml
kubectl apply -f cheese-ingress.yaml# 查看状态
kubectl get pods
kubectl get svc
kubectl get ingress# 测试
# 配置hosts
11.11.11.112 stilton.minikube cheddar.minikube wensleydale.minikube# 浏览器访问测试
http://stilton.minikube/
http://cheddar.minikube/
http://wensleydale.minikube/
2. 根据路径(path)路由
# 使用新的ingress
wget https://gitee.com/mirrors/traefik/tree/v1.7/examples/k8s/cheeses-ingress.yaml
kubectl apply -f cheeses-ingress.yaml# 测试
# 配置hosts
11.11.11.112 cheeses.minikube# 浏览器访问测试
http://cheeses.minikube/stilton/
http://cheeses.minikube/cheddar/
http://cheeses.minikube/wensleydale/
3. 指定路由优先级
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: wildcard-cheesesannotations:traefik.frontend.priority: 1
spec:rules:- host: *.minikubehttp:paths:- path: /backend:serviceName: stiltonservicePort: httpkind: Ingress
metadata:name: specific-cheesesannotations:traefik.frontend.priority: 2
spec:rules:- host: specific.minikubehttp:paths:- path: /backend:serviceName: stiltonservicePort: http
部署 Traefik UI
traefik 本身还提供了一套 UI 供我们使用其同样以 Ingress 方式暴露只需要创建一下即可
kubectl create -f ui.yaml# ui yaml 如下
---
apiVersion: v1
kind: Service
metadata:name: traefik-web-uinamespace: kube-system
spec:selector:k8s-app: traefik-ingress-lbports:- name: webport: 80targetPort: 8580
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: traefik-web-uinamespace: kube-system
spec:rules:- host: traefik-ui.localhttp:paths:- path: /backend:serviceName: traefik-web-uiservicePort: web
2.1、访问测试
都创建无误以后只需要将待测试的域名解析到任意一台 node 上即可页面就不截图了截图就暴露了…..下面来两张 ui 的
2.2、健康检查
关于健康检查测试可以使用 kubernetes 的 Liveness Probe 实现如果 Liveness Probe检查失败则 traefik 会自动移除该 pod以下是一个 示例test 的 deployment健康检查方式是 cat /tmp/health容器启动 2 分钟后会删掉这个文件模拟健康检查失败
apiVersion: v1
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: testnamespace: defaultlabels:test: alpine
spec:replicas: 1selector:matchLabels:test: alpinetemplate:metadata:labels:test: alpinename: testspec:containers:- image: mritd/alpine:3.4name: alpineresources:limits:cpu: 200mmemory: 30Mirequests:cpu: 100mmemory: 20Miports:- name: httpcontainerPort: 80args:command:- bash- -c- echo ok /tmp/health;sleep 120;rm -f /tmp/healthlivenessProbe:exec:command:- cat- /tmp/healthinitialDelaySeconds: 20
test 的 service
apiVersion: v1
kind: Service
metadata:name: test labels:name: test
spec:ports:- port: 8123targetPort: 80selector:name: test
test 的 Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: test
spec:rules:- host: test.comhttp:paths:- path: /backend:serviceName: testservicePort: 8123
全部创建好以后进入 traefik ui 界面可以观察到每隔 2 分钟健康检查失败后kubernetes 重建 pod同时 traefik 会从后端列表中移除这个 pod。