build 7bbbddf7 | content blog-content@c8490fa · 338 posts | profiles 20 · corpus 267 | 0 skipped | | format
apiVersion: soultec.ch/v1kind: Postmetadata: name: iaas-control-plane-api-inaccessible locale: en labels: author: matthias-grasmueck series: lessons-learned capability/containers: 2.39 capability/cloud: 1.94 vendor/vmware: 0.88 annotations: source: blog-content/posts/en/iaas-control-plane-api-inaccessible.md route: /en/insights/iaas-control-plane-api-inaccessible/ schema: /nerd/schema/posts.json markdown: /en/insights/iaas-control-plane-api-inaccessible.mdspec: title: IaaS Control Plane – API inaccessible date: 2024-11-12 author: matthias-grasmueck locale: en summary: >- After upgrading the Supervisor cluster of our IaaS Control Plane platform to vSphere 8.0 Update 3, kubectl access to the Kubernetes clusters stopped working. capabilities: [containers, cloud] vendors: [vmware] series: lessons-learned hero: /blog-assets/iaas-control-plane-api-inaccessible/hero.webp migrated: 2026-08-24 translationReviewed: false draft: false sections: - body: | We recently upgraded the [Supervisor cluster](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-3E4E6039-BD24-4C40-8575-5AA0EECBBBEC.html) of our [VMware IaaS Control Plane](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0.html#GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0) platform, formerly vSphere with Tanzu, to [vSphere 8.0 Update 3](https://docs.vmware.com/en/VMware-vSphere/8.0/rn/vmware-vsphere-with-tanzu-80-release-notes/index.html#What's%20New-What's%20New%20June%2025,%202024) in our lab. The upgrade itself worked as expected, and both the Supervisor cluster and the Kubernetes guest clusters were working afterwards. - heading:

The problem

body: | After a while, kubectl access to our Kubernetes clusters stopped working. The config status of the Supervisor cluster reported this: ``` Initialized vSphere resources Deployed Control Plane VMs Configured Control Plane VMs Configured Load Balancer fronting the kubernetes API Server Configured Core Supervisor Services Service: velero.vsphere.vmware.com. Status: Configuring Service: tkg.vsphere.vmware.com. Reason: Reconciling. Message: Reconciling. ``` Every service running on the Kubernetes guest clusters was still reachable, and the kube-api VIPs of the Kubernetes clusters still answered. Looking closer, I found that authentication against our Supervisor cluster had stopped working. So I wanted to check with kubectl on the Supervisor control plane VMs (cpVMs) whether all the services were still active. I could not log in through the Supervisor VIP, so I connected over SSH to the management IP address of one of the three cpVMs directly. To my surprise, neither the **kube-api** nor the **etcd** service was running: ```bash crictl ps | grep -iE 'etcd|kube-api' ``` Because kube-api only runs when etcd is running, I checked the etcd logs: ```bash cat /var/log/pods/kube-system_etcd-4233ab1d5ddccf36bc5bba316d1972b0_654c066164da8fbdd6d33ad93af301dc/etcd/10364.log stderr F {"level":"warn","ts":"2024-10-08T18:22:39.077642Z","caller":"wal/repair.go:81","msg":"failed to copy","from":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken","to":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal","error":"write /var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken: no space left on device"} ``` The error ***\[…\]no space left on device\[…\]*** is the decisive one. So I checked whether there was enough space on the cpVM's vDisk: ```bash df -h | grep /dev/root /dev/root 32G 32G 0 100% / ``` Which made it reasonable to assume the services were not starting because there was no disk space left. I checked all three cpVMs, and every one of them was at 100% or 99%. - heading:

The solution

body: | To get the services running again I had to reclaim space. A quick search for the ten largest files gave this: ```bash find / -path /proc -prune -o -type f -exec du -Sh {} + | sort -rh | head -n 10 1.1G /var/log/vmware/upgrade-ctl-cli.log.1 884M /var/log/vmware/svchost/stderr.log 730M /var/log/vmware/upgrade-ctl-cli.log 385M /var/log/vmware/audit/kube-apiserver.log 307M /var/log/vmware/fluentbit/consolidated.log 250M /storage/container-registry/docker/registry/v2/blobs/sha256/a0/a0dd531132ecd058d0b0249cf2f32cecccdfbe8d13cfb93b75101aafcd2a50a6/data 248M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3 248M /storage/container-registry/docker/registry/v2/blobs/sha256/43/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3/data 234M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e 234M /storage/container-registry/docker/registry/v2/blobs/sha256/fc/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e/data ``` Then I truncated the log files: ```bash echo > /var/log/vmware/upgrade-ctl-cli.log.1 echo > /var/log/vmware/svchost/stderr.log echo > /var/log/vmware/upgrade-ctl-cli.log echo > /var/log/vmware/audit/kube-apiserver.log echo > /var/log/vmware/fluentbit/consolidated.log ``` Deleting the log files reclaimed enough space on all three cpVMs for etcd and kube-api to start. The free space kept shrinking though, and after a while the problem was back. So I repeated the same procedure and waited for the cluster to reach a healthy state. Then I verified the etcd status and worked out which member was the leader: ```bash etcdctl member list -w table +------------------+---------+----------------------------------+----------------------------+----------------------------+------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER | +------------------+---------+----------------------------------+----------------------------+----------------------------+------------+ | 10a00138f3a1ed4f | started | 421dd5792ebae985affbca516bb385c7 | https://172.16.100.11:2380 | https://172.16.100.11:2379 | false | | 7546e437eef94d66 | started | 421d85be9b7ab8b9dad06f0c6487d976 | https://172.16.100.12:2380 | https://172.16.100.12:2379 | false | | dec23b7a3b3cc58a | started | 421d411b9b2dca2e5176b3ff2dd4b66f | https://172.16.100.13:2380 | https://172.16.100.13:2379 | false | +------------------+---------+----------------------------------+----------------------------+----------------------------+------------+ # Check the endpoint status of all members and get the leader. etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint status +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | https://172.16.100.11:2379 | 10a00138f3a1ed4f | 3.5.11 | 164 MB | false | false | 318 | 668808659 | 668808659 | | | https://172.16.100.12:2379 | 7546e437eef94d66 | 3.5.11 | 164 MB | true | false | 318 | 668808659 | 668808659 | | | https://172.16.100.13:2379 | dec23b7a3b3cc58a | 3.5.11 | 165 MB | false | false | 318 | 668808659 | 668808659 | | +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ # Check the endpoint health of all members. etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint health +----------------------------+--------+-------------+-------+ | ENDPOINT | HEALTH | TOOK | ERROR | +----------------------------+--------+-------------+-------+ | https://172.16.100.11:2379 | true | 15.673792ms | | | https://172.16.100.11:2379 | true | 17.78887ms | | | https://172.16.100.11:2379 | true | 15.571392ms | | +----------------------------+--------+-------------+-------+ ``` To solve the problem for good, I then had all the cpVMs recreated by removing the EAM agency one at a time. > Removing the EAM agency deletes the Supervisor control plane VM it refers to. In a production environment this should only be done under the direction of, and on the explicit instruction of, VMware support. First I gathered the information about the cpVMs: | VM | Role | Management IP | VIP | etcd member | | --- | --- | --- | --- | --- | | vmware-vsc-apiserver-hv4ntr | SupervisorControlPlaneVM (1) | 172.16.100.11 | | 421dd5792ebae985affbca516bb385c7 | | vmware-vsc-apiserver-dhpm69 | SupervisorControlPlaneVM (2) | 172.16.100.12 | 172.16.100.10 | 421d85be9b7ab8b9dad06f0c6487d976 (etcd leader) | | vmware-vsc-apiserver-dfll6t | SupervisorControlPlaneVM (3) | 172.16.100.13 | | 421d411b9b2dca2e5176b3ff2dd4b66f | Then I removed one cpVM after another, like this: 1. Remove the first non-leader cpVM through the vCenter UI: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-hv4ntr > Delete Agency 2. Wait until the new cpVM SupervisorControlPlaneVM (4) is provisioned and the cluster is healthy. 3. Repeat step 1 for the second non-leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dfll6t > Delete Agency 4. Wait until the new cpVM SupervisorControlPlaneVM (5) is provisioned and the cluster is healthy. 5. Repeat step 1 for the leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dhpm69 > Delete Agency 6. Wait until the new cpVM SupervisorControlPlaneVM (6) is provisioned and the cluster is healthy. Once all three cpVMs had been recreated, their disk usage normalised too, and the problem was solved.status: corpus: 267 alsoLike: - {ref: posts/how-to-authenticate-with-the-vsphere-supervisor-api, score: 0.69} - {ref: posts/vvf-9-0-supervisor-mit-foundation-load-balancer, score: 0.69} - {ref: services/virtualization-container, score: 0.59}
{ "apiVersion": "soultec.ch/v1", "kind": "Post", "metadata": { "name": "iaas-control-plane-api-inaccessible", "locale": "en", "labels": { "author": "matthias-grasmueck", "series": "lessons-learned", "capability/containers": "2.39", "capability/cloud": "1.94", "vendor/vmware": "0.88" }, "annotations": { "source": "blog-content/posts/en/iaas-control-plane-api-inaccessible.md", "route": "/en/insights/iaas-control-plane-api-inaccessible/", "schema": "/nerd/schema/posts.json", "markdown": "/en/insights/iaas-control-plane-api-inaccessible.md" } }, "spec": { "title": "IaaS Control Plane – API inaccessible", "date": "2024-11-12", "author": "matthias-grasmueck", "locale": "en", "summary": "After upgrading the Supervisor cluster of our IaaS Control Plane platform to vSphere 8.0 Update 3, kubectl access to the Kubernetes clusters stopped working.", "capabilities": [ "containers", "cloud" ], "vendors": [ "vmware" ], "series": "lessons-learned", "hero": "/blog-assets/iaas-control-plane-api-inaccessible/hero.webp", "migrated": "2026-08-24", "translationReviewed": false, "draft": false }, "sections": [ { "body": "We recently upgraded the [Supervisor cluster](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-3E4E6039-BD24-4C40-8575-5AA0EECBBBEC.html) of our [VMware IaaS Control Plane](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0.html#GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0) platform, formerly vSphere with Tanzu, to [vSphere 8.0 Update 3](https://docs.vmware.com/en/VMware-vSphere/8.0/rn/vmware-vsphere-with-tanzu-80-release-notes/index.html#What's%20New-What's%20New%20June%2025,%202024) in our lab. The upgrade itself worked as expected, and both the Supervisor cluster and the Kubernetes guest clusters were working afterwards." }, { "heading": "

The problem

",
"body": "After a while, kubectl access to our Kubernetes clusters stopped working. The config status of the Supervisor cluster reported this:\n\n```\nInitialized vSphere resources\nDeployed Control Plane VMs\nConfigured Control Plane VMs\nConfigured Load Balancer fronting the kubernetes API Server\nConfigured Core Supervisor Services\nService: velero.vsphere.vmware.com. Status: Configuring\nService: tkg.vsphere.vmware.com. Reason: Reconciling. Message: Reconciling.\n```\n\nEvery service running on the Kubernetes guest clusters was still reachable, and the kube-api VIPs of the Kubernetes clusters still answered.\n\nLooking closer, I found that authentication against our Supervisor cluster had stopped working. So I wanted to check with kubectl on the Supervisor control plane VMs (cpVMs) whether all the services were still active. I could not log in through the Supervisor VIP, so I connected over SSH to the management IP address of one of the three cpVMs directly.\n\nTo my surprise, neither the **kube-api** nor the **etcd** service was running:\n\n```bash\n \ncrictl ps | grep -iE 'etcd|kube-api'\n```\n\nBecause kube-api only runs when etcd is running, I checked the etcd logs:\n\n```bash\ncat /var/log/pods/kube-system_etcd-4233ab1d5ddccf36bc5bba316d1972b0_654c066164da8fbdd6d33ad93af301dc/etcd/10364.log\n\nstderr F {\"level\":\"warn\",\"ts\":\"2024-10-08T18:22:39.077642Z\",\"caller\":\"wal/repair.go:81\",\"msg\":\"failed to copy\",\"from\":\"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken\",\"to\":\"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal\",\"error\":\"write /var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken: no space left on device\"}\n```\n\nThe error ***\\[…\\]no space left on device\\[…\\]*** is the decisive one.\n\nSo I checked whether there was enough space on the cpVM's vDisk:\n\n```bash\n \ndf -h | grep /dev/root\n/dev/root 32G 32G 0 100% /\n```\n\nWhich made it reasonable to assume the services were not starting because there was no disk space left. I checked all three cpVMs, and every one of them was at 100% or 99%." }, { "heading": "

The solution

",
"body": "To get the services running again I had to reclaim space. A quick search for the ten largest files gave this:\n\n```bash\n \nfind / -path /proc -prune -o -type f -exec du -Sh {} + | sort -rh | head -n 10\n1.1G /var/log/vmware/upgrade-ctl-cli.log.1\n884M /var/log/vmware/svchost/stderr.log\n730M /var/log/vmware/upgrade-ctl-cli.log\n385M /var/log/vmware/audit/kube-apiserver.log\n307M /var/log/vmware/fluentbit/consolidated.log\n250M /storage/container-registry/docker/registry/v2/blobs/sha256/a0/a0dd531132ecd058d0b0249cf2f32cecccdfbe8d13cfb93b75101aafcd2a50a6/data\n248M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3\n248M /storage/container-registry/docker/registry/v2/blobs/sha256/43/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3/data\n234M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e\n234M /storage/container-registry/docker/registry/v2/blobs/sha256/fc/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e/data\n```\n\nThen I truncated the log files:\n\n```bash\n \necho > /var/log/vmware/upgrade-ctl-cli.log.1\necho > /var/log/vmware/svchost/stderr.log\necho > /var/log/vmware/upgrade-ctl-cli.log\necho > /var/log/vmware/audit/kube-apiserver.log\necho > /var/log/vmware/fluentbit/consolidated.log\n```\n\nDeleting the log files reclaimed enough space on all three cpVMs for etcd and kube-api to start. The free space kept shrinking though, and after a while the problem was back. So I repeated the same procedure and waited for the cluster to reach a healthy state.\n\nThen I verified the etcd status and worked out which member was the leader:\n\n```bash\netcdctl member list -w table\n+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+\n| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |\n+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+\n| 10a00138f3a1ed4f | started | 421dd5792ebae985affbca516bb385c7 | https://172.16.100.11:2380 | https://172.16.100.11:2379 | false |\n| 7546e437eef94d66 | started | 421d85be9b7ab8b9dad06f0c6487d976 | https://172.16.100.12:2380 | https://172.16.100.12:2379 | false |\n| dec23b7a3b3cc58a | started | 421d411b9b2dca2e5176b3ff2dd4b66f | https://172.16.100.13:2380 | https://172.16.100.13:2379 | false |\n+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+\n\n# Check the endpoint status of all members and get the leader.\netcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint status\n+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |\n+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n| https://172.16.100.11:2379 | 10a00138f3a1ed4f | 3.5.11 | 164 MB | false | false | 318 | 668808659 | 668808659 | |\n| https://172.16.100.12:2379 | 7546e437eef94d66 | 3.5.11 | 164 MB | true | false | 318 | 668808659 | 668808659 | |\n| https://172.16.100.13:2379 | dec23b7a3b3cc58a | 3.5.11 | 165 MB | false | false | 318 | 668808659 | 668808659 | |\n+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+\n\n# Check the endpoint health of all members.\netcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint health\n+----------------------------+--------+-------------+-------+\n| ENDPOINT | HEALTH | TOOK | ERROR |\n+----------------------------+--------+-------------+-------+\n| https://172.16.100.11:2379 | true | 15.673792ms | |\n| https://172.16.100.11:2379 | true | 17.78887ms | |\n| https://172.16.100.11:2379 | true | 15.571392ms | |\n+----------------------------+--------+-------------+-------+\n```\n\nTo solve the problem for good, I then had all the cpVMs recreated by removing the EAM agency one at a time.\n\n> Removing the EAM agency deletes the Supervisor control plane VM it refers to. In a production environment this should only be done under the direction of, and on the explicit instruction of, VMware support.\n\nFirst I gathered the information about the cpVMs:\n\n| VM | Role | Management IP | VIP | etcd member |\n| --- | --- | --- | --- | --- |\n| vmware-vsc-apiserver-hv4ntr | SupervisorControlPlaneVM (1) | 172.16.100.11 | | 421dd5792ebae985affbca516bb385c7 |\n| vmware-vsc-apiserver-dhpm69 | SupervisorControlPlaneVM (2) | 172.16.100.12 | 172.16.100.10 | 421d85be9b7ab8b9dad06f0c6487d976 (etcd leader) |\n| vmware-vsc-apiserver-dfll6t | SupervisorControlPlaneVM (3) | 172.16.100.13 | | 421d411b9b2dca2e5176b3ff2dd4b66f |\n\nThen I removed one cpVM after another, like this:\n\n1. Remove the first non-leader cpVM through the vCenter UI: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-hv4ntr > Delete Agency\n2. Wait until the new cpVM SupervisorControlPlaneVM (4) is provisioned and the cluster is healthy.\n3. Repeat step 1 for the second non-leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dfll6t > Delete Agency\n4. Wait until the new cpVM SupervisorControlPlaneVM (5) is provisioned and the cluster is healthy.\n5. Repeat step 1 for the leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dhpm69 > Delete Agency\n6. Wait until the new cpVM SupervisorControlPlaneVM (6) is provisioned and the cluster is healthy.\n\nOnce all three cpVMs had been recreated, their disk usage normalised too, and the problem was solved." } ], "status": { "corpus": 267, "alsoLike": [ { "ref": "posts/how-to-authenticate-with-the-vsphere-supervisor-api", "score": "0.69" }, { "ref": "posts/vvf-9-0-supervisor-mit-foundation-load-balancer", "score": "0.69" }, { "ref": "services/virtualization-container", "score": "0.59" } ] }}
apiVersion = "soultec.ch/v1"kind = "Post"[metadata]name = "iaas-control-plane-api-inaccessible"locale = "en"[metadata.labels]author = "matthias-grasmueck"series = "lessons-learned""capability/containers" = "2.39""capability/cloud" = "1.94""vendor/vmware" = "0.88"[metadata.annotations]source = "blog-content/posts/en/iaas-control-plane-api-inaccessible.md"route = "/en/insights/iaas-control-plane-api-inaccessible/"schema = "/nerd/schema/posts.json"markdown = "/en/insights/iaas-control-plane-api-inaccessible.md"[spec]title = "IaaS Control Plane – API inaccessible"date = 2024-11-12author = "matthias-grasmueck"locale = "en"summary = "After upgrading the Supervisor cluster of our IaaS Control Plane platform to vSphere 8.0 Update 3, kubectl access to the Kubernetes clusters stopped working."capabilities = ["containers", "cloud"]vendors = ["vmware"]series = "lessons-learned"hero = "/blog-assets/iaas-control-plane-api-inaccessible/hero.webp"migrated = 2026-08-24translationReviewed = falsedraft = false[[sections]]body = "We recently upgraded the [Supervisor cluster](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-3E4E6039-BD24-4C40-8575-5AA0EECBBBEC.html) of our [VMware IaaS Control Plane](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0.html#GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0) platform, formerly vSphere with Tanzu, to [vSphere 8.0 Update 3](https://docs.vmware.com/en/VMware-vSphere/8.0/rn/vmware-vsphere-with-tanzu-80-release-notes/index.html#What's%20New-What's%20New%20June%2025,%202024) in our lab. The upgrade itself worked as expected, and both the Supervisor cluster and the Kubernetes guest clusters were working afterwards."[[sections]]heading = "

The problem

"
body = '''After a while, kubectl access to our Kubernetes clusters stopped working. The config status of the Supervisor cluster reported this:```Initialized vSphere resourcesDeployed Control Plane VMsConfigured Control Plane VMsConfigured Load Balancer fronting the kubernetes API ServerConfigured Core Supervisor ServicesService: velero.vsphere.vmware.com. Status: ConfiguringService: tkg.vsphere.vmware.com. Reason: Reconciling. Message: Reconciling.```Every service running on the Kubernetes guest clusters was still reachable, and the kube-api VIPs of the Kubernetes clusters still answered.Looking closer, I found that authentication against our Supervisor cluster had stopped working. So I wanted to check with kubectl on the Supervisor control plane VMs (cpVMs) whether all the services were still active. I could not log in through the Supervisor VIP, so I connected over SSH to the management IP address of one of the three cpVMs directly.To my surprise, neither the **kube-api** nor the **etcd** service was running:```bash crictl ps | grep -iE 'etcd|kube-api'```Because kube-api only runs when etcd is running, I checked the etcd logs:```bashcat /var/log/pods/kube-system_etcd-4233ab1d5ddccf36bc5bba316d1972b0_654c066164da8fbdd6d33ad93af301dc/etcd/10364.logstderr F {"level":"warn","ts":"2024-10-08T18:22:39.077642Z","caller":"wal/repair.go:81","msg":"failed to copy","from":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken","to":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal","error":"write /var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken: no space left on device"}```The error ***\[…\]no space left on device\[…\]*** is the decisive one.So I checked whether there was enough space on the cpVM's vDisk:```bash df -h | grep /dev/root/dev/root 32G 32G 0 100% /```Which made it reasonable to assume the services were not starting because there was no disk space left. I checked all three cpVMs, and every one of them was at 100% or 99%.'''[[sections]]heading = "

The solution

"
body = '''To get the services running again I had to reclaim space. A quick search for the ten largest files gave this:```bash find / -path /proc -prune -o -type f -exec du -Sh {} + | sort -rh | head -n 101.1G /var/log/vmware/upgrade-ctl-cli.log.1884M /var/log/vmware/svchost/stderr.log730M /var/log/vmware/upgrade-ctl-cli.log385M /var/log/vmware/audit/kube-apiserver.log307M /var/log/vmware/fluentbit/consolidated.log250M /storage/container-registry/docker/registry/v2/blobs/sha256/a0/a0dd531132ecd058d0b0249cf2f32cecccdfbe8d13cfb93b75101aafcd2a50a6/data248M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3248M /storage/container-registry/docker/registry/v2/blobs/sha256/43/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3/data234M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e234M /storage/container-registry/docker/registry/v2/blobs/sha256/fc/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e/data```Then I truncated the log files:```bash echo > /var/log/vmware/upgrade-ctl-cli.log.1echo > /var/log/vmware/svchost/stderr.logecho > /var/log/vmware/upgrade-ctl-cli.logecho > /var/log/vmware/audit/kube-apiserver.logecho > /var/log/vmware/fluentbit/consolidated.log```Deleting the log files reclaimed enough space on all three cpVMs for etcd and kube-api to start. The free space kept shrinking though, and after a while the problem was back. So I repeated the same procedure and waited for the cluster to reach a healthy state.Then I verified the etcd status and worked out which member was the leader:```bashetcdctl member list -w table+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+| 10a00138f3a1ed4f | started | 421dd5792ebae985affbca516bb385c7 | https://172.16.100.11:2380 | https://172.16.100.11:2379 | false || 7546e437eef94d66 | started | 421d85be9b7ab8b9dad06f0c6487d976 | https://172.16.100.12:2380 | https://172.16.100.12:2379 | false || dec23b7a3b3cc58a | started | 421d411b9b2dca2e5176b3ff2dd4b66f | https://172.16.100.13:2380 | https://172.16.100.13:2379 | false |+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+# Check the endpoint status of all members and get the leader.etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint status+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| https://172.16.100.11:2379 | 10a00138f3a1ed4f | 3.5.11 | 164 MB | false | false | 318 | 668808659 | 668808659 | || https://172.16.100.12:2379 | 7546e437eef94d66 | 3.5.11 | 164 MB | true | false | 318 | 668808659 | 668808659 | || https://172.16.100.13:2379 | dec23b7a3b3cc58a | 3.5.11 | 165 MB | false | false | 318 | 668808659 | 668808659 | |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+# Check the endpoint health of all members.etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint health+----------------------------+--------+-------------+-------+| ENDPOINT | HEALTH | TOOK | ERROR |+----------------------------+--------+-------------+-------+| https://172.16.100.11:2379 | true | 15.673792ms | || https://172.16.100.11:2379 | true | 17.78887ms | || https://172.16.100.11:2379 | true | 15.571392ms | |+----------------------------+--------+-------------+-------+```To solve the problem for good, I then had all the cpVMs recreated by removing the EAM agency one at a time.> Removing the EAM agency deletes the Supervisor control plane VM it refers to. In a production environment this should only be done under the direction of, and on the explicit instruction of, VMware support.First I gathered the information about the cpVMs:| VM | Role | Management IP | VIP | etcd member || --- | --- | --- | --- | --- || vmware-vsc-apiserver-hv4ntr | SupervisorControlPlaneVM (1) | 172.16.100.11 | | 421dd5792ebae985affbca516bb385c7 || vmware-vsc-apiserver-dhpm69 | SupervisorControlPlaneVM (2) | 172.16.100.12 | 172.16.100.10 | 421d85be9b7ab8b9dad06f0c6487d976 (etcd leader) || vmware-vsc-apiserver-dfll6t | SupervisorControlPlaneVM (3) | 172.16.100.13 | | 421d411b9b2dca2e5176b3ff2dd4b66f |Then I removed one cpVM after another, like this:1. Remove the first non-leader cpVM through the vCenter UI: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-hv4ntr > Delete Agency2. Wait until the new cpVM SupervisorControlPlaneVM (4) is provisioned and the cluster is healthy.3. Repeat step 1 for the second non-leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dfll6t > Delete Agency4. Wait until the new cpVM SupervisorControlPlaneVM (5) is provisioned and the cluster is healthy.5. Repeat step 1 for the leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dhpm69 > Delete Agency6. Wait until the new cpVM SupervisorControlPlaneVM (6) is provisioned and the cluster is healthy.Once all three cpVMs had been recreated, their disk usage normalised too, and the problem was solved.'''[status]corpus = 267[[status.alsoLike]]ref = "posts/how-to-authenticate-with-the-vsphere-supervisor-api"score = "0.69"[[status.alsoLike]]ref = "posts/vvf-9-0-supervisor-mit-foundation-load-balancer"score = "0.69"[[status.alsoLike]]ref = "services/virtualization-container"score = "0.59"
<?xml version="1.0" encoding="UTF-8"?><manifest kind="Post"> <apiVersion>soultec.ch/v1</apiVersion> <metadata> <name>iaas-control-plane-api-inaccessible</name> <locale>en</locale> <labels> <author>matthias-grasmueck</author> <series>lessons-learned</series> <entry key="capability/containers">2.39</entry> <entry key="capability/cloud">1.94</entry> <entry key="vendor/vmware">0.88</entry> </labels> <annotations> <source>blog-content/posts/en/iaas-control-plane-api-inaccessible.md</source> <route>/en/insights/iaas-control-plane-api-inaccessible/</route> <schema>/nerd/schema/posts.json</schema> <markdown>/en/insights/iaas-control-plane-api-inaccessible.md</markdown> </annotations> </metadata> <spec> <title>IaaS Control Plane – API inaccessible</title> <date>2024-11-12</date> <author>matthias-grasmueck</author> <locale>en</locale> <summary>After upgrading the Supervisor cluster of our IaaS Control Plane platform to vSphere 8.0 Update 3, kubectl access to the Kubernetes clusters stopped working.</summary> <capabilities> <item>containers</item> <item>cloud</item> </capabilities> <vendors> <item>vmware</item> </vendors> <series>lessons-learned</series> <hero>/blog-assets/iaas-control-plane-api-inaccessible/hero.webp</hero> <migrated>2026-08-24</migrated> <translationReviewed>false</translationReviewed> <draft>false</draft> </spec> <sections> <section> <body>We recently upgraded the [Supervisor cluster](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-3E4E6039-BD24-4C40-8575-5AA0EECBBBEC.html) of our [VMware IaaS Control Plane](https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-with-tanzu-concepts-planning/GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0.html#GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0) platform, formerly vSphere with Tanzu, to [vSphere 8.0 Update 3](https://docs.vmware.com/en/VMware-vSphere/8.0/rn/vmware-vsphere-with-tanzu-80-release-notes/index.html#What's%20New-What's%20New%20June%2025,%202024) in our lab. The upgrade itself worked as expected, and both the Supervisor cluster and the Kubernetes guest clusters were working afterwards.</body> </section> <section> <heading>

The problem

</heading>
<body>After a while, kubectl access to our Kubernetes clusters stopped working. The config status of the Supervisor cluster reported this:```Initialized vSphere resourcesDeployed Control Plane VMsConfigured Control Plane VMsConfigured Load Balancer fronting the kubernetes API ServerConfigured Core Supervisor ServicesService: velero.vsphere.vmware.com. Status: ConfiguringService: tkg.vsphere.vmware.com. Reason: Reconciling. Message: Reconciling.```Every service running on the Kubernetes guest clusters was still reachable, and the kube-api VIPs of the Kubernetes clusters still answered.Looking closer, I found that authentication against our Supervisor cluster had stopped working. So I wanted to check with kubectl on the Supervisor control plane VMs (cpVMs) whether all the services were still active. I could not log in through the Supervisor VIP, so I connected over SSH to the management IP address of one of the three cpVMs directly.To my surprise, neither the **kube-api** nor the **etcd** service was running:```bash crictl ps | grep -iE 'etcd|kube-api'```Because kube-api only runs when etcd is running, I checked the etcd logs:```bashcat /var/log/pods/kube-system_etcd-4233ab1d5ddccf36bc5bba316d1972b0_654c066164da8fbdd6d33ad93af301dc/etcd/10364.logstderr F {"level":"warn","ts":"2024-10-08T18:22:39.077642Z","caller":"wal/repair.go:81","msg":"failed to copy","from":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken","to":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal","error":"write /var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken: no space left on device"}```The error ***\[…\]no space left on device\[…\]*** is the decisive one.So I checked whether there was enough space on the cpVM's vDisk:```bash df -h | grep /dev/root/dev/root 32G 32G 0 100% /```Which made it reasonable to assume the services were not starting because there was no disk space left. I checked all three cpVMs, and every one of them was at 100% or 99%. </body> </section> <section> <heading>

The solution

</heading>
<body>To get the services running again I had to reclaim space. A quick search for the ten largest files gave this:```bash find / -path /proc -prune -o -type f -exec du -Sh {} + | sort -rh | head -n 101.1G /var/log/vmware/upgrade-ctl-cli.log.1884M /var/log/vmware/svchost/stderr.log730M /var/log/vmware/upgrade-ctl-cli.log385M /var/log/vmware/audit/kube-apiserver.log307M /var/log/vmware/fluentbit/consolidated.log250M /storage/container-registry/docker/registry/v2/blobs/sha256/a0/a0dd531132ecd058d0b0249cf2f32cecccdfbe8d13cfb93b75101aafcd2a50a6/data248M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3248M /storage/container-registry/docker/registry/v2/blobs/sha256/43/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3/data234M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e234M /storage/container-registry/docker/registry/v2/blobs/sha256/fc/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e/data```Then I truncated the log files:```bash echo &gt; /var/log/vmware/upgrade-ctl-cli.log.1echo &gt; /var/log/vmware/svchost/stderr.logecho &gt; /var/log/vmware/upgrade-ctl-cli.logecho &gt; /var/log/vmware/audit/kube-apiserver.logecho &gt; /var/log/vmware/fluentbit/consolidated.log```Deleting the log files reclaimed enough space on all three cpVMs for etcd and kube-api to start. The free space kept shrinking though, and after a while the problem was back. So I repeated the same procedure and waited for the cluster to reach a healthy state.Then I verified the etcd status and worked out which member was the leader:```bashetcdctl member list -w table+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+| 10a00138f3a1ed4f | started | 421dd5792ebae985affbca516bb385c7 | https://172.16.100.11:2380 | https://172.16.100.11:2379 | false || 7546e437eef94d66 | started | 421d85be9b7ab8b9dad06f0c6487d976 | https://172.16.100.12:2380 | https://172.16.100.12:2379 | false || dec23b7a3b3cc58a | started | 421d411b9b2dca2e5176b3ff2dd4b66f | https://172.16.100.13:2380 | https://172.16.100.13:2379 | false |+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+# Check the endpoint status of all members and get the leader.etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint status+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| https://172.16.100.11:2379 | 10a00138f3a1ed4f | 3.5.11 | 164 MB | false | false | 318 | 668808659 | 668808659 | || https://172.16.100.12:2379 | 7546e437eef94d66 | 3.5.11 | 164 MB | true | false | 318 | 668808659 | 668808659 | || https://172.16.100.13:2379 | dec23b7a3b3cc58a | 3.5.11 | 165 MB | false | false | 318 | 668808659 | 668808659 | |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+# Check the endpoint health of all members.etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint health+----------------------------+--------+-------------+-------+| ENDPOINT | HEALTH | TOOK | ERROR |+----------------------------+--------+-------------+-------+| https://172.16.100.11:2379 | true | 15.673792ms | || https://172.16.100.11:2379 | true | 17.78887ms | || https://172.16.100.11:2379 | true | 15.571392ms | |+----------------------------+--------+-------------+-------+```To solve the problem for good, I then had all the cpVMs recreated by removing the EAM agency one at a time.&gt; Removing the EAM agency deletes the Supervisor control plane VM it refers to. In a production environment this should only be done under the direction of, and on the explicit instruction of, VMware support.First I gathered the information about the cpVMs:| VM | Role | Management IP | VIP | etcd member || --- | --- | --- | --- | --- || vmware-vsc-apiserver-hv4ntr | SupervisorControlPlaneVM (1) | 172.16.100.11 | | 421dd5792ebae985affbca516bb385c7 || vmware-vsc-apiserver-dhpm69 | SupervisorControlPlaneVM (2) | 172.16.100.12 | 172.16.100.10 | 421d85be9b7ab8b9dad06f0c6487d976 (etcd leader) || vmware-vsc-apiserver-dfll6t | SupervisorControlPlaneVM (3) | 172.16.100.13 | | 421d411b9b2dca2e5176b3ff2dd4b66f |Then I removed one cpVM after another, like this:1. Remove the first non-leader cpVM through the vCenter UI: Administration &gt; vCenter Server Extensions &gt; vSphere ESX Agent Manager &gt; Configure &gt; vmware-vcs-apiserver-hv4ntr &gt; Delete Agency2. Wait until the new cpVM SupervisorControlPlaneVM (4) is provisioned and the cluster is healthy.3. Repeat step 1 for the second non-leader cpVM: Administration &gt; vCenter Server Extensions &gt; vSphere ESX Agent Manager &gt; Configure &gt; vmware-vcs-apiserver-dfll6t &gt; Delete Agency4. Wait until the new cpVM SupervisorControlPlaneVM (5) is provisioned and the cluster is healthy.5. Repeat step 1 for the leader cpVM: Administration &gt; vCenter Server Extensions &gt; vSphere ESX Agent Manager &gt; Configure &gt; vmware-vcs-apiserver-dhpm69 &gt; Delete Agency6. Wait until the new cpVM SupervisorControlPlaneVM (6) is provisioned and the cluster is healthy.Once all three cpVMs had been recreated, their disk usage normalised too, and the problem was solved. </body> </section> </sections> <status> <corpus>267</corpus> <alsoLike> <item> <ref>posts/how-to-authenticate-with-the-vsphere-supervisor-api</ref> <score>0.69</score> </item> <item> <ref>posts/vvf-9-0-supervisor-mit-foundation-load-balancer</ref> <score>0.69</score> </item> <item> <ref>services/virtualization-container</ref> <score>0.59</score> </item> </alsoLike> </status></manifest>
Lessons learned · 2024-11-12

IaaS Control Plane – API inaccessible

After upgrading the Supervisor cluster of our IaaS Control Plane platform to vSphere 8.0 Update 3, kubectl access to the Kubernetes clusters stopped working.

2024-11-12Date
Matthias GrasmückAuthor
5Min read
Topics Containers 2.39 Cloud 1.94
Vendors VMware 0.88

We recently upgraded the Supervisor cluster of our VMware IaaS Control Plane platform, formerly vSphere with Tanzu, to vSphere 8.0 Update 3 in our lab. The upgrade itself worked as expected, and both the Supervisor cluster and the Kubernetes guest clusters were working afterwards.

The problem

After a while, kubectl access to our Kubernetes clusters stopped working. The config status of the Supervisor cluster reported this:

Initialized vSphere resources
Deployed Control Plane VMs
Configured Control Plane VMs
Configured Load Balancer fronting the kubernetes API Server
Configured Core Supervisor Services
Service: velero.vsphere.vmware.com. Status: Configuring
Service: tkg.vsphere.vmware.com. Reason: Reconciling. Message: Reconciling.

Every service running on the Kubernetes guest clusters was still reachable, and the kube-api VIPs of the Kubernetes clusters still answered.

Looking closer, I found that authentication against our Supervisor cluster had stopped working. So I wanted to check with kubectl on the Supervisor control plane VMs (cpVMs) whether all the services were still active. I could not log in through the Supervisor VIP, so I connected over SSH to the management IP address of one of the three cpVMs directly.

To my surprise, neither the kube-api nor the etcd service was running:

 
crictl ps | grep -iE 'etcd|kube-api'

Because kube-api only runs when etcd is running, I checked the etcd logs:

cat /var/log/pods/kube-system_etcd-4233ab1d5ddccf36bc5bba316d1972b0_654c066164da8fbdd6d33ad93af301dc/etcd/10364.log

stderr F {"level":"warn","ts":"2024-10-08T18:22:39.077642Z","caller":"wal/repair.go:81","msg":"failed to copy","from":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken","to":"/var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal","error":"write /var/lib/etcd/member/wal/0000000000000181-000000001c149b6d.wal.broken: no space left on device"}

The error […]no space left on device[…] is the decisive one.

So I checked whether there was enough space on the cpVM’s vDisk:

 
df -h | grep /dev/root
/dev/root 32G 32G 0 100% /

Which made it reasonable to assume the services were not starting because there was no disk space left. I checked all three cpVMs, and every one of them was at 100% or 99%.

The solution

To get the services running again I had to reclaim space. A quick search for the ten largest files gave this:

 
find / -path /proc -prune -o -type f -exec du -Sh {} + | sort -rh | head -n 10
1.1G /var/log/vmware/upgrade-ctl-cli.log.1
884M /var/log/vmware/svchost/stderr.log
730M /var/log/vmware/upgrade-ctl-cli.log
385M /var/log/vmware/audit/kube-apiserver.log
307M /var/log/vmware/fluentbit/consolidated.log
250M /storage/container-registry/docker/registry/v2/blobs/sha256/a0/a0dd531132ecd058d0b0249cf2f32cecccdfbe8d13cfb93b75101aafcd2a50a6/data
248M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3
248M /storage/container-registry/docker/registry/v2/blobs/sha256/43/4364e490859d064c9434f9e480d74bc62402a0d812480201d644a4ea9d7ff6c3/data
234M /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e
234M /storage/container-registry/docker/registry/v2/blobs/sha256/fc/fcb275778b51abf28182241bffffc6f9a25861f29ed844d71364f59e4485fb1e/data

Then I truncated the log files:

 
echo > /var/log/vmware/upgrade-ctl-cli.log.1
echo > /var/log/vmware/svchost/stderr.log
echo > /var/log/vmware/upgrade-ctl-cli.log
echo > /var/log/vmware/audit/kube-apiserver.log
echo > /var/log/vmware/fluentbit/consolidated.log

Deleting the log files reclaimed enough space on all three cpVMs for etcd and kube-api to start. The free space kept shrinking though, and after a while the problem was back. So I repeated the same procedure and waited for the cluster to reach a healthy state.

Then I verified the etcd status and worked out which member was the leader:

etcdctl member list -w table
+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+
| 10a00138f3a1ed4f | started | 421dd5792ebae985affbca516bb385c7 | https://172.16.100.11:2380 | https://172.16.100.11:2379 | false |
| 7546e437eef94d66 | started | 421d85be9b7ab8b9dad06f0c6487d976 | https://172.16.100.12:2380 | https://172.16.100.12:2379 | false |
| dec23b7a3b3cc58a | started | 421d411b9b2dca2e5176b3ff2dd4b66f | https://172.16.100.13:2380 | https://172.16.100.13:2379 | false |
+------------------+---------+----------------------------------+----------------------------+----------------------------+------------+

# Check the endpoint status of all members and get the leader.
etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint status
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://172.16.100.11:2379 | 10a00138f3a1ed4f | 3.5.11 | 164 MB | false | false | 318 | 668808659 | 668808659 | |
| https://172.16.100.12:2379 | 7546e437eef94d66 | 3.5.11 | 164 MB | true | false | 318 | 668808659 | 668808659 | |
| https://172.16.100.13:2379 | dec23b7a3b3cc58a | 3.5.11 | 165 MB | false | false | 318 | 668808659 | 668808659 | |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

# Check the endpoint health of all members.
etcdctl --endpoints=https://172.16.100.11:2379,https://172.16.100.12:2379,https://172.16.100.13:2379 -w table endpoint health
+----------------------------+--------+-------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+----------------------------+--------+-------------+-------+
| https://172.16.100.11:2379 | true | 15.673792ms | |
| https://172.16.100.11:2379 | true | 17.78887ms | |
| https://172.16.100.11:2379 | true | 15.571392ms | |
+----------------------------+--------+-------------+-------+

To solve the problem for good, I then had all the cpVMs recreated by removing the EAM agency one at a time.

Removing the EAM agency deletes the Supervisor control plane VM it refers to. In a production environment this should only be done under the direction of, and on the explicit instruction of, VMware support.

First I gathered the information about the cpVMs:

VMRoleManagement IPVIPetcd member
vmware-vsc-apiserver-hv4ntrSupervisorControlPlaneVM (1)172.16.100.11421dd5792ebae985affbca516bb385c7
vmware-vsc-apiserver-dhpm69SupervisorControlPlaneVM (2)172.16.100.12172.16.100.10421d85be9b7ab8b9dad06f0c6487d976 (etcd leader)
vmware-vsc-apiserver-dfll6tSupervisorControlPlaneVM (3)172.16.100.13421d411b9b2dca2e5176b3ff2dd4b66f

Then I removed one cpVM after another, like this:

  1. Remove the first non-leader cpVM through the vCenter UI: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-hv4ntr > Delete Agency
  2. Wait until the new cpVM SupervisorControlPlaneVM (4) is provisioned and the cluster is healthy.
  3. Repeat step 1 for the second non-leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dfll6t > Delete Agency
  4. Wait until the new cpVM SupervisorControlPlaneVM (5) is provisioned and the cluster is healthy.
  5. Repeat step 1 for the leader cpVM: Administration > vCenter Server Extensions > vSphere ESX Agent Manager > Configure > vmware-vcs-apiserver-dhpm69 > Delete Agency
  6. Wait until the new cpVM SupervisorControlPlaneVM (6) is provisioned and the cluster is healthy.

Once all three cpVMs had been recreated, their disk usage normalised too, and the problem was solved.

You might also like