第五课:部署Ingress服务

摘要:
中间件--apiVersion:范围:traefik.containo.usversion:种类:

14 部署Ingress (master01)

服务反向代理
部署Traefik 2.0版本

14.1 创建traefik-crd.yaml文件

全局生效,不局限于ns,定义kind类型,用于ingress-route.yaml里的kind使用。

mkdir /root/traefik && cd /root/traefik
cat >traefik-crd.yaml<<EOF
## IngressRoute
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingressroutes.traefik.containo.us
spec:
  scope: Namespaced
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: IngressRoute
    plural: ingressroutes
    singular: ingressroute
---
## IngressRouteTCP
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingressroutetcps.traefik.containo.us
spec:
  scope: Namespaced
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: IngressRouteTCP
    plural: ingressroutetcps
    singular: ingressroutetcp
---
## Middleware
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: middlewares.traefik.containo.us
spec:
  scope: Namespaced
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Middleware
    plural: middlewares
    singular: middleware
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: tlsoptions.traefik.containo.us
spec:
  scope: Namespaced
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TLSOption
    plural: tlsoptions
    singular: tlsoption
EOF
14.1.1 创建treafik crd资源
[root@master01 traefik]# kubectl create -f traefik-crd.yaml 
customresourcedefinition.apiextensions.k8s.io/ingressroutes.traefik.containo.us created
customresourcedefinition.apiextensions.k8s.io/ingressroutetcps.traefik.containo.us created
customresourcedefinition.apiextensions.k8s.io/middlewares.traefik.containo.us created
customresourcedefinition.apiextensions.k8s.io/tlsoptions.traefik.containo.us created
[root@master01 traefik]# kubectl get CustomResourceDefinition
NAME                                   CREATED AT
ingressroutes.traefik.containo.us      2020-08-11T07:41:42Z
ingressroutetcps.traefik.containo.us   2020-08-11T07:41:42Z
middlewares.traefik.containo.us        2020-08-11T07:41:42Z
tlsoptions.traefik.containo.us         2020-08-11T07:41:43Z

14.2 创建traefik RABC文件

traefik-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: kube-system
  name: traefik-ingress-controller
---
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"]
  - apiGroups: ["extensions"]
    resources: ["ingresses/status"]
    verbs: ["update"]
  - apiGroups: ["traefik.containo.us"]
    resources: ["middlewares"]
    verbs: ["get","list","watch"]
  - apiGroups: ["traefik.containo.us"]
    resources: ["ingressroutes"]
    verbs: ["get","list","watch"]
  - apiGroups: ["traefik.containo.us"]
    resources: ["ingressroutetcps"]
    verbs: ["get","list","watch"]
  - apiGroups: ["traefik.containo.us"]
    resources: ["tlsoptions"]
    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
14.2.1 创建权限文件
[root@master01 traefik]# kubectl create -f traefik-rbac.yaml 
serviceaccount/traefik-ingress-controller created
clusterrole.rbac.authorization.k8s.io/traefik-ingress-controller created
clusterrolebinding.rbac.authorization.k8s.io/traefik-ingress-controller created

14.3 创建traefik configmap文件

traefik-config.yaml

kind: ConfigMap
apiVersion: v1
metadata:
  name: traefik-config
data:
  traefik.yaml: |-
    serversTransport:
      insecureSkipVerify: true
    api:
      insecure: true
      dashboard: true
      debug: true
    metrics:
      prometheus: ""
    entryPoints:
      web:
        address: ":80"
      websecure:
        address: ":443"
      redistcp:
        address: ":6379"
    providers:
      kubernetesCRD: ""
    log:
      filePath: ""
      level: error
      format: json
    accessLog:
      filePath: ""
      format: json
      bufferingSize: 0
      filters:
        retryAttempts: true
        minDuration: 20
      fields:
        defaultMode: keep
        names:
          ClientUsername: drop
        headers:
          defaultMode: keep
          names:
            User-Agent: redact
            Authorization: drop
            Content-Type: keep
14.3.1 创建traefik configmap资源配置
[root@master01 traefik]# kubectl create -f traefik-config.yaml  -n kube-system
configmap/traefik-config created

14.4 设置节点标签

设置节点label 作用是对应traefik-deploy.yaml文件中的nodeSelector:IngressProxy: "true"的节点才会作为traefik服务的节点,不做标签的节点不会提供traefik服务。

[root@master01 traefik]# kubectl label nodes 192.168.68.149 IngressProxy=true
node/192.168.68.149 labeled
[root@master01 traefik]# kubectl label nodes 192.168.68.151 IngressProxy=true
node/192.168.68.151 labeled
14.4.1 查看节点标签

