1. Kubernetesアーキテクチャ概要(CKA重点)
CKA試験では理論だけでなく、クラスタコンポーネントのトラブルシューティングが求められます。
コントロールプレーンノード ワーカーノード
────────────────── ────────────
kube-apiserver ◄──────────────── kubelet
etcd kube-proxy
kube-scheduler コンテナランタイム
controller-manager (containerd)
cloud-controller-manager (任意)
全コンポーネントはkube-apiserverを介して通信(etcdのみAPI serverと直接通信)
| コンポーネント | 場所 | 設定 / Podパス | トラブルシュート |
|---|---|---|---|
| kube-apiserver | コントロールプレーン | /etc/kubernetes/manifests/kube-apiserver.yaml | kubectl get pods -n kube-system |
| etcd | コントロールプレーン | /etc/kubernetes/manifests/etcd.yaml | etcdctl member list |
| kube-scheduler | コントロールプレーン | /etc/kubernetes/manifests/kube-scheduler.yaml | kube-systemのログ確認 |
| controller-manager | コントロールプレーン | /etc/kubernetes/manifests/kube-controller-manager.yaml | kube-systemのログ確認 |
| kubelet | 全ノード | /var/lib/kubelet/config.yaml、systemdサービス | systemctl status kubelet |
試験のポイント:kubeadmクラスタでは、コントロールプレーンコンポーネントは静的Pod(
/etc/kubernetes/manifests/内のファイル)として実行されます。kubeletが自動的に起動・再起動します。マニフェストファイルを編集すると、kubeletがPodを自動リロードします(kubectl applyは不要)。
2. kubeadm — クラスタブートストラップ
# 1. コントロールプレーンの初期化
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.10
# 2. kubeconfigの設定
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
# 3. CNI(Pod Network)のインストール
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 4. ワーカーノードの参加
kubeadm join 192.168.1.10:6443 --token xxx --discovery-token-ca-cert-hash sha256:yyy
3. 静的Pod & マニフェスト
# 静的Podのパス
/etc/kubernetes/manifests/
├── etcd.yaml
├── kube-apiserver.yaml
├── kube-controller-manager.yaml
└── kube-scheduler.yaml
# kubeletの静的Podパスを確認
cat /var/lib/kubelet/config.yaml | grep staticPodPath
# staticPodPath: /etc/kubernetes/manifests
# トラブルシュート: コンポーネントが起動しない場合
kubectl get pods -n kube-system
kubectl describe pod kube-apiserver-controlplane -n kube-system
kubectl logs kube-apiserver-controlplane -n kube-system
4. kubeconfig & コンテキスト
# 現在のコンテキスト
kubectl config current-context
# コンテキストの切り替え(CKA試験では各問題でクラスタ切り替えが必要)
kubectl config use-context cluster1
# kubeconfigの確認
kubectl config view
cat ~/.kube/config
5. チートシート
| タスク | コマンド |
|---|---|
| クラスタ初期化 | kubeadm init --pod-network-cidr=... |
| ノード参加トークン生成 | kubeadm token create --print-join-command |
| コントロールプレーンPod確認 | kubectl get pods -n kube-system |
| 静的Podマニフェスト | ls /etc/kubernetes/manifests/ |
| kubelet設定確認 | cat /var/lib/kubelet/config.yaml |
6. 練習問題
Q1:kubeadmクラスタでkube-apiserverが動作していない場合、最初に確認すべきファイルは?
- A) /etc/kubernetes/kubelet.conf
- B) /etc/kubernetes/manifests/kube-apiserver.yaml ✓
- C) ~/.kube/config
- D) /var/log/syslog
解説:kubeadmクラスタではkube-apiserverは静的Podとして実行されます。kubeletはマニフェストの変更を検知して自動リロードします。YAMLの構文エラーや設定ミスが最も一般的な原因です。
Q2:新しいワーカーノードをクラスタに参加させるjoinコマンドを取得する方法は?
- A) kubectl get nodes --join-command
- B) kubeadm token create --print-join-command ✓
- C) kubeadm init --print-join
- D) kubectl cluster-info --join
解説:kubeadm token create --print-join-commandは新しいトークンを生成し、完全なjoinコマンドを表示します。トークンのデフォルト有効期限は24時間です。
Q3:kube-schedulerが停止すると何が起きますか?
- A) 既存のPodがクラッシュする
- B) 新しいPodがPending状態のまま、ノードにスケジュールされない ✓
- C) クラスタ全体が停止する
- D) すべてのServiceが到達不能になる
解説:kube-schedulerは新しいPodをノードに割り当てる役割を担います。停止すると、新しいPodはPending状態のままになります。既に実行中のPodは影響を受けません。