Ceph CVEs – keyring rotation strongly advised, probably required in the future

root@pixi0:~# ps aux | grep pvestatd root 5574 0.0 0.0 6528 1952 pts/0 S+ 09:19 0:00 grep pvestatd
but thats the grep command finding its own grep process in ps output, so pvestatd is indeed not running? Could you check on all three nodes

systemctl status pvestatd --no-pager -l

And maybe some older log history as well using e.g. journalctl -u pvestatd -b -n 100 --no-pager or so?

If there are no error messages that would seem like pointing to the cause why starting fails, start the service manually (web UI or systemctl start pvestatd).
 
  • Like
Reactions: Burkhard Linke
There are some hints for that in https://pve.proxmox.com/pve-docs/chapter-pveceph.html#pveceph_cephx_how_it_works section, but we did not want to blow the docs up completely.

But roughly, active ceph sessions authenticated with the a ceph monitor and got a monitor ticket from that. This monitor ticket has a (default) TTL of 3 days (but if a monitors old key gets wiped it will expire immediately) and can be used to get ceph service ticket, which are then then used to authenticated with the OSD or MDS (which asks the monitor if its valid) for actual ceph IO. The service ticket has a (default) TTL of 1h.

Upstream ceph has a primitve form of staging a new client key, but that key will be automatically activated once its used, making the old keys obsolete - this was adapted in the Proxmox ceph packages to be more graceful (and we're in the process of upstreaming it, but need to do some upfront work at upstream to make it acceptable there). So, with an external non-Proxmox Ceph setup that has upstream behavior it's likely that once you start the process of changing the client key and moved the first service over, you also started clock for all other services, as their ticket might not get renewed after the TTLs expire.

For PVE you would switch the storage to the new client key, and then to move services over to use it. For VMs its enough to live-migrate them or alternatively restart them, CephFS needs to be remounted and containers on RBD restarted, there is no possibiliity to teach a running librbd or the like of a new client key to allow using either. But this is a code path we did not tested as extensively, or at least not I in such a way that I got all the info correctly available from top of my head, so please test this and read up yourself before doing anything.
And this is the first time the problem of the client key rotation in applications has been explained in a precise and clean manner. Two thumb up for it.
 
exactly.

But the relevant ceph packages are not yet available on the ceph enterprise repository, so how did you got those already installed?

ceph-squid no-subscription
For PVE i have the pve-enterprise subscription.
 
Last edited:
ceph-squid no-subscription
FYI: If you got a valid subscription that allows you accessing pve-enterprise, then you can also use the ceph enterprise repository without having to do anything extra, just add it for all nodes (e.g. in the UI under Node -> Repositories -> Add) and disable the squid no-subscription one.

For the time being you can either wait out until the manager packages come to pve-enterprises or - mentioning for completness sake - temporarily enable the pve-no-subscription repo too, I'd strongly recommend testing the latter in some test lab setup before doing so on in any production environment, just wanted to name all the options. Downgrading ceph would be theoretically an option, but IMO much more involved compared to the other two options.
 
  • Like
Reactions: devaux
FYI: If you got a valid subscription that allows you accessing pve-enterprise, then you can also use the ceph enterprise repository without having to do anything extra, just add it for all nodes (e.g. in the UI under Node -> Repositories -> Add) and disable the squid no-subscription one.

For the time being you can either wait out until the manager packages come to pve-enterprises or - mentioning for completness sake - temporarily enable the pve-no-subscription repo too, I'd strongly recommend testing the latter in some test lab setup before doing so on in any production environment, just wanted to name all the options. Downgrading ceph would be theoretically an option, but IMO much more involved compared to the other two options.
Oh, I didn't know that <o>
Thanks a lot for clarifying!

I also have other clusters currently running with Ceph "no-subscription" 19.2.5. What would be the recommended approach there? Should I switch the Ceph repository to "Ceph Squid Enterprise" before upgrading?

For this specific cluster where I've already updated, I think I will just wait it out until the manager packages land in pve-enterprise. Should I go ahead and switch this cluster to the "Squid Enterprise" Ceph repo right now as well?
 
Last edited:
I also have other clusters currently running with Ceph "no-subscription" 19.2.5. What would be the recommended approach there? Should I switch the Ceph repository to "Ceph Squid Enterprise" before upgrading?
Yes, then it's in sync with the PVE enterprise one, as we will coordinate the rollout of updates between our PVE and ceph enterprise repos.

Should I go ahead and switch this cluster to the "Squid Enterprise" Ceph repo right now as well?
That would be safe to do now and would make sense to ensure it's not overlooked for future updates.
 
got the same issue as UweSauter, however my pvestatsd is running.
Code:
root@proxmox01-pkl:~# /usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys   --rotate-cluster-keys
INFO: This is a dry run. No Ceph key, cipher setting, or daemon will be changed. Session observations can update the migration journal.
FAIL: Could not verify 'aes256k' support for every service daemon:
  could not verify the installed Ceph version of mon. on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mon. on node 'proxmox02-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mon. on node 'proxmox03-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mgr.proxmox01-pkl on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mgr.proxmox02-pkl on node 'proxmox02-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.0 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.1 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.2 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.3 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.4 on node 'proxmox01-pkl.<domain>''; check that 'pvestatd' runs there
  and 35 more

pvestatd:
Code:
root@proxmox01-pkl:~# ps aux | grep pvestatd
root     1219566  1.0  0.0 193616 126872 ?       Ss   08:37   0:00 pvestatd
root     1219769  0.0  0.0   6528  2488 pts/2    S+   08:38   0:00 grep pvestatd

All noted have the pvestatd running on them, no errors the last while, had a issue with PBS which filled up the logs but nothing for last few hours.

After a bit of AI'ing:
Code:
PVE 9.2.18 / pve-cluster 9.1.6
Ceph 19.2.6-pve4
PVE::Ceph::Services::get_ceph_versions() returns short keys:
  proxmox01-pkl ... proxmox05-pkl
PVE::INotify::nodename() returns proxmox01-pkl
ceph mon metadata reports:
  proxmox01-pkl.<domain>
The migration helper then reports installed Ceph versions as unknown.

This is on no-subscription. not enterprise repo.
 
Just a quick heads-up: this is my personal approach and what worked for me. Please make sure to test it on your end first.

You can mute the errors and warnings to bring ceph to HEALTH_OK again (this was on ceph tentacle):

Code:
ceph health mute AUTH_INSECURE_SERVICE_KEY_TYPE
ceph health mute AUTH_INSECURE_SERVICE_TICKETS
ceph health mute AUTH_INSECURE_CLIENT_KEY_TYPE
ceph health mute AUTH_INSECURE_KEYS_ALLOWED
ceph health mute AUTH_INSECURE_KEYS_CREATABLE
ceph health mute AUTH_INSECURE_ROTATING_SERVICE_KEY_TYPE

I did this on our external (non-pve) ceph cluster to get to HEALTH_OK. After that I startet migrating the internal keys to aes256k (bottstrap, mgr, osd).
Right now there are thre warnings left while I wait for the enterprise repository to receive the updates:

Code:
(MUTED) [WRN] AUTH_INSECURE_CLIENT_KEY_TYPE: 2 auth client entities with insecure key types
    entity client.admin using insecure key type: aes
    entity client.pveuser using insecure key type: aes
(MUTED) [WRN] AUTH_INSECURE_KEYS_ALLOWED: Monitors are configured to allow auth using insecure key types
    insecure cipher aes allowed for auth
(MUTED) [WRN] AUTH_INSECURE_KEYS_CREATABLE: Monitors are configured to allow creation of insecure key types

Since they are all mutet ceph is ok:

Code:
  cluster:
    id:     ********-****-****-****-************
    health: HEALTH_OK
            (muted: AUTH_INSECURE_CLIENT_KEY_TYPE AUTH_INSECURE_KEYS_ALLOWED AUTH_INSECURE_KEYS_CREATABLE)

I tested this several times in a virtual lab an had no problems to finish the key updates after pve-test and pve-no-subscription received the updates.
Looking forward to the updates in the enterprise repositories :)

