GKEでManagedCertificateのdomainsに追加して作成しようとするとresourceInUseByAnotherResourceエラーとなる
本記事はresourceInUseByAnotherResource
とFailedNotVisible
のエラーを解決した時の備忘録です。
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で確認するとStatus
がProvisioning
に変わりました。
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エラー
これで解決かと思いきやStatus
がFailedNotVisible
になってしまいました。
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公式のトラブルシューティングに考えられる原因について記載がありました。
- 証明書の期限が切れていることが考えられます。
- ドメインの DNS レコードが、Google Cloud ロードバランサの IP アドレスに解決されません。この問題を解決するには、DNS レコードを更新してロードバランサの IP アドレスを指定します。
- SSL 証明書がロードバランサのターゲット プロキシに適用されていません。この問題を解決するには、ロードバランサの構成を更新してください。
- グローバル転送ルール用のフロントエンド ポートに、SSL プロキシ ロードバランサ用のポート 443 が含まれていません。この問題は、ポート 443 を使用して新しい転送ルールを追加すると解決できます。
SSL 証明書のトラブルシューティング
より一部抜粋
一つ一つ確認していきます。
- 証明書の期限が切れていることが考えられます。
作成したばかリの証明書ですので、これは違いました。
- ドメインの DNS レコードが、Google Cloud ロードバランサの IP アドレスに解決されません。この問題を解決するには、DNS レコードを更新してロードバランサの IP アドレスを指定します。
ドメインのIPはロードバランサに紐づけた静的IPを指定していますので、これも違います。
- 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-certificates
にcertificate-1
しか指定されていません。
これでは駄目です。certificate-2
を追加しましょう。
コマンドで追加しようとしましたが、事故りそうだったのでGCPの管理画面からIngressの編集ボタンを押して直接追記しました。
追加後に確認してみますと、
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
アノテーションを編集して無効な証明書を削除しました。
再度確認してみます。
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
になっていたかも知れないです。
以上となります。
同じことでつまずいている方の解決の糸口になれば幸いです。