プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

<環境構築不要>お手軽にKubernetesを試す

Kubernetesの公式Tutorial環境で自作コンテナのデプロイを試した話です。


動機と結果まとめ

勉強のために自作の超簡単サービスをDockerやAWSに簡易的にデプロイしてみました。

k8sでも試したいと思ったのですが環境を用意するほどの気力と余裕がありません。

ひょっとしたらk8sの公式Tutorial環境でできのではないか?と思ったのがきっかけです。

manifestファイルを使わずにrun/expose/scale/rolloutのみで実施しました。

結果として、環境固有の制約はありましたが一応デプロイできました。

なお今回、デプロイしたコンテナは1つだけです。複数コンテナで構成されるサービスもできると思いますがmanifestファイルなしでやるのは厳しそうだし、雰囲気だけわかれば十分なのでやめました。


事前準備

Dockerhubに自作コンテナをpushしておきます。

ローリングアップデートを試したい場合はv1、v2などタグを2つ用意してくださいい。

私はなにかのTutorialで使ったNode.jsのコンテナを利用しました。

自作コンテナがない方はDockerhub上のnginx:<適当なタグ>とかでもよいと思います。

DockerhubへのPushはここで紹介しています。

architecting.hateblo.jp


k8sの公式Tutorial

ここです。

kubernetes.io


環境を立ち上げる

上記サイトにアクセスして適当なTutorialを選んで下さい。

Tutorialは複数ありますがどれでもOKです。

強いて勧めるなら「Kubernetesの基本を学ぶ」の「アプリケーションのデプロイ」が無難だと思います。minikubeが起動済みで、deploymentやserviceが事前に作成されてないのですぐに自作コンテナを立ち上げる作業に着手できます。

一番最初の「Hello Minikube」だけUIが特殊で使いづらいのでやめた方がよいです。

各Tutorialはテキストと「対話型チュートリアル」で構成されています。テキストは無視して「対話型チュートリアル」を選択してください。ブラウザにk8s環境が表示されます。


確認

以下のコマンドを実行してゴミがないか確認し、あれば削除します。なお「アプリケーションのデプロイ」を選んだ場合はゴミはないはずです。

kubectl get deploy
kubectl get pods
kubectl get svc

「kubectl get deploy」と「kubectl get pods」は空ならOKです。

「kubectl get svc」はデフォルトのkubernetes serviceのみ表示されればOKです。


自作コンテナのPodを立ち上げる

kubectl run my-deploy --image=myacount/myapp:v1 --port 3000

イメージ名やポート番号は自分の用意したコンテナに合わせて変更して下さい。

警告が出ることもありますが問題ありません。

Dockerhubからmyaccount/myapp:v1を取得してPodを起動します。

PodのTCPポート3000番がコンテナの3000番とマップされます。

PodだけでなくdeploymentとreplicaSetも同時に作成されます。

kubectl get deploy
kubectl get pods
kubectl describe pods

作成したPodを外部に公開する

この時点ではPodはk8sクラスタ内のみからアクセス可能な状態です。serviceを作成して外部からアクセスできるようにします。

本番環境のようにtype="LoadBalancer"を使いたいところですがminikubeではサポートされていないためNodePortで我慢します。

kubectl expose deployment/my-deploy --type="NodePort" --port 3000

ポート番号は自分の用意したコンテナに合わせて変更して下さい。

新しいserviceが作成されます。

kubectl get svc
kubectl desribe svc

「kubectl get svc」の「PORT(S)」欄に「3000:32215/TCP」みたいな表示があります。「32215」が外部に公開されているポート番号です。このポート番号はランダムに変わります。

minikubeのこのポート番号にブラウザでアクセスしたいところですが、残念ながらそれはできません。仕方ないのでブラウザ内のターミナルでcurlコマンドを実行して動作確認をします。

curl $(minikube ip):32215

期待したレスポンスがあれば成功です。

スケールする

Podを4台に増やします。

kubectl scale deployment/my-deploy --replicas=4

確認します。

kubectl get rs
kubectl get deploy
kubectl get pods

減らすこともできます。

kubectl scale deployment/my-deploy --replicas=2

ローリングアップデート

イメージをv1からv2にアップデートします。

kubectl set image deployments/my-deploy my-deploy=myaccount/myapp:v2

v2を使う新しいPodが順次作成され、古いPodは順次削除されます。

kubectl describe pods
kubectl rollout status deployments/my-deploy

うまく行けば「kubectl describe pods」で見えるimage名が変わってるはずです。

ロールバックもできます。

kubectl rollout undo deployments/my-deploy

削除

終了する場合は削除しなくても大丈夫です。

やり直したい場合はdeploymentとserviceを削除して下さい。

kubectl delete deploy my-deploy
kubectl delete service my-deploy

これでPodやreplicaSetも削除されます。


トラブルシューティング

よくある間違いがkubectl runでイメージ名を間違えることですが、これが気づきにくいです。

kubectl runコマンド自体は正常に終了します。

kubectl get deployで確認してもPodの立ち上げに時間がかかっているようにしか見えません。

kubectl get podsを確認するとコンテナの作成に失敗したことがわかります。

kubectl describe podsでログを確認するとイメージの取得に失敗したことがわかります。

deployを削除してkubectl runを再度実施しましょう。