k8s v1.14 traefik部署

        traefix 前篇是可以使用,这里k8s v1.14 之前的拿来用不上,然后折腾了一下,参考官方的折腾起来了

基于角色的访问控制配置(仅限Kubernetes 1.6+)

        Kubernetes在1.6+中引入了基于角色的访问控制(RBAC),以允许对Kubernetes资源和API进行细粒度控制。群集配置了RBAC,则需要授权Traefik使用Kubernetes API。有两种方法可以设置适当的权限:通过特定于命名空间的RoleBindings或单个全局ClusterRoleBinding。

        每个命名空间的RoleBinding可以限制授予权限,只有Traefik正在监视的名称空间才能使用,从而遵循最小权限原则。如果Traefik不应该监视所有名称空间,并且名称空间集不会动态更改,那么这是首选方法。否则,必须使用单个ClusterRoleBinding。

traefik学习
traefik官方

准备工作

下载trarfix代码,然后切换到v1.7的分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# git clone https://github.com/containous/traefik.git

# git branch --all
* master
remotes/origin/HEAD -> origin/master
remotes/origin/add-plugin-support
remotes/origin/gh-pages
remotes/origin/master
remotes/origin/v1.0
remotes/origin/v1.1
remotes/origin/v1.2
remotes/origin/v1.3
remotes/origin/v1.4
remotes/origin/v1.5
remotes/origin/v1.6
remotes/origin/v1.7
remotes/origin/v2.0

# git checkout v1.7
Branch 'v1.7' set up to track remote branch 'v1.7' from 'origin'.
Switched to a new branch 'v1.7'

# /root/traefik/examples/k8s

安装部署

使用ClusterRoleBinding

1
2
3
# kubectl apply -f traefik-rbac.yaml 
clusterrole.rbac.authorization.k8s.io/traefik-ingress-controller created
clusterrolebinding.rbac.authorization.k8s.io/traefik-ingress-controller created

对于命名空间限制,每个监视命名空间需要一个RoleBinding以及Traefik kubernetes.namespaces参数的相应配置。

使用Deployments部署或部署DaemonSet

可以将Traefik与Deployment或DaemonSet对象一起使用,而这两个选项各有利弊:

  • 使用部署时,可伸缩性可以更好,因为在使用DaemonSet时您将拥有每个节点的Single-Pod模型,而在使用部署时,可能需要更少的基于环境的副本。
  • 当节点加入群集时,DaemonSet会自动扩展到新节点,而部署窗格仅在需要时在新节点上进行调度。
  • DaemonSets确保只有一个pod副本在任何单个节点上运行。如果要确保两个pod不在同一节点上,则部署需要关联设置
  • 可以使用该NET_BIND_SERVICE功能运行DaemonSet ,这将允许它绑定到每个主机上的端口80/443 / etc。这将允许绕过kube-proxy,并减少流量跳跃。请注意,这违反了Kubernetes最佳实践指南,并提出了调度/扩展问题的可能性。尽管存在潜在问题,但这仍然是大多数入口控制器的选择。

Deployments部署

  • 修改traefik-deployment.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: traefik-ingress-controller
    namespace: kube-system
    ---
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
    name: traefik-ingress-controller
    namespace: kube-system
    labels:
    k8s-app: traefik-ingress-lb
    spec:
    replicas: 1
    selector:
    matchLabels:
    k8s-app: traefik-ingress-lb
    template:
    metadata:
    labels:
    k8s-app: traefik-ingress-lb
    name: traefik-ingress-lb
    spec:
    hostNetwork: true
    serviceAccountName: traefik-ingress-controller
    terminationGracePeriodSeconds: 60
    containers:
    - image: traefik:v1.7
    name: traefik-ingress-lb
    ports:
    - name: http
    containerPort: 80
    hostPort: 80
    - name: https
    containerPort: 443
    hostPort: 443
    - name: admin
    containerPort: 8080
    securityContext:
    capabilities:
    drop:
    - ALL
    add:
    - NET_BIND_SERVICE
    args:
    - --api
    - --kubernetes
    - --logLevel=INFO
    - --web.metrics
    - --metrics.prometheus
    - --web.metrics.prometheus
    - --kubernetes
    - --traefiklog
    - --traefiklog.format=json
    - --accesslog
    - --accesslog.format=json
    - --accessLog.fields.headers.defaultMode=redact
    - --insecureskipverify=true
    - --defaultentrypoints=http,https
    - --entrypoints=Name:https Address::443 TLS
    - --entrypoints=Name:http Address::80
    ---
    kind: Service
    apiVersion: v1
    metadata:
    name: traefik-ingress-service
    namespace: kube-system
    labels:
    k8s-app: traefik-ingress
    spec:
    selector:
    k8s-app: traefik-ingress-lb
    clusterIP: None
    ports:
    - protocol: TCP
    port: 80
    name: web
    - protocol: TCP
    port: 8080
    name: admin
    type: ClusterIP

