kubectl get nodes エラー: サーバーにログインしている必要があります (権限がありません) - 修正方法

kubectl get nodes エラー: サーバーにログインしている必要があります (権限がありません) - 修正方法

インフラストラクチャを変更せずに、kubectl コマンドを実行すると、次のようになります。

kubectl get nodes

エラーが発生します

You must be logged in to the server (Unauthorized) 

Kubernetes クラスターは正常に動作しており、変更も行っていません... これをデバッグする方法はありますか? kubectl には、詳細情報を提供する -vv od デバッグ フラグがありません。

もし私が試したら

kubectl version

Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0",
(...) 
error: You must be logged in to the server (the server has asked for the client to provide credentials)

答え1

私の場合、問題は kubernates 証明書を更新した後に発生し、これにより既存の証明書~/.kube/configに古いキーと証明書の値が含まれるようになりました。

解決策は、価値観 client-certificate-data同じ名前の更新されたファイルの値を含むclient-key-dataファイル。~/.kube/config/etc/kubernetes/kubelet.conf

答え2

Kubernetesの最新バージョンでは、 および をファイルclient-certificate-dataclient-key-dataコピー/etc/kubernetes/admin.confできます。~/.kube/configこの答え証明書の有効期限を決定します。

答え3

私も今日同様の問題に直面しましたが、上記のコメントのおかげで問題を解決することができました。同様の設定をしている人にとって役立つかもしれないので、シナリオの詳細を追加します。

k8s クラスター (EC2 インスタンスの通常のクラスター) に接続するための別のユーザーがいます。 ClusterRoleBindings を追加して、アクセスが制限されたユーザー arunlal を作成しました。

クラスターへの API の実行中に次のエラーが発生した場合 (私の場合は Kubectl):

error: You must be logged in to the server (Unauthorized)

以下の順序で実行してください。

- まず、構成ファイルで使用されている証明書を確認します(ローカルクライアント)

メイン構成には他の k8s および okd クラスターの資格情報に関する詳細が含まれていたため、ローカル システムには別の構成がありました。そのため、ラップトップに 2 番目の構成を作成しました (/Users/arunlal/.kube/config_two)。この場合、次のエイリアスがあります。

alias kctl="kubectl --kubeconfig=/Users/arunlal/.kube/config_two"

- このファイルから、使用している証明書を取得します。

[[メールアドレス]~] cat /Users/arunlal/.kube/config_two| grep -A 5 ユーザー
ユーザー:
- 名前: アルンラル
  ユーザー:
    クライアント証明書: /Users/arunlal/.arunlal-keys/arunlal.crt
    クライアントキー: /Users/arunlal/.arunlal-keys/arunlal.key

- クライアント構成で証明書を取得したら、openssl コマンドを使用して有効性を確認できます。

    [[メールアドレス]~] openssl x509 -noout -dates -in /Users/arunlal/.arunlal-keys/arunlal.crt
    notBefore=2021年6月22日 23:43:22 GMT
    notAfter=2021年9月30日 23:43:22 GMT

- 有効期限を検証する

ユーザーを作成するときに、日数を 5 として渡しましたが、それが問題でした。ユーザーをどのように作成しましたか?

openssl genrsa -out arunlal.key 2048
openssl req -new -key arunlal.key -out arunlal.csr -subj "/CN=arunlal/O=crybit"
openssl x509 -req -in arunlal.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out arunlal.crt -days 5
kubectl config set-credentials arunlal --client-certificate=/root/arunlal-keys/arunlal.crt  --client-key=/root/arunlal-keys/arunlal.key

- 修正するには、日数を増やして証明書を再作成しました

openssl x509 -req -in arunlal.csr -CA /etc/kubernetes/pki/ca.crt
-CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out arunlal.crt -days 100

- これは k8s クラスターから実行する必要があります。

- 証明書をローカルで置き換えました。

新しい証明書で /Users/arunlal/.arunlal-keys/arunlal.crt を変更しました。

これが誰かの役に立つことを願っています。ありがとうございます!

~ アルン

答え4

kubeconfig 証明書が変更されている可能性があります。Terraform を使用してクラスターをデプロイした場合は、terraform apply を実行して新しい kubeconfig ファイルを生成します。

関連情報