0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetesのオフラインインストール(on VirtualBox)

Last updated at Posted at 2025-08-02

1. はじめに

とある事情でインターネットに繋がらない環境にKubernetesクラスタを構築する必要があったので、その際の手順をまとめました。

2. 環境

2.1. システム構成

qiita.png

  • VirtualBoxに3つのVMを構築しました。
  • 1つは導入に必要な資材をインターネットからダウンロードするためのVM(以下オンラインVM)で、残り2つはKubernetesのコントロールプレーンとワーカーノードで、これらはインターネットに繋がらない構成とします。
  • ネットワーク構成ですが、オンラインVMはネットワークアダプターを2つ作成し、1つはインターネットに接続するためにNATタイプのアダプター、もう1つはKubernetes用VMとの通信用であるホストオンリーアダプターで構成します。
  • コントロールプレーンおよびワーカーノード用のVMはホストオンリーアダプターのみです。

2.2. ソフトウェアバージョン

  • ホストOS:CentOS Stream release 9
  • Kubernetes:v1.32.7

3. 準備

3.1. OSセットアップ

3.1.1. オンラインVM

  • CentOS9は最小構成でインストールしました。
  • オンライン側でインストール用資材をダウンロードし、それをオフラインのコントロールプレーンとワーカーノードにコピーする操作を複数回行うため、SSH公開鍵認証でオフライン側にアクセスできるようにしておくと楽です。
# ssh-keygen -t rsa -b 4096
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@<コントロールプレーンのIPアドレス>
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@<ワーカーノードのIPアドレス>
  • コンテナイメージをpullするためにpodmanをインストールしておきます。
# dnf install -y podman
  • yumdownloaderコマンドを使用するので yum-utilsをインストールしておきます。
# dnf install -y yum-utils

3.2.2. オフラインVM(コントロールプレーン&ワーカーノード)

  • CentOS9は最小構成でインストールしました。
  • 必要なrpmをオフラインでインストールするために、CentOS9のisoファイルをマウントしてローカルリポジトリを作成します(作成方法はこちらの記事等を参考にしてください)。
  • KubernetesのPodネットワークの構築の際、各VMのNICにデフォルトゲートウェイを設定しておかないとPodネットワークが正常動作しませんでした。今回はVirtualBoxのホストオンリーアダプターを使用しているので、ホストオンリーネットワークにおけるホストOSのIPアドレス(192.168.56.1)をゲートウェイアドレスとして設定しておきます(実際の検証ではかなり後で発覚&対応したのですが、前もってやっておいた方がいいでしょう)。
# nmcli device show enp0s3 | grep IP4.GATEWAY
IP4.GATEWAY:                            --        <== 未設定状態(デフォルト)

# nmcli connection modify enp0s3 ipv4.gateway 192.168.56.1  <== デフォルトゲートウェイを設定
# nmcli connection down enp0s3           <== NICを落とし上げして反映
# nmcli connection up enp0s3

# nmcli device show enp0s3 | grep IP4.GATEWAY
IP4.GATEWAY:                            192.168.56.1  <== 設定されたことを確認
  • /etc/hostsファイルに各VMのエントリを追加しておきます。
/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.56.102  test01 test01.hoge.com       <== 追記
192.168.56.103  test02 test02.hoge.com       <== 追記
  • インストール用の資材置き場(ディレクトリ)を作成しておきます。
# mkdir -p /work/{docker,k8s,images,manifests}
  • podmanをインストールしておきます。
# dnf install -y podman

3.2. 必要資材のダウンロード①

オンラインVMで実施します。

インストールに必要なものをダウンロードします。

3.2.1 rpmパッケージ

  • コンテナランタイム(containerd)
# mkdir -p /work/docker
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yumdownloader --assumeyes --destdir=/work/docker/containerd --resolve containerd.io
  • Kubernetes関連
# cat > /etc/yum.repos.d/kubernetes.repo << 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
EOF

# mkdir -p /work/k8s
# yumdownloader --assumeyes --destdir=/work/k8s/ --resolve kubeadm.x86_64 kubectl.x86_64 kubelet.x86_64

