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を設定することで行われ、 publishServicenamespace値と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用の電報ボット。 自分と人々の生活を簡素化する方法



Source: https://habr.com/ru/post/J427655/


All Articles