【入門】Kubernetesをつくって壊して直して学んでみた
はじめに
参考にさせて頂いたのはこちらの書籍。当方インフラメインでやってきたもののDockerは少し触ったことがある程度。Kubernetesもどういうものかを知っている程度です。書籍を何冊か買ってますが結構敷居が高く積読状態になってました。。しっかり勉強したいなと思っていたところ、たまたま書店でみつけた本書は手軽にハンズオン形式で手を動かしながら学べるという事でおもしろそうだと思い購入させて頂きました。
ハンズオン環境
今回はさくっとローカル開発環境でハンズオンを実施したかった為、以下の環境としました。
● WSL2(Ubuntu 22.04.3 LTS)
● kind
kindとは、kubernetesをローカル開発環境で簡単に構築できるツール。Docker環境の中にDockerを立ち上げてマルチクラスタを作れるのが特徴です。
環境構築
Dockerインストール
公式サイトだと少しわかりにくい為こちらのサイトをを参考にさせて頂きました。
Docker for Windowsは利用せず、直接WSL2環境にDockerをインストールしています。
kindインストール
以下の公式サイトを参照してインストールしていきます。
今回はリリース済みのバイナリファイルからインストールします。
インストールする前にパッケージを最新化しておきます。
sudo apt-get upgrade -y
私の環境だとDNSサーバの参照先にプライベートIPアドレスが割り当てられており、UpdateServerに対して名前解決が出来なかった為、参照先をGoogleのDNSサーバに変更しています。
この辺りは作業環境に依存すると思います。
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
# nameserver 172.27.0.1
nameserver 8.8.8.8
[2024/07/06追記]
wsl2環境では割と既知の事象のようで、以下のやり方で修正できそうです。
/etc/wsl.conf
に以下を追記する。
[network]
generateResolvConf = false
次回再起動時に/etc/resolv.confが消失する為、ファイルを作成する。
touch /etc/resolv.conf
nameserver 8.8.8.8
バイナリファイルをダウンロードします。
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 97 100 97 0 0 320 0 --:--:-- --:--:-- --:--:-- 321
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 6381k 100 6381k 0 0 4303k 0 0:00:01 0:00:01 --:--:-- 10.6M![](https://storage.googleapis.com/zenn-user-upload/73e5678d4ef4-20240630.png)
バイナリファイルに対して、実行権限を割り当てます。
chmod +x ./kind
バイナリファイルを/usr/local/bin/kindへ移動します。
sudo mv ./kind /usr/local/bin/kind
私の環境だとkindコマンドに対してPathが通っていなかったのでPathを通しておきます。
export PATH="$PATH:/usr/local/bin/kind"
バージョンを確認するkindコマンドが通ればインストール完了です。
kind version
kind v0.23.0 go1.21.10 linux/amd64
kubectlコマンドインストール
snapパッケージマネージャがサポートされている場合、snapコマンドを使用してインストールできます。簡単ですね。
sudo snap install kubectl --classic
kubectl 1.29.6 from Canonical✓ installed!
つくる
まずは正常に動作するPodを作ります。
kubectl apply --filename chapter-05/myapp.yaml --namespace default
pod/myapp created
PodがRunningになっており、問題ありません。
kubectl get pod --namespace default
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 0 3m19s
壊す
不正なマニュフェストを適用してアプリケーションを壊します。
kubectl apply --filename chapter-05/pod-destruction.yaml --namespace default
pod/myapp configured
StatusがRunningになっておらず、CrashLoopBackOffと表示されています。
NAME READY STATUS RESTARTS AGE
myapp 0/1 CrashLoopBackOff 0 19m
直す
まずdiscribeコマンドで情報を取得します。
kubectl describe pod myapp --namespace default
この辺りにエラーを出力されていますね。
どうやらイメージをPullしてくる事ができずにエラーになっている可能性があります。
https://hub.docker.com/ より、イメージを確認します。
イメージは存在しますね。
続いてタグ一覧を確認します。
1.1というタグが存在しません。。
というわけで、kubectl edit でリソースを修正します。
kubectl edit pod myapp --namespace default
pod/myapp edited
containers:
- - image: blux2/hello-server:1.1
+ - image: blux2/hello-server:1.0
imagePullPolicy: IfNotPresent
name: hello-server
ports:
- containerPort: 8080
protocol: TCP
修正後、Podのステータスを確認するとRunningになっている事が確認できました。
kubectl get pod myapp --namespace default
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 1 (27m ago) 45m
学び
原因は、イメージのタグ誤りでしたが、以下の一連の調査・復旧の流れを学ぶことができました。
- kubectl get <リソース名> でリソースの状態を確認する。
- kubectl describe <リソース名> でリソースの詳細を確認する。
- kubectl edit <リソース名> で修復する。
最後に
他にもKubernetesの各種リソースを作りながら壊していったりと結構盛りだくさんの内容です。
実際に手を動かしながら仕組みやトラブルシューティングまで学べて入門書としては良書だと思いました。私もようやく入門できたので、他の書籍で知識を補強したりクラウドサービスのKubernetesを利用してみたりして知見を広げていきたいと思います。
Discussion
いいすね!