Kubernetes 1.6クラスターには、2017年4月13日にクラスターを構築したときに証明書が生成されていました。
2017年12月13日に、クラスターはバージョン1.8にアップグレードされ、新しい証明書が生成されました[明らかに、不完全な証明書のセット]。
2018年4月13日に、api-serverのKubernetesダッシュボード内でこのメッセージが表示され始めました:
[authentication.go:64] Unable to authenticate the request due to an error: [x509: certificate has expired or is not yet valid, x509: certificate has expired or is not yet valid]
client-certificate&client-key/etc/kubernetes/kubelet.conf
12月13日に生成された証明書で[apiserver-kubelet-client.crt
およびapiserver-kubelet-client.crt
]、ただし上記のエラーは引き続き表示されます。
client-certificate&client-key/etc/kubernetes/kubelet.conf
atdifferent12月13日に生成された証明書[apiserver.crt
およびapiserver.crt
](正直なところ、これらの2組の証明書/キーの違いを理解していません)が、上記のエラーは引き続き表示されます。
client-certificate&client-key/etc/kubernetes/kubelet.conf
存在しないファイルで、kube *サービスはいずれも開始されず、/var/log/syslog
これについて不満を言う:
Apr 17 17:50:08 kuber01 kubelet[2422]: W0417 17:50:08.181326 2422 server.go:381] invalid kubeconfig: invalid configuration: [unable to read client-cert /tmp/this/cert/does/not/exist.crt for system:node:node01 due to open /tmp/this/cert/does/not/exist.crt: no such file or directory, unable to read client-key /tmp/this/key/does/not/exist.key for system:node:node01 due to open /tmp/this/key/does/not/exist.key: no such file or directory]
このエラーを克服する方法、またはより詳細なレベルでトラブルシューティングする方法に関するアドバイスはありますか? APIサーバー(kubeadm alpha phase certs apiserver
)、 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd-phase-certs 内の指示に基づきますが、もっと多くのダメージを与えるでしょう。
Kubernetesにとって比較的新しいものであり、これを設定した紳士は相談に応じられません...どんな助けも歓迎します。ありがとう。
Kubernetesクラスター内の各ノードには、kubelet ... /etc/kubernetes/kubelet.conf
...を実行するための構成ファイルが含まれており、このファイルはkubeadmによって自動生成されます。この自動生成中に、kubeadmは/etc/kubernetes/ca.key
を使用して、ノード固有のファイル/etc/kubernetes/kubelet.conf
を作成します。その中に2つの非常に重要な部分があります... client-証明書データおよびクライアントキーデータ私の最初の思考プロセスは、対応する証明書ファイルとキーファイルを見つけ、それらのファイルを更新し、両方をbase64に変換し、クラスター全体のkubelet.conf
ファイル内でそれらの値を使用する必要があると信じるようになりました...この考え方は正しくありません。
代わりに、修正プログラムはkubeadmを使用して、すべてのノードでkubectl.conf
を再生成し、クラスターのadmin.conf
、controller-manager.conf
、およびscheduler.conf
を再生成しましたマスターノード。構成ファイルにclient-certificate-dataおよびclient-key-dataの有効なデータを含めるには、各ノードで/etc/kubernetes/pki/ca.key
が必要です。
プロのヒント:--apiserver-advertise-address
パラメーターを使用して、新しい構成ファイルにkube-apiserverサービスをホストするノードの正しいIPアドレスが含まれるようにします。
Apiserver証明書を再生成する必要があると思います/etc/kubernetes/pki/apiserver.crt
このように現在の有効期限を表示できます。
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
Not Before: Dec 20 14:32:00 2017 GMT
Not After : Dec 20 14:32:00 2018 GMT
以下は、v1.11.5クラスターで証明書を再生成するために使用した手順です。ここからコンパイルされた手順 https://github.com/kubernetes/kubeadm/issues/581
すべての証明書の有効期限を確認するには:
find /etc/kubernetes/pki/ -type f -name "*.crt" -print|egrep -v 'ca.crt$'|xargs -L 1 -t -i bash -c 'openssl x509 -noout -text -in {}|grep After'
Maserノードの証明書を更新します。
*)証明書を更新する
mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.old
mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.old
mv /etc/kubernetes/pki/apiserver-kubelet-client.crt /etc/kubernetes/pki/apiserver-kubelet-client.crt.old
mv /etc/kubernetes/pki/apiserver-kubelet-client.key /etc/kubernetes/pki/apiserver-kubelet-client.key.old
mv /etc/kubernetes/pki/front-proxy-client.crt /etc/kubernetes/pki/front-proxy-client.crt.old
mv /etc/kubernetes/pki/front-proxy-client.key /etc/kubernetes/pki/front-proxy-client.key.old
kubeadm alpha phase certs apiserver --config /root/kubeadm-kubetest.yaml
kubeadm alpha phase certs apiserver-kubelet-client
kubeadm alpha phase certs front-proxy-client
mv /etc/kubernetes/pki/apiserver-etcd-client.crt /etc/kubernetes/pki/apiserver-etcd-client.crt.old
mv /etc/kubernetes/pki/apiserver-etcd-client.key /etc/kubernetes/pki/apiserver-etcd-client.key.old
kubeadm alpha phase certs apiserver-etcd-client
mv /etc/kubernetes/pki/etcd/server.crt /etc/kubernetes/pki/etcd/server.crt.old
mv /etc/kubernetes/pki/etcd/server.key /etc/kubernetes/pki/etcd/server.key.old
kubeadm alpha phase certs etcd-server --config /root/kubeadm-kubetest.yaml
mv /etc/kubernetes/pki/etcd/healthcheck-client.crt /etc/kubernetes/pki/etcd/healthcheck-client.crt.old
mv /etc/kubernetes/pki/etcd/healthcheck-client.key /etc/kubernetes/pki/etcd/healthcheck-client.key.old
kubeadm alpha phase certs etcd-healthcheck-client --config /root/kubeadm-kubetest.yaml
mv /etc/kubernetes/pki/etcd/peer.crt /etc/kubernetes/pki/etcd/peert.crt.old
mv /etc/kubernetes/pki/etcd/peer.key /etc/kubernetes/pki/etcd/peer.key.old
kubeadm alpha phase certs etcd-peer --config /root/kubeadm-kubetest.yaml
*) Backup old configuration files
mv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.old
mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.old
mv /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.old
mv /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.old
kubeadm alpha phase kubeconfig all --config /root/kubeadm-kubetest.yaml
mv $HOME/.kube/config .$HOMEkube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
chmod 777 $HOME/.kube/config
export KUBECONFIG=.kube/config
ノードを再起動し、etcd、kubeapi、kubeletのログを確認します。
注:CI/CDジョブkubeconfigファイルを更新することを忘れないでください。ヘルムコマンドを使用している場合は、それもテストします。
K8s 1.7では、同様の問題(x509期限切れエラーが/var/log/kube-apiserver.logに含まれています)に直面し、期限切れの証明書が見つかりませんでした。マスターノードでapiserverドッカーのみを再起動することにしました。問題を解決しました。
$ Sudo docker ps -a | grep apiserver
af99f816c7ec gcr.io/google_containers/kube-apiserver@sha256:53b987e5a2932bdaff88497081b488e3b56af5b6a14891895b08703129477d85 "/bin/sh -c '/usr/loc" 15 months ago Up 19 hours k8s_kube-apiserver_kube-apiserver-ip-xxxxxc_0
40f3a18050c3 gcr.io/google_containers/pause-AMD64:3.0 "/pause" 15 months ago Up 15 months k8s_POD_kube-apiserver-ip-xxxc_0
$ Sudo docker restart af99f816c7ec
af99f816c7ec
$