openSUSE Leap 15.4 で Kubernetes を構築してみよう(1) 〜マスターノード構築準備編〜

なんだかなぁ〜な今日この頃

鹿野です。
相変わらずご無沙汰しております。

え〜っと、まず言い訳させてください。
今日は毎年恒例、 openSUSE Advent Calendar 2022 の2日目、12/2 分の記事なのですが、(いつものように)時間が間に合わず、、鹿野相変わらずダメじゃん!!・・・って。

実は諸事情により、本来なら 12/2 って仕事もお休みの予定でした。
たっぷりブログ書く時間もあるはずだったわけ。

なのに、

どうして Kubernetes の罠にハマって結局仕事休めなくなるってどういうことよ〜!!

そんでもって今日は ↓ のコミックの発売日。
鹿野的にこれ絶対買わなきゃだめなやつやん!??

www.shonenjump.com

あ、アオのハコの鹿野さん、めっちゃ可愛いですよね〜

・・・・・。

って、これ読んでるからブログ書けなかったんやん!!(もはや言い訳にもなってない

というわけで、今日はそんな恨み節満載な、Kubernetes ネタを書いてみます。
まずは初歩中の初歩、マスターノードから構築してみましょう!!

そもそも openSUSEKubernetes ってできるんだっけ?

Caution: 本日は失敗編です。成功編を読みたい方はもう少々お待ちください。
失敗でも笑って許してくれる方のみ、続きを読んでいただけたらと思います(^^)

てかそもそも、openSUSEKubernetes なんてやってる人いるのかしら???
以前は確かにいましたけどね・・・最近は Kubic も開発停止したって聞くし。

openSUSE Kubic - Retired

なんて思って調べてみたら、こんな記事を見つけてしまった。。。

devops-blog.virtualtech.jp

と、遠山さんや・・・(汗

仮想化技術の皆さんにはいつも大変お世話になってます!! という話は置いておきまして、
とりあえず Tumbleweed + K3s なら実績ってあるってことですね。

だったら Leap でもいけるべ。

・・・とその前に、ハマりたくないので最初のうちにやっておく。
Kubernetes をインストールする前に swap 領域を消しておきましょう。
YaST 開いて、 システム > パーティション設定 からさくっと、 swap のパーティションを削除しちゃいます。

削除をぽちっとえいっとな。
・・・はい、消えました〜!
(いいのかこんなにあっさり消してしまって。※私のはテスト環境なので皆さんは慎重にお願いします、、。

準備が整ったので、早速公式リポジトリから何が落とせのるか YaST で検索してみます。
いつものように YaST を開き、 ソフトウェア > ソフトウェア管理 を選んで Kubernetes で検索っと。

何かいますねぇ。とりあえず、 1.18.4 が降ってくるってことかしら???
と、そそくさとインストールしてみる。

インストールが完了したようなので、もしかしてもうマスターノードがどこかに!??

tsukimi@localhost:~> kubectl get node
'kubectl' が入力間違いでなければ、下記のように入力することで command-not-found を利用してパッケージを検索することができます:
    cnf kubectl

・・・なんてことはさすがにないようです。(当たり前だろ!
ここからは手動でやるってことですね。

kubeadm でマスターノード構築してみよう

一旦クラスタ構成とか考えずに、まずはこの PC をマスターノードにする前提でやってみます。
マスターノードとはワーカーノードを管理するサーバーのこと。 Kubernetes のコマンドはワーカーノードから叩くことはほぼなく、マスターノードの中の api-server を使って叩くことになります。(このあたり私もまだまだ勉強不足であるのだけど

ところでこの PC の IPアドレスは 192.168.0.99 だそうです。
マスターノードは本来 IPアドレスを固定にする必要がありますが、今回はお試しなのでそこは何を考えずに、細かい事抜きにして下記のコマンドで構築してみます。

sudo kubeadm init --apiserver-advertise-address=192.168.0.99 --pod-network-cidr=10.128.0.0/16

さて、どうなったかといいますと・・・。

[preflight] WARNING: Couldn't create the interface used for talking to the container runtime: docker is required for container runtime: exec: "docker": executable file not found in $PATH
[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'

なんかいろいろ出てきたぞよorz

  • Docker なんてコマンドしらね〜よ
  • ファイアウォールで 6443 と 10250 を開けろやおら
  • そもそも kubelet が起動してね〜よ

・・・そこからかぁ〜・・・

Docker を起動しよう!

気を取り直して、 YaST から Docker をインストールします。
つか、 kubeadm と Docker って依存パッケージじゃないんですね・・・。
ま、今どきコンテナランタイムに Docker は使わないと思う(最近は containerd が使われます)ので、気持ちはわからんでもないが。。。

YaST から ソフトウェア > ソフトウェア管理 を開いて、 docker を検索。インストールします。

インストールしただけではサービスが起動していないので、起動するように設定します。
YaST から システム > サービスマネージャ を開きましょう。

そしたら docker を探していきます。見つかったら、

  • 「開始」ボタンをクリック
  • 「開始モード」から「起動時」を選択

ですね。

ついでに、 kubelet も起動しておきましょう。
同じように kubelet を検索して、「開始」ボタンクリック、「起動時」に起動するよう選択してください。

sudo docker images でこんな感じで出てきたら、ひとまずOKです。

tsukimi@localhost:~> sudo docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

ファイアーウォールの設定も忘れずに

さて、もうひとつ。ファイアーウォールの設定ですね。
最低限必要なポートは、下記の2つのようです。

YaST から、 セキュリティとユーザ > ファイアウォール を選択してください。

そしたら ゾーンを internal を選択し、 kube-apiserver を探して、追加をクリックします。
kubelet の方は実はまだ起動できていないので、「ポート」タグをクリック、「TCPポート」に 10250 と書いておきます。

これで準備ができたはず!!

今度こそ構築すっぞ!!・・・と思ったら。

さて、気を取り戻して、一番最初の kubeadm init コマンドを叩いてみましょう。

tsukimi@localhost:~> sudo kubeadm init --apiserver-advertise-address=192.168.0.99 --pod-network-cidr=10.128.0.0/16
Found multiple CRI sockets, please use --cri-socket to select one: /var/run/dockershim.sock, /var/run/crio/crio.sock
To see the stack trace of this error execute with --v=5 or higher

・・・・・。(あれ?

OKOK。ある意味予想通りですね。
ようはコンテナランタイムを指定しろや!って話のようです。
最近の Kubernetes では無きものとされてしまった(?) dockershim も、まだ 1.18 の段階では選択肢として残っているんですね。せっかく今回は Docker を選んだので、コマンドを下記に変えて実行してみましょう。

sudo kubeadm init --cri-socket=/var/run/dockershim.sock --apiserver-advertise-address=192.168.0.99 --pod-network-cidr=10.128.0.0/16

今度こそうまく行くはず・・・・・

ががが!??!?!???

[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.17-ce. Latest validated version: 19.03
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR KubeletVersion]: the kubelet version is higher than the control plane version. This is not a supported version skew and may lead to a malfunctional cluster. Kubelet version: "1.20.13" Control plane version: "1.18.18"

結果: 失敗

・・・てか待てやおらっ!!! ←原因はわかった(汗

本日のまとめ

え〜っと、せっかくなので続きます。(今日は疲れたとも言うw

Kubernetes の公式リポジトリのパッケージ等を使うとより最新の環境で構築できるのですが、今回は openSUSE 公式パッケージでやってみようとしています。

・・・が、結果的にそれが裏目に出て、見事なまでにハマったということですね(汗

続きは次回とします。今度こそマスターノード構築まで行ってみる予定です。 ですが、ファイアーウォールの設定やら、サービスの起動やらは、基本的に今日書いた手順で問題ないはず。(いやまだ動いていないのだからなんとも言えんのだけど!

とりあえず次回をお楽しみに!!