JavaScriptを有効にしてください

GKEでManagedCertificateのdomainsに追加して作成しようとするとresourceInUseByAnotherResourceエラーとなる

 · 

GKEでManagedCertificateのdomainsに追加して作成しようとするとresourceInUseByAnotherResourceエラーとなる

本記事はresourceInUseByAnotherResourceFailedNotVisibleのエラーを解決した時の備忘録です。

ManagedCertificateにドメインを追加

現在運用中のサイトをa.example.comとし、
追加したいドメインをb.example.comとして話を進めていきます。

a.example.comのLBを使いまわすため、ManagedCertificateにb.example.comを追加しました。

1
2
3
4
5
6
7
8
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: certificate-1
spec:
  domains:
    - a.example.com
    - b.example.com

describeで確認してみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
~/$ kubectl describe ManagedCertificate
Name:         certificate-1
Namespace:    hogehoge

--- 省略 ---

Spec:
  Domains:
    a.example.com
    b.example.com
Status:
  Certificate Name:    mcrt-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
  Certificate Status:  Active
  Domain Status:
    Domain:     a.example.com
    Status:     Active
  Expire Time:  2021-07-30T00:36:49.000-07:00
Events:
  Type     Reason        Age                 From                            Message
  ----     ------        ----                ----                            -------
  Warning  BackendError  13m (x94 over 22h)  managed-certificate-controller  googleapi: Error 400: The ssl_certificate resource 'projects/<project name>/global/sslCertificates/mcrt-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' is already being used by 'projects/<project name>/global/targetHttpsProxies/<ingress object>', resourceInUseByAnotherResource

すると、resourceInUseByAnotherResourceエラーが出ました。

googleapi: Error 400: The ssl_certificate resource ‘projects//global/sslCertificates/mcrt-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX’ is already being used by ‘projects//global/targetHttpsProxies/’, resourceInUseByAnotherResource

既存の証明書はa.example.com用に作られたものなので、それに追加できる仕様じゃないみたいです。(常識かもしれない…)
新しく作り直すのが正解です。

というわけで、certificate-2を新しく作成しました。

1
2
3
4
5
6
7
8
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: certificate-2
spec:
  domains:
    - a.example.com
    - b.example.com

certificate-2を追加して、describeで確認するとStatusProvisioningに変わりました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
~/$ kubectl describe ManagedCertificate
Name:         certificate-2
Namespace:    hogehoge

--- 省略 ---

Spec:
  Domains:
    a.example.com
    b.example.com
Status:
  Certificate Name:    mcrt-YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  a.example.com
    Status:  Provisioning
    Domain:  b.example.com
    Status:  Provisioning
Events:
  Type    Reason  Age   From                            Message
  ----    ------  ----  ----                            -------
  Normal  Create  36s   managed-certificate-controller  Create SslCertificate mcrt-YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY

Domain Statusにもちゃんと二つ表示されています。

FailedNotVisibleエラー

これで解決かと思いきやStatusFailedNotVisibleになってしまいました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
~/$ kubectl describe ManagedCertificate
Name:         certificate-2
Namespace:    hogehoge

--- 省略 ---

Spec:
  Domains:
    a.example.com
    b.example.com
Status:
  Certificate Name:    mcrt-YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  a.example.com
    Status:  FailedNotVisible
    Domain:  b.example.com
    Status:  FailedNotVisible
Events:
  Type    Reason  Age   From                            Message
  ----    ------  ----  ----                            -------
  Normal  Create  30m   managed-certificate-controller  Create SslCertificate mcrt-YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY

色々調べてみますとGoogle公式のトラブルシューティングに考えられる原因について記載がありました。

  1. 証明書の期限が切れていることが考えられます。
  2. ドメインの DNS レコードが、Google Cloud ロードバランサの IP アドレスに解決されません。この問題を解決するには、DNS レコードを更新してロードバランサの IP アドレスを指定します。
  3. SSL 証明書がロードバランサのターゲット プロキシに適用されていません。この問題を解決するには、ロードバランサの構成を更新してください。
  4. グローバル転送ルール用のフロントエンド ポートに、SSL プロキシ ロードバランサ用のポート 443 が含まれていません。この問題は、ポート 443 を使用して新しい転送ルールを追加すると解決できます。

SSL 証明書のトラブルシューティング より一部抜粋

一つ一つ確認していきます。

  1. 証明書の期限が切れていることが考えられます。

作成したばかリの証明書ですので、これは違いました。

  1. ドメインの DNS レコードが、Google Cloud ロードバランサの IP アドレスに解決されません。この問題を解決するには、DNS レコードを更新してロードバランサの IP アドレスを指定します。

ドメインのIPはロードバランサに紐づけた静的IPを指定していますので、これも違います。

  1. SSL 証明書がロードバランサのターゲット プロキシに適用されていません。この問題を解決するには、ロードバランサの構成を更新してください。

ロードバランサのターゲット プロキシに適用されていない…??

Ingressの設定を確認してみますと、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
~/$ kubectl describe Ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: example-com-ip
    networking.gke.io/managed-certificates: certificate-1
    kubernetes.io/ingress.class: "gce"