检查是否成功

[root@master01 traefik]# kubectl get nodes --show-labels
NAME             STATUS   ROLES    AGE   VERSION   LABELS
192.168.68.149   Ready    <none>   21h   v1.15.1   IngressProxy=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.68.149,kubernetes.io/os=linux
192.168.68.151   Ready    <none>   24h   v1.15.1   IngressProxy=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.68.151,kubernetes.io/os=linux

14.5 创建traefik部署文件

注意每个node节点的80与443端口不能被占用,每个节点都检查一下
其中ports字段我们可以自定义,可以添加你需要的端口,常用为80和443。
生产环境可以适当调整资源cpu和内存的大小。
traefik-deploy.yaml

apiVersion: v1
kind: Service
metadata:
  name: traefik
  labels:                       
    app: traefik-metrics
spec:
  ports:
    - name: web
      port: 80
    - name: websecure
      port: 443
    - name: admin
      port: 8080
  selector:
    app: traefik
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: traefik-ingress-controller
  labels:
    app: traefik
spec:
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      name: traefik
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 1
      containers:
        #- image: traefik:latest
        - image: traefik:2.0.5
          name: traefik-ingress-lb
          ports:
            - name: web
              containerPort: 80
              hostPort: 80
            - name: websecure
              containerPort: 443
              hostPort: 443
            - name: admin
              containerPort: 8080
            - name: redistcp
              containerPort: 6379
              hostPort: 6379
          resources:
            limits:
              cpu: 200m
              memory: 300Mi
            requests:
              cpu: 100m
              memory: 256Mi
          securityContext:
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
          args:
            - --configfile=/config/traefik.yaml
          volumeMounts:
            - mountPath: "/config"
              name: "config"
      volumes:
        - name: config
          configMap:
            name: traefik-config 
      tolerations:              #设置容忍所有污点,防止节点被设置污点
        - operator: "Exists"
      nodeSelector:             #设置node筛选器,在特定label的节点上启动
        IngressProxy: "true"
14.5.1 部署traefik资源
[root@master01 traefik]# kubectl apply -f traefik-deploy.yaml -n kube-system
service/traefik created
daemonset.apps/traefik-ingress-controller created

[root@master01 traefik]# kubectl get DaemonSet -A
NAMESPACE     NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR       AGE
kube-system   traefik-ingress-controller   2         2         2       2            2           IngressProxy=true   11m

14.6 traefik路由配置

14.6.1 配置traefik dashboard

traefik-dashboard-route.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard-route
  namespace: kube-system
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`ingress.abcd.com`)
      kind: Rule
      services:
        - name: traefik
          port: 8080
14.6.2 部署dashboard
[root@master01 traefik]# kubectl apply -f traefik-dashboard-route.yaml 
ingressroute.traefik.containo.us/traefik-dashboard-route created
14.6.3 访问dashboard

修改本地hosts文件
192.168.68.149 ingress.abcd.com
访问dashboard

avator

14.7 部署访问服务

创建nginx服务

kubectl run nginx-ingress-demo --image=nginx --replicas=1 -n kube-system
kubectl expose deployment nginx-ingress-demo --port=1099 --target-port=80 -n kube-system

[root@master01 traefik]# kubectl run nginx-ingress-demo --image=nginx --replicas=1 -n kube-system
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-ingress-demo created
[root@master01 traefik]# kubectl expose deployment nginx-ingress-demo --port=1099 --target-port=80 -n kube-system
service/nginx-ingress-demo exposed

创建路由

cat >nginx-ingress-demo-route.yaml<<EOF
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-nginx-demo-route
  namespace: kube-system