3.2.2 コンテナイメージ

  • コンテナレジストリのイメージをpull&save
# podman pull registry:2
# mkdir -p /work/images
# podman save registry:2 > /work/images/registry.tar

3.2.3. ダウンロードした資材の転送

3.2.1~3.2.2でダウンロードしたファイルをコントロールプレーンとワーカーノードにコピーします。

# scp -p /work/docker/containerd/* root@<コントロールプレーンのIPアドレス>:/work/docker/
# scp -p /work/k8s/* root@<コントロールプレーンのIPアドレス>:/work/k8s/
# scp -p /work/images/* root@<コントロールプレーンのIPアドレス>:/work/images/


# scp -p /work/docker/containerd/* root@<ワーカーノードのIPアドレス>:/work/docker/
# scp -p /work/k8s/* root@<ワーカーノードのIPアドレス>:/work/k8s/

4. プライベートレジストリの構築

コントロールプレーンで実施します。

プライベートレジストリのコンテナを起動します。

# cd /work/images/
# podman load < registry.tar
# mkdir -p /var/lib/containers/registry
# podman run --privileged -d -p 5000:5000 -v /var/lib/containers/registry:/var/lib/registry registry:2

稼働確認します。

# podman ps
CONTAINER ID  IMAGE                         COMMAND               CREATED        STATUS        PORTS                   NAMES
57f590e3ac8a  docker.io/library/registry:2  /etc/docker/regis...  4 seconds ago  Up 4 seconds  0.0.0.0:5000->5000/tcp  eloquent_kare

次に、OSが再起動された後も自動的にコンテナが起動するように設定しておきます。
Podman v4.7以降ではQuadletの使用が推奨されているようなので、今回はこの方法で設定します。

以下のコマンドでyamlファイルを作成します。

# podman generate kube <コンテナID> -f ~/registry.yaml

Quadletファイルを作成します。

# mkdir -p ~/.config/containers/systemd/
# vi  ~/.config/containers/systemd/registry.kube
registry.kube
[Unit]
Description=Private Container Registry
Before=local-fs.target

[Kube]
Yaml=/root/registry.yaml
PublishPort=5000:5000

[Service]
Restart=always

[Install]
WantedBy=multi-user.target default.target

構文チェックを実行します。

# /usr/lib/systemd/system-generators/podman-system-generator --user --dryrun

設定を反映します。

# systemctl --user daemon-reload

これでOS再起動時にプライベートレジストリのコンテナが自動起動されるようになります。

5. Kubernetesインストール

5.1. インストール(前半)

コントロールプレーンで実施します。

CentOS9へのk8sインストール手順はこちらを参考にしていますが、オンライン環境向けの手順のため一部をオフライン用に変更する必要があります。

  • kernel-develのインストール
# dnf install -y kernel-devel-$(uname -r)
  • kernelモジュールの追加
# modprobe br_netfilter
# modprobe ip_vs
# modprobe ip_vs_rr
# modprobe ip_vs_wrr
# modprobe ip_vs_sh
# modprobe overlay

# cat > /etc/modules-load.d/kubernetes.conf << EOF
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
overlay
EOF
  • Sysctlの設定
# cat > /etc/sysctl.d/kubernetes.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# sysctl --system
  • swapの無効化
# swapoff -a
# sed -e '/swap/s/^/#/g' -i /etc/fstab
  • containerdのインストール
    ※バージョンは導入当時のものです。
# cd /work/docker
# yum install -y --cacheonly --disablerepo=* ./containerd.io-1.7.27-3.1.el9.x86_64.rpm
  • containerdの設定
# containerd config default > /etc/containerd/config.toml
# cp -p /etc/containerd/config.toml /etc/containerd/config.toml.org
# vi /etc/containerd/config.toml
# diff /etc/containerd/config.toml /etc/containerd/config.toml.org
139c139
<             SystemdCgroup = true   <=== SystemdCgroupの値を true に変更
---
>             SystemdCgroup = false
  • containerdの起動