Hope this helps.
 
not sure if this is related, but since the change of the new keys when you do a fresh ceph install (for example when adding a new ceph node), ceph pool status (via pvestatd) (server-view storage-pool) is showing a "?" which only disappears after restarting the pvestatd on that specific node although the storage-pool works without issues.

Code:
Sep 10 11:44:31 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:44:32 pve-1 pvestatd[1495]: mount error: Job failed. See "journalctl -xe" for details.
Sep 10 11:44:41 pve-1 pvestatd[1495]: mount error: Job failed. See "journalctl -xe" for details.
Sep 10 11:44:42 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:44:51 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:44:51 pve-1 pvestatd[1495]: mount error: Job failed. See "journalctl -xe" for details.
Sep 10 11:45:01 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:45:11 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:45:21 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:45:31 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:45:41 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:45:51 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:46:01 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:46:11 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:46:21 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:46:31 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:46:41 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:46:51 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:47:01 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:47:11 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:47:21 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:47:31 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:47:41 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:47:51 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:48:01 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:48:11 pve-1 pvestatd[1495]: rados_connect failed - Input/output erro

if you restart pvestatd it works.

Code:
Sep 10 11:48:51 pve-1 pvestatd[1495]: rados_connect failed - Input/output error
Sep 10 11:48:54 pve-1 systemd[1]: Reloading pvestatd.service - PVE Status Daemon...
Sep 10 11:48:54 pve-1 pvestatd[53614]: send HUP to 1495
Sep 10 11:48:54 pve-1 pvestatd[1495]: received signal HUP
Sep 10 11:48:54 pve-1 pvestatd[1495]: server shutdown (restart)
Sep 10 11:48:54 pve-1 systemd[1]: Reloaded pvestatd.service - PVE Status Daemon.
Sep 10 11:48:55 pve-1 pvestatd[1495]: restarting server
 
