{"id":1031,"date":"2023-02-18T16:09:32","date_gmt":"2023-02-18T15:09:32","guid":{"rendered":"https:\/\/blog.unetresgrossebite.com\/?p=1031"},"modified":"2023-02-18T16:11:34","modified_gmt":"2023-02-18T15:11:34","slug":"recovering-from-expired-kubernetes-api-server-certificates","status":"publish","type":"post","link":"https:\/\/blog.unetresgrossebite.com\/?p=1031","title":{"rendered":"Recovering from expired Kubernetes API Server Certificates"},"content":{"rendered":"\n<p>Today, it&#8217;s been over a year I had not time to focus on my Kubernetes labs, which I am now reminded about as I am no longer able to query their API. API Server certificate expired a few days ago.<\/p>\n\n\n\n<p>Recovering from this is relatively easy. First, connecting to one of your control plane nodes, we would generate new certificates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/etc\/kubernetes<br>cp -rp ssl ssl.old<br>cd ssl<br>kubeadm certs renew apiserver<br>kubeadm crets renew apiserver-kubelet-client<br>kubeadm certs renew front-proxy-client<\/code><\/pre>\n\n\n\n<p>Next, we would re-generate the kubernetes-admin kubeconfig file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubeadm kubeconfig user --client-name kubernetes-admin \\\n    --config=\/etc\/kubernetes\/kubeadm-config.yaml \\\n    --org system:masters >\/etc\/kubernetes\/admin.conf<\/code><\/pre>\n\n\n\n<p>Then, make sure to share those new certificates and kubeconfig with your other control plane nodes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scp -rp \/etc\/kubernetes\/admin.conf \/etc\/kubernetes\/ssl \\\n    root@masterX:\/etc\/kubernetes\/<\/code><\/pre>\n\n\n\n<p>Make sure to restart kube-apiserver pods:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>crictl ps | grep kube-apiserver<br>crictl stop &lt;container-id><br>crictl rm &lt;container-id><br>crictl ps | grep kube-apiserver<\/code><\/pre>\n\n\n\n<p>Once removed, a new kube-apiserver container should be starting up. That one would be using your new certificates: you should be recovering access to cluster API at that stage. Still we&#8217;re not done.<\/p>\n\n\n\n<p>Then, we can proceed with kubespray, applying the cluster playbook, which should finish to restart components. You could otherwise reboot all nodes. Or restart kube-controller-managers &amp; scheduler, then kubelet.<\/p>\n\n\n\n<p>I&#8217;m a bit surprised that kubespray playbooks were unable to get that rotation working &#8212; running the cluster playbook, which usually fixes broken nodes or cluster configuration, was not helpful here. It does not seem to rotate kube-apiserver certificates (I could see tasks checking for their SAN, and then it keeps going, until it fails querying the API).<br>Still, we can see how simple it is to recover from a bad case of not paying attention to my own monitoring.<br>As usual, Kubernetes shines by its ease of use and reliability, despite my best effort to crash it!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today, it&#8217;s been over a year I had not time to focus on my Kubernetes labs, which I am now reminded about as I am no longer able to query their API. API Server certificate expired a few days ago. Recovering from this is relatively easy. First, connecting to one of your control plane nodes, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12,14],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts\/1031"}],"collection":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1031"}],"version-history":[{"count":3,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts\/1031\/revisions"}],"predecessor-version":[{"id":1034,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts\/1031\/revisions\/1034"}],"wp:attachment":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}