こしあん
2025-12-13

Kubernetes学習メモ(1)


33{icon} {views}


Kubernetesを勉強したときのコマンドのメモです。流石に逃げられなくなった。随時追加します。

Pod、YAMLの記述、ReplicaSet、Deployment、Serviceまで。

教材

環境構築

EC2でARM系、Ubuntuでやってみた。Kubernetes(k8s)の前提でCPUコアが2以上必要

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の場合は一気に全部消して再作成する)

変更メッセージ

この方法が正式なやり方かわからないが、annotationskubernetes.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の中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です