Last edited:
not sure if this is related, but since the change of the new keys when you do a fresh ceph install (for example when adding a new ceph node), ceph pool status (via pvestatd) (server-view storage-pool) is showing a "?" which only disappears after restarting the pvestatd on that specific node although the storage-pool works without issues.
on a hunch - are the steps here:
* install new PVE from the ISO - and run pveceph install - without upgrading to the latest packages before?

In any case thanks for the report! - we'll see if we can reproduce that in a consistent manner (and maybe add a suggestion to restart pvestatd/bake it into the migration script)
 
  • Like
Reactions: Johannes S
but thats the grep command finding its own grep process in ps output, so pvestatd is indeed not running? Could you check on all three nodes

systemctl status pvestatd --no-pager -l

And maybe some older log history as well using e.g. journalctl -u pvestatd -b -n 100 --no-pager or so?

If there are no error messages that would seem like pointing to the cause why starting fails, start the service manually (web UI or systemctl start pvestatd).
Node 1
Code:
root@pixi0:~# journalctl -u pvestatd -b --no-pager
Sep 09 11:50:29 pixi0 systemd[1]: Starting pvestatd.service - PVE Status Daemon...
Sep 09 11:50:30 pixi0 pvestatd[2970]: ipcc_send_rec[1] failed: Connection refused
Sep 09 11:50:30 pixi0 pvestatd[2970]: ipcc_send_rec[2] failed: Connection refused
Sep 09 11:50:30 pixi0 pvestatd[2970]: ipcc_send_rec[3] failed: Connection refused
Sep 09 11:50:30 pixi0 pvestatd[2970]: Unable to load access control list: Connection refused
Sep 09 11:50:30 pixi0 pvestatd[2970]: ipcc_send_rec[1] failed: Connection refused
Sep 09 11:50:30 pixi0 pvestatd[2970]: ipcc_send_rec[2] failed: Connection refused
Sep 09 11:50:30 pixi0 pvestatd[2970]: ipcc_send_rec[3] failed: Connection refused
Sep 09 11:50:30 pixi0 systemd[1]: pvestatd.service: Control process exited, code=exited, status=111/n/a
Sep 09 11:50:30 pixi0 systemd[1]: pvestatd.service: Failed with result 'exit-code'.
Sep 09 11:50:30 pixi0 systemd[1]: Failed to start pvestatd.service - PVE Status Daemon.
Sep 09 11:50:30 pixi0 systemd[1]: pvestatd.service: Consumed 561ms CPU time, 108.5M memory peak.

Node 2
Code:
root@pixi1:~# journalctl -u pvestatd -b --no-pager
Sep 09 11:57:18 pixi1 systemd[1]: Starting pvestatd.service - PVE Status Daemon...
Sep 09 11:57:18 pixi1 pvestatd[2976]: ipcc_send_rec[1] failed: Connection refused
Sep 09 11:57:18 pixi1 pvestatd[2976]: ipcc_send_rec[2] failed: Connection refused
Sep 09 11:57:18 pixi1 pvestatd[2976]: ipcc_send_rec[3] failed: Connection refused
Sep 09 11:57:18 pixi1 pvestatd[2976]: Unable to load access control list: Connection refused
Sep 09 11:57:18 pixi1 pvestatd[2976]: ipcc_send_rec[1] failed: Connection refused
Sep 09 11:57:18 pixi1 pvestatd[2976]: ipcc_send_rec[2] failed: Connection refused
Sep 09 11:57:18 pixi1 pvestatd[2976]: ipcc_send_rec[3] failed: Connection refused
Sep 09 11:57:18 pixi1 systemd[1]: pvestatd.service: Control process exited, code=exited, status=111/n/a
Sep 09 11:57:18 pixi1 systemd[1]: pvestatd.service: Failed with result 'exit-code'.
Sep 09 11:57:18 pixi1 systemd[1]: Failed to start pvestatd.service - PVE Status Daemon.
Sep 09 11:57:18 pixi1 systemd[1]: pvestatd.service: Consumed 563ms CPU time, 109.1M memory peak.

