・お知らせ 「本記事は前編と後編に分かれております。」
記事概要 | リンク先 |
---|---|
前編: Kubernetesとは?・Nodeの作成初期 等 | 前編URLリンク |
後編: Pod作成とkubectlでPodの中身を見る 等 | * 本記事 |
前回丁寧に解説したせいで(ふざけたせいで) その続きを後編にまとめました。
早速行ってみましょー
前編終了の状態と確認
- ワーカーノードを含めたマルチノードの設定を反映させて
Kind
を立ち上げました。 - コントロールプレーン(マスターノード)とデータプレーン(ワーカーノード)が起動している状態です。
- 前回からの状態を確かめるにはターミナルで
docker ps
コマンドでコンテナが2つあるか確認します。
-
kind-worker
kind-control-plane
の2つ見つけれました?
現在の状態をイメージする
たこやん「ノードが2つ出来たのはわかったけど、今から中身入れるのはどうするん?」
「その前に現状のイメージを掴んでおきましょう」
たこやん「そうしよう」
- 現在の状態はどうなっているでしょうか?
-
Kind
=Docker
にKubernetes
入れちゃいました でしたね。 -
Kind
公式サイトのイメージを使って説明してみます。
「ホストの中にビンがありますね。これがDocker
と思ってください。」
たこやん「なるほど。ビンがDockerシステム
をイメージしているんだな。」
「そしてビンには栓がしてあって中にKind
の船があります。」
たこやん「ボトルシップみたいやな。Kind
の船にKubernetes
マークのコンテナ積んでんで!」
「Docker
というビンの中にKind
という船があって、
Kubernetes
コンテナを載せてコントロール。
コンテナ内ではKubernetes
のそれぞれのシステムが働いているイメージです。」
たこやん「Kind
のイメージはそんな特徴を表していたんだな。うまくできたイメージだな。
イメージはできたが、なんでこんな2重のシステムになってんだ?」
「瓶の栓がありますよね。
つまりこれは栓を外さない限りDockerというビンの中から外には出ない事を表しています」
たこやん「なるほど。安全にKubernetes
を試せるというワケだ!」
[蛇足]
Kindではcontainerd
というシステムを削除すればPod
を含め一発で削除できる
優秀なシステム設計になっています。
Kind
でKubernetes
<<基本操作編>>
Kind
で "Hello world"
たこやん「仕組みはわかったから、早くKubernetes
を触ってみたいぞ」
「そうですね。歴史にのっとり"Hello world"から実施してみましょう。」
たこやん「YAMLをコマンドで指示を出すんだっけ?」
「そうです。コマンドkubectl
を使ってKindに指示を出して行きます。」
たこやん「二重の中に入ったKind
に命令できるんだ!kubectl
入れといてよかったー」
「でしょー」
1:DockerHub
からコンテナイメージを取得しPod
作成
DockerHub
から コンテナイメージを取得します。
pod hello-world
が作られていたら成功です。
kubectl run hello-world --image hello-world --restart=Never
pod/hello-world created
最初のhello-world
はPod
名 次の--image
でDockerHub
からhello-world
を取得
--restart=Never
でPod
が存在しなくなった時に再起動しないようにする(よくわからなくてもOK)
2:Podを確認しよう。kubectl get pod
kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world 0/1 ContainerCreating 0 10s
STATUS
が上記のようにContainerCreating
になっている場合は少し待ってから再度コマンド実行
kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world 0/1 Completed 0 49s
上記のようになればOK!
3:ログを出力してみる
下記コマンドを打つことにより pod
のログを取得する事が可能です。
kubectl logs pod/hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
4:削除してみる
下記コマンドでPod
を削除してみる
削除後にPodを確認してみる
kubectl delete pod/hello-world
pod "hello-world" deleted
kubectl get pod
No resources found.
たこやん「おーこれでDockerHub
からのコンテナを利用して試してみる事ができるな」
「はいこれで、簡単なKubernetes
環境の構築は完了です。」
たこやん「終わり?」
「いえいえ、この方法での構築はメジャーな構築方法とはいえないので、別の説明をします。」
Kubernetes
で Pod
を作って中に入る
いよいよ本番です。(じゃー今までなんなん?)
Kubernetes
でPod
を作ってPod
の中に入ってみます。
具体的に下記順番で説明したいと思います。
- リソースについて
- マニュフェストファイル作成
- Podを作る
- Podの中に入る
- 後始末
1.リソースとは
-
Kubernetes
には大きく分けて5種類のリソースがあります。
たこやん「リソースってどんな意味で捉えたらいいんだろ」
「動作の実行に必要な処理システムの要素を指しますね。」
たこやん「何らかの役割を持った集まりってイメージかな。あとこれ内容全部覚えないとだめ?」
「こんな種類があるんだなでいいですよ。」
*リソースの詳細説明は割愛させて頂きます。
種別 | 概要 | 例 |
---|---|---|
Workloads リソース | コンテナの実行に関するリソース | Pod |
Discovery & LB リソース | コンテナを外部公開するようなエンドポイントを提供するリソース | Service |
Config & Storage リソース | 設定/機密情報/永続化ボリュームなどに関するリソース | Secret |
Cluster リソース | セキュリティやクォータなどに関するリソース | Node |
Metadata リソース | クラスタ内の他のリソースを操作するためのリソース | LimitRange |
2.マニュフェストファイル作成
たこやん「リソースはイメージできた。あとはどうやって構築するか?ymlファイルで指示を出せるんだっけ?」
「そうです。Kubernetes
はymlファイルで指示を出します。その作成を細かく見てやってみましょう」
- マニュフェストファイルの構成
マニュフェストファイルに必ず必要な入力項目は下記になります。
[参照元]https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/
項目 | 内容 |
---|---|
apiVersion | どのバージョンのKubernetesAPIを利用してオブジェクトを作成するか |
kind | どの種類のオブジェクトを作成するか |
metadata | オブジェクトを一意に特定するための情報、文字列のname、UID、また任意のnamespaceが該当 |
spec | オブジェクトの望ましい状態 |
上記ではよくわかりにくいので、今回作成する実際のファイル内容を元に詳細説明します。
- 下記がサンプルの全体の構成です。
apiVersion: v1
kind: Pod
metadata:
name: debug
namespace: default
spec:
containers:
- name: basic
image: centos:7
command:
- "bin/sh"
- "-c"
args:
- |
while true
do
sleep ${DELAY}
done
env:
- name: "DELAY"
value: "5"
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
たこやん「めっちゃ難しそうじゃんかー!」
「一つ一つ説明しますので頑張りましょう!(自分に対しても)」
部分的に解説していきます。
1.apiVersion
,kind
(何のKubernetes
部品を作る?)
まずは最初の2行です。ここではKubernetes
のリソースで何を作りたいかを指示します。
今回はPod
です。
apiVersion: v1
kind: pod
- apiVersion :kindの種類によって指定する値が決まっている
- v1:Podなのでapiで見るとv1ですね。
- kind :リソースの種類(この内容によりapiVersion)が決まる
-
pod
:今回作成はpod
です
-
Kubernetes
のapiVersion
は下記の参照元で定められている内容を確認できます。
Pod
はGroup core
で version v1
となっています。
core
は省略できるので、v1
がapiVersion
の記載内容となるわけです。
2.metadata
次に設定しなければいけないのはメタデータと言われる部分です。
メタデータはデータのデータという意味で、つまりKubernetes
の付加するデータを指します。
metadata
には下記の内容が含まれています。
metadata:
name: debug
namespace: default
- name(必須項目): リソース固有の名前を決める
- namespace(任意): 名前空間を表します。(例えば複数のチームや開発の際に重複しないように設定します。)
*今回name:debug, namespace:defaultとしましたが一意に決まる内容で名前を設定すれば問題ないです。
3.spec
最後にspec
を設定します。
spec
はコンテナの定義を記載する箇所となっています。
spec:
containers:
- name: basic
image: centos:7
command:
- "bin/sh"
- "-c"
args:
- |
while true
do
sleep ${DELAY}
done
env:
- name: "DELAY"
value: "5"
記載が必要な箇所は下記となります。
- name: Podに含まれるコンテナ名を指定します。
- image: コンテナを指定します。指定しなければ
latest
になります。
誤動作の原因にもなりますのでできれば指定をした方がいいです。 -
command: コンテナに対する指示を記載します。
今回の指定は下記の通りです。- bin/sh: 「シェルを実行してください」と指示をしています
- -c: 引数で「次の命令を実行してください」と指示をしています。
-
args: コマンド実行
今回の指定は下記の通りです。
- while true: trueの間は
- do: 実行してください
- sleep ${DELAY} : 遅延時間の設定を{DELAY}にて
- done: 終わり
-
env: 環境変数設定箇所
今回の指定は下記の通りです。
- name: "DELAY": argsの${DELAY}に対して
- value: "5":5秒遅く動作させる
たこやん「なかなか難しいがなんとなく?わかったのかなー?」
「そうですね。難しいですが(自分が)分解すれば動作の繋がりがわかると思います。」
たこやん「ここからどうするの?」
「直前の作業でPod
消したのでノードだけになってますよね?」
たこやん「そうやな。コントロールプレーンとワーカーだけになってるな?」
「ということは?」
たこやん「kubectl
コマンドで作ればいいんかな?」
「そうです。今回はapply
のコマンドを使用して作っていきます。」
3.Pod
作成
kubectl apply -f
を使う事によりPod
を作成する事ができます。
下記のコマンドを入力しPod
を作成してください。
kubectl apply -f pods.yml
下記のコマンドでPod
の状況を確認してください。
-wをつけることによりステータスが変化すれば更新してくれて便利です。
kubectl get pods -w
NAME READY STATUS RESTARTS AGE
debug 0/1 Pending 0 17s
nginx 0/1 Pending 0 17s
nginx 0/1 Pending 0 33s
nginx 0/1 ContainerCreating 0 33s
debug 0/1 Pending 0 35s
debug 0/1 ContainerCreating 0 35s
nginx 1/1 Running 0 45s
debug 1/1 Running 0 74s
次にPod
のIPアドレスを確認します。
下記コマンドで確認ができます。
これでdebugからnginxへのアクセスができる状態がわかりました。
❯ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
debug 1/1 Running 0 34m 10.244.1.3 kind-worker <none> <none>
nginx 1/1 Running 0 34m 10.244.1.2 kind-worker <none> <none>
まずはdebugの中に入ります。
kubectl exec
で実行中のコンテナへのシェルを取得します。
-it
のオプションで標準入出力及びエラー出力をコンテナに対して結びつけます。
[Ctrl + Q][Ctrl + P]を使う為です。
kubectl exec -it debug sh
sh-4.2#
次に curl
コマンドでnginxのIPアドレスを入力しアクセスできるか確認してみましょう。
kubectl exec -it debug sh
sh-4.2# curl http://10.244.1.2/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
sh-4.2#
確認できたら exit
でシェルから抜けれます。
たこやん「おーこれでPod
に入って触ることができた。」
「そうですね。とりあえずはKind
を通じてKubernetes
のPod
を触る流れができました。最後に後始末をしましょう」
たこやん「それは簡単そうだな。まるっと消せば良さそうだもんな。」
4. 後始末
Kind
では削除は簡単でしたね。
kind delete cluster
Deleting cluster "kind" ...
「以上でおしまいです。お疲れ様でした。」
たこやん「今回は簡単な操作内容ぽいけど、Kind
を使えば作って壊してしても
ホストに影響しないからガンガン実験できるわな!よし他もチャレンジだ!」
「頑張ってください。自分もやでー」
わかりやすいかなと表現豊かに説明しました。(嘘)
ふざけた説明ばかりですみません。
間違っておりましたら、暖かくご指摘とご意見を頂けましたら幸いです。
参考・面白ければ・LGTMください。ありがとうございました。
参考・参照資料
Kind
に関する事項は公式サイトが充実しています。英語ですが・・。
インストール。Win,Linux等該当のコード箇所もあります。
Kind Quick Startワーカーノード含めたインストール参考箇所
Setting Kubernetes versionチェシャ猫さん CloudNativeDeveloper JP 発表資料
CloudNativeを学ぶにはまずKindより始めよ
Kubernetes
に関して
やはり公式サイト
Kubernetes公式サイト文中でも出てきたapi確認
API OVERVIEWUdemyの学習サイト(わかりやすいです。)
Docker + Kubernetes で構築する Webアプリケーション 実践講座