# systemctl enable --now containerd.service
# systemctl status containerd.service
● containerd.service - containerd container runtime
Loaded: loaded (/usr/lib/systemd/system/containerd.service; enabled; preset: disabled)
Active: active (running) since Thu 2025-03-20 18:14:57 JST; 5s ago
Docs: https://containerd.io
Process: 36840 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 36841 (containerd)
Tasks: 7
  :

ここで一度OSを再起動します。

# reboot

再起動後は、念の為containerdの稼働確認をもう一度しておきます。

# systemctl status containerd.service
  • firewalldの停止
    オフライン環境なので今回は止めちゃいます。
# systemctl disable --now firewalld
# systemctl status firewalld
  • Kubernetes関連コンポーネントのインストール
# cd /work/k8s
# yum install -y --cacheonly --disablerepo=* ./*.rpm
  • kubeletの起動
# systemctl enable --now kubelet.service

# systemctl status kubelet.service   ※稼働確認
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
mq10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Thu 2025-03-20 18:31:40 JST; 5s ago
Docs: https://kubernetes.io/docs/
Process: 5014 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAI>
Main PID: 5014 (code=exited, status=1/FAILURE)
    :

この時点ではエラーが表示された状態になりますが無視して問題ありません

  • 必要イメージの確認
    kubeadmコマンドを導入後にkubernetesインストールに必要なコンテナイメージが確認可能になります。
# kubeadm config images list
    :
registry.k8s.io/kube-apiserver:v1.32.7
registry.k8s.io/kube-controller-manager:v1.32.7
registry.k8s.io/kube-scheduler:v1.32.7
registry.k8s.io/kube-proxy:v1.32.7
registry.k8s.io/coredns/coredns:v1.11.3
registry.k8s.io/pause:3.10
registry.k8s.io/etcd:3.5.16-0

出力されたイメージ名&タグをメモしておきます。

5.2. 必要資材のダウンロード②

オンラインVMで実施します。

オンラインVMに戻り、必要なコンテナイメージを入手します。

# cd /work/images
# podman pull registry.k8s.io/kube-apiserver:v1.32.7
# podman pull registry.k8s.io/kube-controller-manager:v1.32.7
# podman pull registry.k8s.io/kube-scheduler:v1.32.7
# podman pull registry.k8s.io/kube-proxy:v1.32.7
# podman pull registry.k8s.io/coredns/coredns:v1.11.3
# podman pull registry.k8s.io/pause:3.10
# podman pull registry.k8s.io/etcd:3.5.16-0

pullしたイメージをsaveしてコントロールプレーンにコピーします。

# podman save registry.k8s.io/kube-apiserver:v1.32.7 > k8s_image1.tar
# podman save registry.k8s.io/kube-controller-manager:v1.32.7 > k8s_image2.tar
# podman save registry.k8s.io/kube-scheduler:v1.32.7 > k8s_image3.tar
# podman save registry.k8s.io/kube-proxy:v1.32.7 > k8s_image4.tar
# podman save registry.k8s.io/coredns/coredns:v1.11.3 > k8s_image5.tar
# podman save registry.k8s.io/pause:3.10 > k8s_image6.tar
# podman save registry.k8s.io/etcd:3.5.16-0 > k8s_image7.tar

# scp -p /work/images/k8s_*.tar root@<コントロールプレーンのIPアドレス>:/work/images/

5.3. インストール(後半)

コントロールプレーンで実施します。

  • コンテナイメージのload
# cd /work/images/
# podman load < k8s_image1.tar
# podman load < k8s_image2.tar
# podman load < k8s_image3.tar
# podman load < k8s_image4.tar
# podman load < k8s_image5.tar
# podman load < k8s_image6.tar
# podman load < k8s_image7.tar

