KubernetesのAPI Serverを故障させて検証してみた|etcd接続エラーの確認と復旧手順

kubenetesロゴ

今回は、kube-apiserverをあえて破壊して挙動を確認する検証を行いました。

特にCKA試験では、以下のようなトラブル対応が重要になります。

  • API Serverに接続できない
  • etcdとの通信が失敗している
  • 証明書の設定ミス
  • control planeが起動しない

この記事では、etcd接続を壊したときのログ確認方法と復旧手順を分かりやすく解説します。

CKA試験を勉強している人
Kubernetesのcontrol planeトラブルを理解したい人
kube-apiserverが起動しなくて困っている人

現在の状態を確認

まずは、API Serverが正常に動作している状態を確認します。

kubectl get pod -A

事前にバックアップを取得

破壊検証を行う前に、必ずマニフェストのバックアップを取得しておきます。

cp /etc/kubernetes/manifests/kube-apiserver.yaml ./kube-apiserver.yaml_bk

etcdへの接続を壊してみる

次に、API Serverからetcdへの接続設定をあえて壊してみます。

vi /etc/kubernetes/manifests/kube-apiserver.yaml

修正前

- --etcd-servers=https://127.0.0.1:2379

修正後(あえて間違える)

- --etcd-servers=https://127.0.0.1:1111

数分後にエラー発生

しばらくすると、以下のエラーが表示されました。

The connection to the server 172.30.1.2:6443 was refused

今回はetcdのポートだけを壊したにも関わらず、API Server自体に接続できなくなります。

kube-apiserverのログを確認

次に、ログを確認して原因を調べます。

cat /var/log/pods/kube-system_kube-apiserver-controlplane_*/kube-apiserver/*.log

ログを見ると、どの設定が間違っているのかが明確に表示されています。

crictlでコンテナログを確認

続いて、コンテナ側のログも確認してみます。

crictl ps -a | grep apiserver
crictl logs <コンテナID>

ここでも、etcdへの接続エラーが確認できました。

syslogを確認

念のため、syslogも確認してみます。

cat /var/log/syslog

ログには connection refused のエラーは表示されますが、
直接的な原因はここでは分かりませんでした。

正しいetcdのポートを調べる

今回は自分で壊したので正しいポートは分かっていますが、
実際の試験/実務では自分で調べる必要があります。

今回はapi-server ⇄ etcd 間での問題なのでetcdの正しいポートを見てみます。
クライアントから繋ぐ正しいリンクは「–listen-client-urls」に記載があります。

etcdの設定は以下のファイルに記載されています。

view /etc/kubernetes/manifests/etcd.yaml

kube-apiserver.yamlを修正

正しいポートに戻します。

vi /etc/kubernetes/manifests/kube-apiserver.yaml

修正後、数分待つとAPI Serverが復旧します。

kubectl get pod -A

証明書を壊してみる

次に、証明書エラーが発生した場合の挙動も確認してみます。

vi /etc/kubernetes/manifests/kube-apiserver.yaml

修正前

--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt

修正後(あえて間違える)

--etcd-cafile=/etc/kubernetes/pki/etcd/aaa.crt

数分後エラー発生

k get pod

さっきと同じですね。他のログも見てみます。

証明書エラーのログを確認

ログを確認すると、証明書エラーが明確に表示されていました。

cat /var/log/pods/kube-system_kube-apiserver-controlplane_*/kube-apiserver/*.log

正しい証明書を調べる方法

正しい証明書は、etcd.yaml を見れば必ず分かります。

view /etc/kubernetes/manifests/etcd.yaml

確認するポイントはこの3つです。

--cert-file
--key-file
--trusted-ca-file

証明書の対応関係

コンポーネント証明書
etcdserver.crt
kube-apiserverapiserver-etcd-client.crt

関係は以下の通りです。

API Server(クライアント)
        
apiserver-etcd-client.crt
        
etcd(サーバー)
        
server.crt

設定を元に戻して復旧

正しい証明書に戻します。

vi /etc/kubernetes/manifests/kube-apiserver.yaml 

修正後

--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt

数分後、正常に復旧しました。

k get pod -A

まとめ

kube-apiserverが起動しない場合は、まず以下を確認しましょう。

確認ポイント

  • etcdのポートが正しいか
  • kube-apiserver.yamlの設定ミスがないか
  • 証明書のパスが正しいか
  • etcd.yamlの設定と一致しているか

① 接続先(ポート)の対応

確認したい内容kube-apiserver 側etcd 側意味
etcd の接続先URL–etcd-servers=https://127.0.0.1:2379–listen-client-urls=https://127.0.0.1:2379この2つは必ず一致させる

② 証明書の対応関係

種類etcd 側(サーバー)kube-apiserver 側(クライアント)役割
CA証明書–trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt–etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt通信を信頼するための証明書
サーバー証明書–cert-file=/etc/kubernetes/pki/etcd/server.crt(設定なし)etcd自身の証明書
秘密鍵–key-file=/etc/kubernetes/pki/etcd/server.key(設定なし)etcdの秘密鍵
クライアント証明書(設定なし)–etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crtAPI Serverが接続するための証明書
クライアント秘密鍵(設定なし)–etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.keyAPI Server用の秘密鍵