はじめに
本記事では、AlmaLinuxを使用して、Kubernetes(k8s)環境を構築する方法について記載いたします。
ここでは、Control Plainノード×1台とWorkerノード×1台のシンプルな環境を構築します。
環境
- OS
AlmaLinux release 9.5 (Teal Serval) - Container Runtime Interface(CRI)
Containerd v2.0.4 - Kubernetes(k8s)
v1.32 - Container Network Interface(CNI)
calico v3.29.2
Kubernetes(k8s)環境
- Control-Planeノード
ホスト名:cp
IPアドレス:192.168.10.50 - Workerノード
ホスト名:worker01
IPアドレス:192.168.10.51 - Podネットワーク
CIDR:192.168.20.0/24
事前準備
SELinuxの設定
1.SELinuxの設定を「permissive」に変更します。
[maint@cp ~]$ sudo setenforce 0
[maint@cp ~]$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
setenforce: SELinux is disabled
[maint@cp ~]$
2.変更を反映するため、AlmaLinuxを再起動します。
[root@cp ~]# reboot
firewalldの無効化
ここでは、firewalldを無効化します。
[root@cp ~]# systemctl disable firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@cp ~]# systemctl stop firewalld.service
[root@cp ~]#
IPv4 packet forwardingの有効化
1.IPv4パケットのフォワーディングを有効化します。
[maint@cp cp]$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
net.ipv4.ip_forward = 1
[maint@cp cp]$
2.設定を反映します。
[maint@cp ~]$ sudo sysctl --system
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
* Applying /usr/lib/sysctl.d/50-default.conf ...
* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
* Applying /etc/sysctl.d/50-libreswan.conf ...
~(略)~
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.ens160.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.ip_forward = 1
[maint@cp ~]$
3.「net.ipv4.ip_forward = 1」に設定されていることを確認します。
[maint@cp ~]$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[maint@cp ~]$
swapの設定
1.swapを無効化します。
[maint@cp ~]$ sudo swapoff -a
[maint@cp ~]$
2.「/etc/fstab」を以下のとおり、編集します。
[maint@cp ~]$ sudo vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Mar 23 00:36:03 2025
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/almalinux-root / xfs defaults 0 0
UUID=a031484e-30fc-420c-9154-3d729659cf7a /boot xfs defaults 0 0
【以下の行をコメントアウトする】
#/dev/mapper/almalinux-swap none swap defaults 0 0
[maint@cp ~]$
Container Runtime Interface (CRI)のインストール
ここでは、CRIとして「containerd」を使用します。
Containerdのインストール
1.「Containerd」のアーカイブファイルをダウンロードします。
[maint@cp ~]$ wget https://github.com/containerd/containerd/releases/download/v2.0.4/containerd-2.0.4-linux-amd64.tar.gz
[maint@cp ~]$ ls -l
合計 36060
-rw-r--r--. 1 maint maint 36924288 3月 18 02:53 containerd-2.0.4-linux-amd64.tar.gz
[maint@cp ~]$
2.ダウンロードしたアーカイブファイルを展開します。ここでは、「/usr/local」に展開します。
[maint@cp ~]$ sudo tar Cxzvf /usr/local containerd-2.0.4-linux-amd64.tar.gz
bin/
bin/ctr
bin/containerd-stress
bin/containerd
bin/containerd-shim-runc-v2
[maint@cp ~]$
3.systemdを使用するため、「containerd.service」をダウンロードします。
[maint@cp ~]$ wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
[maint@cp ~]$
[maint@cp ~]$ ls -l
合計 36064
-rw-r--r--. 1 maint maint 36924288 3月 18 02:53 containerd-2.0.4-linux-amd64.tar.gz
-rw-r--r-- 1 maint maint 1248 3月 23 10:57 containerd.service
[maint@cp ~]$
4.ダウンロードしたファイルをコピーします。
[maint@cp ~]$ sudo mkdir -p /usr/local/lib/systemd/system/
[maint@cp ~]$ sudo cp -p ./containerd.service /usr/local/lib/systemd/system/containerd.service
[maint@cp ~]$ sudo chown root:root /usr/local/lib/systemd/system/containerd.service
[maint@cp ~]$ ls -l /usr/local/lib/systemd/system/containerd.service
-rw-r--r-- 1 root root 1248 3月 23 10:57 /usr/local/lib/systemd/system/containerd.service
[maint@cp ~]$
5.リロードした後、「containerd」サービスを有効化します。
[maint@cp ~]$ sudo systemctl daemon-reload
[maint@cp ~]$ sudo systemctl enable --now containerd
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /usr/local/lib/systemd/system/containerd.service.
[maint@cp ~]$
[maint@cp ~]$ sudo systemctl status containerd.service
● containerd.service - containerd container runtime
Loaded: loaded (/usr/local/lib/systemd/system/containerd.service; enabled; preset: disabled)
Active: active (running) since Sun 2025-03-23 11:51:45 JST; 35s ago
Docs: https://containerd.io
Process: 6551 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 6552 (containerd)
Tasks: 7
Memory: 31.1M
CPU: 76ms
CGroup: /system.slice/containerd.service
mq6552 /usr/local/bin/containerd
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899478757+09:00" level=info msg="Start cni network conf syncer for default"
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899483726+09:00" level=info msg="Start streaming server"
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899491498+09:00" level=info msg="Registered namespace \"k8s.io\" with NRI"
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899497233+09:00" level=info msg="runtime interface starting up..."
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899501489+09:00" level=info msg="starting plugins..."
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899508015+09:00" level=info msg="Synchronizing NRI (plugin) with current runtime stat>
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899641815+09:00" level=info msg=serving... address=/run/containerd/containerd.sock.tt>
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899699993+09:00" level=info msg=serving... address=/run/containerd/containerd.sock
3月 23 11:51:45 cp containerd[6552]: time="2025-03-23T11:51:45.899778276+09:00" level=info msg="containerd successfully booted in 0.026807s"
3月 23 11:51:45 cp systemd[1]: Started containerd container runtime.
[maint@cp ~]$
runcのインストール
1.「runc」バイナリファイルをダウンロードします。
[maint@cp ~]$ wget https://github.com/opencontainers/runc/releases/download/v1.2.6/runc.amd64
[maint@cp ~]$
[maint@cp ~]$ ls -l
合計 47340
-rw-r--r--. 1 maint maint 36924288 3月 18 02:53 containerd-2.0.4-linux-amd64.tar.gz
-rw-r--r-- 1 maint maint 1248 3月 23 10:57 containerd.service
-rw-r--r-- 1 maint maint 11546208 3月 18 05:23 runc.amd64
[maint@cp ~]$
2.「/usr/local/sbin/runc」にインストールします。
[maint@cp ~]$ mkdir -p /usr/local/sbin
[maint@cp ~]$ sudo install -m 755 ./runc.amd64 /usr/local/sbin/runc
[maint@cp ~]$ ls -l /usr/local/sbin/runc
-rwxr-xr-x 1 root root 11546208 3月 23 11:24 /usr/local/sbin/runc
[maint@cp ~]$
Container Network Interface(CNI) pluginsのインストール
1.「CNI plugins」ファイルをダウンロードします。
[maint@cp ~]$ wget https://github.com/containernetworking/plugins/releases/download/v1.6.2/cni-plugins-linux-amd64-v1.6.2.tgz
[maint@cp ~]$
[maint@cp ~]$ ls -l
合計 98900
-rw-r--r-- 1 maint maint 52794236 1月 7 01:13 cni-plugins-linux-amd64-v1.6.2.tgz
-rw-r--r--. 1 maint maint 36924288 3月 18 02:53 containerd-2.0.4-linux-amd64.tar.gz
-rw-r--r-- 1 maint maint 1248 3月 23 10:57 containerd.service
-rw-r--r-- 1 maint maint 11546208 3月 18 05:23 runc.amd64
[maint@cp ~]$
2.「/opt/cni/bin」に展開します。
[maint@cp ~]$ sudo mkdir -p /opt/cni/bin
[maint@cp ~]$ sudo tar Cxzvf /opt/cni/bin ./cni-plugins-linux-amd64-v1.6.2.tgz
./
./ipvlan
./tap
./loopback
./host-device
./README.md
./portmap
./ptp
./vlan
./bridge
./firewall
./LICENSE
./macvlan
./dummy
./bandwidth
./vrf
./tuning
./static
./dhcp
./host-local
./sbr
[maint@cp ~]$
systemd cgroup driverの設定
1.「config.toml」を作成します。
[root@cp ~]$ mkdir -p /etc/containerd
[root@cp ~]# containerd config default > /etc/containerd/config.toml
[root@cp ~]#
2.「systemd cgroup driver」を使用するように、「/etc/containerd/config.toml」を編集します。
[root@cp ~]# vi /etc/containerd/config.toml
【編集内容】
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
BinaryName = ''
CriuImagePath = ''
CriuWorkPath = ''
IoGid = 0
IoUid = 0
NoNewKeyring = false
Root = ''
ShimCgroup = ''
SystemdCgroup = true <= 追記する。
[root@cp ~]#
3.変更内容を反映するため、「containerd」を再起動します。
[root@cp ~]# systemctl restart containerd.service
[root@cp ~]# systemctl status containerd.service
● containerd.service - containerd container runtime
Loaded: loaded (/usr/local/lib/systemd/system/containerd.service; enabled; preset: disabled)
Active: active (running) since Sun 2025-03-23 13:09:01 JST; 8s ago
Docs: https://containerd.io
Process: 9773 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 9775 (containerd)
Tasks: 7
Memory: 16.8M
CPU: 42ms
CGroup: /system.slice/containerd.service
mq9775 /usr/local/bin/containerd
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190248885+09:00" level=info msg="Start cni network conf syncer for default"
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190253375+09:00" level=info msg="Start streaming server"
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190261056+09:00" level=info msg="Registered namespace \"k8s.io\" with NRI"
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190269145+09:00" level=info msg="runtime interface starting up..."
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190273566+09:00" level=info msg="starting plugins..."
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190280074+09:00" level=info msg="Synchronizing NRI (plugin) with current runtime stat>
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190346827+09:00" level=info msg=serving... address=/run/containerd/containerd.sock.tt>
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190388048+09:00" level=info msg=serving... address=/run/containerd/containerd.sock
3月 23 13:09:01 cp containerd[9775]: time="2025-03-23T13:09:01.190474539+09:00" level=info msg="containerd successfully booted in 0.016336s"
3月 23 13:09:01 cp systemd[1]: Started containerd container runtime.
[root@cp ~]#
kubeadmのインストール
1.「Kubernetes」リポジトリを「yum」リポジトリに追加します。
[maint@cp ~]$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
[maint@cp ~]$
2.「kubelet」、「kubeadm」、「kubectl」をインストールします。
[maint@cp ~]$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
Kubernetes
~(略)~ 5.0 kB/s | 12 kB 00:02
======================================================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
======================================================================================================================================================
インストール:
kubeadm x86_64 1.32.3-150500.1.1 kubernetes 12 M
kubectl x86_64 1.32.3-150500.1.1 kubernetes 11 M
kubelet x86_64 1.32.3-150500.1.1 kubernetes 15 M
依存関係のインストール:
conntrack-tools x86_64 1.4.7-4.el9_5 appstream 222 k
cri-tools x86_64 1.32.0-150500.1.1 kubernetes 7.1 M
kubernetes-cni x86_64 1.6.0-150500.1.1 kubernetes 8.0 M
libnetfilter_cthelper x86_64 1.0.0-22.el9 appstream 23 k
libnetfilter_cttimeout x86_64 1.0.0-19.el9 appstream 22 k
libnetfilter_queue x86_64 1.0.5-1.el9 appstream 28 k
トランザクションの概要
======================================================================================================================================================
インストール 9 パッケージ
~(略)~
インストール済み:
conntrack-tools-1.4.7-4.el9_5.x86_64 cri-tools-1.32.0-150500.1.1.x86_64 kubeadm-1.32.3-150500.1.1.x86_64
kubectl-1.32.3-150500.1.1.x86_64 kubelet-1.32.3-150500.1.1.x86_64 kubernetes-cni-1.6.0-150500.1.1.x86_64
libnetfilter_cthelper-1.0.0-22.el9.x86_64 libnetfilter_cttimeout-1.0.0-19.el9.x86_64 libnetfilter_queue-1.0.5-1.el9.x86_64
完了しました!
[maint@cp ~]$
Control-Planeノードの構築
Clusterの作成
「kubeadm」コマンドを使用して、Clusterを作成します。
コントロールプレーンノードの共有エンドポイントとして、ホスト名(DNS名)を使用します。
ここでは、名前解決の方法として、「hosts」ファイルを使用します。
1.「/etc/hosts」ファイルを編集します。
[maint@cp ~]$ sudo vi /etc/hosts
192.168.10.50 cp <= 追記する
192.168.10.51 worker01 <= 追記する
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[maint@cp ~]$
2.名前解決ができることを確認します。
[maint@cp ~]$ ping cp
PING cp (192.168.10.50) 56(84) bytes of data.
64 バイト応答 送信元 cp (192.168.10.50): icmp_seq=1 ttl=64 時間=0.019ミリ秒
64 バイト応答 送信元 cp (192.168.10.50): icmp_seq=2 ttl=64 時間=0.065ミリ秒
^C
--- cp ping 統計 ---
送信パケット数 2, 受信パケット数 2, 0% packet loss, time 1056ms
rtt min/avg/max/mdev = 0.019/0.042/0.065/0.023 ms
[maint@cp ~]$
3,コントロールプレーンを初期化します。
ここでは、「pod network cidr」を「192.168.20.0/24」とします。
※このCIDRは、Container Network Interface(CNI)で指定するCIDRと一致させる必要があります。
[maint@cp ~]$ sudo kubeadm init --control-plane-endpoint cp --pod-network-cidr "192.168.20.0/24" --upload-certs
~(略)~
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
/* ==================================================
Control-Planeノードを追加する際やWorkerノードを追加する際に必要になるため、
以下のメッセージを保存して置きます。
/* ==================================================
You can now join any number of control-plane nodes running the following command on each as root:
kubeadm join cp:6443 --token 1j0leg.684r39zz57wbcggi \
--discovery-token-ca-cert-hash sha256:551f1f348bdc0e46715451e31f86271c87299b701e584890e01b59b01b2015bd \
--control-plane --certificate-key 698a5c01ca4a889a403412b07b67b8ad22fe4955ba5d7c3997208094b65562f0
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join cp:6443 --token 1j0leg.684r39zz57wbcggi \
--discovery-token-ca-cert-hash sha256:551f1f348bdc0e46715451e31f86271c87299b701e584890e01b59b01b2015bd
[maint@cp ~]$
4.メッセージに記載されている通り、一般ユーザーでコマンドを実行できるようにします。
[maint@cp ~]$ mkdir -p $HOME/.kube
[maint@cp ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[maint@cp ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
[maint@cp ~]$
5.コントロールプレーンの稼働確認を行います。
「STATUS」が「NotReady」となっていますが、これは、「Container Network Interface(CNI)」がインストールされていないためです。
[maint@cp ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
cp NotReady control-plane 5m39s v1.32.3
[maint@cp ~]$
Container Network Interface(CNI)のインストール
「Pod」が相互に通信できるようにするためには、Container Network Interface(CNI)ベースの「Pod」ネットワークアドオンを実装する必要があります。
ここでは、「Calico」を実装します。
1.Tigeraオペレーター定義ファイルをダウンロードします。
[maint@cp ~]$ wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml
[maint@cp ~]$ ls -l
合計 100476
-rw-r--r-- 1 maint maint 52794236 1月 7 01:13 cni-plugins-linux-amd64-v1.6.2.tgz
-rw-r--r--. 1 maint maint 36924288 3月 18 02:53 containerd-2.0.4-linux-amd64.tar.gz
-rw-r--r-- 1 maint maint 1248 3月 23 10:57 containerd.service
-rw-r--r-- 1 maint maint 11546208 3月 18 05:23 runc.amd64
-rw-r--r-- 1 maint maint 1613665 3月 23 14:09 tigera-operator.yaml
[maint@cp ~]$
2.Tigeraオペレーターとカスタムリソース定義をインストールします。
[maint@cp ~]$ kubectl create -f ./tigera-operator.yaml
namespace/tigera-operator created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/tiers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/adminnetworkpolicies.policy.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/apiservers.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/imagesets.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/installations.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/tigerastatuses.operator.tigera.io created
serviceaccount/tigera-operator created
clusterrole.rbac.authorization.k8s.io/tigera-operator created
clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created
deployment.apps/tigera-operator created
[maint@cp ~]$
3.Tigeraオペレーターの確認を行います。
[maint@cp ~]$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-668d6bf9bc-lp7dk 0/1 Pending 0 21m
kube-system coredns-668d6bf9bc-pqc8v 0/1 Pending 0 21m
kube-system etcd-cp 1/1 Running 0 21m
kube-system kube-apiserver-cp 1/1 Running 0 21m
kube-system kube-controller-manager-cp 1/1 Running 0 21m
kube-system kube-proxy-cjf7l 1/1 Running 0 21m
kube-system kube-scheduler-cp 1/1 Running 0 21m
tigera-operator tigera-operator-ccfc44587-q4v9b 1/1 Running 0 101s
[maint@cp ~]$
4.カスタムリソースファイルをダウンロードします。
[maint@cp ~]$ wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/custom-resources.yaml
[maint@cp ~]$ ls -l
合計 100480
-rw-r--r-- 1 maint maint 52794236 1月 7 01:13 cni-plugins-linux-amd64-v1.6.2.tgz
-rw-r--r--. 1 maint maint 36924288 3月 18 02:53 containerd-2.0.4-linux-amd64.tar.gz
-rw-r--r-- 1 maint maint 1248 3月 23 10:57 containerd.service
-rw-r--r-- 1 maint maint 777 3月 23 14:20 custom-resources.yaml
-rw-r--r-- 1 maint maint 11546208 3月 18 05:23 runc.amd64
-rw-r--r-- 1 maint maint 1613665 3月 23 14:09 tigera-operator.yaml
[maint@cp ~]$
5.ダウンロードした「custom-resources.yaml」を編集します。
「pod network CIDR」を「kebeadm init」で指定した「192.168.20.0/24」に修正します。
[maint@cp ~]$ vi custom-resources.yaml
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
ipPools:
- name: default-ipv4-ippool
blockSize: 26
cidr: 192.168.20.0/24 <= kubeadm initで指定したCIDRを記載する。
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
[maint@cp ~]$
6.カスタムリソース定義に基づいて、「Calico」をインストールします。
[maint@cp ~]$ kubectl create -f custom-resources.yaml
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created
[maint@cp ~]$
7.インストール確認を行います。
すべての「STATUS」が「Running」となれば完了です。
[maint@cp ~]$ watch kubectl get pods -n calico-system
Every 2.0s: kubectl get pods -n calico-system cp: Sun Mar 23 14:33:12 2025
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-f98894c9-gp9sz 1/1 Running 0 2m47s
calico-node-6kzrs 1/1 Running 0 2m47s
calico-typha-9cdd56d7f-9j6kl 1/1 Running 0 2m47s
csi-node-driver-9fx9c 2/2 Running 0 2m47s
[maint@cp ~]$
8.コントロールプレーン(Node)の状態を確認します。
「STATUS」が「Ready」となっていることを確認します。
[maint@cp ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
cp Ready control-plane 39m v1.32.3
[maint@cp ~]$
9.Podの状態を確認します。
すべての「STATUS」が「Running」となっていることを確認します。
[maint@cp ~]$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-6f64f486f-s2c6t 1/1 Running 0 6m17s
calico-apiserver calico-apiserver-6f64f486f-x28l4 1/1 Running 0 6m17s
calico-system calico-kube-controllers-f98894c9-gp9sz 1/1 Running 0 6m17s
calico-system calico-node-6kzrs 1/1 Running 0 6m17s
calico-system calico-typha-9cdd56d7f-9j6kl 1/1 Running 0 6m17s
calico-system csi-node-driver-9fx9c 2/2 Running 0 6m17s
kube-system coredns-668d6bf9bc-lp7dk 1/1 Running 0 40m
kube-system coredns-668d6bf9bc-pqc8v 1/1 Running 0 40m
kube-system etcd-cp 1/1 Running 0 40m
kube-system kube-apiserver-cp 1/1 Running 0 40m
kube-system kube-controller-manager-cp 1/1 Running 0 40m
kube-system kube-proxy-cjf7l 1/1 Running 0 40m
kube-system kube-scheduler-cp 1/1 Running 0 40m
tigera-operator tigera-operator-ccfc44587-q4v9b 1/1 Running 0 20m
[maint@cp ~]$
Workerノードの構築
WorkerノードをClusterに追加する前に、Control-Planeノードで行った以下の作業を行います。
- 事前準備
- 「containerd」のインストール
- 「runc」のインストール
- 「CNI plugins」のインストール
- 「systemd cgroup driver」の設定
- 「kubeadmのインストール」
Workerノードの追加
Control-Planeノードの構築で実行した「kubeadm init」コマンドの結果に記載されているコマンドを実行します。
【kubeadm init実行結果の抜粋】
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join cp:6443 --token 1j0leg.684r39zz57wbcggi \
--discovery-token-ca-cert-hash sha256:551f1f348bdc0e46715451e31f86271c87299b701e584890e01b59b01b2015bd
Clusterに参加します。
[maint@cp ~]$ sudo kubeadm join cp:6443 --token 1j0leg.684r39zz57wbcggi \
--discovery-token-ca-cert-hash sha256:551f1f348bdc0e46715451e31f86271c87299b701e584890e01b59b01b2015bd
[maint@cp ~]$
Control-Planeノードでworkerノードが追加されていることを確認します。
[maint@cp ~]$ kubectl get nodes -A
[maint@cp ~]$
以上で終了です。