Kubernetes

Ubuntu 22.04で本番環境Kubernetesクラスターを構築・HA化する手順

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

前提条件と環境準備

このセクションでは、クラスタを本番稼働させるために最低限必要な OS/ハードウェアスペックと、ネットワーク・ファイアウォールの設定要件をまとめます。適切なリソースが確保できていないと、パフォーマンス低下や障害時の復旧が困難になるため、必ず事前に確認してください。

OS・ハードウェア要件

Ubuntu 22.04 LTS(64bit)を対象にしています。CPU・メモリ・ディスクはノードの役割ごとに推奨値がありますので、計画段階で余裕を持った構成を選択してください。

  • OS: Ubuntu 22.04 LTS(公式 apt リポジトリが利用可能)
  • CPU: 最低 2 コア(コントロールプレーンは 4 コア以上推奨)
  • メモリ: 4 GB 以上
  • コントロールプレーンノード:8 GB 以上推奨
  • ワーカーノード:2 GB でも可(負荷が高いワークロードは増量してください)
  • ディスク: 空き容量 20 GB 以上、etcd 用データは SSD が望ましい

公式ドキュメント: 「Kubernetes クラスター作成 – kubeadm

ネットワーク設定とファイアウォールの考慮

以下に示すポートは コントロールプレーンノードワーカーノード の両方で相互に開放しておく必要があります。ufwiptables、もしくはクラウドベンダー提供のセキュリティグループで設定してください。

  • IP アドレス: 各ノードは静的 IP か DHCP 予約で一意に割り当てる
  • ポート要件(TCP)
ポート 用途
6443 API Server(kubectl、kubelet が利用)
2379‑2380 etcd クラスタ間通信
10250 kubelet の API
10251 kube-scheduler
10252 kube-controller-manager
30000‑32767 NodePort(ユーザーアプリが外部公開する場合)
  • ファイアウォール: 上記ポートを全ノード間で許可し、外部からの不要なアクセスはブロックします。
  • 名前解決: コントロールプレーンのホスト名は /etc/hosts もしくは内部 DNS に登録し、ワーカーノードから正しく参照できるようにしておきます。

必須コンポーネントのインストール

本章では、公式 apt リポジトリから containerd(推奨)と Kubernetes コンポーネント を取得し、システムレベルで必要な設定を行う手順を示します。パッケージ管理によるバージョン固定により、将来的なアップグレードが安全かつ容易になります。

Docker/Containerd のインストールと設定

Docker は互換性の観点から残すことも可能ですが、Kubernetes 1.28 系では containerd がデフォルトランタイムとして推奨されています。以下は containerd をインストールする例です。

ポイントcontainerd は軽量で Kubernetes と相性が良く、CNI プラグインとの連携もスムーズです。Docker エンジンは不要な場合はインストールしない方がリソースの無駄遣いを防げます。

kubeadm・kubelet・kubectl のインストール手順

apt-key は非推奨となったため、ここでは keyring 方式 に置き換えて安全性を高めています。

次に、クラスターで使用する kubeadm・kubelet・kubectl のバージョンを固定します。

kubelet が systemd で有効かどうかを確認します。

スワップ無効化と sysctl 推奨パラメータ設定

Kubernetes は スワップが有効 な状態では動作しません。永続的に無効化したうえで、CNI がブリッジを正しく処理できるようカーネルパラメータも調整します。


シングルコントロールプレーン構成でのクラスター初期化

単一ノードでも本番環境として十分に機能します。ここでは kubeadm init の実行例と、Calico CNI の導入手順、ワーカーノードの参加方法を示します。

kubeadm init の実行例とオプション解説

以下のコマンドは、シングルコントロールプレーンノード上でクラスタを作成する最小構成です。--upload-certs を付与すると、後続ノード追加時に証明書を再利用できます。

  • --apiserver-advertise-address … API Server がリッスンする IP(ノードのプライベートアドレス)
  • --pod-network-cidr … Calico のデフォルト CIDR と合わせることで、Pod の IP 割り当てが正しく行われます
  • --control-plane-endpoint … 将来 HA 化する際にロードバランサの VIP を指定できるようにしておくと移行が楽です

初期化後の設定(kubectl へのアクセス権付与)

非 root ユーザーでも kubectl が使えるように設定ファイルをコピーします。

マスターノード状態の確認方法

kubectl get nodeskubectl get pod -A でコンポーネントの稼働状況をチェックします。

期待される出力例(抜粋):

Calico CNI プラグインのデプロイと基本ネットワークポリシー設定

Calico はスケールしやすく、NetworkPolicy の表現力が高いことから多くのプロダクション環境で採用されています。

最小限のデフォルト拒否ポリシー例

以下は 全 Namespace のすべての Pod に対して Ingress/Egress を禁止 するテンプレートです。必要に応じて個別の許可ルールを追加してください。

適用は kubectl apply -f deny.yaml で実行します。

ワーカーノードの参加手順 (kubeadm join の取得と実行)

kubeadm init 実行時に表示された join コマンド を各ワーカーノードで実行します。通常のワーカーは --control-plane オプションを付けません。

重要--control-plane は追加のコントロールプレーンノード(マスターノード)を増設する際にのみ使用します。ワーカーノードでは必ず省略してください。

参加後、マスターノードで再度 kubectl get nodes を実行し、Ready 状態のワーカーが表示されることを確認します。


高可用性 (HA) 構成の実装

単一コントロールプレーンはシングルポイント障害(SPOF)になるため、本番環境では ロードバランサ + 複数コントロールプレーン の構成が推奨されます。ここでは Keepalived による VIP と HAProxy による TCP ロードバランシングの設定手順、そして追加マスターの作成方法を解説します。

HAProxy と Keepalived によるロードバランサー設置手順

まずは Keepalived で仮想 IP(VIP) を割り当て、HAProxy がその VIP 経由で API Server へリクエストを転送します。

必要パッケージのインストール

Keepalived 設定例(VIP: 10.0.0.100/24)

以下は master01 に配置する設定ファイルです。2 台目以降は priority の数値だけ変更してください。

設定を反映させてサービスを再起動します。

HAProxy 設定例(TCP モード)

/etc/haproxy/haproxy.cfg に以下のブロックを追加し、API Server へのロードバランシングを有効にします。

VIP(例:10.0.0.100) を kubeadm init --control-plane-endpoint に指定すれば、クライアントは常に同一エンドポイントで API Server へアクセスできます。

複数コントロールプレーンノードの追加方法と kubeadm init の再利用

最初に作成したマスターで 証明書キー を取得し、2 台目以降のマスターで kubeadm init--control-plane)を実行します。

  • --certificate-key に 1 台目で取得したキーを渡すことで、etcd の証明書が安全に共有されます。
  • --upload-certs を付与し続けると、さらに新しいマスター追加時にも同様の手順が利用可能です。

kubelet 再起動

HA 環境での状態確認とフェイルオーバーテスト

以下のコマンドで各ノードのステータスや VIP の割り当て状況を確認し、意図した通りにフェイルオーバーが機能するか検証します。


運用・保守ガイド

本番環境では 計画的なアップグレード障害時の迅速な切り分け が不可欠です。ここでは kubeadm を利用した安全なバージョン上げ手順と、主要コンポーネントのトラブルシューティング項目をまとめます。

基本的なアップグレード手順 (kubeadm upgrade)

  1. 対象バージョンの確認
    bash
    apt-cache madison kubeadm | grep '\s1\.28\.' # 例: 1.29.x に上げる場合は公式リリースノート参照

  2. kubeadm 本体だけを先にアップグレード
    bash
    sudo apt-get install -y kubeadm=1.29.0-00 # バージョンは実際のリリストから選択

  3. クラスター全体のアップグレードプランを取得
    bash
    sudo kubeadm upgrade plan

  4. コントロールプレーンノードを順次アップグレード(マスターごとに実行)
    bash
    sudo kubeadm upgrade apply v1.29.0

  5. kubelet と kubectl も同バージョンへ固定
    bash
    sudo apt-get install -y kubelet=1.29.0-00 kubectl=1.29.0-00
    sudo systemctl daemon-reload && sudo systemctl restart kubelet

  6. ワーカーノードをローテーションでアップグレード(各ノードで実行)
    bash
    sudo kubeadm upgrade node config --kubelet-version v1.29.0
    sudo apt-get install -y kubelet=1.29.0-00
    sudo systemctl restart kubelet

トラブルシューティングの主要ポイント

以下は障害発生時にまず確認すべき項目と、代表的なエラー例です。

項目 確認コマンド 主なエラー例と対処
コンポーネント全体の状態 kubectl get componentstatuses SchedulerUnhealthyjournalctl -u kube-scheduler でログ確認
kubelet の起動状況 systemctl status kubeletjournalctl -u kubelet -f swap is enabled → 再度スワップ無効化と /etc/fstab 修正
etcd ヘルスチェック ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 endpoint health unhealthy → 証明書期限切れ、ディスク容量不足、ネットワーク遮断を確認
Pod ネットワーク kubectl get pods -A -o widekubectl logs -n kube-system <calico-pod> Failed to create pod network → sysctl 設定漏れや Calico の IPIP モジュール無効化
API サーバーへのアクセス curl -k https://<VIP>:6443/healthz タイムアウト → HAProxy / Keepalived 設定ミス、ファイアウォールブロック

公式ドキュメントの 「Kubernetes クラスター作成 – kubeadm」 には、さらに詳細なアップグレード手順とトラブルシューティングガイドが掲載されています。実施前に必ず目を通してください。


まとめ

  • 前提条件:Ubuntu 22.04、CPU≥2、メモリ≥4 GB、必要ポートの開放を確保したネットワーク基盤を用意。
  • コンポーネントインストールcontainerd と公式 apt リポジトリから取得した kubeadm/kubelet/kubectl を keyring 方式で安全に導入し、スワップ無効化・sysctl 設定を実施。
  • シングルコントロールプレーン構築kubeadm init --pod-network-cidr=192.168.0.0/16 によりクラスタを初期化し、Calico CNI をデプロイ。ワーカーノードは --control-plane なしで参加させます。
  • HA 構成:Keepalived が提供する VIP と HAProxy の TCP ロードバランサーで API Server を冗長化し、kubeadm init --control-plane と証明書キー共有で複数コントロールプレーンノードを追加。フェイルオーバーテストも必ず実施してください。
  • 運用・保守kubeadm upgrade による段階的バージョン上げと、componentstatuses・etcd health・kubelet ログのチェック項目を標準化しておくことで障害時に迅速対応できます。

以上の手順を踏めば、Ubuntu 22.04 上で 本番レベル の Kubernetes クラスタを安全かつ安定的に構築・運用できるようになります。ぜひ実環境で検証し、CI/CD パイプラインやマイクロサービスデプロイへと活用してください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Kubernetes