# podman images
REPOSITORY                               TAG         IMAGE ID      CREATED        SIZE
registry.k8s.io/kube-apiserver           v1.32.7     761ae2258f18  8 days ago     98.1 MB
registry.k8s.io/kube-controller-manager  v1.32.7     87f922d0bde0  8 days ago     90.8 MB
registry.k8s.io/kube-scheduler           v1.32.7     36cc9c80994e  8 days ago     70.7 MB
registry.k8s.io/kube-proxy               v1.32.7     d5bc66d8682f  8 days ago     95.3 MB
registry.k8s.io/etcd                     3.5.16-0    a9e7e6b294ba  10 months ago  151 MB
registry.k8s.io/coredns/coredns          v1.11.3     c69fa2e9cbf5  11 months ago  63.3 MB
registry.k8s.io/pause                    3.10        873ed7510279  14 months ago  740 kB
docker.io/library/registry               2           26b2eb03618e  22 months ago  26 MB
  • タグ付け
    ※タグ名のFQDNはお使いの環境のものに置き換えてください
# podman tag registry.k8s.io/kube-apiserver:v1.32.7 test01.hoge.com:5000/kube-apiserver:v1.32.7
# podman tag registry.k8s.io/kube-controller-manager:v1.32.7 test01.hoge.com:5000/kube-controller-manager:v1.32.7
# podman tag registry.k8s.io/kube-scheduler:v1.32.7 test01.hoge.com:5000/kube-scheduler:v1.32.7
# podman tag registry.k8s.io/kube-proxy:v1.32.7 test01.hoge.com:5000/kube-proxy:v1.32.7
# podman tag registry.k8s.io/coredns/coredns:v1.11.3 test01.hoge.com:5000/coredns:v1.11.3
# podman tag registry.k8s.io/pause:3.10 test01.hoge.com:5000/pause:3.10
# podman tag registry.k8s.io/etcd:3.5.16-0 test01.hoge.com:5000/etcd:3.5.16-0

# podman images
REPOSITORY                                    TAG         IMAGE ID      CREATED        SIZE
registry.k8s.io/kube-apiserver                v1.32.7     761ae2258f18  8 days ago     98.1 MB
test01.hoge.com:5000/kube-apiserver           v1.32.7     761ae2258f18  8 days ago     98.1 MB
registry.k8s.io/kube-scheduler                v1.32.7     36cc9c80994e  8 days ago     70.7 MB
test01.hoge.com:5000/kube-controller-manager  v1.32.7     87f922d0bde0  8 days ago     90.8 MB
registry.k8s.io/kube-controller-manager       v1.32.7     87f922d0bde0  8 days ago     90.8 MB
test01.hoge.com:5000/kube-scheduler           v1.32.7     36cc9c80994e  8 days ago     70.7 MB
test01.hoge.com:5000/kube-proxy               v1.32.7     d5bc66d8682f  8 days ago     95.3 MB
registry.k8s.io/kube-proxy                    v1.32.7     d5bc66d8682f  8 days ago     95.3 MB
test01.hoge.com:5000/etcd                     3.5.16-0    a9e7e6b294ba  10 months ago  151 MB
registry.k8s.io/etcd                          3.5.16-0    a9e7e6b294ba  10 months ago  151 MB
test01.hoge.com:5000/coredns                  v1.11.3     c69fa2e9cbf5  11 months ago  63.3 MB
registry.k8s.io/coredns/coredns               v1.11.3     c69fa2e9cbf5  11 months ago  63.3 MB
test01.hoge.com:5000/pause                    3.10        873ed7510279  14 months ago  740 kB
registry.k8s.io/pause                         3.10        873ed7510279  14 months ago  740 kB
docker.io/library/registry                    2           26b2eb03618e  22 months ago  26 MB
  • タグ付けした方のイメージをプライベートレジストリにpush
# podman push test01.hoge.com:5000/kube-apiserver:v1.32.7 --tls-verify=false
# podman push test01.hoge.com:5000/kube-controller-manager:v1.32.7 --tls-verify=false
# podman push test01.hoge.com:5000/kube-scheduler:v1.32.7 --tls-verify=false
# podman push test01.hoge.com:5000/kube-proxy:v1.32.7 --tls-verify=false
# podman push test01.hoge.com:5000/coredns:v1.11.3 --tls-verify=false
# podman push test01.hoge.com:5000/pause:3.10 --tls-verify=false
# podman push test01.hoge.com:5000/etcd:3.5.16-0 --tls-verify=false
  • containerdの設定変更
