Container

kubernetes-bootcampを試す

Kubernetes(クーバネティス)のチュートリアルをやってみました。

Minikubeを使ったクラスタの作成

クラスタの実行

minikube version

minikube のバージョンを確認する

 

minikube start

クラスタを実行する

$ minikube version
minikube version: v0.34.1
$
$ minikube start
o   minikube v0.34.1 on linux (amd64)
>   Configuring local host environment ...
>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
-   "minikube" IP address is 172.17.0.75
-   Configuring Docker as the container runtime ...
-   Preparing Kubernetes environment ...
@   Downloading kubelet v1.13.3
@   Downloading kubeadm v1.13.3
-   Pulling images required by Kubernetes v1.13.3 ...
-   Launching Kubernetes v1.13.3 using kubeadm ...
-   Configuring cluster permissions ...
-   Verifying component health .....
+   kubectl is now configured to use "minikube"
=   Done! Thank you for using minikube!
$

MinikubeがVMを起動し、VM上でKubernetesクラスタが実行される。

 

kubectlを使ってKubernetesとお話しする

kubeclt version

kubeclt がインストールされているか確認する

$ kubeclt version
kubeclt: command not found
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:08:12Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:00:57Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
$

クライアントとマスターにインストールされているサーバーのバージョンが表示される。

マスターはクラスタの管理をする人

kubectl cluster-info

クラスタの詳細を確認する。

$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.75:8443
KubeDNS is running at https://172.17.0.75:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$

実行中のマスターを確認。

Kubernetesダッシュボードで、マイアプリケーションが見れる・・らしい。

 

 kubectl get nodes

クラスタ内のノードを表示する。

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   46m   v1.13.3
$

アプリケーションをホストするために使用できるすべてのノードを表示。↑はひとつだけですね。(ほんとは、最低でも3ついるらしい)

Readyってなってるのは、アプリのデプロイ準備おっけぃ👌🥰ってこと。

Nodeは実行中のアプリケーションをホストする人

Nodeは、Kubernetesクラスタのワーカーマシンとして機能するVMまたは物理マシン。

kubelet

Nodeを管理しマスターと通信するエージェント。Dockerやrktの操作もするらしぃ。

 

rktってなんぞや?

podネイティブなコンテナエンジン(Linux入門より)。これ以上調べると深みにハマりそうなので、これくらいにしておく。

 

アプリケーションのデプロイ

アプリケーションを配置する

kubectl を使ってDeployment の作成と管理を行う。

Deploymentを作成すると、クラスタ上にコンテナ化したアプリケーションをデプロイできる。

kubectl は API を使ってクラスタと対話する。

kubectl run
  • アプリケーションのインスタンスを実行できるNodeを検索する
  • そのNodeで実行するようにアプリケーションをスケジュールする
  • 必要に応じて新しいNodeでインスタンスを再スケジュールするようにクラスタを設定する
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1--port=8080
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/kubernetes-bootcamp created
$

kubectl run --generator=deployment/apps.v1

↑これは廃止になっちゃうから、今度から

kubectl run --generator=run-pod/v1 か kubectl create を使ってね。だって。

 

kubectl get deployments

deploymentsを表示する。

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           9m58s
$

インスタンスは、Node上のDockerコンテナ内で実行されている。

Deploymentはアプリケケーションのアプリケーションのインスタンスを作成し、更新する方法を提供する。Deploymentを作成するとマスターは指定されたアプリケーションをクラスタ内の個々のNodeにスケジュールする。

アプリケーションのインスタンスが作成されるとDeploymentコントローラーはインスタンスを継続的に監視する。

