元営業WEBエンジニアのアプリ開発日記

営業出身のWEB系エンジニアが気になったものから作ってはメモを残してくブログ

kubernetes(k8s)のチュートリアルをざっくりやって見る

概要

前々から気になってはいたものの 仕事に追われて遊べなかったKubernetisで遊んでみた。
とりあえず公式のTutorialをローカル環境(Mac)で一通りやってわかったことをざっくりとメモしとこう

kubernetes(k8s)とは

いわゆるコンテナオーケストラレーションらしい。
dockerとかで使うコンテナを用いて運用する際に必要なやつ。
コンテナのメモリとかcpuの制御、コンテナのデプロイ、ロールバックとか色々してくれる素敵なやつ。
ローカル環境開発ではdocker使ったことあるけど、本番でも使えれば!なんて人は勉強する価値あるかと。

基本的な構成

クラスター構成

クラスター構成
k8sはデプロイなどを管理する「Master」とそれ以外の「Node」というクラスターで構成されている。

node構成

node構成
nodeは複数の「pod」で構成され、podには「container」と永続化するデータを格納する「volume」が複数存在する。

下準備

minikubeインストール

ローカル環境でクラスターを使うには、minikubeDocker Desktop for Macを使う2パターンあるみたい。Tutorialではminikube使ってたんでそれで行くことにする。

# minikubeインストール
brew cask install minikube

# VirtualBox重たくて嫌いなんでhyperkitでクラスタ起動する
## hyperkit導入
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit
chmod +x docker-machine-driver-hyperkit
sudo mv docker-machine-driver-hyperkit /usr/local/bin/
sudo chown root:wheel /usr/local/bin/docker-machine-driver-hyperkit
sudo chmod u+s /usr/local/bin/docker-machine-driver-hyperkit
## minikubeでクラスタ起動
minikube start --vm-driver=hyperkit

## virtualboxで起動しようとしてエラーになったからdeleteするとうまくいった
## minikube delete

実際に触って見るぞ

アプリケーションをクラスタにデプロイする

dockerのイメージを指定してデプロイできるのだよ

# デプロイ
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
# デプロイされてるの確認
kubectl get deployments
kubectl get pods

外部からアクセスできるようにservice生成

# 外部公開(service生成)
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
# 公開してるポート番号の取得
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
# 実際にアクセス
curl $(minikube ip):$NODE_PORT

podのスケールアップ・スケールダウン

アクセス負荷を考慮してスケールアップしたりダウンしたりコマンドでちょろっとできる

スケールアップ

# スケールアップ(pod4つに増やす)
kubectl scale deployments/kubernetes-bootcamp --replicas=4
# 増えてるー
kubectl get deployments
kubectl get pods -o wide

スケールダウン

# スケールダウン(pods2つにする)
kubectl scale deployments/kubernetes-bootcamp --replicas=2
# 減ってるー
kubectl get deployments
kubectl get pods -o wide

ロードバランシング

なんどもアクセスすると異なるpodにアクセス(ロードバランシング)していることがわかる

# アクセスして見る
kubectl describe services/kubernetes-bootcamp
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
# 毎度違うpodにアクセスしてるーー
curl $(minikube ip):$NODE_PORT

アプリケーションのアップデート、ロールバック

アップデート

# set imageで更新したいバージョンを指定
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
# version2に更新されてる
kubectl describe services/kubernetes-bootcamp

## rollout でもversion upできるらしいもじゃ
kubectl rollout status deployments/kubernetes-bootcamp

ロールバック

# ロールバックできる!!
kubectl rollout undo deployments/kubernetes-bootcamp
# versionが戻ってる
kubectl describe services/kubernetes-bootcamp

まとめ

ざっくりと理解。次は以下交えて実際のアプリケーション作ってみよー

  • 自分のアプリに準じたConfigMapを作成してデプロイ
  • PersistantVolume(PV), PersistantVolumeClaim(PVC)を絡めてDBデータの永続化対応
  • hostPathを用いてmacとコンテナのディレクトリリンク
    • docker-composeで言う所のvolumes的なのがしたい。
    • ローカル環境ではわざわざimageのバージョンアップではなく変更に準じてコンテナの内容が変わるようにしたいから。。