UbuntuでのKubernetes運用:トラブルシューティングとベストプラクティス
Kubernetes (K8s) は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースのオーケストレーションシステムです。その柔軟性と拡張性から、現代のクラウドネイティブなアプリケーション開発においてデファクトスタンダードとなりつつあります。Ubuntu は、その安定性、セキュリティ、豊富なパッケージリポジトリから、Kubernetes クラスタを構築・運用するための人気のあるオペレーティングシステム (OS) です。
この記事では、Ubuntu 上での Kubernetes クラスタの運用におけるトラブルシューティングとベストプラクティスに焦点を当てます。一般的な問題、診断方法、解決策、そして長期的な安定性と効率性を確保するための推奨事項について詳しく解説します。
1. なぜ Ubuntu で Kubernetes を運用するのか?
Ubuntu は Kubernetes の基盤としていくつかの利点を提供します。
- 安定性とセキュリティ: Ubuntu は、長期間にわたって安定したパフォーマンスとセキュリティアップデートを提供する、実績のあるディストリビューションです。これは、ミッションクリティカルなアプリケーションをホストする Kubernetes クラスタにとって不可欠です。
- 幅広いハードウェアサポート: Ubuntu は、さまざまなハードウェアプラットフォームをサポートしており、物理サーバー、仮想マシン、クラウドインスタンスなど、さまざまな環境で Kubernetes クラスタを構築できます。
- 豊富なパッケージリポジトリ: Ubuntu の APT パッケージマネージャーは、Kubernetes コンポーネントや関連ツールを簡単にインストールおよび管理できる、大規模なソフトウェアリポジトリを提供します。
- コミュニティサポート: Ubuntu は、大規模で活発なコミュニティを持ち、ドキュメント、チュートリアル、フォーラムを通じて優れたサポートを提供します。
- Canonical Kubernetes: Canonical は、Ubuntu の開発元であり、Charmed Kubernetes や MicroK8s といった、Kubernetes のインストール、管理、アップグレードを簡素化するツールを提供しています。
2. Ubuntu での Kubernetes クラスタ構築:一般的なシナリオ
Ubuntu で Kubernetes クラスタを構築する方法はいくつかあります。最も一般的なシナリオは以下のとおりです。
- kubeadm: Kubernetes コミュニティが提供する kubeadm は、最小限の構成で Kubernetes クラスタをブートストラップするためのコマンドラインツールです。これは、Kubernetes の仕組みを理解したい開発者や、カスタムクラスタ構成が必要な管理者に適しています。
- Charmed Kubernetes: Canonical が提供する Charmed Kubernetes は、オペレーターパターンを使用して Kubernetes クラスタのライフサイクルを管理します。これにより、インストール、アップグレード、スケーリングなどの操作が簡素化され、本番環境での運用に適しています。
- MicroK8s: Canonical が提供する MicroK8s は、シングルノードの Kubernetes クラスタを簡単にデプロイできる軽量ディストリビューションです。開発環境、テスト環境、エッジコンピューティングのユースケースに適しています。
- Managed Kubernetes Services: 主要なクラウドプロバイダー(AWS、Google Cloud、Azure など)は、マネージド Kubernetes サービスを提供しています。これらのサービスは、Kubernetes クラスタの管理を自動化し、運用オーバーヘッドを削減します。
この記事では、kubeadm を使用して Ubuntu で Kubernetes クラスタを構築する方法を例として取り上げ、トラブルシューティングとベストプラクティスの説明に役立てます。
3. kubeadm を使用した Kubernetes クラスタ構築:手順
kubeadm を使用して Kubernetes クラスタを構築する基本的な手順は次のとおりです。
-
前提条件の確認:
- 各ノードに Ubuntu Server 18.04 以上がインストールされていること。
- 各ノードにコンテナランタイム(Docker、containerd、CRI-O など)がインストールされていること。
- 各ノードで
kubelet
,kubeadm
,kubectl
パッケージがインストールされていること。 - 各ノードで swap が無効になっていること。
- ネットワーク接続が適切に設定されていること。
- ホスト名がユニークであること。
-
kubeadm のインストール:
bash
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl -
コントロールプレーンノードの初期化:
コントロールプレーンノードで、次のコマンドを実行します。
bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
--pod-network-cidr
オプションは、Pod が使用するネットワークアドレス空間を指定します。 -
kubectl の設定:
初期化が完了したら、ユーザーの Kubernetes 設定を構成します。
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config -
ネットワークプラグインのインストール:
Kubernetes クラスタには、Pod 間通信を可能にするネットワークプラグインが必要です。Calico、Flannel、Weave Net など、さまざまなオプションがあります。ここでは、Calico を使用する例を示します。
bash
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml -
ワーカーノードの参加:
kubeadm init コマンドの出力には、ワーカーノードをクラスタに参加させるために実行する必要があるkubeadm join
コマンドが含まれています。ワーカーノードで、そのコマンドを実行します。
bash
sudo kubeadm join <control-plane-ip>:<port> --token <token> --discovery-token-ca-cert-hash sha256:<hash> -
クラスタの確認:
コントロールプレーンノードで、次のコマンドを実行して、クラスタが正しくセットアップされていることを確認します。
bash
kubectl get nodes
kubectl get pods -n kube-system
4. 一般的な問題とその解決策
Kubernetes クラスタの運用中に発生する可能性のある一般的な問題とその解決策を以下に示します。
- ノードが NotReady 状態になる:
- 原因: kubelet が実行されていない、ネットワークの問題、リソース不足など。
- 解決策:
- kubelet のステータスを確認し、必要に応じて再起動します。
bash
sudo systemctl status kubelet
sudo systemctl restart kubelet - ネットワーク接続を確認します (ping, traceroute など)。
- CPU、メモリ、ディスクなどのリソース使用率を確認します。
- kubelet ログ (
/var/log/syslog
または/var/log/kubelet.log
) を調べてエラーがないか確認します。 - コンテナランタイム (Docker など) が実行されていることを確認します。
bash
sudo systemctl status docker
sudo systemctl restart docker
- kubelet のステータスを確認し、必要に応じて再起動します。
- Pod が Pending 状態になる:
- 原因: スケジュール可能なノードがない、リソース要求を満たせない、アフィニティ/アンチアフィニティルール違反、テイント/トレラレーションの問題など。
- 解決策:
kubectl describe pod <pod-name>
を実行して、スケジューリングイベントを確認します。- ノードのステータスを確認します (
kubectl get nodes
)。 - ノードのリソース使用率を確認します (
kubectl top node
)。 - Pod のリソース要求とノードのリソース容量を比較します。
- アフィニティ/アンチアフィニティルールとテイント/トレラレーションが正しく設定されていることを確認します。
- Pod が CrashLoopBackOff 状態になる:
- 原因: アプリケーションのクラッシュ、設定エラー、ネットワークの問題など。
- 解決策:
kubectl logs <pod-name>
を実行して、Pod のログを確認します。kubectl describe pod <pod-name>
を実行して、Pod のイベントを確認します。- アプリケーションの設定ファイルを確認します。
- ネットワーク接続を確認します。
- 必要な依存関係がインストールされていることを確認します。
- DNS 解決の問題:
- 原因: CoreDNS の設定エラー、ネットワークの問題など。
- 解決策:
- CoreDNS Pod のステータスを確認します (
kubectl get pods -n kube-system
)。 - CoreDNS のログを確認します (
kubectl logs <coredns-pod-name> -n kube-system
)。 /etc/resolv.conf
ファイルが正しく設定されていることを確認します。- kube-proxy が正しく設定されていることを確認します。
- CoreDNS Pod のステータスを確認します (
- ネットワークポリシーの問題:
- 原因: ネットワークポリシーがトラフィックをブロックしている。
- 解決策:
- ネットワークポリシーの設定を確認します (
kubectl get networkpolicy
)。 - ネットワークポリシーが意図したとおりに動作していることを確認します。
- Calico などのネットワークプラグインのドキュメントを参照して、トラブルシューティングの手順を確認します。
- ネットワークポリシーの設定を確認します (
- ストレージの問題:
- 原因: PersistentVolumeClaim (PVC) がバインドされていない、ストレージプロビジョニングの問題など。
- 解決策:
- PVC のステータスを確認します (
kubectl get pvc
)。 - PersistentVolume (PV) が利用可能であることを確認します (
kubectl get pv
)。 - ストレージプロビジョナーが正しく設定されていることを確認します。
- ストレージクラスが正しく設定されていることを確認します。
- PVC のステータスを確認します (
5. トラブルシューティングツール
Kubernetes クラスタのトラブルシューティングに役立つツールを以下に示します。
- kubectl: Kubernetes クラスタと対話するためのコマンドラインツールです。Pod、ノード、サービスなどのリソースのステータスを確認したり、ログを表示したり、リソースをデプロイしたりできます。
- kubectl explain: Kubernetes リソースのスキーマとドキュメントを表示します。YAML ファイルを作成する際に役立ちます。
- stern: 複数の Pod からリアルタイムでログを収集します。複数の Pod でアプリケーションの動作を監視する際に便利です。
- k9s: Kubernetes クラスタの状況を監視するためのターミナル UI です。リソースのステータス、ログ、イベントを視覚的に確認できます。
- Lens: Kubernetes クラスタの状況を監視するための GUI です。リソースのステータス、ログ、イベントを視覚的に確認できます。
- Prometheus & Grafana: Kubernetes クラスタとアプリケーションのメトリックを収集し、可視化します。パフォーマンスの問題を特定する際に役立ちます。
- Jaeger & Zipkin: 分散トレーシングシステムです。マイクロサービスのパフォーマンスを分析し、ボトルネックを特定する際に役立ちます。
6. Kubernetes クラスタのベストプラクティス
Kubernetes クラスタの安定性と効率性を確保するためのベストプラクティスを以下に示します。
- リソースの要求と制限の設定: Pod に CPU とメモリのリソース要求と制限を設定することで、リソースの競合を防ぎ、アプリケーションの安定性を向上させることができます。リソース要求は、Pod が必要とする最小限のリソース量を指定し、リソース制限は、Pod が使用できる最大のリソース量を指定します。
- ヘルスチェックの設定: Liveness Probe と Readiness Probe を設定することで、Kubernetes が Pod の状態を監視し、必要に応じて再起動またはトラフィックのルーティングを停止できます。Liveness Probe は、Pod が実行中かどうかを判断し、Readiness Probe は、Pod がトラフィックを受け入れる準備ができているかどうかを判断します。
- 自動スケーリングの設定: Horizontal Pod Autoscaler (HPA) を使用して、CPU 使用率やメモリ使用率などのメトリックに基づいて Pod の数を自動的に調整できます。これにより、アプリケーションのパフォーマンスを維持し、リソースの使用率を最適化できます。
- シークレットの安全な管理: シークレット(パスワード、API キーなど)を ConfigMap に直接保存するのではなく、Kubernetes Secrets を使用して安全に管理します。Secrets は、暗号化された状態で保存され、必要な場合にのみ Pod に公開されます。
- 名前空間の使用: 名前空間を使用して、Kubernetes クラスタ内のリソースを論理的に分割します。これにより、リソースの管理が容易になり、名前の衝突を防ぎ、セキュリティを向上させることができます。
- RBAC の使用: Role-Based Access Control (RBAC) を使用して、ユーザーとサービスアカウントに Kubernetes リソースへのアクセス権を付与します。最小権限の原則に従い、必要なアクセス権のみを付与します。
- 定期的なバックアップ: etcd に保存されている Kubernetes クラスタの構成を定期的にバックアップします。これにより、障害発生時にクラスタを復元できます。
- モニタリングとロギング: Prometheus と Grafana などのツールを使用して、Kubernetes クラスタとアプリケーションのメトリックを収集し、可視化します。Fluentd や Elasticsearch などのツールを使用して、ログを収集し、分析します。
- Kubernetes のバージョンアップグレード: Kubernetes の新しいバージョンがリリースされたら、定期的にクラスタをアップグレードします。新しいバージョンには、バグ修正、セキュリティアップデート、新機能が含まれている場合があります。
- Immutable Infrastructure の原則: アプリケーションのデプロイメントを繰り返す際に、常に新しいイメージを作成し、既存のイメージを変更しないようにします。これにより、設定のドリフトを防ぎ、デプロイメントの再現性を高めることができます。
- GitOps の採用: Git を信頼できる唯一の情報源として使用し、Kubernetes クラスタへの変更を自動化します。これにより、デプロイメントの追跡が容易になり、ロールバックが容易になります。
7. Ubuntu 特有の考慮事項
Ubuntu で Kubernetes を運用する場合、いくつかの Ubuntu 特有の考慮事項があります。
- AppArmor/SELinux: AppArmor または SELinux などのセキュリティモジュールが有効になっている場合、Kubernetes コンポーネントやコンテナの動作に影響を与える可能性があります。これらのモジュールが正しく構成されていることを確認してください。
- ufw (Uncomplicated Firewall): ufw が有効になっている場合、Kubernetes が必要なポートにアクセスできることを確認してください。
- systemd: Kubernetes コンポーネントは systemd で管理されます。systemd の設定を確認し、必要に応じて調整してください。
- カーネルバージョン: 互換性の問題を避けるために、推奨されるカーネルバージョンを使用してください。
8. まとめ
Ubuntu は、安定性、セキュリティ、豊富なパッケージリポジトリから、Kubernetes クラスタを構築・運用するための優れたプラットフォームです。この記事では、Ubuntu での Kubernetes クラスタの構築、一般的な問題のトラブルシューティング、長期的な安定性と効率性を確保するためのベストプラクティスについて説明しました。これらのガイドラインに従うことで、Ubuntu での Kubernetes クラスタの運用を成功させることができます。
Kubernetes は複雑なシステムであり、常に新しいツールや技術が登場しています。常に学習し、知識をアップデートし続けることが重要です。公式ドキュメント、コミュニティフォーラム、オンラインコースなどを活用して、Kubernetes の理解を深めてください。