Node 3
Code:
root@pixi2:~# journalctl -u pvestatd -b --no-pager
Sep 09 11:59:59 pixi2 systemd[1]: Starting pvestatd.service - PVE Status Daemon...
Sep 09 11:59:59 pixi2 pvestatd[2956]: ipcc_send_rec[1] failed: Connection refused
Sep 09 11:59:59 pixi2 pvestatd[2956]: ipcc_send_rec[2] failed: Connection refused
Sep 09 11:59:59 pixi2 pvestatd[2956]: ipcc_send_rec[3] failed: Connection refused
Sep 09 11:59:59 pixi2 pvestatd[2956]: Unable to load access control list: Connection refused
Sep 09 11:59:59 pixi2 pvestatd[2956]: ipcc_send_rec[1] failed: Connection refused
Sep 09 11:59:59 pixi2 pvestatd[2956]: ipcc_send_rec[2] failed: Connection refused
Sep 09 11:59:59 pixi2 pvestatd[2956]: ipcc_send_rec[3] failed: Connection refused
Sep 09 11:59:59 pixi2 systemd[1]: pvestatd.service: Control process exited, code=exited, status=111/n/a
Sep 09 11:59:59 pixi2 systemd[1]: pvestatd.service: Failed with result 'exit-code'.
Sep 09 11:59:59 pixi2 systemd[1]: Failed to start pvestatd.service - PVE Status Daemon.
Sep 09 11:59:59 pixi2 systemd[1]: pvestatd.service: Consumed 557ms CPU time, 109.1M memory peak.

Manually starting the service seems to work fine on all nodes and then pve-cephx-rotate-service-keys runs as well.
 
hmm, this might be an odd race with the pve-cluster restarting at the same time (was that part of the upgrade too)? Albeit it's weird that it consistently happened on all three node...
 
hmm, this might be an odd race with the pve-cluster restarting at the same time (was that part of the upgrade too)? Albeit it's weird that it consistently happened on all three node...

I was able to fix this. Seems there was an error in /etc/hosts and the hosts weren't able to resolve their hostnames.

Thanks again!
 
  • Like
Reactions: t.lamprecht
on a hunch - are the steps here:
* install new PVE from the ISO - and run pveceph install - without upgrading to the latest packages before?

In any case thanks for the report! - we'll see if we can reproduce that in a consistent manner (and maybe add a suggestion to restart pvestatd/bake it into the migration script)

Edit: Just in case. This was a fresh 20.2.4 install, no migration-script was used.

Nope, having all nodes on the same version (pve-no-subscription) and using ceph wizard to install ceph. it also happend on a fresh 3 node install. all nodes, same updates, same ceph version. I restarted each pvestatd on the 3 node cluster. "?" was fixed.

after adding a 4th node (also latest packages before joing cluster and installing ceph) the pool also had the error on the fourth node, while still working so I restarted the pvestatd there too. Which worked.

The cant connect message also appeared when 4th node joined ceph initially after the wizard before finally loading the dashboard. The error message appeared only while loading the dashboard, after showing the dashboard the only problem left was the "?" in server-view.

The Ceph repos were not set to no-subscription before starting the ceph wizard, because the ceph wizard does that for you.
 
Last edited:
got the same issue as UweSauter, however my pvestatsd is running.
Code:
root@proxmox01-pkl:~# /usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys   --rotate-cluster-keys
INFO: This is a dry run. No Ceph key, cipher setting, or daemon will be changed. Session observations can update the migration journal.
FAIL: Could not verify 'aes256k' support for every service daemon:
  could not verify the installed Ceph version of mon. on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mon. on node 'proxmox02-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mon. on node 'proxmox03-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mgr.proxmox01-pkl on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of mgr.proxmox02-pkl on node 'proxmox02-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.0 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.1 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.2 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.3 on node 'proxmox01-pkl.<domain>'; check that 'pvestatd' runs there
  could not verify the installed Ceph version of osd.4 on node 'proxmox01-pkl.<domain>''; check that 'pvestatd' runs there
  and 35 more

