KubernetesのAPI Serverを故障させて検証してみた|etcd接続エラーの確認と復旧手順
今回は、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_bketcdへの接続を壊してみる
次に、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
証明書の対応関係
| コンポーネント | 証明書 |
|---|---|
| etcd | server.crt |
| kube-apiserver | apiserver-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.crt | API Serverが接続するための証明書 |
| クライアント秘密鍵 | (設定なし) | –etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key | API Server用の秘密鍵 |