kubernetesでtraefikの導入インストール

5969 ワード

参考githubプロジェクトアドレスhttps://github.com/containous/traefik
ドキュメントのアドレス:https://docs.traefik.io/
以下のプロファイルはすべてhttps://github.com/containous/traefik/tree/master/examples/k8s見つける
一配置
traefikには、deamonset形式とdeployment形式の2つの導入方法があります.2つの形式にはそれぞれ優位性がある.
deploymentを使用すると、伸縮性が向上します.
deamonset,Single-Pod-per-Nodeを使用します.ノードがクラスタに追加されると、DaemonSetは自動的に新しいノードに拡張されます.DaemonSetはNET_を使用できますBIND_SERVICE機能は、各ホスト上のポート80/443/etcにバインドできるように動作します.これにより、kube−proxyを迂回し、流量ホッピングを低減することができる.
まずrbacファイルを作成
##traefik-rbac.yaml

---
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

 
##traefik-ds.yaml

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  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
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8080
          hostPort: 8580
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
---
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

deamonset方式は、コンフィギュレーションファイルにマシンのポートを直接露出し、hostPortによって実現される.アクセス時に未使用のkube-proxy.
##traefik-deployment.yaml

---
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
        ports:
        - name: http
          containerPort: 80
        - name: admin
          containerPort: 8080
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
---
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

deploymentの形式はnodePortの形式でアクセスしたポートを露出する.
作成
#  rbac
kubectl create -f traefik-rbac.yaml

#    
kubectl create -f traefik-ds.yaml
  :
kubectl create -f traefik-deployment.yaml

二使用
サービスへのIngressの作成
example:traefik webインタフェースへのアクセス
###traefik-ingress.yaml 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  tls:
  - secretName: traefik-cert
  rules:
  - host: traefik-ui.k8s
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-ingress-service
          servicePort: 8080

注意:ここのservicePortは、8080であってもよいし、nameで表されてもよい.以下のようにする.
###traefik-ingress2.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  type: NodePort
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - name: web
    port: 80
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  rules:
  - host: traefik-ui.k8s
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-web-ui
          servicePort: web

三アクセス
Ingressのhostをローカルのhostsファイルに追加します.形式:[ノードIP host]
追加が完了すると、ブラウザからアクセスできます.
4つのドメイン名、パスの区別
example:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cheeses
  annotations:
    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

traefik.frontend.rule.type:PathPrefixStripはingressのannotationsに入れなければ有効になりません.
五アクセススケジューリング
バックグラウンドに複数のコピーがあるサービスの場合、デフォルトのスケジューリングはポーリングスケジューリングです.
サービスのannotationsでtraefikを構成できます.ingress.kubernetes.io/load-balancer-method: drr
スケジューリングアルゴリズムは動的ポーリングに変更され、スケジューリングされるサービスごとに重みが動的に調整されます.