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,
これは以前のバージョンにはありませんでした。 以下は、動作に必要なコンポーネントのリストです。
作成:
- 名前空間
- サービスアカウント
- TLSシークレット
- クラスターの役割
- クラスタロールバインディング
- configmap
- 配備
- httpおよびhttpsのサービス
- Traefikダッシュボードのサービス
- イングレス
名前空間
名前空間を作成します。
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リポジトリからダウンロードできます 。 セットアッププロセスで問題が発生した場合は、お気軽にお問い合わせください。
翻訳者からの別れの言葉
ブログの他の記事を読む:
Redmine用の電報ボット。 自分と人々の生活を簡素化する方法