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
続きは次回〜