Kubernetes学習メモ(1)

Kubernetesを勉強したときのコマンドのメモです。流石に逃げられなくなった。随時追加します。
Pod、YAMLの記述、ReplicaSet、Deployment、Serviceまで。
目次
教材
- Udemy : Kubernetes for the Absolute Beginners – Hands-on
- 英語音声だが日本語字幕あり。セールで買うと安い
- KodeKloud : Crash Course: Kubernetes For Absolute Beginners
- 別途KodeKloudの登録が必要(無料)
環境構築
EC2でARM系、Ubuntuでやってみた。Kubernetes(k8s)の前提でCPUコアが2以上必要。
- Dockerのインストール
- Minikubeのインストール:k8sの動作本体
- kubectlのインストール
Podの操作
Podの作成。kubectl runはデバッグ・テスト用のコマンドで、本番のデプロイをならkubectl create deploymentを推奨。
nginxのPodを作成
kubectl run nginx --image=nginx
Podの一覧を取得
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 9s
Podの状態を取得(IPを含めてみたいときは-o wideオプションをつける)
kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
(略)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m44s default-scheduler Successfully assigned default/nginx to minikube
Normal Pulling 3m43s kubelet Pulling image "nginx"
Normal Pulled 3m37s kubelet Successfully pulled image "nginx" in 5.741s (5.741s including waiting). Image size: 172250416 bytes.
Normal Created 3m37s kubelet Created container: nginx
Normal Started 3m37s kubelet Started container nginx
Podの削除
kubectl delete pod nginx
deploymentでPodを作成
kubectl create deployment nginx --image=nginx
# 比較用
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-66686b6766-tmlt5 1/1 Running 0 9s
deploymentでPodを削除
kubectl delete deployment nginx
ノードの状態を取得:(OSを含めてみたいときは-o wide)
kubectl get nodes
YAMLでのPodの作成
s01_pods.yamlに以下のファイルを作成。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
tier: frontend
spec:
containers:
- name: nginx
image: nginx
Podのデプロイ
kubectl apply -f ./s01_pods.yaml
Podの削除
kubectl delete -f ./s01_pods.yaml
(Terraformっぽくてシンプルで良い)
環境変数を使う:コンテナ設定にenvを追加
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
tier: frontend
spec:
containers:
- name: nginx
image: nginx
env:
- name: MY_ENV_VALUE
value: helloworld1234
Podの環境変数を読む
kubectl describe pod nginx
(略)
Ready: True
Restart Count: 0
Environment:
MY_ENV_VALUE: helloworld1234
ReplicaSet
このファイルをs03_replicaset.yamlとして保存
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: busybox-replicaset
spec:
selector:
matchLabels:
app: myapp
replicas: 3
template:
metadata:
name: busybox
labels:
app: myapp
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "sleep 3600"] # CrashLoopBackOff対策のため1時間スリープして生きておく
ReplicaSetの作成
kubectl apply -f ./s03_replicaset.yaml
ReplicaSetの一覧を取得
kubectl get replicaset
NAME DESIRED CURRENT READY AGE
busybox-replicaset 3 3 3 2m
※Podの状態取得をすると3つ展開表示される(例:Auto Scaling Group vs EC2のような関係)
kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-replicaset-49fzh 1/1 Running 0 3m28s
busybox-replicaset-rcdws 1/1 Running 0 3m28s
busybox-replicaset-zzpbn 1/1 Running 0 3m28s
ReplicaSetの状態(詳細)を取得
kubectl describe replicaset busybox-replicaset
現在デプロイされているReplicaSetを編集する
システムが自動生成したファイルを編集し、保存すると反映されるが(例:レプリカ数の変更)本当にデバッグ用。
kubectl edit replicaset busybox-replicaset
レプリカ数を一時的に変更
YAMLを編集せずに、一時変更ならこちらのほうがお行儀は良さそう。
# レプリカ数を2にスケールダウン
kubectl scale replicaset busybox-replicaset --replicas=2
Deployment
以下の内容をs04_deployment.yamlとして保存。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: myapp
replicas: 3
template:
metadata:
name: nginx-app
labels:
app: myapp
tier: frontend
spec:
containers:
- name: nginx
image: nginx
デプロイを開始
kubectl apply -f ./s04_deployment.yaml
デプロイの一覧
kubectl get deployment
(裏ではdeployment→replicaset→pod)の流れで作成されている。
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 4m3s
$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-deployment-7585c6c4c7 3 3 3 4m5s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7585c6c4c7-5hpq6 1/1 Running 0 4m10s
nginx-deployment-7585c6c4c7-k2vzk 1/1 Running 0 4m10s
nginx-deployment-7585c6c4c7-pkjts 1/1 Running 0 4m10s
「get ◯◯」を全部を一気に見たい
kubectl get all
デプロイの詳細
kubectl describe deployment nginx-deployment
deploymentとreplicasetの違いは、deploymentはRollingUpdateなどのデプロイ戦略が用意されている点。
Rolling
(Udemyの内容より結構編集入れてる)
これをs05_rolling.yamlとして保存する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: myapp
replicas: 6
template:
metadata:
name: nginx-app
labels:
app: myapp
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.28
デプロイを行う。
kubectl apply -f ./s05_rollong.yaml
イメージタグのアップデートのデフォルト挙動
nginxのイメージタグを1.28から1.29に変更してapplyする。
> kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-6cffdb8c96-4qqqb 1/1 Running 0 7m3s
nginx-deployment-6cffdb8c96-lzqj5 0/1 Completed 0 7m3s
nginx-deployment-6cffdb8c96-n9p2b 1/1 Running 0 7m3s
nginx-deployment-6cffdb8c96-p2x8q 1/1 Running 0 7m3s
nginx-deployment-6cffdb8c96-v28nz 1/1 Running 0 7m3s
nginx-deployment-8556b5d749-jrbbf 0/1 ContainerCreating 0 0s
nginx-deployment-8556b5d749-jwgsq 1/1 Running 0 4s
nginx-deployment-8556b5d749-m8h4f 0/1 ContainerCreating 0 4s
nginx-deployment-8556b5d749-tqbkc 0/1 ContainerCreating 0 4s
YAMLでのローリング戦略の書き方
デフォルトではローリングアップデートになる。ローリング戦略をYAMLで書くには、spec以下に書く。
apiVersion: apps/v1
kind: Deployment
metadata:
spec:
selector:
replicas: 6
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
template:
以下のようにRecreateにすると、一気に置き換える戦略になる。デプロイは速いがダウンタイムがある。
strategy:
type: Recreate
NAME READY STATUS RESTARTS AGE
nginx-deployment-8556b5d749-4k7j8 0/1 ContainerCreating 0 1s
nginx-deployment-8556b5d749-b7gds 0/1 ContainerCreating 0 1s
nginx-deployment-8556b5d749-blf4q 0/1 ContainerCreating 0 1s
(略 Recreateの場合は一気に全部消して再作成する)
変更メッセージ
この方法が正式なやり方かわからないが、annotationsのkubernetes.io/change-causeでメッセージを追加できる。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
annotations:
kubernetes.io/change-cause: "初回リリース: nginx 1.28 を6レプリカでデプロイ"
spec:
selector:
matchLabels:
app: myapp
replicas: 6
template:
metadata:
name: nginx-app
labels:
app: myapp
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.28
これで1.28→1.29のアップデートを行う。変更メッセージの確認:
kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 初回リリース: nginx 1.28 を6レプリカでデプロイ
2 2回目リリース: nginx 1.29 を6レプリカでデプロイ
ロールバックする
kubectl rollout undo deployment/nginx-deployment
リビジョンはこのようになる。
$ kubectl rollout undo deployment/nginx-deployment
deployment.apps/nginx-deployment rolled back
$ kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
2 2回目リリース: nginx 1.29 を6レプリカでデプロイ
3 初回リリース: nginx 1.28 を6レプリカでデプロイ
YAMLではなくアドホックにイメージタグを変える
kubectl set image deployment/nginx-deployment nginx=nginx:1.27
Service
NodePort:ホストマシンにIPを公開(例:フロントエンド)ClusterIP:ホストマシンにIPを公開しない中継用のポイント(例:フロントエンド→バックエンド、バックエンド→DB間の接続)LoadBalancer:クラウドベンダーとの統合
NodePort
s07_service_nodeportというディレクトリを作る。pod.yamlにPodの定義を書く。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx
service.yamlにNodePortを書く。
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30004
selector:
app: myapp
サービスとポッドの起動
kubectl apply -f .
サービスの一覧
kubectl get service
# または
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d2h
myapp-service NodePort 10.107.133.3 <none> 80:30004/TCP 29m
サービスの詳細を取得
kubectl describe svc kubernetes
現在のMinikube側のIPの取得
minikube service myapp-service --url
# 結果例
http://192.168.49.2:30004
これをcurlすると「Welcome to nginx!」と表示される。VSCodeからEC2に接続している場合、このURLはMinikubeのものなので、ローカルホストにポートフォワーディングが必要(socat)など。
一括削除
kubectl delete -f .
ClusterIP
s08_service_clusteripというディレクトリを作り、pod.yamlに
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379
name: redis
service.yamlに
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
type: ClusterIP # デフォルト設定なので省略可能
ports:
- name: "redis-service"
port: 6379
targetPort: 6379
selector:
app: redis
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー
