英文网站建设哪家好,163企业邮箱免费版,网站怎么做预约小程序,app打包网站开发源码目录[-]
. 一、Ingress 介绍. 二、Traefik 介绍. 三、部署 Ingress 控制器 Traefik. 1、Traefik 两种部署方式介绍. 2、创建 Traefik 配置文件. 3、将 Traefik 配置文件挂载到 ConfigMap. 4、设置 CA 证书. 5、给节点设置 Label. 6、创建 Traefik 服务账户与角色权限. 7、创建…目录[-]
. 一、Ingress 介绍. 二、Traefik 介绍. 三、部署 Ingress 控制器 Traefik. 1、Traefik 两种部署方式介绍. 2、创建 Traefik 配置文件. 3、将 Traefik 配置文件挂载到 ConfigMap. 4、设置 CA 证书. 5、给节点设置 Label. 6、创建 Traefik 服务账户与角色权限. 7、创建 Traefik Ingress Controller. 四、配置 Ingress 访问策略. 1、Ingress 规则配置简介. 2、创建 Traefik Dashboard Ingress前言
Ingress 可以为 Kubernetes 集群外部访问集群内部 Service 提供配置Ingress Controller 控制器可以充当网关提供路由策略、负载均衡流量、SSL并提供基于名称的虚拟主机提供统一的入口供流量涌入是一个边缘路由器或额外的前端。这里使用 Traefik 来充当 Ingress Controller 控制器下面将介绍如何在 Kubernetes 中部署 Traefik 这个过程。 Ingress 不会暴露任意端口或协议。将除 HTTP 和 HTTPS 之外的服务暴露给互联网通常使用 Service.Type NodePort 或 Service.Type LoadBalancer 类型的服务。 系统环境
kubernetes 版本1.14.0traefik 版本1.7.12
Github 示例部署文件
部署文件 github 地址: https://github.com/my-dlq/blog-example/tree/master/kubernetes/traefik-v1.7-deploy
一、Ingress 介绍
对于基于 HTTP 的服务不同的 URL 对应不同的后端服务或者虚拟服务器(Virtual Host)这些应用层的转发无法通过 Kubernetes Service 机制实现所以从 Kubernetes 1.1 版本开始新增 Ingress 资源。Ingress 是一种将不同的URL的访问请求转发到不同的 Service 实现Http层业务路由机制。
Kubernetes Ingress 包含 Ingress 策略和 Ingress 控制器两部分组成Ingress 策略是配置路由规则而 Ingress 控制器则是将服务进行转发。Ingress Controller 基于 Ingress 规则将客户端请求转发到 Service 对应的后端 Endpoints(Pod) 上这样会跳过 Kube-proxy 转发功能避免增加开销。
例如下图展示了集群外部客户端通过 Ingress 地址访问集群根据配置的 Ingress 规则将所有访问 host 为 www.mydlq.club 且 path 为 “/test” 或者 “/dev” 的外部流量转发到对应的 Pod 上。 二、Traefik 介绍
Traefik 是一个轻松与微服务配合且流行的 HTTP 反向代理和负载均衡器。Traefik 与现有的基础架构组件如 Docker、Swarm、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS ……集成并自动动态配置。在你的控制器上指向 Traefik 应该是你唯一需要配置的步骤。 三、部署 Ingress 控制器 Traefik
在定义 Ingress 之前我先首先拥有 Ingresss 控制器以实现为后端所有服务统一入口。Ingresss 控制器也是以 Pod 形式运行在 Kubernetes 集群中监控 API Server 的 /ingress 接口后端的backend services如果 Service 发送变化则 Ingress 控制器将自动更新其转发规则下面我们开始部署 Traefik 到 Kubernetes 集群。
步骤简介
(1)、创建 Traefik 配置文件并将其以 ConfigMap 方式挂载到 Kubernetes 集群中。(2)、生成 CA 证书并将其以 Secret 方式挂载到 Kubernetes 集群中。(3)、创建 Traefik Label 设置到 Kubernetes 节点(相当于设置了 Label 的节点是 Ingress 入口)。(4)、创建 Traefik ServiceAccount 以提供 Traefik 一定权限。(5)、创建 Traefik 控制器。
1、Traefik 两种部署方式介绍
在 Kubernetes 下有两种部署 Kubernetes 的方式
DeploymentDeamonSet
两种部署方式的区别
在 Kubernetes 利用 DaemonSet 方式部署的应用会在设置对应 Label 的 Kubernetes 节点上部署一个 Pod每当新增 Kubernetes 节点后只要对新增的 Kubernetes 节点设置对应 Label 就可将 Traefik 扩展到该节点。但是也是因为如此一个节点只能启用一个 Pod这样对于 Traefik 的扩展非常不利如果将外部流量大量指向某个节点那么很可能会致使该节点的 Traefik 崩溃但也是非常方便限制两个 Traefik Pod 起在不在同一节点上。使用 Deployment 方式的部署方式一般是部署无状态应用的所以通过这种方式能够很轻松的扩展 Traefik 应用副本数。
如果用 DaemonSet 方式部署 Traefik 就可与使用该 “NET_BIND_SERVICE” 功能这将允许它绑定到每个主机上的 80/443/etc 端口。这将允许绕过 kube-proxy并减少流量跳跃。而 Deployment 这种部署方式是通过 kube-proxy 代理将流量转发到 Traefik所以可以利用集群中所有节点的 IP 地址访问 Traefik但是每新增一个 Kubernetes 节点后如果想在该节点上设置 Traefik 那么必须更改 Traefik Deployment 配置增加副本数且使其在新节点上调度。
所以两种部署方式区别大概如下
DaemonSet 方式能够确定有哪些节点在运行 Traefik可以确定的知道后端 IP但是不能方便的伸缩。 Deployment 可以方便的伸缩但是不能确定有哪些节点在运行 Traefik 所以不能确定的知道后端 IP。使用 Deployment 时可伸缩性可以更好DaemonSet 方式在新增节点时更易扩展。DaemonSet 确保每个节点只有一个 Traefik Pod 在运行。而 Deployment 可以有多个副本。如果要确保两个pod不在同一节点上则可以设置成Deployment。DeamonSet 可以使用 “NET_BIND_SERVICE” 功能这将允许它绑定到每个主机上的端口 80/443/etc。这将允许绕过kube-proxy并减少流量跳跃。
这两张方式可以根据自己的需求选择其一即可。这里将介绍如何通过 DaemonSet 方式部署 Traefik Ingress。
2、创建 Traefik 配置文件
为了方便配置 Traefik一般情况下将 Traefik 配置文件放置到容器外这里以 ConfigMap 方式将配置文件存入 Kubernetes 集群然后通过挂载方式将 ConfigMap 挂入 Traefik 容器中。
创建 traefik.toml 文件
traefik.toml
# traefik.toml
debug true
InsecureSkipVerify true
defaultEntryPoints [http,https]
[entryPoints][entryPoints.http]address :80compress true[entryPoints.https]address :443compress true[entryPoints.https.tls][[entryPoints.https.tls.certificates]]CertFile /ssl/tls.crtKeyFile /ssl/tls.key[entryPoints.traefik]address :8080
[kubernetes]
[traefikLog]format json#filePath /data/traefik.log
[accessLog]#filePath /data/access.logformat json[accessLog.filters]retryAttempts trueminDuration 10ms[accessLog.fields]defaultMode keep[accessLog.fields.names]ClientUsername drop[accessLog.fields.headers]defaultMode keep[accessLog.fields.headers.names]User-Agent redactAuthorization dropContent-Type keep
[api]entryPoint traefikdashboard trueTraefik 配置文件中设置该 Traefik Ingress 允许以 HTTP、HTTPS 方式进入;设置 SSL 统一的 CA 证书文件地址为“/ssl/tls.crt”,“/ssl/tls.key”方便后续通过 ConfigMap 方式将 CA 证书文件挂入其中。
3、将 Traefik 配置文件挂载到 ConfigMap
n 指定程序启的 Namespace--from-file 读取文件生成 ConfigMap
$ kubectl create configmap traefik-config --from-file./traefik.toml -n kube-system4、设置 CA 证书
这里设置 Traefik 统一的 CA 证书文件如果已经有拥有认证的证书文件可以直接拿来用或者也可以用 openssl 程序生成自签名证书。
生成自签名 CA 证书
openssl 工具生成 CA 自签名的证书
$ openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 9999 -out tls.crt生成 secret 到 Kubernetes
$ kubectl create secret generic traefik-ui-tls-cert --from-filetls.crt --from-filetls.key -n kube-system5、给节点设置 Label
由于是 Kubernetes DeamonSet 这种方式部署 Traefik所以需要提前给节点设置 Label这样当程序部署时 Pod 会自动调度到设置 Label 的点上。
节点设置 Label 标签
格式kubectl label nodes [节点名] [keyvalue]
$ kubectl label nodes k8s-master-2-11 IngressProxytrue查看节点是否设置 Label 成功
$ kubectl get nodes --show-labelsNAME STATUS ROLES VERSION LABELS
k8s-master-2-11 Ready master v1.14.0 IngressProxytrue,kubernetes.io/hostnamek8s-master-2-11,kubernetes.io/oslinux,node-role.kubernetes.io/master
k8s-node-2-12 Ready none v1.14.0 kubernetes.io/hostnamek8s-node-2-12,storagenodeglusterfs
k8s-node-2-13 Ready none v1.14.0 kubernetes.io/hostnamek8s-node-2-13,storagenodeglusterfs
k8s-node-2-14 Ready none v1.14.0 kubernetes.io/hostnamek8s-node-2-14,storagenodeglusterfs可以看到已经设置上了 Label
6、创建 Traefik 服务账户与角色权限
Kubernetes 在 1.6 版本中引入了基于角色的访问控制RBAC策略方便对 Kubernetes 资源和 API 进行细粒度控制。所以这里提前创建好 Traefik ServiceAccount 并分配一定的权限。
创建 traefik-rbac.yaml 文件
traefik-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: traefik-ingress-controllernamespace: kube-system---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: traefik-ingress-controller
rules:- apiGroups: []resources: [services,endpoints,secrets]verbs: [get, watch, list] - apiGroups: [extensions]resources: [ingresses]verbs: [get, watch, list] - apiGroups: [extensions]resources: [ingresses/status]verbs: [update] ---kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: traefik-ingress-controller
subjects:
- kind: ServiceAccount name: traefik-ingress-controllernamespace: kube-system
roleRef:kind: ClusterRolename: traefik-ingress-controllerapiGroup: rbac.authorization.k8s.io创建 Traefik RBAC
$ kubectl apply -f traefik-rbac.yaml7、创建 Traefik Ingress Controller
创建 traefik.yaml 文件
这里设置部署 Traefik 的 yaml 文件里面包含 Traefik 的 Service 和 DaemonSet。Service 里面需要设置三个端口分别为 80、443、8080这三个端口分别对应 http端口、https端口、traefik admin控制台端口。DaemonSet 里面设置容器也暴露三个端口其中 “80/443” 是使用特权端口的守护进程阐述了静态非NodePorthostPort 绑定这样相当于暴露当前 Traefik Pod 所在节点 IP外部流量能通过该节点 IP 进入 Traefik Ingress。而 8080 是供 Traefik Dashboard 用的控制台端口可以通过该端口访问 Traefik 控制台。
例如这里设置 Traefik 启动到 “k8s-master-2-11”此节点的 IP 为 “192.168.2.11” 这样外部想通过 Traefik Ingress 访问集群服务必须通过该 IP 地址而不应通过 Kubernetes 集群 IP相当于该节点充当了 Kubernetes 入口。
traefik.yaml
kind: Service
apiVersion: v1
metadata:name: traefik-ingress-servicenamespace: kube-system
spec:selector:k8s-app: traefik-ingress-lbports:- protocol: TCPport: 80name: http- protocol: TCPport: 443name: https- protocol: TCPport: 8080name: admin---apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:name: traefik-ingress-controllernamespace: kube-systemlabels:k8s-app: traefik-ingress-lb
spec:template:metadata:labels:k8s-app: traefik-ingress-lbname: traefik-ingress-lbspec:serviceAccountName: traefik-ingress-controllerterminationGracePeriodSeconds: 60containers:- image: traefik:1.7.12name: traefik-ingress-lbports:- name: httpcontainerPort: 80hostPort: 80 #hostPort方式将端口暴露到集群节点- name: httpscontainerPort: 443hostPort: 443 #hostPort方式将端口暴露到集群节点- name: admincontainerPort: 8080securityContext:capabilities:drop:- ALLadd:- NET_BIND_SERVICEargs:- --api- --kubernetes- --logLevelINFO- --configfile/config/traefik.tomlvolumeMounts:- mountPath: /sslname: ssl- mountPath: /configname: configvolumes:- name: sslsecret:secretName: traefik-ui-tls-cert- name: configconfigMap:name: traefik-config tolerations: #设置容忍所有污点防止节点被设置污点- operator: ExistsnodeSelector: #设置node筛选器在特定label的节点上启动IngressProxy: true部署 Traefik
$ kubectl apply -f traefik.yaml查看 Traefik 资源
$ kubectl get daemonset,service,pod -o wide -n kube-systemNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR CONTAINERS IMAGES
daemonset.extensions/traefik-ingress-controller 1 1 1 1 1 IngressProxytrue traefik-ingress-lb traefik:1.7.12
------------------------------------------------------------------------------------------------------------------------------------------------------
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) SELECTOR
service/traefik-ingress-service ClusterIP 10.10.114.105 none 80/TCP,443/TCP,8080/TCP k8s-apptraefik-ingress-lb
------------------------------------------------------------------------------------------------------------------------------------------------------
NAME READY STATUS RESTARTS IP NODE NOMINATED NODE READINESS GATES
pod/traefik-ingress-controller-8rzwt 1/1 Running 3 10.20.0.29 k8s-master-2-11 none none到这里 Traefik 控制器已经部署完成下面将同过暴露 Traefik Dashboard Ingres 来进行 Igress 配置示例。
四、配置 Ingress 访问策略
1、Ingress 规则配置简介
一个常规的路由策略如下所示这里根据注解详细描述 Ingress 访问配置。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: test-ingress #Ingress 资源名称annotations:kubernetes.io/ingress.class: traefik #指定用 traefik 控制器,如果为 nginx 控制器则设置为 nginx
spec:rules:- host: cloud.mydlq.club #设置 host 匹配规则外部流量访问该 host 时候进行代理操作http:paths:- path: /traefik #设置 path当 host 匹配后进行 path 匹配根据 path 不同转发不同的服务 backend:serviceName: traefik-ingress-service #设置 service 名称和要跳转的 service 一致servicePort: 8080 #设置 service 端口2、创建 Traefik Dashboard Ingress
上面部署的 Traefik 控制器默认有控制台服务即 Traefik Service 的 8080 端口。
这里配置一个 Ingress 将这个 Dashboard 设置域名为 http://cloud.mydlq.club/traefik 暴露出去其它服务也是类似这种方法将 Service 暴露出去。
创建 traefik-dashboard-ingress.yaml 文件
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: traefik-dashboardnamespace: kube-systemannotations:kubernetes.io/ingress.class: traefik #指定用 traefik 控制器traefik.frontend.rule.type: PathPrefixStrip #跳转后端时忽略 pathtraefik.ingress.kubernetes.io/frontend-entry-points: http #指定只能以 http方式访问也可以设置 https
spec:rules:- host: cloud.mydlq.club #设置 hosthttp:paths:- path: /traefik #设置 pathbackend:serviceName: traefik-ingress-service #设置 service 名称和要跳转的 service 一致servicePort: 8080 #设置 service 端口创建 Traefik Dashboard Ingress
$ kubectl apply -f traefik-dashboard-ingress.yaml查看 Ingress
$ kubectl describe ingress traefik-dashboard -n kube-systemName: traefik-dashboard
Namespace: kube-system
Address:
Default backend: default-http-backend:80 (none)
TLS:SNI routes
Rules:Host Path Backends---- ---- --------cloud.mydlq.club /traefik traefik-ingress-service:8080 (10.20.0.29:8080)
Annotations:kubernetes.io/ingress.class: traefiktraefik.frontend.rule.type: PathPrefixStriptraefik.ingress.kubernetes.io/frontend-entry-points: http
Events: none设置 Host 映射
客户端想通过域名访问服务必须要进行DNS解析由于这里没有 DNS 服务器进行域名解析所以修改 hosts 文件将 Traefik 指定节点的 IP 和自定义 host 绑定。
$ vi /etc/hosts添加下面内容
192.168.2.11 cloud.mydlq.club通过域名访问 Traefik Dashboard
访问地址 http://cloud.mydlq.club/traefik 查看 Traefik 控制台。