こんにちは。先日Kubernetesに入門したので、登竜門としてオンプレミスのクラスタを構築してみました。
今回構築したKubernetesのバージョンはv1.28.2です。
環境
今回Kubernetesを動かす環境として、Proxmox上にVMを3台用意しました。
コンテナランタイムにはContainerd、CNIにはCiliumを採用しました。
Kubernetesが属するネットワークアドレスは10.10.10.0/24です。
# |
value |
OS |
Ubuntu 22.04.3 LTS |
CPU |
4 Core |
RAM |
8 GB |
HDD |
32 GB |
Container Runtime |
Containerd |
CNI |
Cilium |
Hostname |
IP Address |
Role |
kcp-1 |
10.10.10.240 |
Control Plane |
kwk-1 |
10.10.10.241 |
Worker Node |
kwk-2 |
10.10.10.242 |
Worker Node |
インストールスクリプトの紹介
自分の環境用ではありますが、自動インストール用にスクリプトを書きました。
セットアップについてはAnsibleなどの利用をオススメします。
コンテナランタイムのインストール
以下のドキュメントを参考に進めました。
iptablesでのブリッジ設定
以下のコマンドを順番に実行します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
$ sudo modprobe overlay
$ sudo modprobe br_netfilter
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
$ sudo sysctl --system
|
APT経由でのContainerdのインストール
前提パッケージをインストールします。
1
2
3
4
5
6
7
8
9
|
$ sudo apt-get update -y
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release \
apt-transport-https \
nfs-common
|
ContainerdのインストールにはDockerインストールで利用するリポジトリを利用します。
1
2
3
4
5
|
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
Containerdをインストールして、Systemdで自動起動するようにします。
1
2
3
4
|
$ sudo apt-get update
$ sudo apt-get install containerd.io -y
$ sudo systemctl start containerd
$ ksudo systemctl enable containerd
|
Cgroup driverをSystemdに変更します。
1
2
3
|
$ sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
$ containerd config default | sudo tee /etc/containerd/config.toml
$ sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
|
nerdctlもついでにインストールしておきましょう。
1
2
|
$ wget https://github.com/containerd/nerdctl/releases/download/v1.6.0/nerdctl-1.6.0-linux-amd64.tar.gz
$ sudo tar Cxzvf /usr/local/bin nerdctl-1.6.0-linux-amd64.tar.gz
|
Kubectl, Kubelet, Kubeadmのインストール
Kubernetesクラスタを構築するために必要なツールをインストールします。
まずはリポジトリを追加します。
1
2
3
|
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
|
ツールをインストールして、バージョンを肯定します。
1
2
|
$ sudo apt-get install -y kubectl kubelet kubeadm
$ sudo apt-mark hold kubelet kubeadm kubectl
|
CNIプラグインのインストール
CNIプラグインのインストールをします。
今回ダウンロードしたバージョンはv1.3.0です。
1
2
|
$ sudo mkdir -p /opt/cni/bin
$ curl -L "https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz" | sudo tar -C /opt/cni/bin -xz
|
クラスタの構築
ここまでの工程をすべてのノードで行いましょう。
コントロールプレーン
コントロールプレーンでクラスタを起動します。
--control-plane-endpoint
にはコントロールプレーンのIPアドレスを渡します。
1
|
$ sudo kubeadm init --control-plane-endpoint=10.10.10.240
|
クラスタのコンフィグファイルをコピーします。
1
2
3
|
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
ワーカーノード
ワーカーノードではクラスタに参加するために、以下のコマンドを実行します。
このコマンドは、コントロールプレーンでクラスタを立ち上げた際に表示されたコマンドです。
IPアドレス、トークン、ハッシュ値は各自変更してください。
1
2
|
$ sudo kubeadm join 10.10.10.240:6443 --token lu4wng.331v1crmk77ouua2 \
--discovery-token-ca-cert-hash sha256:7070922f6dfb288bca91e364e197a06cd641e4cf57b181188624988b3f0e3e43
|
Ciliumのインストール
Kubernetesでは一部の接続をCNIに委譲しています。そのため、クラスタを構築した直後ではPod間およびNode間の接続を行うことができません。
そこで今回はCiliumというCNIをインストールしました。
Cilium Quick Installation — Cilium 1.14.2 documentation
Cilium CLIのインストール
以下のコマンドを実行します。
1
2
3
4
5
|
$ CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
$ CLI_ARCH=amd64
$ curl -L https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz
$ sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
$ rm cilium-linux-${CLI_ARCH}.tar.gz
|
Cilium CLIからCiliumをインストールする
以下のコマンドを実行します。
1
|
$ cilium install --version 1.14.2
|
ステータスチェック
Ciliumが正しくインストールされたか検証するために、以下のコマンドを実行します。
先程のインストールコマンド実行後に、数分おいてから実行してください。
1
2
3
4
5
6
7
|
$ cilium status --wait
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Envoy DaemonSet: disabled (using embedded mode)
\__/¯¯\__/ Hubble Relay: OK
\__/ ClusterMesh: disabled
|
Hubble UIを有効化する
CiliumにはHubbleと呼ばれる通信を可視化するコンポーネントが存在します。
このHubbleのWebUIを有効化しておきます。
1
|
$ cilium hubble enable --ui
|
環境構築終了
これでクラスタの構築とCNIのインストールが終了しました。
検証もかねてKubernetes上でUbuntuを起動してみましょう。
1
2
3
4
|
$ kubectl run -it ubuntu --image=ubuntu bash
If you don't see a command prompt, try pressing enter.
root@ubuntu:/#
|
アタッチされたあとにcurlをインストールして、Googleにアクセスしてみましょう。
1
2
3
4
5
6
7
8
|
root@ubuntu:/# apt update -y && apt install -y curl
root@ubuntu:/# curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
|
動いてそうですね。
おわりに
はじめてのKubernetesで困るところも多かったですが、なんとかインストールすることができました。
晴れて僕もKubernetes入門できました。これから精進していきます。
参考文献