pvestatd:
Code:
root@proxmox01-pkl:~# ps aux | grep pvestatd
root     1219566  1.0  0.0 193616 126872 ?       Ss   08:37   0:00 pvestatd
root     1219769  0.0  0.0   6528  2488 pts/2    S+   08:38   0:00 grep pvestatd

All noted have the pvestatd running on them, no errors the last while, had a issue with PBS which filled up the logs but nothing for last few hours.

After a bit of AI'ing:
Code:
PVE 9.2.18 / pve-cluster 9.1.6
Ceph 19.2.6-pve4
PVE::Ceph::Services::get_ceph_versions() returns short keys:
  proxmox01-pkl ... proxmox05-pkl
PVE::INotify::nodename() returns proxmox01-pkl
ceph mon metadata reports:
  proxmox01-pkl.<domain>
The migration helper then reports installed Ceph versions as unknown.

This is on no-subscription. not enterprise repo.
In our environment, this issue is related to using FQDNs instead of short hostnames. By default, we use FQDNs everywhere. Example:

Code:
$ hostname
node1.our-domain.tld
$ hostname -f
node1.our-domain.tld

Claude proposed this update:

Code:
    # every daemon is judged on its Ceph version, only the touched ones on their data directory
    for my $type (qw(mon mgr mds osd)) {
-        $_->{binary} = $installed->{ $_->{node} } for $info->{daemons}->{$type}->@*;
+        for my $d ($info->{daemons}->{$type}->@*) {
+            my $short = (split(/\./, $d->{node} // ''))[0];
+            $d->{binary} = $installed->{$short} // $installed->{ $d->{node} };
+        }
    }
 
Last edited:
  • Like
Reactions: hapym3al
i'm stuck at step for storage
Rich (BB code):
XXX@pvirtocbhpewd01:~# /usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys     --rotate-all-storage-keys --rotate-admin-key --apply
INFO: Recovery and confirmations may run before the remaining plan can be shown.

Apply this run, including recovery and any requested key confirmations? (y/N) y
INFO: Collecting cluster info.
WARN: the 'cephfs' mount on node 'XXX01' is timed out, left alone: the unmount failed. It remains queued and keeps its previous key until an ordinary unmount succeeds.
WARN: the 'cephfs' mount on node 'XXX02' is timed out, left alone: the unmount failed. It remains queued and keeps its previous key until an ordinary unmount succeeds.
WARN: the 'cephfs' mount on node 'XXX03' is timed out, left alone: the unmount failed. It remains queued and keeps its previous key until an ordinary unmount succeeds.
WARN: the 'cephfs' mount on node 'XXX04' is in use, left alone: /mnt/pve/cephfs: target is busy. It remains queued and keeps its previous key until an ordinary unmount succeeds.

Not touched by this run:
  Additional actions not selected: cipher restriction.

Plan
Step 1: rotate 1 selected Ceph user key and rewrite every copy Proxmox VE keeps. Affected CephFS mounts are redone on every node unless something is using them.
  Ceph user 'client.admin': staged next to the current key
  For each staged Ceph user key, both the current and new keys authenticate until the new key is committed with '--confirm-clients-refreshed USER' or, once every open record is ready, '--confirm-all-clients-refreshed'.
  Live sessions of the selected Ceph users:
  'client.admin', 9 sessions: XXX01: 2, XXX02: 3, XXX03: 1, XXX04: 3
Possible consumers (host-wide hints, not session attribution):
Kernel hints mean sockets without an owning process.
  XXX01: possible kernel client
  XXX02: possible kernel client
  XXX03: possible kernel client
  XXX04: possible kernel client
  For staged keys, refresh their consumers after applying: live-migrate every VM, remount every kernel CephFS or RBD mount, and restart other consumers; a dry run then reports who is left.

INFO: the new key of 'client.admin' was staged by an earlier run, rewriting its copies
PASS: a fresh 'client.admin' connection succeeds with the staged key
WARN: the 'cephfs' mount on node 'XXX01' is timed out, left alone: the unmount failed. It remains queued and keeps its previous key until an ordinary unmount succeeds.
WARN: the 'cephfs' mount on node 'XXX02' is timed out, left alone: the unmount failed. It remains queued and keeps its previous key until an ordinary unmount succeeds.
WARN: the 'cephfs' mount on node 'XXX03' is timed out, left alone: the unmount failed. It remains queued and keeps its previous key until an ordinary unmount succeeds.
WARN: the 'cephfs' mount on node 'XXX04' is in use, left alone: /mnt/pve/cephfs: target is busy. It remains queued and keeps its previous key until an ordinary unmount succeeds.
PASS: 'client.admin' has a new 'aes256k' key staged next to its current one; both authenticate until you commit the new one, once every consumer of it is refreshed.

What is left
No authentication check is an error: the service keys and the tickets they hand out are migrated.

Ceph still reports these authentication health checks:
  AUTH_INSECURE_CLIENT_KEY_TYPE: 2 auth client entities with insecure key types
  AUTH_INSECURE_KEYS_ALLOWED: Monitors are configured to allow auth using insecure key types
  AUTH_INSECURE_KEYS_CREATABLE: Monitors are configured to allow creation of insecure key types
  AUTH_INSECURE_ROTATING_SERVICE_KEY_TYPE: 4 rotating auth service keys using insecure key types
These recompute on the monitors' next tick; AUTH_INSECURE_ROTATING_SERVICE_KEY_TYPE clears on its own within a few hours.
'ceph health mute <check>' silences the warning about a client key you leave on the old cipher.

Client keys awaiting action:
  'client.admin': the new key is staged. Both keys remain valid. CephFS refresh pending: 'cephfs'
    on node 'XXX01', 'cephfs' on node 'XXX02', 'cephfs' on node
    'XXX03', 'cephfs' on node 'XXX04'. Free busy mounts and resolve node or
    mount errors, then rerun with '--apply'.

Left to whoever manages the client that reads them; 'man pveceph' covers what each needs:
  client.k8s
WARN: Keep /etc/pve/priv/cephx-key-migration.json until migration completion and access verification. It contains secret keys needed to recover a daemon left behind ('ceph auth import'), so protect it like a keyring.

Done

Yet i put this host in maintenance , no vm , no container, try to umount -l /mnt/pve/cephfs , no luck, so will proceed with reboot i think for all nodes on cluster one by one after put them in maintenance and rerun rotate apply
for node 4 with in use , found why it was an iso file mounted on cdrom on one vm

i think i found possible issue
root@pvirtocbhpewd01:~# ceph fs get cephfs | grep -E 'session_timeout|session_autoclose'
session_timeout 60
session_autoclose 300
root@XXX01:~# dpkg -S /usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys
pve-manager: /usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys
root@XXX01:~# pveversion --verbose | grep -E 'pve-manager|pve-kernel|ceph'
pve-manager: 9.2.18 (running version: 9.2.18/614bede5d65599c6)
ceph: 20.2.4-pve4
ceph-fuse: 20.2.4-pve4

seems that script have 20second for timeout
PVE::Tools::run_command( ['umount', $path], timeout => 20, ...);
timeout hardcoded here

manual umount on my pve node
root@XXX01:~# time umount /mnt/pve/cephfs
echo "RC=$?"
real 1m2.806suser 0m0.000ssys 0m0.003s
RC=0

i didn't find why it take so long , but clearly it's > to hardcoded timeout on script, i modify timeout 20 to 65


PVE 9.2.18
Ceph 20.2.4-pve4
CephFS session_timeout = 60
helper pve-cephx-rotate-service-keys :
timeout => 20 (original)observations :
manual umount : max seen 62.806 s
helper with timeout
timeout 20 s : ko
timeout 60 s : ko
timeout 65 s : success for all 4 nodes

replace 20s with 65s
perl -0pi -e 's/(PVE::Tools::run_command\(\s*\[\x27umount\x27,\s*\$path\],\s*timeout\s*=>\s*)20/$1 65/' \
/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys
 
Last edited:
In our environment, this issue is related to using FQDNs instead of short hostnames. By default, we use FQDNs everywhere. Example:

Code:
$ hostname
node1.our-domain.tld
$ hostname -f
node1.our-domain.tld

Claude proposed this update:

Code:
    # every daemon is judged on its Ceph version, only the touched ones on their data directory
    for my $type (qw(mon mgr mds osd)) {
-        $_->{binary} = $installed->{ $_->{node} } for $info->{daemons}->{$type}->@*;
+        for my $d ($info->{daemons}->{$type}->@*) {
+            my $short = (split(/\./, $d->{node} // ''))[0];
+            $d->{binary} = $installed->{$short} // $installed->{ $d->{node} };
+        }
    }
Is there a fix coming for this soon?