TraefikとNgixInngress-Coontrollerの展開

18822 ワード

前言
Traefik
TraefikはGolangで開発された軽量級のHttp逆エージェントと負荷イコライザである.バックエンドノードを自動的に配置して更新することができるので、現在は圧倒的に大部分のコンテナプラットフォームにサポートされています.例えば、Kubergnetes、Swarm、Rancherなどです.trefikは、リアルタイムでKubergnetes APIと相互作用するので、Serviceのノード変化に対して、trefikの反応はより迅速になります.全体的には、trefikはKubergnetesで完璧に動作することができます.
NFgix-Inngress-Coontroller
Ngins-Inngress-Coontrollerは、ほとんどのK 8 sに接触したばかりの人にとってはよく知られています.外部に露出したserviceの7層の逆代理です.現在の最新のコードネームは0.9.0-beta.15で、現在のnginx-ingres-controlはまだbetaバージョンにあります.しかし、接触した人は、nginx-ingres-controlの強大なAnnotate配置が、serviceに豊富な個性的な配置を提供することができます.これはtrefikにとってはまだ打てない状況です.
配置
Traefik
1.RBAD権限ルールの作成
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
2.deployment配置を定義する
ここでは主に2つの展開パターンが定義されています.それぞれDaementとDeploymentの違いは主に以下の通りです.
  • は、一つのノードに対してdaemonesetのtrefikだけを配置し、deploymentを採用するとより伸縮しやすくなります.
  • Daemensetは、taintsおよびtolerationsフィールドを利用してカスタマイズされたノードにtrefikサービスを配置することができる.
  • は、任意のノードで80及び443ポートにアクセスできるDaement方式を採用していますが、deploymentを使用する者はserviceで定義されたオブジェクトに依存してアクセスしなければなりません.
  • 私たちはクベルネテツのマシン群に複数のingresサービスを展開しますので、ここではdeployment方式を統一して展開します.
    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:
          serviceAccountName: traefik-ingress-controller
          terminationGracePeriodSeconds: 60
          containers:
          - image: traefik
            name: traefik-ingress-lb
            args:
            - --web
            - --kubernetes
            - --web.metrics
            - --web.metrics.prometheus
            - --accesslog
            - --accesslog.filepath=/var/log/traefik_access.log
            - --traefiklog
            - --traefiklog.filepath=/var/log/traefik.log
            - --traefiklogsfile=traefik.log
            - --api
            - --loglevel=INFO
            - --metrics.prometheus
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: traefik-ingress-service
      namespace: kube-system
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
        - protocol: TCP
          port: 80
          name: web
        - protocol: TCP
          port: 8080
          name: admin
      type: NodePort
    
    3.Traefikを構成するUIインターフェース
    TraefikのUIはAnglarJSによって書かれた簡潔なインターフェースであり、デフォルトのポートを起動するのは8080である.
    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: traefik-ui.minikube
        http:
          paths:
          - backend:
              serviceName: traefik-web-ui
              servicePort: 80
    
    4.使用
    使用については、ingressを編集した人が使ったことがあると信じています.ここでは疲れていません.主にTraefikのKubergnetesにおけるAnnotateの構成を説明します.
    汎用プロファイル
  • Kbernetes.io/ingress.class:trefikIngress声明では、ここでingresバックエンドはtrefikで実現され、nginxのcontroller
  • ではないと宣言しています.
  • ingres.kubernetes.io/whitelist-source-range:「1.2.3.0/24,fe 80:::/16」ホワイトリストへのアクセスを設定し、ipv 4とipv 6
  • をサポートします.
  • ingress.kubernetes.io/auth-type:baichttp認証モードであり、ここではbaicモード
  • である.
  • ingress.kubernetes.io/auth-secret:mysecretbaic認証の対応するusernameとpassword、ここで対応するtrefikがあるKbernetes名前空間のsecrets
  • フロントエンドの設定
  • trefik.frontend.rule.type:PathPrefixStripは、先端に複数のパスを配置して転送する場合には、変更オプションを設定しなければならない.
  • apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: cheeses
      annotations:
        kubernetes.io/ingress.class: traefik
        traefik.frontend.rule.type: PathPrefixStrip
    spec:
      rules:
      - host: cheeses.minikube
        http:
          paths:
          - path: /stilton
            backend:
              serviceName: stilton
              servicePort: http
          - path: /cheddar
            backend:
              serviceName: cheddar
              servicePort: http
          - path: /wensleydale
            backend:
              serviceName: wensleydale
              servicePort: http
    
  • trefik.frontend.prorit:"3"は先端の重みを配置して、値が高いほど優先的に
  • にマッチングします.
  • trefik.frontend.passHostHeader:「false」クローズ着信Hearder
  • trefik.protocol=https使用httpsプロトコル
  • trefik.frontented.ntryPoints=http,httpsはhttpとhttps
  • を同時にサポートします.
    バックエンドの設定
  • trefik.backend.loadbalancer.method=drrバックエンドServiceの負荷均衡戦略は、現在trefikでサポートされている戦略は、wrr(加重輪訓スケジュールアルゴリズム)とdrr(動的重み付け循環スケジュールアルゴリズム)
  • を含む.
  • trefik.backend.loadbalancer.stickiss=trueが負荷イコライザのsession親和性を開いているかどうか
  • trefik.backend.loadbalancer.stickiss.co okie Name=NAME手動配置バックエンドsession親和性のcookie名称
  • trefik.backend.loadbalancer.sticky=true廃棄
  • 健康診断
  • trefik.backend.healthcheck.path=/healthtrate fikの監視検査パス
  • trefik.backend.healthcheck.interval=5 s健康診断の時間間隔
  • trefik.backend.circuitbreker:「Network ErrrorRatio()」0.5は、あるノードのサービスエラー率が50%に達すると自動的にノードをオフします.
  • trefik.backend.circuitbreker:「LatencyAtQuation ileMS(50.0)」は、あるノードでサービスの遅延が50 ms以上であることを監視し、自動的にノードを下にする.
  • trefik.backend.circuitbreker:「ResponseCodeRatio(500,600,0,600)」0.5は、あるノードのサービスの戻り状態コードが「500-600」であることを監視します.
  • NFgix-Inngress-Coontroller
    1.RBAC権限ルールとServiceAcceountアカウントを作成する
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nginx-ingress-serviceaccount
      namespace: kube-system
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: nginx-ingress-clusterrole
    rules:
      - apiGroups:
          - ""
        resources:
          - configmaps
          - endpoints
          - nodes
          - pods
          - secrets
        verbs:
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - nodes
        verbs:
          - get
      - apiGroups:
          - ""
        resources:
          - services
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - "extensions"
        resources:
          - ingresses
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - ""
        resources:
            - events
        verbs:
            - create
            - patch
      - apiGroups:
          - "extensions"
        resources:
          - ingresses/status
        verbs:
          - update
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: Role
    metadata:
      name: nginx-ingress-role
      namespace: kube-system
    rules:
      - apiGroups:
          - ""
        resources:
          - configmaps
          - pods
          - secrets
          - namespaces
        verbs:
          - get
      - apiGroups:
          - ""
        resources:
          - configmaps
        resourceNames:
          # Defaults to "-"
          # Here: "-"
          # This has to be adapted if you change either parameter
          # when launching the nginx-ingress-controller.
          - "ingress-controller-leader-nginx"
        verbs:
          - get
          - update
      - apiGroups:
          - ""
        resources:
          - configmaps
        verbs:
          - create
      - apiGroups:
          - ""
        resources:
          - endpoints
        verbs:
          - get
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: RoleBinding
    metadata:
      name: nginx-ingress-role-nisa-binding
      namespace: kube-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: nginx-ingress-role
    subjects:
      - kind: ServiceAccount
        name: nginx-ingress-serviceaccount
        namespace: kube-system
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: nginx-ingress-clusterrole-nisa-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: nginx-ingress-clusterrole
    subjects:
      - kind: ServiceAccount
        name: nginx-ingress-serviceaccount
        namespace: kube-system
    
    2.nginx-ingress-controllerのconfigmapファイルを作成する
    私はここでtcp-configmapを追加して、tcpポートの代理をします.
    apiVersion: v1
    data:
      enable-vts-status: "true"
    kind: ConfigMap
    metadata:
      name: ingress-configmap
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ingress-controller-leader-nginx
      namespace: kube-system
    ---
    apiVersion: v1
    data:
    kind: ConfigMap
    metadata:
      name: tcp-configmap
      namespace: kube-system
    
    3.nginx-ingres-controllerを作成するdefault-http-backend
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        k8s-app: default-http-backend
      name: default-http-backend
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s-app: default-http-backend
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          labels:
            k8s-app: default-http-backend
        spec:
          containers:
          - image: index.tenxcloud.com/google_containers/defaultbackend:1.1
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 30
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 5
            name: default-http-backend
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              limits:
                cpu: 10m
                memory: 20Mi
              requests:
                cpu: 10m
                memory: 20Mi
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 60
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: default-http-backend
      namespace: kube-system
      labels:
        k8s-app: default-http-backend
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        k8s-app: default-http-backend
    
    4.nginx-ingres-controllerを作成する
    ここでは、定義されたtcp-configmapファイルに対して4層の負荷等化を行うnginx-iness-controllerの起動パラメータ--tcp-services-configmapに注目することができる.注目すべきは、tcp-configmapで定義されているポートは重複しないことです.
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      annotations:
      labels:
        k8s-app: nginx-ingress-controller
      name: nginx-ingress-controller
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s-app: nginx-ingress-controller
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          labels:
            k8s-app: nginx-ingress-controller
        spec:
          containers:
          - args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --configmap=kube-system/ingress-configmap
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-configmap
            env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            image: index.int.jumei.com/gcr.io/google-containers/nginx-ingress-controller-amd64:0.9.0-beta.15
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /healthz
                port: 10254
                scheme: HTTP
              initialDelaySeconds: 10
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            name: nginx-ingress-controller
            ports:
            - containerPort: 80
              hostPort: 80
              protocol: TCP
            - containerPort: 443
              hostPort: 443
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /healthz
                port: 10254
                scheme: HTTP
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            securityContext:
              privileged: true
          dnsPolicy: ClusterFirst
          serviceAccount: nginx-ingress-serviceaccount
          serviceAccountName: nginx-ingress-serviceaccount
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-controller
      namespace: kube-system
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
        name: http
      - port: 443
        protocol: TCP
        targetPort: 443
        name: https
      selector:
        k8s-app: nginx-ingress-controller
      sessionAffinity: None
      type: ClusterIP
    
    5.使用
    イングレスの使用については、私はここで次の文をまとめます.
    締め括りをつける
    この二日間でTraefikとNginnx-ingres-controllerの使用を通じて、ほとんどのシーンはTraefikが私の需要を満たすことができます.いや、この後のショーは先輩たちをビーチに撮影するリズムです.TraefikはKuberge友好と素早いサポートについて、皆さんが体験する価値があります.TraefikのGithub上のstarはすでに1.2 Wを超えています.200以上のreleassを発表しました.熱が低くないことが分かります.また、Traefikは、毎日何度も追加、削除、キラード、アップグレード、ダウングレードに苦しめられているマイクロサービスに対して、ほとんど神器です.trefikの後端を配置することには全く関心がありません.自動的にserviceの変化を監督してくれましたので、簡単に配置と熱を再ロードします.これもウェブサイトからhttpエージェント図を表示します.
    Install with RBAC roles
    Please check the RBAC document.
    curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml \
        | kubectl apply -f -
    
    curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml \
        | kubectl apply -f -
    https://github.com/kubernetes/ingress-nginx/blob/master/deploy/README.md#install-with-rbac-roles
    Using Helm
    NGINX Ingress controller can be installed via Helm using the chart stable/inx from the offical charts repository.To install the chart with the release name  my-nginx:
    helm install stable/nginx-ingress --name my-nginx
    If the kubernetes cluster has RBAC enabled、then run:
    helm install stable/nginx-ingress --name my-nginx --set rbac.create=true