OpenShiftのIngress

OpenShift で GitLab Operator を使って Ingress を提供するには、2つの方法がサポートされています:

  1. (デフォルト)NGINX Ingress Controller
  2. OpenShift ルート

NGINX イングレスコントローラー

この設定では、トラフィックは以下のように流れます:

graph TD U(End User) --> GTLB([gitlab.domain.com]) GTLB --resolves to--> SRV_N[/Service/gitlab-nginx-ingress-controller/] SRV_N --connects to--> DPL_N[Deployment/gitlab-nginx-ingress-controller] DPL_N -- looks up corresponding ingress --> ING{{Ingress/gitlab-webservice-default}} ING --proxies to--> SRV_W[/Service/gitlab-webservice-default/] SRV_W --connects to--> DPL_W[Deployment/gitlab-webservice-default]

OpenShift ルーターが NGINX Ingress Controller を上書きする場合の回避策

OpenShift 環境では、GitLab Ingress が NGINX サービスの外部 IP アドレスではなく GitLab インスタンスのホスト名を受信することがあります。これはADDRESS 列のkubectl get ingress -n <namespace> の出力で見ることができます。

OpenShift ルーターコントローラーは、Ingress クラスが異なるために、Ingress リソースを無視するのではなく、誤って更新してしまいます。以下のコマンドは、OpenShift にデプロイされた標準 Ingress 以外の Ingress を適切に無視するように OpenShift ルーターコントローラーに指示します:

  kubectl -n openshift-ingress-operator \
    patch ingresscontroller default \
    --type merge \
    -p '{"spec":{"namespaceSelector":{"matchLabels":{"openshift.io/cluster-monitoring":"true"}}}}'

Ingress が既に作成された後にこのパッチを適用する場合は、手動で Ingress を削除してください。GitLab オペレータが手動で再作成します。それらは NGINX Ingress Controller によって適切に所有され、OpenShift Router によって無視されるはずです。

note
Ingress を手動で削除するとバグが発生することがあります。回避策は、GitLab Operator コントローラーのポッドを手動で削除することです。詳細は#315を参照してください。

NGINX-Ingress コントローラの作成をブロックする SCC 関連の問題のトラブルシューティングについては、Operator Troubleshooting ドキュメントを参照してください。

設定

デフォルトでは、GitLab OperatorはNGINX Ingress ControllerチャートのGitLabフォークをデプロイします。

IngressにNGINX Ingress Controllerを使用するには、以下を完了します:

  1. インストール手順の最初のステップに従い、GitLab Operator をインストールします。
  2. Webservice 用に作成された Route に関連付けられたドメイン名を探します:

    $ kubectl get route -n openshift-console console -ojsonpath='{.status.ingress[0].host}'
       
    console-openshift-console.yourdomain.com
    

    次のステップで使用するドメインは、console-openshift-console の_後の_部分です。

  3. GitLab CRマニフェストを作成するステップで、ドメインを以下のように設定します:

    spec:
      chart:
        values:
          global:
            # Configure the domain from the previous step.
            hosts:
              domain: yourdomain.com
    
    note
    デフォルトでは、CertManagerはGitLab関連IngressのTLS証明書を作成・管理します。その他のオプションについては、TLSのドキュメントを参照してください。
  4. 残りのインストール手順に従って、GitLab CRを適用し、最終的にCRのステータスがReady
  5. NGINX Ingress Controllerのサービス(LoadBalancerタイプ)の外部IPアドレスを探します:

    $ kubectl get svc -n gitlab-system gitlab-nginx-ingress-controller -ojsonpath='{.status.loadBalancer.ingress[].ip}'
       
    11.22.33.444
    
  6. DNS プロバイダーで A レコードを作成し、ドメインと前のステップの外部 IP アドレスを接続します:

    • gitlab.yourdomain.com ->11.22.33.444
    • registry.yourdomain.com ->11.22.33.444
    • minio.yourdomain.com ->11.22.33.444

    ワイルドカードの A レコードではなく、個別の A レコードを作成することで、既存のルート (OpenShift ダッシュボード用のルートなど) が期待通りに機能し続けるようになります。

    note
    これらのレコードは、クラウドプロバイダーのネットワーク設定の公開ゾーンと非公開ゾーンの_両方に_存在する必要があります。これらのゾーン間のパリティにより、クラスター内部での適切なルーティングが保証され、CertManagerが適切に証明書を発行できるようになります。

GitLabはhttps://gitlab.yourdomain.com

OpenShift ルート

デフォルトでは、OpenShift は Ingress を管理するためにRoutesを使用します。

この設定では、トラフィックは以下のように流れます:

graph TD U(End User) --> GTLB([gitlab.domain.com]) GTLB --resolves to--> SRV_R[/Service/router-default/] SRV_R --connects to--> DPL_R[Deployment/router-default] DPL_R -- looks up corresponding Route --> RT{{Route/gitlab-webservice-default-xyz}} RT --proxies to--> SRV_W[/Service/gitlab-webservice-default/] SRV_W --connects to--> DPL_W[Deployment/gitlab-webservice-default]
note
NGINX Ingress Controllerの代わりにRoutes for Ingressを使用すると、SSH経由のGitはサポートされません。

セットアップ

OpenShift Routes for Ingress を使用するには、以下を完了します:

  1. インストール手順の最初のステップに従い、GitLab Operator をインストールします。
  2. Webservice 用に作成された Route に関連付けられたドメイン名を探します:

    $ kubectl get route -n openshift-console console -ojsonpath='{.status.ingress[0].host}'
    console-openshift-console.yourdomain.com
    

    次のステップで使用するドメインは、console-openshift-console の_後の_部分です。

  3. GitLab CRマニフェストを作成するステップでも設定します:

    spec:
      chart:
        values:
          # Disable NGINX Ingress Controller.
          nginx-ingress:
            enabled: false
          global:
            # Configure the domain from the previous step.
            hosts:
              domain: yourdomain.com
            ingress:
              # Unset `spec.ingressClassName` on the Ingress objects
              # so the OpenShift Router takes ownership.
              class: none
              annotations:
                # The OpenShift documentation says "edge" is the default, but
                # the TLS configuration is only passed to the Route if this annotation
                # is manually set.
                route.openshift.io/termination: "edge"
    
    note
    デフォルトでは、CertManagerはGitLab関連ルートのTLS証明書を作成・管理します。その他のオプションについては、TLSのドキュメントを参照してください。OpenShiftクラスターがワイルドカード証明書でセキュリティ保護されている場合、オプション2ではワイルドカード証明書でGitLab関連Routesをセキュリティ保護できます。
  4. 残りのインストール手順に従って、GitLab CRを適用し、最終的にCRのステータスがReady

GitLabはhttps://gitlab.yourdomain.com

この設定では、OpenShift Routes は GitLab Operator によって作成された Ingresses を翻訳することで作成されます。この変換の詳細については、Routeのドキュメントを参照してください。