K8SのイングレスコントローラーとしてのTraefik

K8Sに優れたコミュニティと一般的に優れたドキュメントがあることは秘密ではありません。 その中で、多くの質問に対する答えを簡単に見つけることができます。 しかし、他のドキュメントと同様に、完全にすべてを網羅することはできません。 この記事では、Ingressコントローラーとして使用するためにTraefikを展開および構成する方法に関する詳細な手順を提供しようとします。







画像







Ingressとは何ですか?



Ingressは、主にHTTP / HTTPSを介して、クラスター内のサービスへの外部アクセスを制御するAPIオブジェクトです。 Ingressリソースが機能するには、Ingressコントローラーが必要です。 GCEを使用する場合、入力コントローラーは既にウィザードに展開されています。 ただし、 kops



からAWSなどにクラスターをダウンロードした場合は、Ingressコントローラーを自分でデプロイする必要があります。 minikubeでは、これはIngressアドインを含めることで解決されます。







入力コントローラー



イングレスコントローラーの役割は、NGINXイングレスコントローラー、Kong、Octaviaイングレスコントローラーなどによって実行できます。この記事では、Traefikのようなツールを検討し、クラスター内のサービスのイングレスコントローラーとして使用する方法を確認します。







なんで?



NodePort



またはLoadBalancer



介して各サービスへのアクセスを提供できるのに、なぜIngressコントローラーを使用するのですか? つまり、これにより、1つの中央ポイントですべてのトラフィックをプロキシできます。 つまり、Ingressコントローラーを使用すると、Trafikに必要なLoadBalancerは1つだけで、それ以上は不要です。 このバンドルは、すべてのトラフィックを解決します。







Traefikコンポーネント



Traefikは、バージョン1.4でKubernetes Ingressのサポートを発表しました。 ただし、最近リリースされたTraefik 1.7にはpublishedService,



オプションpublishedService,



あり、Ingressのstatus



フィールドを更新できますがpublishedService,



これは以前のバージョンにはありませんでした。 以下は、動作に必要なコンポーネントのリストです。







作成:









名前空間







名前空間を作成します。







 kubectl create namespace traefik
      
      





TLSシークレット







(約。-以下の例では、何らかの理由で作者が同じ設定を複製しています。以下のリンクで提供されるREADMEファイルの現在の設定を参照してください)







最初に証明書を作成します。







 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
      
      





TLS証明書を作成します。







 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
      
      





シークレットを作成:







 kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt
      
      





便宜上、これらのコマンドでREADMEファイルを作成し、それをGitHubにアップロードしました。







ConfigMap







 --- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik"
      
      





デフォルトでは、EntryPointはポート80



および443



です。







EntryPoint http



listens :80



および追加のルールはありません







EntryPoint https



:443



リッスンし、TLS証明書を接続するためのルールが含まれています。







EntryPoint traefik



:8080



をリッスンし、基本認証を使用します。 ユーザー名はadmin



、パスワードはadmin



です。







Kubernetesでの対応するエンドポイントIngressの定義は、 publishService



を設定することで行われ、 publishService



namespace



値とservice



名で構成される必要があります。 この場合、 traefik / traefik



です。







ping



またはヘルスチェックはentryPoint http



を使用しhttp









api



またはdashboard / uiはentryPoint traefik



を使用します。







ポートで追加のentryPointsを定義できることに注意してください。 このポートは、動的ポートおよびNodePort



代わりに、任意のポートにトラフィックをプロキシできます。







クラスターロール







Traefikのサービスアカウントには、 Ingress status



フィールドを更新する権限が必要です。 これは重要なパラメータであり、 公式のTraefikドキュメントにはまだ記載されていません。







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





最後の6行は、正しく動作するために非常に重要です。







展開







展開は非常に簡単で簡単です。 メインブロックを簡単に見てみましょう。







 volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap
      
      





ConfigMapおよびSecretのvolumes



を定義します。これらのvolumes



、volumeMountsで使用できます。







 volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap"
      
      





ヘルスチェックは、ConfigMapで定義されているように、ポート80で実行されます。







構成ファイルで指定されているすべてのentryPointのポートを開きます。







 ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080
      
      





インターネット上のいくつかの例とドキュメントは古くなっているので、Traefikが機能するために必要なargs



セクションをお見逃しなく。







 args: - --logLevel=INFO - --configfile=/config/traefik.toml
      
      





-api、-ping、-kubernetesなどの追加のフラグと引数を渡さないでください。これにより、構成ファイルで指定された設定が上書きされます。







サービス







最初のサービスは、entryPoints http



およびhttps



ロードバランサーを定義しhttps



。 LoadBalancerのセキュリティグループ(Ingress)を見ると、ポート80と443が開いているのがわかりますK8sはLoadBalancerを作成し、Traefikが実行されているノードに接続します。 私のような内部ELBを作成する場合は、注釈を定義する必要があります。







 --- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: {} # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer
      
      





サービス(ダッシュボード用)







楽しい部分になりました! Dashboardは基本認証を使用するため、 https



必要でした。 SSLを使用するには、ダッシュボードが機能するポート:8080



トラフィックをリダイレクトする必要があります。 ご覧のとおり、非常に簡単です。 すべての魔法はイングレスで起こります。







 --- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard
      
      





イングレス(ダッシュボード用)







魔法は、Dashboardへの安全なトラフィックのプロキシがTraefik自体を介して行われることです。 Traefikは、IngressがTraefikアノテーションを使用して管理します。







 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080
      
      





たった4つのシンプルで明確な注釈が必要でした。







もちろん、完全な機能を確保するには、ELBを指すDNSレコードtraefik-ui.example.com



を作成する必要があります。







これが自動的に行われるといいでしょうか? 問題ではありませんが、次の記事でDNSレコードの自動作成について書きます。







参照資料







完成したdeployment.yamlファイルは、 Githubリポジトリからダウンロードできます 。 セットアッププロセスで問題が発生した場合は、お気軽にお問い合わせください。







翻訳者からの別れの言葉



ブログの他の記事を読む:







Kubernetesのステートフルバックアップ







多数の異種Webプロジェクトのバックアップ







Redmine用の電報ボット。 自分と人々の生活を簡素化する方法








All Articles