spec:
  entryPoints:
    - web
  routes:
    - match: Host(\`nginx.abcd.com\`)
      kind: Rule
      services:
        - name: nginx-ingress-demo
          port: 1099
EOF

创建nginx代理路由服务

[root@master01 traefik]# kubectl create -f nginx-ingress-demo-route.yaml
ingressroute.traefik.containo.us/traefik-nginx-demo-route created
[root@master01 traefik]# kubectl get IngressRoute -A
NAMESPACE     NAME                       AGE
kube-system   traefik-dashboard-route    16h
kube-system   traefik-nginx-demo-route   57s

绑定域名以后可以通过nginx.abcd.com访问上面创建的nginx服务。

14.8 创建https服务

代理dashboard https服务
创建自签名证书

cd /root/traefik
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=cloud.abcd.com"

将证书存储到kubernetes secret中

kubectl create secret tls dashboard-tls --key=tls.key --cert=tls.crt -n kube-system

查看系统secret

[root@master01 traefik]# kubectl get secret -n kube-system
NAME                                     TYPE                                  DATA   AGE
coredns-token-mv2gz                      kubernetes.io/service-account-token   3      41h
dashboard-tls                            kubernetes.io/tls                     2      13s
default-token-q5bxc                      kubernetes.io/service-account-token   3      2d
traefik-ingress-controller-token-ldcr8   kubernetes.io/service-account-token   3      18h

创建代理路由

cat >kubernetes-dashboard-route.yaml<<EOF
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: kubernetes-dashboard-route
  namespace: kubernetes-dashboard
spec:
  entryPoints:
    - websecure
  tls: 
    secretName: dashboard-tls
  routes:
    - match: Host(\`cloud.abcd.com\`)
      kind: Rule
      services:
        - name: kubernetes-dashboard
          port: 443
EOF

创建kubernetes-dashboard代理路由服务

[root@master01 traefik]# kubectl create -f kubernetes-dashboard-route.yaml 
ingressroute.traefik.containo.us/kubernetes-dashboard-route created
[root@master01 traefik]# kubectl get IngressRoute -A
NAMESPACE              NAME                         AGE
kube-system            traefik-dashboard-route      18h
kube-system            traefik-nginx-demo-route     48m
kubernetes-dashboard   kubernetes-dashboard-route   19s

绑定cloud.abcd.com域名并通过https访问。

Ingress的意义是什么?
我们在做svc关联的时候,使用nodeport模式从外部访问的流程是,k8s根据yaml文件中的port配置生成服务(svc)的端口和容器内的端口的映射关系,然后会自动生成一个节点node的随机端口(高于32768的端口号)映射到服务(svc)的端口。那么如果有很多服务同时使用nodeport模式会出现几个问题,1.我们需要去查找某个服务对应的某个端口,会比较复杂,2.node上的端口提供给某个服务以后就不能提供给其他服务使用,这个是服务和端口一对一对应的,数量有限。如何解决这些问题呢,就引入了ingress模式,traefik是一个开源实现ingress的工具,实现方式是前端使用域名去关联service和端口,后端的service和pod的对应不需要用户关心,由traefik-route自动完成。我们访问某个服务的时候只需要访问域名,可以由域名解析到pod的地址,不需要再去查找服务pod所在node的IP地址和对应的端口访问。简化了服务访问的流程。

用户访问->域名->ingess服务->svc服务->pod

ingress-route yaml文件说明:

apiVersion: traefik.containo.us/v1alpha1  -----ingress-route api类型
kind: IngressRoute  ---------------------------资源类型,不是kubernetes的资源类别,而是在traefik-crd.yaml中定义的。
metadata:
  name: kubernetes-dashboard-route  -----------ingress-route name,可以通过kubectl get IngressRouter查看
  namespace: kubernetes-dashboard   -----------所属namespace
spec:
  entryPoints:
    - websecure   -----------------------------客户访问入口,可以在traefik-config.yaml里配置
  tls: 
    secretName: dashboard-tls   ---------------tls secret文件名 
  routes:
    - match: Host(\`cloud.abcd.com\`)   -------对外客户访问域名
      kind: Rule
      services:
        - name: kubernetes-dashboard    -------后端svc名,可以从kubectl get svc查看
          port: 443    ------------------------svc端口号

14.9 Ingress-TCP服务访问

修改配置文件traefik-config.yamltraefik-deploy.yaml文件中的port字段块:
traefik-config.yaml

    entryPoints:
      redistcp:
        address: ":6379"

traefik-deploy.yaml

          ports:
          - name: redistcp
              containerPort: 6379
              hostPort: 6379
14.9.1 TCP ingress案例

启用redis服务

kubectl apply -f redis-tcp-deploy.yaml
[root@master01 traefik]# kubectl apply -f redis-tcp-deploy.yaml 
deployment.extensions/redis-tcp created
service/redis-tcp-svc created

启用traefik-route代理tcp端口

[root@master01 traefik]# more traefik-redis-tcp-route.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: redis-tcp-ingress
spec:
  entryPoints:
    - redistcp
  routes:
  - match: HostSNI(`*`)
    services:
    - name: redis-tcp-svc
      port: 6379
      weight: 10
      terminationDelay: 400

kubectl apply -f traefik-redis-tcp-route.yaml

[root@master01 traefik]# kubectl apply -f traefik-redis-tcp-route.yaml 
ingressroutetcp.traefik.containo.us/redis-tcp-ingress created

[root@master01 traefik]# kubectl get IngressRouteTCP -A
NAMESPACE   NAME                AGE
default     redis-tcp-ingress   42s

14.9.2 测试redis tcp服务

我们在master02上安装redis服务

yum -y epel-release
yum -y install redis

修改hosts文件,我们在redis-route文件中使用的host为*,所以我们可以随意绑定一个域名,假设访问域名为redis.cc.com,或者我们直接访问node的IP和端口。

cat >> /etc/hosts<<EOF
192.168.68.149 redis.cc.com
EOF

从master02访问我们安装的redis服务

redis-cli -h redis.cc.com -p 6379
redis.cc.com:6379> set a 1123
OK
redis.cc.com:6379> get a
"1123"
redis.cc.com:6379>info #获取redis服务端信息,此处内容较多,就不全部显示了
192.168.68.149:6379> info
# Server
redis_version:6.0.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:19d4277f1e8a2fed
redis_mode:standalone
os:Linux 3.10.0-1127.el7.x86_64 x86_64
...

14.10 监控traefik服务

以下内容在“第六课:部署集群监控系统”监控系统部署完毕后进行
启用traefik监控服务
kubectl apply -f traefik-serviceMonitor.yaml

[root@master01 traefik]# kubectl apply -f traefik-serviceMonitor.yaml 
servicemonitor.monitoring.coreos.com/traefik created

添加页面到grafana
导入模板文件 Traefik 2-1587191399741.json

安装grafana插件

prometheus-operator-6685db5c6-hszsn   1/1     Running   1          28h
[root@master01 prometheus]# kubectl exec -it -n monitoring grafana-5dc77ff8cb-9lcgc /bin/bash
bash-5.0$ grafana-cli plugins install grafana-piechart-panel
installing grafana-piechart-panel @ 1.6.0
from: https://grafana.com/api/plugins/grafana-piechart-panel/versions/1.6.0/download
into: /var/lib/grafana/plugins

✔ Installed grafana-piechart-panel successfully 

Restart grafana after installing plugins . <service grafana-server restart>

删除pod
kubectl delete pods grafana-5dc77ff8cb-9lcgc -n monitoring
k8s会自动重建一个grafana的pod并刷新dashboard加载我们刚才安装的插件。

再次登录grafana监控页面可以看到相应的监控展示

模拟访问
模拟错误页面访问可以查看监控上404访问数量

for i in `seq 1 100001`;do sleep 0.5;curl http://nginx.cc.com/213131;done

免责声明:文章转载自《第五课:部署Ingress服务》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux修改mysql配置文件多页面显示和多TAB页显示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux学习之Linux目录及文件系统

以往的 Windows 一直是以存储介质为主的,主要以盘符(C 盘,D 盘...)及分区来实现文件管理,然后之下才是目录,目录就显得不是那么重要,除系统文件之外的用户文件放在任何地方任何目录也是没有多大关系。所以通常 Windows 在使用一段时间后,磁盘上面的文件目录会显得杂乱无章(少数善于整理的用户除外吧)。然而 UNIX/Linux 恰好相反,UNI...

K8S单机版nacos

1.创建命名空间 [root@k8s-matser01 ~]# kubectl create ns nacos 2.编辑mysql的yaml文件 [root@k8s-matser01 ~]# cat mysql.yaml apiVersion: v1 kind: ReplicationController metadata: name: mysql...

eAccelerator 配置参数详解

eAccelerator配置参数如下: [eaccelerator]extension=eaccelerator.soeaccelerator.shm_size="64"eaccelerator.cache_dir="/tmp/eaccelerator"eaccelerator.enable="1"eaccelerator.optimizer="1"eacc...

目录扫描工具DirBuster

DirBuster是用来探测web服务器上的目录和隐藏文件的。因为DirBuster是采用java编写的,所以运行前要安装上java的环境。 来看一下基本的使用:  ①:TargetURL下输入要探测网站的地址,需要注意的是这个地址要加上协议,看网站是http还是https。  ②:WorkMethod是选择工作方式,一个是get请求,一个是自动选择。一般...

提取Windows下的微信提示音

安卓版的微信没有像QQ那样自带音效,而Windows版本微信有,故想从windows版微信里提取微信通知音,提高手机通知音的区分度。 方法很简单,从官网下载Windows微信安装程序后,解压得到WeChatResource.dll文件,然后继续解压该文件,在.rsrc/1033/WAVE下就可以得到微信声音资源文件。复制到其他地方增加文件名后缀.wav即可...

win10安装mysql5.7.29教程以及错误处理

重新配了一台电脑,装了win10系统,安装mysql是出现了一些问题以及解决的方法。记录于此,避免下次安装遇到重复问题。 首先下载mysql5.7.29安装包,本次使用的是zip。已保存在百度网盘 链接:https://pan.baidu.com/s/1y8aahxloQEJTGXqmd95xsg 提取码:e3c6 也可以自己去官网下载: 下载地址:  h...