LoginSignup
4
1

More than 3 years have passed since last update.

"Kind" でお手軽 "Kubernetes" ハンズオン 後編

Last updated at Posted at 2020-11-04

・お知らせ 「本記事は前編と後編に分かれております。」

記事概要 リンク先
前編: Kubernetesとは?・Nodeの作成初期 等  前編URLリンク
後編: Pod作成とkubectlでPodの中身を見る 等  * 本記事

前回丁寧に解説したせいで(ふざけたせいで) その続きを後編にまとめました。
早速行ってみましょー

前編終了の状態と確認

  • ワーカーノードを含めたマルチノードの設定を反映させてKindを立ち上げました。 
  • コントロールプレーン(マスターノード)とデータプレーン(ワーカーノード)が起動している状態です。
  • 前回からの状態を確かめるにはターミナルで docker psコマンドでコンテナが2つあるか確認します。

スクリーンショット 2020-08-14 14.56.46.png

  • kind-worker kind-control-planeの2つ見つけれました?

現在の状態をイメージする

たこやん「ノードが2つ出来たのはわかったけど、今から中身入れるのはどうするん?」

「その前に現状のイメージを掴んでおきましょう」

たこやん「そうしよう」

  • 現在の状態はどうなっているでしょうか?
  • Kind = DockerKubernetes入れちゃいました でしたね。
  • Kind公式サイトのイメージを使って説明してみます。

スクリーンショット 2020-08-14 16.49.03.png

「ホストの中にビンがありますね。これがDockerと思ってください。」

たこやん「なるほど。ビンがDockerシステムをイメージしているんだな。」

「そしてビンには栓がしてあって中にKindの船があります。」

たこやん「ボトルシップみたいやな。Kindの船にKubernetesマークのコンテナ積んでんで!」

Dockerというビンの中にKindという船があって、
 Kubernetesコンテナを載せてコントロール。
 コンテナ内ではKubernetesのそれぞれのシステムが働いているイメージです。」

たこやんKindのイメージはそんな特徴を表していたんだな。うまくできたイメージだな。
     イメージはできたが、なんでこんな2重のシステムになってんだ?」

「瓶の栓がありますよね。
 つまりこれは栓を外さない限りDockerというビンの中から外には出ない事を表しています」

たこやん「なるほど。安全にKubernetesを試せるというワケだ!」

[蛇足]
Kindではcontainerdというシステムを削除すればPodを含め一発で削除できる
優秀なシステム設計になっています。

KindKubernetes <<基本操作編>>

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-worldPod名 次の--imageDockerHubからhello-worldを取得
--restart=NeverPodが存在しなくなった時に再起動しないようにする(よくわからなくても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環境の構築は完了です。」

たこやん「終わり?」

「いえいえ、この方法での構築はメジャーな構築方法とはいえないので、別の説明をします。」


KubernetesPod を作って中に入る

いよいよ本番です。(じゃー今までなんなん?)
KubernetesPodを作ってPodの中に入ってみます。
具体的に下記順番で説明したいと思います。

  1. リソースについて
  2. マニュフェストファイル作成
  3. Podを作る
  4. Podの中に入る
  5. 後始末

1.リソースとは

  • Kubernetesには大きく分けて5種類のリソースがあります。

たこやん「リソースってどんな意味で捉えたらいいんだろ」

「動作の実行に必要な処理システムの要素を指しますね。」

たこやん「何らかの役割を持った集まりってイメージかな。あとこれ内容全部覚えないとだめ?」

「こんな種類があるんだなでいいですよ。」

*リソースの詳細説明は割愛させて頂きます。
種別 概要
Workloads リソース コンテナの実行に関するリソース Pod
Discovery & LB リソース コンテナを外部公開するようなエンドポイントを提供するリソース Service
Config & Storage リソース 設定/機密情報/永続化ボリュームなどに関するリソース Secret
Cluster リソース セキュリティやクォータなどに関するリソース Node
Metadata リソース クラスタ内の他のリソースを操作するためのリソース LimitRange

2.マニュフェストファイル作成

たこやん「リソースはイメージできた。あとはどうやって構築するか?ymlファイルで指示を出せるんだっけ?」

「そうです。Kubernetesはymlファイルで指示を出します。その作成を細かく見てやってみましょう」


項目 内容
apiVersion どのバージョンのKubernetesAPIを利用してオブジェクトを作成するか
kind どの種類のオブジェクトを作成するか
metadata オブジェクトを一意に特定するための情報、文字列のname、UID、また任意のnamespaceが該当
spec オブジェクトの望ましい状態

上記ではよくわかりにくいので、今回作成する実際のファイル内容を元に詳細説明します。

  • 下記がサンプルの全体の構成です。
sample.yml
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
  1. apiVersion :kindの種類によって指定する値が決まっている
    • v1:Podなのでapiで見るとv1ですね。
  2. kind :リソースの種類(この内容によりapiVersion)が決まる
    • pod:今回作成はpodです

KubernetesapiVersionは下記の参照元で定められている内容を確認できます。
PodGroup coreversion v1となっています。
coreは省略できるので、v1がapiVersionの記載内容となるわけです。

スクリーンショット 2020-08-15 14.17.54.png

参照元:Kubernetes API Overview

2.metadata

次に設定しなければいけないのはメタデータと言われる部分です。
メタデータはデータのデータという意味で、つまりKubernetesの付加するデータを指します。
metadataには下記の内容が含まれています。

metadata:
  name: debug
  namespace: default
  1. name(必須項目): リソース固有の名前を決める
  2. 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"

記載が必要な箇所は下記となります。

  1. name: Podに含まれるコンテナ名を指定します。
  2. image: コンテナを指定します。指定しなければlatestになります。
    誤動作の原因にもなりますのでできれば指定をした方がいいです。
  3. command: コンテナに対する指示を記載します。

    今回の指定は下記の通りです。

    • bin/sh: 「シェルを実行してください」と指示をしています
    • -c: 引数で「次の命令を実行してください」と指示をしています。
  4. args: コマンド実行

    今回の指定は下記の通りです。

    • while true: trueの間は
    • do: 実行してください
    • sleep ${DELAY} : 遅延時間の設定を{DELAY}にて
    • done: 終わり
  5. 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を通じてKubernetesPodを触る流れができました。最後に後始末をしましょう」

たこやん「それは簡単そうだな。まるっと消せば良さそうだもんな。」

4. 後始末

Kindでは削除は簡単でしたね。

kind delete cluster
Deleting cluster "kind" ...

「以上でおしまいです。お疲れ様でした。」

たこやん「今回は簡単な操作内容ぽいけど、Kindを使えば作って壊してしても
ホストに影響しないからガンガン実験できるわな!よし他もチャレンジだ!」

「頑張ってください。自分もやでー


わかりやすいかなと表現豊かに説明しました。(嘘)
ふざけた説明ばかりですみません。 :bow:
間違っておりましたら、暖かくご指摘とご意見を頂けましたら幸いです。
参考・面白ければLGTMください。ありがとうございました。

参考・参照資料

Kindに関する事項は公式サイトが充実しています。英語ですが・・。

Kubernetesに関して

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1