Harbor構築後など既にcert-managerが入っている環境にTanzu Application Platform(以下TAP)をデプロイしようとすると、cert-managerがバッティングしてデプロイに失敗する。
そこでcert-managerを除外リストに追加してデプロイする訳だが、以下のようにcert-managerを除外リストに入れてデプロイしても失敗する。
excluded_packages:
- cert-manager.tanzu.vmware.com
TAPはデフォルトで、shared.ingress_issuer
にtap-ingress-selfsigned
を指定してデプロイされる。
このtap-ingress-selfsigned
はcert-managerのリソースであるkind: ClusterIssuer
で定義され、オレオレ証明書の認証局となってくれるのだが、これがexcluded_packages
でcert-managerを指定するとデフォルトで作成されなくなる。
そのため、このIssuerに証明書を発行してもらおうとするコンポーネントのデプロイが全滅する。
例えばapi-auto-registration-controllerなんかが以下のエラーで起動できなくなる(ContainerCreatingで止まる)。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m35s default-scheduler Successfully assigned api-auto-registration/api-auto-registration-controller-6bcfff7665-hntp5 to tis-sharedcluster-0919-md-1-v8hf6-7bddbfb84f-5wx4b
Warning FailedMount 2m32s kubelet Unable to attach or mount volumes: unmounted volumes=[ca-cert-info], unattached volumes=[kube-api-access-gsxs2 ca-cert-info]: timed out waiting for the condition
Warning FailedMount 25s (x10 over 4m35s) kubelet MountVolume.SetUp failed for volume "ca-cert-info" : secret "ca-extractor" not found
Warning FailedMount 18s kubelet Unable to attach or mount volumes: unmounted volumes=[ca-cert-info], unattached volumes=[ca-cert-info kube-api-access-gsxs2]: timed out waiting for the condition
Secretは以下のようになり、期待する証明書が発行されていない。
$ kubectl get secret -n api-auto-registration
NAME TYPE DATA AGE
ca-cert servicebinding.io/ca-certificates 2 6m40s
ca-extractor-jm2rk Opaque 1 6m38s
image-pull-secret kubernetes.io/dockerconfigjson 1 6m40s
そのため、cert-managerを除外する際は、予めtap-ingress-selfsigned
を自作して配布しておくとよさそう。
cat << EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: tap-ingress-selfsigned
spec:
selfSigned: {}
EOF
上記実施後、cert-managerを除外してTAPをデプロイした結果は以下。
$ kubectl get app -n tap-install tap
NAME DESCRIPTION SINCE-DEPLOY AGE
tap Reconcile succeeded 5m5s 5m6s
無事回避できた。