spec:
  rules:
    - host: a.example.com
      http:
        paths:
        - path: /*
          backend:
            serviceName: svc-a-example
            servicePort: 80
    - host: b.example.com
      http:
        paths:
        - path: /*
          backend:
            serviceName: svc-b-example
            servicePort: 80

managed-certificatescertificate-1しか指定されていません。
これでは駄目です。certificate-2を追加しましょう。

コマンドで追加しようとしましたが、事故りそうだったのでGCPの管理画面からIngressの編集ボタンを押して直接追記しました。
GKE - ingressのmanaged-certificatesを編集

追加後に確認してみますと、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
~/$ kubectl describe Ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: example-com-ip
    networking.gke.io/managed-certificates: certificate-1,certificate-2
    kubernetes.io/ingress.class: "gce"
spec:
--- 省略 ---

ちゃんと追加されていますね。

ここで念のため、一旦certificate-2を削除して、再作成して確認しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
~/$ kubectl delete ManagedCertificate certificate-2
~/$ kubectl apply -f certificate-2.yaml
~/$ kubectl describe ManagedCertificate
Name:         certificate-2
Namespace:    hogehoge

--- 省略 ---

Spec:
  Domains:
    a.example.com
    b.example.com
Status:
  Certificate Name:    mcrt-ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  a.example.com
    Status:  FailedNotVisible
    Domain:  b.example.com
    Status:  FailedNotVisible
Events:
  Type    Reason  Age   From                            Message
  ----    ------  ----  ----                            -------
  Normal  Create  29m   managed-certificate-controller  Create SslCertificate mcrt-ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ

うーん、また失敗してますね…。

再度Ingressの詳細を確認してみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
~/$ kubectl describe Ingress
Name:             example-ingress
Namespace:        hogehoge
Address:          XXX.XXX.XXX.XXX
Rules:
  Host                Path  Backends
  ----                ----  --------
  a.example.com
                      /*   svc-a-example:80 (XXX.XXX.XXX.XXX:80)
Annotations:          ingress.gcp.kubernetes.io/pre-shared-cert: mcrt-AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA,mcrt-BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB
--- 省略 ---
Events:
  Type    Reason  Age                     From                     Message
  ----    ------  ----                    ----                     -------```
Normal  SslCertificateMissing  53m (x142 over 32h)      loadbalancer-controller  googleapi: Error 404: The resource 'projects/example/global/sslCertificates/mcrt-AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA' was not found, notFound
Normal  SslCertificateMissing  43m (x142 over 32h)      loadbalancer-controller  googleapi: Error 404: The resource 'projects/example/global/sslCertificates/mcrt-BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB' was not found, notFound

googleapi: Error 404: The resource ‘projects/example/global/sslCertificates/mcrt-AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA’ was not found, notFound
要約:証明書がありません。

pre-shared-certに設定されている証明書がないと怒っていますね。
これまでの過程で失敗した証明書を削除したことが原因だと思われます。

pre-shared-certは証明書をスムーズに切り替えるために、証明書を事前共有しておく仕組みのようです。

証明書を削除した際にpre-shared-certの方は削除してくれないようです。
ですのでこちらもcloudのyaml編集で直接pre-shared-certアノテーションを編集して無効な証明書を削除しました。
GKE - ingressのpre-shared-certを編集

再度確認してみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
~/$ kubectl describe Ingress
Name:             example-ingress
Namespace:        hogehoge
Address:          XXX.XXX.XXX.XXX
Rules:
  Host                Path  Backends
  ----                ----  --------
  a.example.com
                      /*   svc-a-example:80 (XXX.XXX.XXX.XXX:80)
Annotations:          ingress.gcp.kubernetes.io/pre-shared-cert: mcrt-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
--- 省略 ---
Events:
  Type    Reason  Age                     From                     Message
  ----    ------  ----                    ----                     -------```
Normal  SslCertificateMissing  53m (x142 over 32h)      loadbalancer-controller  googleapi: Error 404: The resource 'projects/example/global/sslCertificates/mcrt-AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA' was not found, notFound
Normal  SslCertificateMissing  43m (x142 over 32h)      loadbalancer-controller  googleapi: Error 404: The resource 'projects/example/global/sslCertificates/mcrt-BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB' was not found, notFound

pre-shared-certが現在アクティブになっている証明書のみになってますね。
エラー表示はそのままですがそのうち消えるはずです。(翌日確認したら消えていました)

ManagedCertificateはまだFailedNotVisibleのままですので、
もう一度certificate-2を削除して再作成しようとしましたが、Googleのトラブルシューティングの所に気になる記載がありました。

マネージド ステータスが PROVISIONING の場合、ドメイン ステータスが FAILED_NOT_VISIBLE であっても、Google Cloud はプロビジョニングを再試行します。
SSL 証明書のトラブルシューティング より一部抜粋

FailedNotVisibleでも再試行するみたいです。

30分後、確認すると無事Activeになりました!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
~/$ kubectl describe ManagedCertificate
Name:         certificate-2
Namespace:    hogehoge

--- 省略 ---

Spec:
  Domains:
    a.example.com
    b.example.com
Status:
  Certificate Name:    mcrt-ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ
  Certificate Status:  Active
  Domain Status:
    Domain:  a.example.com
    Status:  Active
    Domain:  b.example.com
    Status:  Active
Events:
  Type    Reason  Age   From                            Message
  ----    ------  ----  ----                            -------
  Normal  Create  43m   managed-certificate-controller  Create SslCertificate mcrt-ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ

最後に

FailedNotVisibleのエラーは結果的にpre-shared-certを削除したら解消されましたが、これが原因かどうかは不明です。
もしかしたら時間経過で自然とActiveになっていたかも知れないです。

以上となります。
同じことでつまずいている方の解決の糸口になれば幸いです。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア