0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自宅にオンプレミスk8sクラスタを構成する

0
Posted at

前提

使用するマシンは、Linuxがインストール可能なコンピュータであれば何でも構いません。本記事では中古で格安で手に入れたFujitsu futro s720を利用します。
クラスタに使用するマシンがすべて同LAN内に置かれるように配置してください。

1. Linux環境の構築

Linuxのインストール

Linux Server 26.04をマシンにインストール(詳細は省略)
手順:

  1. rufusの公式サイトからrufusをダウンロード
  2. Linuxの公式サイトから Ubuntu Server 26.04 LTSをダウンロード
  3. rufusでUSBメモリにUbuntu Server 26.04 LTSのisoイメージを書き込む
  4. USBメモリをクラスタに使用するマシンに差し込む
  5. BIOSを立ち上げてBoot OptionからUSBメモリの起動順位を一番上にして再起動
  6. Ubuntuのインストール画面が表示されるので、順番に設定していく
    1. Install OpenSSH serverにチェック
    2. Featured server snapsは特に何もチェックしない

各種設定

1. スワップの無効化

swappoffでスワップを無効化

sudo swapoff -a

/etc/fstab を編集してスワップファイルの行をコメントアウト

fstab
# /swap.img   none    swap    sw  0  0

2. カーネルモジュールのロード

/etc/modules-load.d/k8s.conf を作成して以下の内容を書き込む

overlay
br_netfilter

モジュールをロード

sudo modprobe overlay
sudo modprobe br_netfilter

3. ネットワーク設定

/etc/sysctl.d/k8s.conf を編集してipフォワーディングとブリッジを設定

net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1

設定を反映

sudo sysctl --system

2. コンテナランタイムのインストール

コンテナランタイムとして標準の containerd を使用。

1. containerdのインストール

sudo apt update
sudo apt install -y containerd

2. デフォルト設定の生成とSystemdCgroupの有効化

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

/etc/containerd/config.toml を編集してSystemCgroupを有効化

SystemdCgroup = true

サービスの再起動と有効化

sudo systemctl restart containerd
sudo systemctl enable containerd

3. kubeadm, kubelet, kubectlのインストール

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

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

2. kubeadm, kubelet, kubectlのインストール
Kubernetesパッケージリポジトリの公開証明鍵をダウンロード

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

aptにKubernetesのリポジトリを追加

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

kubelet, kubeadm, kubectlをインストール

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

4. クラスタの初期化(Masterノードのみ)

以下のコマンドでクラスタを初期化
※192.168.0.0/16はPodネットワーク用のCIDR(Calicoのデフォルト値)で、ホストのLANサブネットとは別のもの
※ホストのLANサブネットが192.168.1.0/24などの環境では、192.168.0.0/16だとホストのLANの設定と重複し、最悪ネットワークが使えなくなる可能性があるので、その場合は 10.244.0.0/16 など重複しないCIDRを指定

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

クラスタの初期化が完了すると以下のメッセージが表示されるので、コピーして控える

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

...(中略)...

Alternatively, if you are the root user, you can run:
sudo kubeadm join <MasterノードのIP>:6443 --token <トークン> \
        --discovery-token-ca-cert-hash sha256:<ハッシュ>

(任意)一般ユーザーでもkubectlを実行できるように、configファイルの権限を設定する

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5. CNI(Calico)のインストール

Pod同士のネットワーク接続のためにCNIをインストール(ここではCalicoをCNIとして使用)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yaml

6. Workerノードの追加(Workerノードのみ)

4. クラスタの初期化(Masterノードのみ)で控えたコマンドをWorkerノードで実行して、Workerノードをクラスタに参加させる

sudo kubeadm join <MasterノードのIP>:6443 --token <トークン> \
        --discovery-token-ca-cert-hash sha256:<ハッシュ>

7. 動作確認

1. workerノードの確認

以下のコマンドをMasterノードで実行して、ノードの一覧を出力する

kubectl get nodes

以下のようにノードが表示されれば成功

kubectl get nodes
NAME            STATUS   ROLES           AGE    VERSION
worker          Ready    <none>          16h    v1.36.0
master          Ready    control-plane   16h    v1.36.0

2. podの追加

試しに、Nginxをpod上で動作させてみる
nginxイメージを使用して、nginxという名前のDeploymentを作成

kubectl create deployment nginx --image=nginx

deploymentとpodを確認

kubectl get deployments
kubectl get pods

以下のようにpodの一覧が表示される。

NAME                    READY   STATUS    RESTARTS   AGE
nginx-7f8fbb96d-rxn4w   1/1     Running   0          22s

3. Serviceの追加

このままではpodのIPアドレスが毎回変わってしまうので、podに対してIPとPort番号を割り当てる service を作成する

kubectl expose deployment nginx --port=80 --type=NodePort

サービスの一覧を確認する

kubectl get services

以下のようにサービス一覧が表示されたら成功

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        1h
nginx        NodePort    10.100.200.50   <none>        80:31234/TCP   1m

サービス一覧のPORT(S)列の80:31234/TCPの31234が、外部に公開されているPort番号となる。
ブラウザでMasterノードもしくはWorkerノードのIPアドレス:Port番号にアクセスして、Nginxの画面が出れば成功

ちなみに、WorkerノードのIPアドレス一覧は次のコマンドで確認できる

kubectl get nodes -o wide
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?