Kubernetes用GitLabエージェントのトラブルシューティング

Kubernetes用のGitLabエージェントを使用していると、トラブルシューティングが必要なイシューに遭遇することがあります。

サービスログを見ることから始めましょう:

kubectl logs -f -l=app.kubernetes.io/name=gitlab-agent -n gitlab-agent

GitLab の管理者であれば、GitLab エージェントサーバーのログを見ることもできます。

トランスポートWebSocketダイヤルに失敗しました。

{
  "level": "warn",
  "time": "2020-11-04T10:14:39.368Z",
  "msg": "GetConfiguration failed",
  "error": "rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://gitlab-kas:443/-/kubernetes-agent\\\": dial tcp: lookup gitlab-kas on 10.60.0.10:53: no such host\""
}

このエラーは、kas-address エージェントポッドとの kas-address接続に問題がある場合に発生します。kas-address このイシューを解決するには、WebSocketDialが kas-address正確であることを確認してください。

{
  "level": "error",
  "time": "2021-06-25T21:15:45.335Z",
  "msg": "Reverse tunnel",
  "mod_name": "reverse_tunnel",
  "error": "Connect(): rpc error: code = Unavailable desc = connection error: desc= \"transport: Error while dialing failed to WebSocket dial: expected handshake response status code 101 but got 301\""
}

このエラーは、kas-address に末尾のスラッシュが含まれていない場合に発生します。このイシューを解決するには、wss://GitLab.host.tld:443/-/kubernetes-agent/ またはws://GitLab.host.tld:80/-/kubernetes-agent/のように、wss またはws URL の末尾にスラッシュがあることを確認してください。

バリデーションエラー(Deployment.metadata)

{
  "level": "info",
  "time": "2020-10-30T08:56:54.329Z",
  "msg": "Synced",
  "project_id": "root/kas-manifest001",
  "resource_key": "apps/Deployment/kas-test001/nginx-deployment",
  "sync_result": "error validating data: [ValidationError(Deployment.metadata): unknown field \"replicas\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"selector\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"template\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta]"
}

このエラーは、マニフェストファイルが不正な形式で、Kubernetesが指定されたオブジェクトを作成できない場合に発生します。マニフェストファイルが有効であることを確認してください。

追加のトラブルシューティングについては、マニフェストファイルを使用してKubernetesでオブジェクトを直接作成してみてください。

WebSocketダイヤルに失敗しました: ハンドシェーク要求の送信に失敗しました。

{
  "level": "warn",
  "time": "2020-10-30T09:50:51.173Z",
  "msg": "GetConfiguration failed",
  "error": "rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent\\\": net/http: HTTP/1.x transport connection broken: malformed HTTP response \\\"\\\\x00\\\\x00\\\\x06\\\\x04\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x05\\\\x00\\\\x00@\\\\x00\\\"\""
}

このエラーは、エージェント側でwsskas-address として設定したが、エージェントサーバがwss で利用できない場合に発生します。このイシューを解決するには、両側で同じスキームが設定されていることを確認します。

grpc-encoding用にDecompressorがインストールされていません。

{
  "level": "warn",
  "time": "2020-11-05T05:25:46.916Z",
  "msg": "GetConfiguration.Recv failed",
  "error": "rpc error: code = Unimplemented desc = grpc: Decompressor is not installed for grpc-encoding \"gzip\""
}

このエラーは、エージェントのバージョンがエージェントサーバ(KAS) のバージョンより新しい場合に発生します。このエラーを修正するには、agentk とエージェントサーバの両方が同じバージョンであることを確認してください。

不明な作成者によって署名された証明書

{
  "level": "error",
  "time": "2021-02-25T07:22:37.158Z",
  "msg": "Reverse tunnel",
  "mod_name": "reverse_tunnel",
  "error": "Connect(): rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent/\\\": x509: certificate signed by unknown authority\""
}

このエラーは、GitLabインスタンスがエージェントにとって未知の内部認証局によって署名された証明書を使用している場合に発生します。

このイシューを解決するには、HelmインストールをカスタマイズすることでエージェントにCA証明書ファイルを提示することができます。helm install コマンドに--set-file config.caCert=my-custom-ca.pem を追加します。ファイルは有効なPEMまたはDERエンコードされた証明書である必要があります。

config.caCert の値を設定してagentk をデプロイすると、証明書はconfigmap に追加され、証明書ファイルは/etc/ssl/certs にマウントされます。

$ kubectl get configmap -lapp=gitlab-agent -o yaml
apiVersion: v1
items:
- apiVersion: v1
  data:
    ca.crt: |-
      -----BEGIN CERTIFICATE-----
      MIIFmzCCA4OgAwIBAgIUE+FvXfDpJ869UgJitjRX7HHT84cwDQYJKoZIhvcNAQEL
      ...truncated certificate...
      GHZCTQkbQyUwBWJOUyOxW1lro4hWqtP4xLj8Dpq1jfopH72h0qTGkX0XhFGiSaM=
      -----END CERTIFICATE-----
  kind: ConfigMap
  metadata:
    annotations:
      meta.helm.sh/release-name: self-signed
      meta.helm.sh/release-namespace: gitlab-agent-self-signed
    creationTimestamp: "2023-03-07T20:12:26Z"
    labels:
      app: gitlab-agent
      app.kubernetes.io/managed-by: Helm
      app.kubernetes.io/name: gitlab-agent
      app.kubernetes.io/version: v15.9.0
      helm.sh/chart: gitlab-agent-1.11.0
    name: self-signed-gitlab-agent
    resourceVersion: "263184207"
