Kubernetesチュートリアル

Kubernetesチュートリアルを動かした際の作業メモ。

kubernetes.io

本記事で使用している画像は全てkubernetesチュートリアルページからの引用です。

Module1: クラスターの作成

# クラスタの情報取得
kubectl cluster-info

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

# deploymentを作成
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

# deploymentの一覧を確認
kubectl get deployments

# 通信をクラスタ全体のプライベートネットワークに転送するために"proxy"を作成
kubectl proxy

# クラスタのバージョン取得
curl http://localhost:8001/version

APIサーバーは、pod名に基づいて各podのエンドポイントを自動的に作成し、プロキシを通じてアクセスできるようにしてくれる。

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

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/

Module3: Podとノードについて

Pod:論理ホスト. 独立したネットワークで動いている. Node: ワーカーマシン(アプリを実行するためのコンピュータリソース). クラスターによって仮想、物理マシンのどちらであってもよい.

podの状態を確認する

# podsの情報を取得
kubectl get pods

# podsの中でどんなコンテナが動いているかを確認
kubectl desctibe pods

# アプリケーションの出力を確認
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

# log取得
kubectl logs $POD_NAME

# コンテナ上でコマンドを実行
kubectl exec $POD_NAME -- env

# bash sessionを実行
kubectl exec -ti $POD_NAME -- bash

Module4: Serviceを使ったアプリケーションの公開

Clusterを使ってコンテナを外部に公開することができる. Clusterは以下の4種類ある.

ClusterIP (既定値) - クラスター内の内部IPでServiceを公開します。この型では、Serviceはクラスター内からのみ到達可能になります。 NodePort - NATを使用して、クラスター内の選択された各ノードの同じポートにServiceを公開します。:を使用してクラスターの外部からServiceにアクセスできるようにします。これはClusterIPのスーパーセットです。 LoadBalancer - 現在のクラウドに外部ロードバランサを作成し(サポートされている場合)、Serviceに固定の外部IPを割り当てます。これはNodePortのスーパーセットです。 ExternalName - 仕様のexternalNameで指定した名前のCNAMEレコードを返すことによって、任意の名前を使ってServiceを公開します。プロキシは使用されません。このタイプはv1.7以上のkube-dnsを必要とします。

Serviceとラベル

Serviceは、ラベルとセレクタを使用して一連のPodを照合する. ラベルは、作成時またはそれ以降にオブジェクトにアタッチでき、いつでも変更可能.

ラベル

# clusterの情報を確認
kubectl get services

# どのポートが外部に公開されているか確認
kubectl describe services/kubernetes-bootcamp

# 外向けに公開
ubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services

# node port確認
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

ラベルの付与

# ラベル確認
kubectl describe deployment

# ラベルで取得
kubectl get pods -l app=kubernetes-bootcamp
kubectl get services -l app=kubernetes-bootcamp

# 新しいラベル付与
kubectl label pods $POD_NAME version=v1

サービスの削除

kubectl delete service -l app=kubernetes-bootcamp

Module5: アプリケーションの複数インスタンスを実行

Deploymentをスケールアウトすると新しいPodが作成され、使用可能なリソースを持つノードに割り当てられる.

# Developmentにより作成されたReplicaSetを取得
kubectl get rs

# Developmentを4レプリカにスケール
kubectl scale deployments/kubernetes-bootcamp --replicas=4

# Developmentを取得
kubectl get deployments

# podsを取得
kubectl get pods -o wide

ロードバランスされているか確認

# service再作成
ubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

うまくできないので一旦スキップ

スケールダウン

kubectl scale deployments/kubernetes-bootcamp --replicas=2

Module6: ローリングアップデートの実行

ローリングアップデートでは、Podインスタンスを新しいインスタンスで段階的にアップデートすることで、ダウンタイムなしでDeploymentをアップデートできる. Deploymentがパブリックに公開されている場合、Serviceはアップデート中に利用可能なPodのみにトラフィックを負荷分散してくれる。

kubectl get pods
# imageのバージョンアップデート
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

# ロールアウト
kubectl rollout status deployments/kubernetes-bootcam

# ロールバック
kubectl rollout undo deployments/kubernetes-bootcamp