# vi /etc/containerd/config.toml
(変更内容)
67行目: sandbox_imageの場所とバージョンを修正	
	sandbox_image = "registry.k8s.io/pause:3.8"
	 ↓
	sandbox_image = "test01.hoge.com:5000/pause:3.10"
	
	
167行目~:containerdがプライベートレジストリにHTTPでアクセスできるよう設定を追加
	[plugins."io.containerd.grpc.v1.cri".registry.configs]
	
	[plugins."io.containerd.grpc.v1.cri".registry.headers]
	
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors]

    ↓

	[plugins."io.containerd.grpc.v1.cri".registry.configs]
	  [plugins."io.containerd.grpc.v1.cri".registry.configs."test01.hoge.com:5000".tls] 追加
	    insecure_skip_verify = true                              追加
	
	[plugins."io.containerd.grpc.v1.cri".registry.headers]
	
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
	  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."test01.hoge.com:5000"]  追加
	    endpoint = ["http://test01.hoge.com:5000"]                    追加

変更後、containerdを再起動します。

# systemctl restart containerd
  • resolv.confの設定
    ファイルが存在しないとこの後のkubeadm init時にkube-apiserverが上がってこずにタイムアウトエラーとなります(中身は空でOK)
# touch /etc/resolv.conf

このタイミングでVMのスナップショットを取得しておいた方がよいでしょう

  • Kubernetesクラスターの作成
kubeadm init --pod-network-cidr=10.244.0.0/16 \
 --kubernetes-version=v1.32.7 \
 --apiserver-advertise-address=192.168.56.102 \    ※コントロールプレーンノードのIPアドレス
 --image-repository="test01.hoge.com:5000"     ※プライベートレジストリのアドレス

実行後、以下のメッセージが出力されるまで待ちます。

Your Kubernetes control-plane has initialized successfully!

また、出力の最後に表示されるワーカーノード追加用コマンド(kubeadm join~)も後で使用するので必ずメモしておきます。

   :
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join xx.xx.xx.xx:6443 --token xxxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa1
  • kubeconfig作成
# cd
# mkdir .kube
# cp /etc/kubernetes/admin.conf $HOME/.kube/config
# export KUBECONFIG=$HOME/.kube/config

なお、この時点ではまだコントロールプレーンはReadyではありません。

# kubectl get node
NAME     STATUS     ROLES           AGE    VERSION
test01   NotReady   control-plane   106s   v1.32.3

続けてPodネットワークの構築に進みます。

6. Podネットワーク構築

今回はflannelにてPodネットワークを構築します。

6.1. マニフェストのダウンロード

オンラインVMで実施します。

# cd /work/
# mkdir flannel
# cd flannel/
# curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

6.2. コンテナイメージの入手

  • ダウンロードしたマニフェストに記載されているイメージとタグの確認
# grep image kube-flannel.yml
image: ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1
image: ghcr.io/flannel-io/flannel:v0.26.7
image: ghcr.io/flannel-io/flannel:v0.26.7  <== こちらは一つ上と重複しているので無視

※必要なイメージの数はバージョンによって異なる可能性があります。

  • イメージをpull & save
# podman pull ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1
# podman pull ghcr.io/flannel-io/flannel:v0.26.7

# podman save ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1 > flannel_image1.tar
# podman save ghcr.io/flannel-io/flannel:v0.26.7 > flannel_image2.tar
# ls -l
合計 94736
-rw-r--r--. 1 root root 11042304  5月 30 14:23 flannel_image1.tar
-rw-r--r--. 1 root root 85955072  5月 30 14:23 flannel_image2.tar
-rw-r--r--. 1 root root     4348  3月 27 03:12 kube-flannel.yml
  • イメージとマニフェストをコントロールプレーンにコピー
# ssh root@<コントロールプレーンのIPアドレス> mkdir /work/flannel/
# scp flannel_image*.tar root@<コントロールプレーンのIPアドレス>:/work/flannel/
# scp kube-flannel.yml root@<コントロールプレーンのIPアドレス>:/work/flannel/

