🐡

【入門】Kubernetesをつくって壊して直して学んでみた

2024/07/02に公開

はじめに

参考にさせて頂いたのはこちらの書籍。当方インフラメインでやってきたもののDockerは少し触ったことがある程度。Kubernetesもどういうものかを知っている程度です。書籍を何冊か買ってますが結構敷居が高く積読状態になってました。。しっかり勉強したいなと思っていたところ、たまたま書店でみつけた本書は手軽にハンズオン形式で手を動かしながら学べるという事でおもしろそうだと思い購入させて頂きました。
https://www.seshop.com/product/detail/26100

ハンズオン環境

今回はさくっとローカル開発環境でハンズオンを実施したかった為、以下の環境としました。
● WSL2(Ubuntu 22.04.3 LTS)
● kind
 kindとは、kubernetesをローカル開発環境で簡単に構築できるツール。Docker環境の中にDockerを立ち上げてマルチクラスタを作れるのが特徴です。
https://kind.sigs.k8s.io/

環境構築

Dockerインストール

公式サイトだと少しわかりにくい為こちらのサイトをを参考にさせて頂きました。
Docker for Windowsは利用せず、直接WSL2環境にDockerをインストールしています。
https://zenn.dev/thyt_lab/articles/fee07c278fcaa8

kindインストール

以下の公式サイトを参照してインストールしていきます。
今回はリリース済みのバイナリファイルからインストールします。
https://kind.sigs.k8s.io/docs/user/quick-start#installing-from-release-binaries
インストールする前にパッケージを最新化しておきます。

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に以下を追記する。

/etc/wsl.conf
[network]
generateResolvConf = false

次回再起動時に/etc/resolv.confが消失する為、ファイルを作成する。
touch /etc/resolv.conf

/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

学び

原因は、イメージのタグ誤りでしたが、以下の一連の調査・復旧の流れを学ぶことができました。

  1. kubectl get <リソース名> でリソースの状態を確認する。
  2. kubectl describe <リソース名> でリソースの詳細を確認する。
  3. kubectl edit <リソース名> で修復する。

最後に

他にもKubernetesの各種リソースを作りながら壊していったりと結構盛りだくさんの内容です。
実際に手を動かしながら仕組みやトラブルシューティングまで学べて入門書としては良書だと思いました。私もようやく入門できたので、他の書籍で知識を補強したりクラウドサービスのKubernetesを利用してみたりして知見を広げていきたいと思います。

ヘッドウォータース

Discussion