kind: List

GitLabアプリケーションサーバーのエージェントサーバー(KAS) のログに同様のエラーが表示されるかもしれません:

{"level":"error","time":"2023-03-07T20:19:48.151Z","msg":"AgentInfo()","grpc_service":"gitlab.agent.agent_configuration.rpc.AgentConfiguration","grpc_method":"GetConfiguration","error":"Get \"https://gitlab.example.com/api/v4/internal/kubernetes/agent_info\": x509: certificate signed by unknown authority"}

これを修正するには、内部CAの公開証明書を/etc/gitlab/trusted-certs ディレクトリにインストールしてください。

あるいは、カスタムディレクトリから証明書を読み込むようにエージェントサーバ(KAS) を設定することもできます。/etc/gitlab/gitlab.rb に以下の設定を追加します:

gitlab_kas['env'] = {
   'SSL_CERT_DIR' => "/opt/gitlab/embedded/ssl/certs/"
 }

変更を適用するには

  1. GitLab を再設定します。

    sudo gitlab-ctl reconfigure
    
  2. gitlab-kas を再起動します。

    gitlab-ctl restart gitlab-kas
    

プロジェクトが見つかりません

{
  "level ":"error ",
  "time ":"2022-01-05T15:18:11.331Z",
  "msg ":"GetObjectsToSynchronize.Recv failed ",
  "mod_name ":"gitops ",
  "error ":"rpc error: code = NotFound desc = project not found ",
}

このエラーは、マニフェストを保存しているプロジェクトが公開されていない場合に発生します。修正するには、プロジェクトが公開されているか、マニフェストファイルがエージェントが設定されているリポジトリに保存されていることを確認してください。

ワークロードに対する脆弱性スキャンの実行に失敗しました: jobs.batch が既に存在します。

{
  "level": "error",
  "time": "2022-06-22T21:03:04.769Z",
  "msg": "Failed to perform vulnerability scan on workload",
  "mod_name": "starboard_vulnerability",
  "error": "running scan job: creating job: jobs.batch \"scan-vulnerabilityreport-b8d497769\" already exists"
}

GitLabエージェントは、各ワークロードをスキャンするジョブを作成することで脆弱性スキャンを実行します。スキャンが中断された場合、これらのジョブが取り残される可能性があり、さらにジョブを実行する前にクリーンアップする必要があります。ジョブをクリーンアップするには、以下のコマンドを実行します:

kubectl delete jobs -l app.kubernetes.io/managed-by=starboard -n gitlab-agent

これらのジョブのクリーンアップをより堅牢にするよう取り組んでいます。

インベントリポリシーが作動を阻止 (strategy: Apply, status: Empty, policy: MustMatch)

{
  "error":"inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch)",
  "group":"networking.k8s.io",
  "kind":"Deployment",
  "name":"resource-name",
  "namespace":"namespace",
  "status":"Skipped",
  "timestamp":"2022-10-29T15:34:21Z",
  "type":"apply"
}

このエラーは、GitLabエージェントがオブジェクトを更新しようとして、そのオブジェクトに必要なアノテーションがない場合に発生します。このエラーを修正するには、以下の方法があります:

  • 手動で必要なアノテーションを追加します。
  • オブジェクトを削除し、エージェントに再作成させます。
  • inventory_policy の設定を変更します。

インストール中の解析エラー

エージェントのインストール時に、以下のようなエラーが発生することがあります:

Error: parse error at (gitlab-agent/templates/observability-secret.yaml:1): unclosed action

このエラーは通常、Helmのバージョンに互換性がないために発生します。このイシューを解決するには、Kubernetesのバージョンと互換性のあるHelmのバージョンを使用していることを確認してください。

GitLab Agent Server: Unauthorized Kubernetes 用ダッシュボードでのエラー

Kubernetes の DashboardページでGitLab Agent Server: Unauthorized. Trace ID: <...> のようなエラーが発生するのは、以下のいずれかが原因である可能性があります:

  • エージェント設定ファイルのuser_access エントリが存在しないか、間違っています。解決するには、ユーザーにKubernetesアクセスを許可するを参照してください。
  • ブラウザに複数の_gitlab_kas Cookie があり、KASに送信されています。最も考えられる原因は、同じサイトでホストされている複数のGitLabインスタンスです。

    例えば、gitlab.comkas.gitlab.comをターゲットとした_gitlab_kas クッキーを設定しますが、そのクッキーはkas.staging.gitlab.comにも送信され、staging.gitlab.comでエラーを引き起こします。

    一時的に解決するには、ブラウザのクッキーストアからgitlab.com_gitlab_kas クッキーを削除してください。イシュー 418998はこの既知の問題の修正を提案しています。

  • GitLabとKASは異なるサイトで動作しています。例えば、GitLabはgitlab.example.com 、KASはkas.example.com 。GitLabはこのユースケースをサポートしていません。詳しくはイシュー416436をご覧ください。