6.3. flannelのインストール

コントロールプレーンで実施します。

  • コンテナイメージのload
# cd /work/flannel
# podman load -i flannel_image1.tar
# podman load -i flannel_image2.tar
  • タグ付け
# podman tag ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1 test01.hoge.com:5000/flannel-io/flannel-cni-plugin:v1.7.1-flannel1
# podman tag ghcr.io/flannel-io/flannel:v0.26.7 test01.hoge.com:5000/flannel-io/flannel:v0.26.7
  • タグ付けした方のイメージをプライベートレジストリにpush
# podman push test01.hoge.com:5000/flannel-io/flannel-cni-plugin:v1.7.1-flannel1 --tls-verify=false
# podman push test01.hoge.com:5000/flannel-io/flannel:v0.26.7 --tls-verify=false
  • マニフェストの編集
# cp -p kube-flannel.yml kube-flannel.yml.org
# vi kube-flannel.yml
(変更内容)
コンテナイメージの場所をプライベートレジストリに変更します。

137行目: 	
	image: ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1
	 ↓
	image: test01.hoge.com:5000/flannel-io/flannel-cni-plugin:v1.7.1-flannel1
	
147行目: 	
	image: ghcr.io/flannel-io/flannel:v0.26.7
	 ↓
	image: test01.hoge.com:5000/flannel-io/flannel:v0.26.7

161行目: 	
	image: ghcr.io/flannel-io/flannel:v0.26.7
	 ↓
	image: test01.hoge.com:5000/flannel-io/flannel:v0.26.7

※編集箇所はバージョンによって異なる可能性があります。

  • マニフェストの適用
# kubectl apply -f ./kube-flannel.yml

しばらく待つとコントロールプレーンがReadyになりました。

# kubectl get node
NAME     STATUS   ROLES           AGE   VERSION
test01   Ready    control-plane   72m   v1.32.3

ですが、corednsとflannelのPodがまだRunningになりません。

# kubectl get pod --all-namespaces
NAMESPACE      NAME                             READY   STATUS              RESTARTS      AGE
kube-flannel   kube-flannel-ds-l9nlb            0/1     Error               3 (25s ago)   43s
kube-system    coredns-5778b5f575-2bjtx         0/1     ContainerCreating   0             73m
kube-system    coredns-5778b5f575-cdbxk         0/1     ContainerCreating   0             73m
kube-system    etcd-test01                      1/1     Running             0             73m
kube-system    kube-apiserver-test01            1/1     Running             0             73m
kube-system    kube-controller-manager-test01   1/1     Running             0             73m
kube-system    kube-proxy-5qt4v                 1/1     Running             0             73m
kube-system    kube-scheduler-test01            1/1     Running             0             73m

いろいろと問題判別をした結果、以下3つの対応で解決しました。

  • コントロールプレーンノード(ホスト)にデフォルトゲートウェイを設定
    → 3.2.2で実施済み
  • ルーティング追加
# ip route add 10.96.0.1 via 192.168.56.1
  • /etc/resolv.confの設定
    VirturlBoxのホストオンリーネットワークにおけるホストOSのIPアドレス(192.168.56.1)をネームサーバーとして設定
# cat "nameserver 192.168.56.1" > /etc/resolv.conf
  • CoreDNSのConfigMapにhostsエントリを追加
# kubectl edit cm coredns -n kube-system

