1. はじめに
とある事情でインターネットに繋がらない環境にKubernetesクラスタを構築する必要があったので、その際の手順をまとめました。
2. 環境
2.1. システム構成
- 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のエントリを追加しておきます。
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
[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をオフライン環境に導入する手順をまとめました。
- 仮想化環境や構成、バージョン等によってはこの手順通りにいかない可能性は高いですが、なにかの参考になれば幸いです。