美文网首页网络与访问Kubernetes ( k8s )
Kubernetes ( k8s ) Ingress Contr

Kubernetes ( k8s ) Ingress Contr

作者: Hello泽泽 | 来源:发表于2020-04-11 15:13 被阅读0次

    0.集群环境

    Kubernetes v1.16.6
    traefik v2.0.7

    1. 创建Traefik CRD资源

    traefik v2.0 版本后,开始使用CRD(Custom Resource Definition)来完成路由配置

    文件名: traefik_crd.yaml

    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: ingressroutes.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: IngressRoute
        plural: ingressroutes
        singular: ingressroute
      scope: Namespaced
    
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: ingressroutetcps.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: IngressRouteTCP
        plural: ingressroutetcps
        singular: ingressroutetcp
      scope: Namespaced
    
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: middlewares.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: Middleware
        plural: middlewares
        singular: middleware
      scope: Namespaced
    
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: tlsoptions.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: TLSOption
        plural: tlsoptions
        singular: tlsoption
      scope: Namespaced
    
    $ kubectl apply -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
    

    2.创建 RBAC 资源授权

    文件名: traefik_rbac.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
    ---
    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
    
    $ kubectl apply -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
    

    4.节点设置Label 标签

    标签: ing: "traefik"
    当前使用DeamonSet 的方式部署traefik,先给节点设置 label,当程序部署时pod会自动调度到对应的 label 的节点。

    # 当前 lable
    $ kubectl get node --show-labels
    NAME             STATUS   ROLES    AGE   VERSION   LABELS
    linuxhub-k8s-n-51   Ready    <none>   28h   v1.16.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=linuxhub-k8s-n-51,kubernetes.io/os=linux
    linuxhub-k8s-n-52   Ready    <none>   29h   v1.16.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=linuxhub-k8s-n-52,kubernetes.io/os=linux
    linuxhub-k8s-n-53   Ready    <none>   29h   v1.16.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=linuxhub-k8s-n-53,kubernetes.io/os=linux
    

    创建 label

    # 创建 节点 label 
    $ kubectl label nodes linuxhub-k8s-n-51 ing=traefik
    node/linuxhub-k8s-n-51 labeled
    
    $ kubectl label nodes linuxhub-k8s-n-52 ing=traefik
    node/linuxhub-k8s-n-52 labeled
    
    $ kubectl label nodes linuxhub-k8s-n-53 ing=traefik
    node/linuxhub-k8s-n-53 labeled
    

    查看 label

    $ kubectl get node --show-labels
    NAME             STATUS   ROLES    AGE   VERSION   LABELS
    linuxhub-k8s-n-51   Ready    <none>   28h   v1.16.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ing=traefik,kubernetes.io/arch=amd64,kubernetes.io/hostname=linuxhub-k8s-n-51,kubernetes.io/os=linux
    linuxhub-k8s-n-52   Ready    <none>   29h   v1.16.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ing=traefik,kubernetes.io/arch=amd64,kubernetes.io/hostname=linuxhub-k8s-n-52,kubernetes.io/os=linux
    linuxhub-k8s-n-53   Ready    <none>   29h   v1.16.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ing=traefik,kubernetes.io/arch=amd64,kubernetes.io/hostname=linuxhub-k8s-n-53,kubernetes.io/os=linux
    
    $ kubectl get node -l ing=traefik
    NAME             STATUS   ROLES    AGE   VERSION
    linuxhub-k8s-n-51   Ready    <none>   28h   v1.16.6
    linuxhub-k8s-n-52   Ready    <none>   29h   v1.16.6
    linuxhub-k8s-n-53   Ready    <none>   29h   v1.16.6
    

    4.部署 traefik ingress 控制器

    使用 DaemonSet 方式部署,便于在多服务器间扩展, 并使用 hostPort的方式让其监听每个 node 的 80443 端口

    文件名: traefik_ds.yaml

    kind: DaemonSet
    apiVersion: apps/v1
    metadata:
      name: traefik
      namespace: kube-system
      labels:
        k8s-app: traefik-ingress-lb
    spec:
      selector:
        matchLabels:
          k8s-app: traefik-ingress-lb
      template:
        metadata:
          labels:
            k8s-app: traefik-ingress-lb
            name: traefik-ingress-lb
        spec:
          serviceAccountName: traefik-ingress-controller
          terminationGracePeriodSeconds: 60
          restartPolicy: Always
          tolerations:
          - operator: "Exists"
          containers:
          - image: traefik:v2.0.7
            name: traefik-ingress-lb
            resources:
              limits:
                cpu: 2000m
                memory: 1024Mi
              requests:
                cpu: 1000m
                memory: 1024Mi
            ports:
            - name: web
              containerPort: 80
              hostPort: 80
            - name: websecure
              containerPort: 443
              hostPort: 443
            - name: admin
              containerPort: 8080
            args:
            - --entrypoints.web.Address=:80
            - --entrypoints.websecure.Address=:443
            - --api.insecure=true
            - --metrics.prometheus=true
            - --api.dashboard=true
            - --providers.kubernetescrd
            - --api
            - --accesslog
          nodeSelector:
            ing: "traefik"
    ---
    
    kind: Service
    apiVersion: v1
    metadata:
      name: traefik
      namespace: kube-system
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
        - protocol: TCP
          port: 8080
          name: admin
    
    $ kubectl apply -f traefik_ds.yaml
    daemonset.apps/traefik created
    service/traefik created
    

    查看部署状态

    $ kubectl -n kube-system get all -l k8s-app=traefik-ingress-lb
    NAME                READY   STATUS    RESTARTS   AGE
    pod/traefik-3rxsp   1/1     Running   0          3m2s
    pod/traefik-p8b6c   1/1     Running   0          3m2s
    pod/traefik-sfbx9   1/1     Running   0          3m2s
    
    NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/traefik   3         3         3       3            3           ing=traefik     3m2s
    

    4.配置 Traefik 路由规则

    Traefik Dashboard 服务

    $ kubectl -n kube-system get svc
    NAME       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
    traefik    ClusterIP   10.254.115.210   <none>        8080/TCP                 34m
    

    配置通过域名对外暴露访问内部traefik服务8080端口
    域名: k8s-traefik.linuxhub.cn

    文件: traefik_ingressroute.yaml

    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: traefik-webui
      namespace: kube-system
    spec:
      entryPoints:
        - web
      routes:
      - match: Host(`k8s-traefik.linuxhub.cn`)
        kind: Rule
        services:
        - name: traefik
          port: 8080
    
    $ kubectl apply -f  traefik_ingressroute.yaml
    ingressroute.traefik.containo.us/traefik-webui created
    

    5.访问 Traefik Dashboard

    通过域名访问 http://k8s-traefik.linuxhub.cn

    image.png
    image.png

    相关文章

      网友评论

        本文标题:Kubernetes ( k8s ) Ingress Contr

        本文链接:https://www.haomeiwen.com/subject/mrbymhtx.html