2
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?

More than 1 year has passed since last update.

kubernetes - kubeadm でオンプレ環境準備

Last updated at Posted at 2022-06-29

背景

Kubernetes 完全ガイドで勉強するために kubeadm でオンプレ環境を用意します。
環境は以下の通りです。

・CentOS7.9 - masternode / master1
・CentOS7.9 - workernode / worker1
※ ノードは必要になれば追加します

kubeadm のインストール

手順は公式サイトに則ります。

前提条件

CentOS7 を満たしていれば良さそうです。

事前準備

iptables がブリッジを通過するトラフィックを処理できるようにする

[root@master1 ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
[root@master1 ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
* Applying /etc/sysctl.conf ...
*

カーネルパラメータを変更したようですね。

iptables が nftables バックエンドを使用しないようにする

Cent7 は対応不要項目ですが、"RHEL 8 はレガシーモードへの切り替えをサポートしていないため現在の kubeadm パッケージとは互換性がありません" とのことです。
Cent8 で kubeadm 使えないので注意が必要ですね。

必要ポートの確認

検証環境なので必要に応じてポート開放 or firewalld 無効化で行きます。

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

Kubernetes は複数のコンテナランタイムをサポートしています。
Docker・containerd・CRI-O などです。親しみがある Docker を採用します。

ここでDocker公式サイトを基に docker-ce をインストールします。

[root@master1 ~]# yum install -y yum-utils
// yum-utils インストール

[root@master1 ~]# yum-config-manager \
>     --add-repo \
>     https://download.docker.com/linux/centos/docker-ce.repo
// レポジトリ追加
[root@master1 ~]# yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
// docker-ce 等インストール

[root@master1 ~]# systemctl start docker
// サービス起動
[root@master1 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
// サービス自動起動有効化

[root@master1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
// docker コマンド実行

kubeadm・kubelet・kubectl のインストール

kubernetes レポジトリを追加します。

[root@master1 ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
> enabled=1
> gpgcheck=1
> repo_gpgcheck=1
> gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
> EOF
[root@master1 ~]# ls -la /etc/yum.repos.d/
合計 60
--snip--
-rw-r--r--.  1 root root  263  6月 29 12:53 kubernetes.repo // kubernetes.repo 追加

SElinux を permissive モードに変更します。

[root@master1 ~]# setenforce 0
[root@master1 ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@master1 ~]# getenforce
Permissive

kubelet 等をインストールします。

[root@master1 ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
kubernetes/signature                          |  844 B     00:00     
https://packages.cloud.google.com/yum/doc/yum-key.gpg から鍵を取得中
です。
Importing GPG key 0x13EDEF05:
 Userid     : "Rapture Automatic Signing Key (cloud-rapture-signing-key-2022-03-07-08_01_01.pub)"
 Fingerprint: a362 b822 f6de dc65 2817 ea46 b53d c80d 13ed ef05
 From       : https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg から鍵
を取得中です。
kubernetes/signature                          | 1.4 kB     00:00 !!! 
https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/repodata/repomd.xml: [Errno -1] repomd.xml signature could not be verified for kubernetes
// 取得した鍵がマッチしない的なことを言っていますね。


他のミラーを試します。
--snip--

gpgcheck を無効化すると行けるようなので無効化します。

[root@master1 ~]# cat /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
#gpgcheck=1 // 先頭 # 追加
#repo_gpgcheck=1 // 先頭 # 追加
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

再度 yum コマンドで kubelet 等をインストールします。
次に kubelet を起動します。

[root@master1 ~]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

# systemctl --help
--now            Start or stop unit in addition to enabling or disabling it
// --now オプションはサービス有効/無効 + 起動/停止なんですね

kubeadm を使用したクラスターの作成

kubeadm init でコントロールプレーンノードをセットアップします。
まずは kubeadm init だけで実行してみる。

[root@master1 ~]# kubeadm init
[init] Using Kubernetes version: v1.24.2
[preflight] Running pre-flight checks
        [WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
        [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
        [WARNING Hostname]: hostname "master1.example.local" could not be reached
        [WARNING Hostname]: hostname "master1.example.local": lookup master1.example.local on 8.8.8.8:53: no such host
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: E0629 13:11:53.138685    1851 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
time="2022-06-29T13:11:53+09:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

気持ちいいくらいにエラーが出ます。一つずつ対処します。
まずは、firewalld に必要なポートを開けます。

[root@master1 ~]# firewall-cmd --add-port=6443/tcp --zone=public --permanent && \
> firewall-cmd --add-port=10250/tcp --zone=public --permanent && \
> firewall-cmd --reload
success
success
success

次に、swap を無効化します。

[root@master1 ~]# cat /etc/fstab

[root@master1 ~]# swapoff -a // 一時的な無効化

[root@master1 ~]# cat /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Wed Jun 29 10:06:31 2022
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=438009b8-90bf-45b4-9dae-46a9010b234e /boot                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0 // 先頭 # 追加で恒久的な無効化

次に、ERROR CRI の対応ですが、systemctl statu docker で docker は Active です。
下記ファイルを削除すると行けるようなので削除します。

[root@master1 ~]# rm -rf /etc/containerd/config.toml

[root@master1 ~]# systemctl restart containerd // containerd を再起動しないと config.toml 削除手順が反映されないようです

Warning は名前解決系なので、ここで再度 kubeadm init を実行します。

[root@master1 ~]# kubeadm init

Then you can join any number of worker nodes by running the following on each as root:
// 最終行に workernode 追加用のコマンドが表示されれば OK です

kubectl コマンドでコントロールプレーンの状態を確認します。

[root@master1 ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?

環境変数に KUBECONFIG を追加する。

[root@master1 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@master1 ~]# vi ~/.bash_profile 

[root@master1 ~]# kubectl get nodes
NAME                    STATUS     ROLES           AGE   VERSION
master1.example.local   NotReady   control-plane   10m   v1.24.2 // workernode追加前は NotReady ステータスで問題ない

続いて workernodeを追加します。(事前に kubeadm・kubelet・kubeclt はインストール済みです)

[root@worker1 ~]# kubeadm join 
--snip---
[ERROR CRI]: container runtime is not running: output: E0629 13:35:17.280545    2936 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
// workernode も綺麗にエラーが出ますね。master 同様に swap 無効化及び config.toml 削除+containerd 再起動をします

エラー対処後、再度 kubeadm join を実行します。

```bash
[root@worker1 ~]# kubeadm join 
-- snip --
This node has joined the cluster:
// このメッセージが表示されれば成功です

master 側で join 結果を確認します。

```bash
[root@master1 ~]# kubectl get nodes
NAME                    STATUS     ROLES           AGE    VERSION
master1.example.local   NotReady   control-plane   107m   v1.24.2
worker1.example.local   NotReady   <none>          89m    v1.24.2
// 期待値は Ready でした。
// あとで判明したのですが、coredns が pending だったので master も NotReady だったようです

各 node の状態を確認します。

[root@master1 ~]# kubectl describe node |grep  KubeletNotReady
  Ready            False   Wed, 29 Jun 2022 15:09:59 +0900   Wed, 29 Jun 2022 13:22:45 +0900   KubeletNotReady              container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
  Ready            False   Wed, 29 Jun 2022 15:08:04 +0900   Wed, 29 Jun 2022 13:40:53 +0900   KubeletNotReady              container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
// "cni plugin not initialized" と言っていますね。cni セットアップまで NotReady が正しいようです

cni をセットアップします。いくつかあるようですが、今回は flannel を採用します。
flannel githubページを参照してインストールします。

[root@master1 ~]# kubectl apply -f https://raw.githubusercontent.com/flannel-Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
// Manifest を apply するだけです

kubectl get pods で状態を確認します。

[root@master1 k8s]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-6d4b75cb6d-w6rxt                        1/1     Running   0          8m35s
kube-system   coredns-6d4b75cb6d-x4n2p                        1/1     Running   0          8m35s
kube-system   etcd-master1.example.local                      1/1     Running   5          8m50s
kube-system   kube-apiserver-master1.example.local            1/1     Running   5          8m50s
kube-system   kube-controller-manager-master1.example.local   1/1     Running   0          8m52s
kube-system   kube-flannel-ds-7bpfg                           1/1     Running   0          7m11s
kube-system   kube-flannel-ds-fc6wh                           1/1     Running   0          7m11s
kube-system   kube-proxy-2czrg                                1/1     Running   0          8m36s
kube-system   kube-proxy-7tpvl                                1/1     Running   0          8m30s
kube-system   kube-scheduler-master1.example.local            1/1     Running   5          8m50s

ここまでで k8s + flannel 構成が出来ました。
沢山検証ブログがあって助かりました。

おわりに

検証環境が出来たので、kubernetes 完全ガイドに沿って手を動かしていきたいと思います。

2
1
1

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
2
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?