参数:

  • hostNetwork: 映射到本地网络
  • name: https 增加443端口的映射
  • securityContext,args: 参考官方
  • Service: 增加labels标签,用于后期的prometheus监控
  • 部署traefik-deployment
1
2
3
4
# kubectl  apply -f  traefik-deployment.yaml
serviceaccount/traefik-ingress-controller created
deployment.extensions/traefik-ingress-controller created
service/traefik-ingress-service created

DaemonSets 部署(可选)

1
# kubectl apply -f traefik-ds.yaml
  • Deployments和DaemonSets之间存在一些显着差异:
    • 部署具有更容易的向上和向下扩展可能性。它可以实现完整的pod生命周期,并支持Kubernetes 1.2的滚动更新。运行部署至少需要一个Pod。
    • DaemonSet会自动扩展到满足特定选择器的所有节点,并保证一次填充一个节点。Kubernetes 1.7也完全支持滚动更新,适用于DaemonSets

检查部署

  • 查看pod

    1
    2
    3
    4
    5
    6
    7
    # kubectl --namespace=kube-system get pods
    NAME READY STATUS RESTARTS AGE
    coredns-5579b8778b-xw8m9 1/1 Running 2 3d21h
    kubernetes-dashboard-65dfbf6f4f-hcgbb 1/1 Running 0 2d16h
    metrics-server-94ff5d4cc-b97l5 1/1 Running 1 3d
    tiller-deploy-5cbcf75545-rbzld 1/1 Running 0 17h
    traefik-ingress-controller-c595665d6-cm7kh 1/1 Running 0 3m20s
  • 查看services

    1
    2
    3
    4
    5
    6
    7
    # kubectl get services --namespace=kube-system
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kube-dns ClusterIP 10.254.0.2 <none> 53/UDP,53/TCP,9153/TCP 3d21h
    kubernetes-dashboard NodePort 10.254.214.153 <none> 443:32533/TCP 3d21h
    metrics-server ClusterIP 10.254.61.132 <none> 443/TCP 3d
    tiller-deploy ClusterIP 10.254.207.227 <none> 44134/TCP 17h
    traefik-ingress-service NodePort 10.254.246.158 <none> 80:32146/TCP,8080:30455/TCP 3m53s

        这里使用的是nodeport模式进行部署的,可以看到端口为32146,这里访问会返回404 page not found,那是因为我们还没有给Traefik任何配置。

  • 查看services 1
    1
    2
    3
    # kubectl get services --namespace=kube-system |grep "traefik"
    traefik-ingress-service ClusterIP None <none> 80/TCP,8080/TCP 7m55s
    traefik-web-ui ClusterIP 10.254.78.17 <none> 80/TCP 21h

        这个例子是修改过 traefik-deployment.yaml 的结果,明显没有nodeport的端口

创建一个服务和一个将公开Traefik Web UI的Ingres

1
2
3
# kubectl apply -f ui.yaml 
service/traefik-web-ui created
ingress.extensions/traefik-web-ui created

在/etc/hosts 文件设置一个路由条目traefik-ui.minikube

在浏览器进行访问可以看到Traefik Web UI

坚持原创技术分享,您的支持将鼓励我继续创作!
0%