一、概述

1、理解Ingress

简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。Ingress相当于nginx、apache等负载均衡方向代理服务器,其中还包括规则定义,即URL的路由信息,路由信息得的刷新由Ingress controller来提供。

2、理解Ingress Controller

Ingress Controller 实质上可以理解为是个监视器,Ingress Controller 通过不断地跟 kubernetes API 打交道,实时的感知后端 service、pod 等变化,比如新增和减少 pod,service 增加与减少等;当得到这些变化信息后,Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用。

3、RBAC

在开始之前,需要先了解一下什么是RBAC。RBAC(基于角色的访问控制)使用 rbac.authorization.k8s.io API 组来实现权限控制,RBAC 允许管理员通过 Kubernetes API 动态的配置权限策略。在 1.6 版本中 RBAC 还处于 Beat 阶段,如果想要开启 RBAC 授权模式需要在 apiserver 组件中指定 --authorization-mode=RBAC 选项。

在 RBAC API 的四个重要概念: 

Role:是一系列的权限的集合,例如一个角色可以包含读取 Pod 的权限和列出 Pod 的权限 

ClusterRole: 跟 Role 类似,但是可以在集群中到处使用( Role 是 namespace 一级的) 

RoloBinding:把角色映射到用户,从而让这些用户继承角色在 namespace 中的权限。 

ClusterRoleBinding: 让用户继承 ClusterRole 在整个集群中的权限。

 

二、部署traefik

环境介绍

系统k8s版本dockerip主机名配置

centos 7.6

1.18.1

19.03.5

10.212.20.94

k8s-master

2核4G

centos 7.6

1.18.1

19.03.5

10.212.20.240

k8s-node01

2核8G

 

 

 

 

 

 

traefik版本

traefik目前主要有2个版本,分别是1.x和2.x。因为2个版本之间,配置文件差异比较大,目前网络上的博客文章都是基于1.x编写的。

因此,本文采用1.x最后一个版本,镜像名为:traefik:v1.7.24-alpine

 

配置证书

https证书,是从阿里云购买的,买的通配符证书,1年1千多块钱左右。

登录master节点,创建证书目录。

mkdir /etc/kubernetes/ssl

将证书上传到此目录,并重命名文件。

目录结构如下:

./

├── tls.crt

└── tls.key

 

创建secret

创建secret,保存https证书,注意操作目录,如果不是在此目录下操作,须指定绝对路径。

cd /etc/kubernetes/ssl

kubectl create secret generic ssl --from-file=tls.crt --from-file=tls.key -n kube-system

如果需要配置traefik多域名证书形式,traefik能够自动识别证书。请参考文章底部提供的参考链接!

 

打label标签

为 k8s-node01 节点指定label标签为edgenode=true

kubectl label nodes k8s-node01 edgenode=true

 

配置yaml

traefik.yaml

这里面包含了rbac,DaemonSet,controller,traefik UI,https配置,configmap

---

kind: ClusterRole

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

name: traefik-ingress-controller

rules:

- apiGroups:

- ""

resources:

- services

- endpoints

- secrets

verbs:

- get

- list

- watch

- apiGroups:

- extensions

resources:

- ingresses

verbs:

- get

- list

- watch

---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

name: traefik-ingress-controller

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: ClusterRole

name: traefik-ingress-controller

subjects:

- kind: ServiceAccount

name: traefik-ingress-controller

namespace: kube-system

---

apiVersion: v1

kind: ServiceAccount

metadata:

name: traefik-ingress-controller

namespace: kube-system

---

kind: ConfigMap

apiVersion: v1

metadata:

name: traefik-conf

namespace: kube-system

data:

traefik.toml: |

insecureSkipVerify = true

defaultEntryPoints = ["http","https"]

[entryPoints]

[entryPoints.http]

address = ":80"

[entryPoints.https]

address = ":443"

[entryPoints.https.tls]

[[entryPoints.https.tls.certificates]]

