Kubernetesの公式チュートリアルをやってみる その2 ではKubernetesの環境構築を行いました。
この記事のチュートリアルではデプロイルールの構築とアプリの起動を行います。
注意 && disclaimer
翻訳・意訳が主目的ではないのでいろいろ端折ったりすることがあります。
明らかな間違いはしないつもりですが、何かあれば優しくツッコんであげてください。
→記事のまとめは Kubernetesの公式チュートリアルをやってみる その1 にあります。
本記事の取り扱う範囲
Using kubectl to Create a Deployment の内容を扱います。
Using kubectl to Create a Deployment
Deployment
とは何か、Deployment
は何をやってくれるか辺りの内容
Deployment
-
Deployment
とは、『コンテナ化アプリを配置、更新するためのルール情報』を指す。- 作成の際にコンテナアプリを作成するベースとなるコンテナイメージを指定する。(必須)
- 環境変数やアプリのレプリカ数等、稼働に必要な情報を指定することができる。(オプション)
- master にある
Deployment Controller
はDeployment
の内容に従ってコンテナ化アプリをノードにデプロイする。- デプロイ後はアプリをモニタリングし、ダウン・削除したアプリを新しいものに置き換えることで自動復旧させる。
kubectl
- Kubernetes API を通じてクラスタを操作するためのコマンドラインツール
- Kubernetes上のクラスタは
kubectl
を用いて操作する。
- Kubernetes上のクラスタは
Interactive Tutorial
Estimate Time: 10分
※最初さらっと触っただけだったけど、あとで周辺をヘルプとか見ながら掘ってった内容も含みます。
-
サンプルで node.js のアプリを立ち上げる
Deployment
を構築する。- 構成の都合上 Pod も出てくるが、Pod については次の章で説明
-
kubectl get nodes
- node 一覧を表示するコマンド。
-
kubectl get ~~
でヒューマンリーダブルな一覧を表示する。 -
kubectl ~~ --help
で表示されるヘルプで各コマンドの用途や引数などが確認できる。- デフォルトではページャーがつかないので、ページングする場合は
kubectl ~~ --help | less
で。
- デフォルトではページャーがつかないので、ページングする場合は
- ここのチュートリアルでは開始後に node が1つ起動している。
- ※(明記はないが)
kubectl get [名詞]s
はkubectl get [名詞]
でも動作する。- チュートリアル上はs付きだがコマンド補完はsなしで候補が上がる。
- ヘルプを見るとgetの対象は複数形、ただしそれぞれ省略形があるらしい。
- コマンド補完効くので省略形あまり書くことないような。。。
$ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready <none> 28m v1.10.0
-
kubectl run --image=[container image name]
- コンテナレジストリに登録されたイメージ名を指定して Deployment を作成
- チュートリアルでは gcr.io(Google Container Registry)を使用している
-
--port=nnn
でサービス作成時に公開するポートを指定することができる。 - run を実行後に
kubectl get deployments
で作成内容を確認できる。- この時点で Pod も作成されている(
kubectl get pods
)
- この時点で Pod も作成されている(
- コンテナレジストリに登録されたイメージ名を指定して Deployment を作成
# Deploymentの作成 + Pod起動
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
deployment.apps "kubernetes-bootcamp" created
# Deploymentの確認
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 11s
# Podの確認
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-974m6 1/1 Running 0 22s
-
kubectl proxy
- ターミナルからアプリへのプロキシを作成する。
- 起動中はコントロールが戻らないので別ターミナルで起動するか
kubectl proxy &
で裏にぶん投げておくとよい。
# proxyを起動(+ バックグラウンド化)、既定では8001でコンテナ内のサービスポート(8080)にアクセスする
$ kubectl proxy &
[1] 3250
$ Starting to serve on 127.0.0.1:8001
# proxyのポート経由でアプリへアクセスできる
$ curl http://localhost:8001/version
{
"major": "1",
"minor": "10",
"gitVersion": "v1.10.0",
"gitCommit": "fc32d2f3698e36b93322a3465f63a14e9f0eaead",
"gitTreeState": "clean",
"buildDate": "2018-04-10T12:46:31Z",
"goVersion": "go1.9.4",
"compiler": "gc",
"platform": "linux/amd64"
}$
ハマったところ
- Pod の起動が失敗している
- imageの指定を間違えると Pod の STATUS が
Running
にならない。- よくよく見ると
Deployment
の AVALIABLE も0
になっていたが最初気づかなかった。 - スペルミスに注意すること(´・ω・`)
- よくよく見ると
- imageの指定を間違えると Pod の STATUS が
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubenetes-bootcamp:v1 --port=8080
deployment.apps "kubernetes-bootcamp" created
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 0 9s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-f48c9b644-mmzbm 0/1 ErrImagePull 0 17s
- 【チュートリアル環境の注意】環境の期限切れ
- チュートリアル進めてる間は大丈夫だったが記事書きながら操作しているとKatacodaのターミナルがタイムアウトした。
- 大体30分ぐらい?どこかに記載あるかも。
- その場合ページ自体をリフレッシュして最初からやり直すこと。
- ターミナルのメインプロセスで
exit
しても同様に何もできなくなるので注意。
- チュートリアル進めてる間は大丈夫だったが記事書きながら操作しているとKatacodaのターミナルがタイムアウトした。
The Katacoda environment has expired. Please refresh to start a fresh environment.
We encountered a problem with the connection.
This may have been due to the internet connection dropping.
Please refresh and try again.