本記事は『つくって、壊して、直して学ぶ Kubernetes入門』(高橋あおい著、五十嵐綾監修)の「Chapter 3 全体像の説明」と「Chapter 4 アプリケーションをKubernetesクラスタ上につくる」から一部を抜粋したものです。掲載にあたって編集しています。
本書での学習の流れ
本書では3つのパートに分かれています。
●Part 1:基礎的な知識と環境構築を行います。
●Part 2:一番ページ数も多く、Kubernetesを扱ううえで大事なことを詰め込んだパートになります。本書のタイトルは「つくって、壊して、直して学ぶ Kubernetes入門」ですが、Chapter5でトラブルシューティングの方法を一通り説明します。その後、各リソースの説明→リソースを使ってアプリケーションを壊してみる(アプリケーションに疎通できない、リソースが作成できない)、という流れになっています。Chapter8ではこれまでの総復習になっているため、Kubernetesに慣れている方はまずChapter8で腕試しをしてみるのも面白いでしょう。
●Part 3:Kubernetesのリソースを作成して壊す、というところから少しステップアップしたChapterになります。Kubernetesのアーキテクチャの説明から始まり、実際の開発フローや運用を見据えた説明内容になります。Kubernetesクラスタの利用規模が小さい場合や、個人で使っている場合は参考程度にとどめていただく内容が多いかもしれません。Chapter12は本書を読み終えた後の参考書籍などを紹介していますので、ぜひ目を通してみてください。
使用するアプリケーションについて
本書ではChapter1で説明した自作のhello-serverを使ってハンズオンを進めていきます。hello-serverを少しずつ機能拡張したり、変更を加えたりしながら進めていきます。
アプリケーションはGoで書かれています。Goをはじめて触る方にはわかりづらいかもしれませんので、ここで少し簡単に解説します。
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { --- (1) fmt.Fprintf(w, "Hello, world!") }) log.Println("Starting server on port 8080") --- (2) err := http.ListenAndServe(":8080", nil) --- (3) if err != nil { log.Fatal(err) } }
(1) " / "で始まるパスへのリクエストを受け付けます。ここではfmt.Fprintf(w, “Hello, world!”)と書かれているように、”Hello, world!”を出力します。
(2) ログにサーバを開始することを出力します。ハンズオンではこのログが出力されているかどうかを確認することがあります。
(3) 8080番ポートでhttpサーバを開始します。
こちらのコードをベースに、ハンズオンが進むごとに少しずつ改良されたDockerイメージを使っていきます。タグの値がその都度変わっていくので、間違えないようにしましょう。
Podを動かしてみよう
本書で利用しているマニフェストやコードなどは以下のリポジトリにアップロードされています。
https://github.com/aoi1/bbf-kubernetes
本書ではこのリポジトリをローカルにgit cloneないしは、ダウンロードして使っていただきます。次のコマンドでgit cloneできます。
git clone https://github.com/aoi1/bbf-kubernetes
また、UI上からzipファイルをダウンロードすることもできます。
リポジトリは章ごとにディレクトリが切られています。本書でマニフェスト/コードを紹介する際にはそれぞれ<ディレクトリ名>/<ファイル名>で紹介しますので、適宜参照してください。
kubectlをインストールする
Kubernetesクラスタを構築できていることの確認をするためにもkubectlを使えると良いでしょう。
まずはkubectlをインストールしましょう。クラスタと接続するための設定情報はクラスタを構築したら行うので、ここではインストールだけで大丈夫です。
ドキュメント:https://kubernetes.io/docs/tasks/tools/#kubectl
ドキュメントに各種OSのインストール方法が書かれています。自分の環境に合った方法でインストールしてください。
kindをインストールする
まずはkindをインストールしましょう。
ドキュメント:https://kind.sigs.k8s.io/docs/user/quick-start#installation
HomeBrewを利用している方は次のコマンドでインストールできます。
brew install kind
また、以下の条件に当てはまる方はgo installを使用してkindのインストールをすることができます。
- Dockerをインストールしている
- Goのバージョン1.16以上をインストールしている
次のコマンドをターミナルで打ってkindをインストールできます。
go install sigs.k8s.io/kind@v0.20.0
準備:Podを作成する前にKubernetesクラスタの起動を確認しよう
はじめてのKubernetesリソースの作成ということで、ここではあえてKubernetesクラスタの起動確認ステップを入れています。以降このステップの説明はしませんが、久しぶりにKubernetesを触るときなどは確認するようにしましょう(私はよくクラスタを消したことを忘れて「壊れた!」とビックリしてしまいます)。
Podを作成する前にクラスタが起動できているか、kubectlを利用できるか、まずは確認して みましょう。
kubectl get nodesを打ってみましょう。期待する出力結果は次のとおりです。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready control-plane 8m43s v1.29.0
クラスタが構築できていない場合はエラーが返ってきます。kindを利用していれば次のようにクラスタの存在を確認できます。
kind get clusters
$ kind get clusters kind
※デフォルトで作成されるクラスタ名がkindです。
では、早速順を追ってコンテナを動かしてみましょう。
マニフェストを利用してみよう
今回利用するマニフェストは次のとおりです。
apiVersion: v1 kind: Pod metadata: name: myapp labels: app: myapp spec: containers: - name: hello-server image: blux2/hello-server:1.0 ports: - containerPort: 8080
今回のハンズオン用アプリケーションのコンテナイメージを指定しているだけで、ほかはchapter-04/nginx.yamlとほとんど変わりません。一点だけ異なるのは、namespaceを指定していることです。
マニフェストをKubernetesクラスタに適用してみよう
kubectl apply --filename <ファイル名>でKubernetesクラスタ上にリソースを作成できます。まずはPodが存在しないことを確認しましょう。
kubectl get pod --namespace default
$ kubectl get pod --namespace default No resources found in default namespace.
つづいて、マニフェストを適用します。
kubectl apply --filename chapter-04/myapp.yaml --namespace default
$ kubectl apply --filename chapter-04/myapp.yaml --namespace default pod/myapp created
Podが作成できていることを確認しましょう。
kubectl get pod --namespace default
$ kubectl get pod --namespace default NAME READY STATUS RESTARTS AGE myapp 1/1 Running 0 61s
STATUSがRunningになっていることが確認できていればPodの作成完了です。STATUSがContainerCreatingなど、Running以外が表示されたとしても、しばらく待っていればRunningになるはずです。PodがRunningになったでしょうか?
おめでとうございます! これでKubernetes使いの一歩を踏み出しましたね。