CertFile = "/ssl/tls.crt"

KeyFile = "/ssl/tls.key"

---

kind: DaemonSet

apiVersion: apps/v1

metadata:

name: traefik-ingress-controller

namespace: kube-system

labels:

k8s-app: traefik-ingress-lb

spec:

selector:

matchLabels:

k8s-app: traefik-ingress-lb

name: traefik-ingress-lb

template:

metadata:

labels:

k8s-app: traefik-ingress-lb

name: traefik-ingress-lb

spec:

serviceAccountName: traefik-ingress-controller

tolerations:

- key: node-role.kubernetes.io/master

effect: NoSchedule

terminationGracePeriodSeconds: 60

hostNetwork: true

#nodeSelector:

# ingress: traefik

volumes:

- name: ssl

secret:

secretName: ssl

- name: config

configMap:

name: traefik-conf

containers:

- image: traefik:v1.7.24-alpine

name: traefik-ingress-lb

ports:

- name: http

containerPort: 80

hostPort: 80

- name: admin

containerPort: 8080

securityContext:

privileged: true

args:

- --configfile=/config/traefik.toml

- -d

- --web

- --kubernetes

volumeMounts:

- mountPath: "/ssl"

name: "ssl"

- mountPath: "/config"

name: "config"

nodeSelector:

edgenode: "true"

---

kind: Service

apiVersion: v1

metadata:

name: traefik-ingress-service

spec:

selector:

k8s-app: traefik-ingress-lb

ports:

- protocol: TCP

port: 80

name: web

- protocol: TCP

port: 8080

name: admin

- protocol: TCP

port: 443

name: https

type: NodePort

---

apiVersion: v1

kind: Service

metadata:

name: traefik-web-ui

namespace: kube-system

spec:

selector:

k8s-app: traefik-ingress-lb

ports:

- port: 80

targetPort: 8080

---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: traefik-web-ui

namespace: kube-system

annotations:

kubernetes.io/ingress.class: traefik

spec:

rules:

- host: traefikui.test.com

http:

paths:

- backend:

serviceName: traefik-web-ui

servicePort: 80

View Code

 

使用DaemonSet类型来部署Traefik,并使用nodeSelector来限定Traefik所部署的主机。如果有dns,将域名解析到这所部署的主机即可。

 

开始部署

kubectl apply -f traefik.yaml

 

访问traefik ui

由于内网没有dns服务器,直接修改windows10的hosts文件,添加一条记录。

10.212.20.240 traefikui.test.com

注意:这里的10.212.20.240是Traefik所部署的主机。不是master节点ip

 

访问http和https

http://traefikui.test.com

https://traefikui.test.com

效果如下:

 

 

三、traefik发布应用

现在k8s环境中,有一个vue开发的web后台。

查看pod

# kubectl get pods -n test

NAME READY STATUS RESTARTS AGE

web-wxbweb-845994566c-4dcxt 1/1 Running 2 2d23h

查看svc

# kubectl get svc -n test

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

web-wxbweb ClusterIP 10.1.43.224 7000/TCP,7001/TCP 2d23h

目前的service类型是ClusterIP

 

新建一个yaml,通过traefik来暴露访问。

wxbweb-traefik.yaml

kind: Ingress

metadata:

name: web-wxbweb

namespace: test

annotations:

kubernetes.io/ingress.class: traefik

traefik.frontend.rule.type: PathPrefixStrip

spec:

rules:

- host: wxbweb.test.com

http:

paths:

- path: /

backend:

serviceName: web-wxbweb

servicePort: 7000

 

发布一下

kubectl apply -f wxbweb-traefik.yaml

 

新增一条hosts记录

10.212.20.240 wxbweb.test.com

 

访问页面是否正常。

 

 

2.0配置,请参考

https://docs.traefik.io/user-guides/crd-acme/

 

本文参考链接:

https://www.cnblogs.com/cptao/p/10911918.html

 

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。