以下のようにエントリを追加します。

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  Corefile: |
    .:53 {
      errors
      health {
        lameduck 5s
      }
      # 以下追加
      hosts {
        xx.xx.xx.xx test01.hoge.com test01    ※コントロールプレーン用VMの情報を記述
        fallthrough
      }
      # 追加ここまで
      ready
      kubernetes cluster.local in-addr.arpa ip6.arpa {
             :

変更後CoreDNSのPodを再起動します。

kubectl -n kube-system rollout restart deployment coredns

これで全PodがRunningになりました。

# kubectl get pod --all-namespaces
NAMESPACE      NAME                             READY   STATUS    RESTARTS      AGE
kube-flannel   kube-flannel-ds-l9nlb            1/1     Running   8 (15m ago)   26m
kube-system    coredns-84688d95f6-hmhlm         1/1     Running   0             11s
kube-system    coredns-84688d95f6-p97vr         1/1     Running   0             11s
kube-system    etcd-test01                      1/1     Running   0             98m
kube-system    kube-apiserver-test01            1/1     Running   0             98m
kube-system    kube-controller-manager-test01   1/1     Running   0             98m
kube-system    kube-proxy-5qt4v                 1/1     Running   0             98m
kube-system    kube-scheduler-test01            1/1     Running   1 (13m ago)   98m

7. ワーカーノード追加

ワーカーノードで実施します。

ワーカーノードの追加手順は以下の3ステップになります。

1.「5.1. インストール(前半)」の「kubeletの起動」までの作業を実施します

2.空のresolv.confを作成します

# touch /etc/resolv.conf

3.containerdの設定変更&再起動を行います。

# vi /etc/containerd/config.toml
(変更内容)
67行目: sandbox_imageの場所とバージョンを修正	
	sandbox_image = "registry.k8s.io/pause:3.8"
	 ↓
	sandbox_image = "test01.hoge.com:5000/pause:3.10"
	
	
167行目~:containerdがプライベートレジストリにHTTPでアクセスできるよう設定を追加
	[plugins."io.containerd.grpc.v1.cri".registry.configs]
	
	[plugins."io.containerd.grpc.v1.cri".registry.headers]
	
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors]

    ↓

	[plugins."io.containerd.grpc.v1.cri".registry.configs]
	  [plugins."io.containerd.grpc.v1.cri".registry.configs."test01.hoge.com:5000".tls] 追加
	    insecure_skip_verify = true                              追加
	
	[plugins."io.containerd.grpc.v1.cri".registry.headers]
	
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
	  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."test01.hoge.com:5000"]  追加
	    endpoint = ["http://test01.hoge.com:5000"]                    追加
# systemctl restart containerd

4.「5.3. インストール(後半)」の最後でメモしたコマンドを実行します

# kubeadm join xx.xx.xx.xx:6443 --token xxxxxxxxx --discovery-token-ca-cert-hash sha256:yyyyyyyyyyyy

ただワーカーノードについてもネットワーク周りの問題でReadyにならなかったため、以下2つの追加対応を実施しています。

  • デフォルトゲートウェイを設定
    → 今回は3.2.2で実施済み
  • ルーティング追加
# ip route add 10.96.0.1 via 192.168.56.1

これでワーカーノードがReadyになり、全てのPodがRunningになりました。

# kubectl get node
NAME       STATUS   ROLES           AGE     VERSION
test01     Ready    control-plane   3h35m   v1.32.3
test02     Ready    <none>          21m     v1.32.3

# kubectl get pod --all-namespaces
NAMESPACE      NAME                             READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-9565n            1/1     Running   0          77m
kube-flannel   kube-flannel-ds-cz9tg            1/1     Running   0          8m26s
kube-system    coredns-84f7c69758-5wgsj         1/1     Running   0          65m
kube-system    coredns-84f7c69758-cnxbn         1/1     Running   0          65m
kube-system    etcd-test01                      1/1     Running   0          86m
kube-system    kube-apiserver-test01            1/1     Running   0          86m
kube-system    kube-controller-manager-test01   1/1     Running   0          86m
kube-system    kube-proxy-v6hdx                 1/1     Running   0          8m26s
kube-system    kube-proxy-x2ddm                 1/1     Running   0          86m
kube-system    kube-scheduler-test01            1/1     Running   0          86m

8. デプロイテスト

テスト用のnamespaceを作成し、軽めのPod(nginx等)をデプロイして問題無いことを確認します。

9. まとめ

  • 非常にニッチなケースとは思いますが、kubenetesをオフライン環境に導入する手順をまとめました。
  • 仮想化環境や構成、バージョン等によってはこの手順通りにいかない可能性は高いですが、なにかの参考になれば幸いです。
0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?