インスタンスをホストしているNodeが停止・削除された場合、Deploymentコントローラーが置き換えを行う(セルフヒーリング

 

アプリケーションを見てみよう

ポッドは隔離されたブライベートネットワーク内で実行され、クラスタ内の他のポッドやサービスからは見えるが通信はできない。

kubectl を使用すると、APIエンドポイントを介し対話でアプリケーションと通信することができる。

 

kubectl proxy

クラスタ全体のプライベートネットワークに通信を転送するプロキシを作成する。プロキシを終了するにはCtrl + C。

$ kubectl proxy
Starting to serve on 127.0.0.1:8001
$

ホストとクラスタの接続確立おっけぃ。

 

APIを通じてバージョンを問い合わせてみる。

$ curl http://localhost:8001/version
{
  "major": "1",
  "minor": "13",
  "gitVersion": "v1.13.3",
  "gitCommit": "721bfa751924da8d1680787490c54b9179b1fed0",
  "gitTreeState": "clean",
  "buildDate": "2019-02-01T20:00:57Z",
  "goVersion": "go1.11.5",
  "compiler": "gc",
  "platform": "linux/amd64"
}$

 

ポット名を取得して環境変数に入れる。

$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range.items}}{{.metadata.name}}{{"¥n"}}{{end}}')
$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernete4sbootcamp-c96bdb4b4-zrm7j¥n
$

 

ポッド名を指定してそのポッドで実行されているアプリケーションにHTTPリクエストを送信。だんだん、理解が追いついてこなくなるの巻・・

$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "pods \"kubernete4sbootcamp-c96bdb4b4-zrm7j¥n\" not found",
  "reason": "NotFound",
  "details": {
    "name": "kubernete4sbootcamp-c96bdb4b4-zrm7j¥n",
    "kind": "pods"
  },
  "code": 404
}$

 

アプリケーションの探索

Kubernetes Pod

アプリケーションのインスタンスをホストするためのもの。ひとつ以上のアプリケーションコンテナのグループと共有リソースを表す抽象概念。

  • 共有ストレージ(ボリューム)
  • ネットワーキング(クラスタに固有のIPアドレス)
  • コンテナのイメージバージョンや使用するポートなのdの各コンテナをどう動かすかに関する情報

とかを含む。

Deploymentがコンテナを持つPodを作成する。

Podには、例えばNode.jsアプリのコンテナ、Node.js Webサーバーによってデータ供給されるコンテナ、などを含むことができる。Pod内の各コンテナは、IPアドレス、ポートを共有し同じ場所に配置・スケジュールされる。

 

Node

Nodeは複数のPodを持つことができ、マスターに管理される。マスターはクラスタ内のNode間でPodスケジュールを自動的にスケジューリングする。

kubelet
  • マスターとNode間の通信を担当する
  • Podとコンテナを管理する

Nodeは、レジストリ?からコンテナイメージを取得、解凍し、アプリケーションを実行する。Docker、rktみたいなランタイム。

 

kubectl

デプロイされたアプリケーションとその環境に関する情報を取得する。

 

kubectl get pods

Podの一覧を表示する

 kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-6bf84cb898-84dsr   1/1     Running   0          13s

 

 

kubectl describe pods

Pod内のコンテナ情報を表示。IPアドレスやポート番号、Podのライフサイクルなどが表示される

$ kubectl describe pods
Name:               kubernetes-bootcamp-6bf84cb898-84dsr
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               minikube/172.17.0.65
Start Time:         Sat, 06 Apr 2019 11:09:53 +0000
Labels:             pod-template-hash=6bf84cb898
                    run=kubernetes-bootcamp
Annotations:        <none>
Status:             Running
IP:                 172.18.0.2
:
:
(なんか、いっぱい表示される)

 

これ、さっきやったやつ(クラスタ全体のプライベートネットワークに通信を転送するプロキシを作成)

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

(ポット名を取得して環境変数に入れる)

$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-6bf84cb898-8zs8t

(ポッド名を指定してそのポッドで実行されているアプリケーションにHTTPリクエストを送信)

 

 

kubectl logs

上コンテナ内のログを表示する

$ kubectl logs $POD_NAME
Kubernetes Bootcamp App Started At: 2019-04-06T14:33:24.185Z | Running On:  kubernetes-bootcamp-6bf84cb898-8zs8t

Running On: kubernetes-bootcamp-6bf84cb898-8zs8t | Total Requests: 1 | App Uptime: 275.768 seconds | Log Time: 2019-04-06T14:37:59.953Z

 

 

kubectl exec

Pod上コンテナでコマンドを実行する

$ kubectl exec $POD_NAME env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-6bf84cb898-8zs8t
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root
$

 

kubectl exec -ti $POD_NAME bash

コンテナに入る

$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-6bf84cb898-8zs8t:/#

 

NodeJSが動いていることを確認。

# curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6bf84cb898-8zs8t | v=1

 

 

続きは次回〜

-Container