Kubernetes初心者向けハンズオンガイド

# kubectlの基本まとめ：Kubernetes初心者向けハンズオンガイド

Kubernetesを扱う上で避けて通れないのが、`kubectl` コマンドです。本記事では、Kubernetesクラスタの操作に必須な `kubectl` の基本コマンドを、主に以下のリソースを中心に解説します。

## ✅ 本記事で扱う内容

- Namespaceの作成と参照  
- Kubernetes Objectの作成と参照  
- Pod / ReplicaSet / Deployment / Service / DaemonSet  の基礎
- LabelとAnnotationの基礎

---

## 1. Namespaceの作成と参照

Kubernetesでは、リソースを分離して管理するためにNamespaceを使用します。

```bash
# Namespace一覧を取得
kubectl get namespaces

# 新しいNamespace(dev)を作成
kubectl create namespace dev

# devというNamespace上にPodを作成
kubectl run nginx-pod --image=nginx -n dev

# Namespaceを指定してPodを表示
kubectl get pods -n dev
(nginx-podが表示されれば成功)
```
---
## ２．Kubernetes　Objectの作成と参照
Kubernetesでは基本的にYAMLファイルを用いた各種リソースの定義・操作を推奨しています。
```bash
# nginx-podというPodを作成するYAMLファイルを作成します。--dry-run=client -o yamlというオプションでPodは作成せずYAMLファイルのみ作成します。
kubectl run nginx-pod --image=nginx --dry-run=client -o yaml > nginx.yaml

# nginx.yamlファイルを用いてPodを作成します
kubectl apply -f nginx.yaml

# Podが作成されているかを確認
kubectl get pods

# Podを削除
kubectl delete -f nginx.yaml
```
次にYAMLファイルを作成せずに作成します。
```bash
# Podを作成
kubectl run nginx-pod --image=nginx

# Podが作成されたかを確認
kubectl get pods

# Podを削除
kubectl delete pod nginx
```
## 📝 コラム：なぜYAMLを使うのか？
このCollumは読み飛ばしても構いません

上記の例では前者ではYAMLファイルを用いてPodを作成し、後者ではYAMLファイルを作成せずPodを作成しました。なぜ一般に前者のYAMLファイルを作成する方法が推奨されているのかについて深堀りします。
　主な理由としては「再利用性」「履歴の可視性」「GitOpsとの親和性」が関わっています。
一般に管理方式では宣言的(YAMLに状態を保存)か命令的(コマンドライン操作)かに分かれます。宣言的管理方式ではYAMLファイルを編集することでPodに変更を加えることができ、変更部分はYAMLファイルに残ります。一方、命令的管理方式ではPodに変更を加えてもYAMLに残らないので構成の再利用性が低いのです。
　他にも様々な理由から宣言的管理方式、つまりYAMLファイルで管理することが推奨されています。CKAなどの試験では限られた時間の中で操作する必要があるので命令的管理方式でも問題ないですが、実際に開発現場やチーム開発では宣言的管理方式で運用するようにしましょう。

---
## ３. Podについて
PodはKubernetesの最小デプロイ単位です。Podの中には任意の数のコンテナが存在します。
```bash
# Pod作成(2でのnginx.yaml)
kubectl apply -f nginx.yaml

# Pod一覧を取得
kubectl get pods

# Podの詳細確認
kubectl describe pod nginx-pod

# Podのログ確認
kubectl logs nginx-pod

# Pod内にシェルで入る
kubectl exec -it nginx-pod -- /bin/sh

# Pod内から抜ける
exit
```
---
## ４．ReplicaSetについて
ReplicaSetは、Podのレプリカ数を保証するリソースです。例えばあるPodを常に３つに維持しておきたいといった場面ではReplicaSetを用います。仮に3つのうち1つのPodが障害を起こしてしまってもそのPodを削除後、新しいPodを作成することで常に3つに保ちます。
※通常はDeploymentを通して管理します。
```bash
# Replicasetを作成する。以下のYAMLファイルを作成してください。
# ファイル名はnginx-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset #レプリカセットの名前
  labels:
    app: nginx
spec:
  replicas: 3  #レプリカ数3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx #nginxイメージを使用
          ports:
            - containerPort: 80
```
```bash
# ReplicaSetの作成
kubectl apply -f nginx-rs.yaml

# ReplicaSet一覧
kubectl get rs

# ReplicaSetの状態確認
kubectl describe rs nginx-replicaset

# ReplicaSetの削除
kubectl delete -f nginx-rs.yaml

```
---
## 5. Deploymentについて
DeploymentはPodやReplicaSetの管理を自動化するリソースです。主な利用用途としては新しいバージョンの定期リリースを管理するためやダウンタイムを発生させずにバージョンのロールアウトなどに用いられています。
また、先ほどのReplicaSetやPodは直接操作せず、Deploymentから管理するのが推奨されています。
```bash
# Deploymentを命令的に作成
kubectl create deployment kuard-deploy --image=gcr.io/kuar-demo/kuard-amd64:1 --replicas=2
# 作成したDeploymentのYAMLファイルを作成
kubectl get deployment kuard-deploy -o yaml > kuard-deploy.yaml

# 動いているDeploymentを一旦削除
kubectl delete deployment kuard-deploy
```
そして先ほど作成したDeploymentのYAMLファイルを用いて宣言的に作成します
```bash
# 宣言的にDeploymentの作成
kubectl apply -f kuard-deploy.yaml

# Deployment一覧
kubectl get deployments

# レプリカ数を3→2に変更
kubectl scale deployment kuard-deploy --replicas=2

# ロールアウト状況の確認
kubectl rollout status deployment kuard-deploy

```
---
## 6. Serviceについて
ServiceはPodへのネットワークアクセスを安定して提供する抽象化レイヤーです。
Serviceは'kubectl expose'を用いて作成することができます
```bash
# Podの作成
kubectl run service-pod --image=gcr.io/kuar-demo/kuard-amd64:1 --port=8080

# Serviceの作成
kubectl expose deployment service-pod

# Service一覧
kubectl get svc

# PodとServiceの関連確認（ラベルセレクタをチェック）
kubectl describe svc service-pod
```
---
## 7. LabelとAnnotationについて
ラベルはリソースのグルーピング、アノテーションはメタデータ管理に使います。
```bash
# ラベル付きでPod作成（YAMLファイルでも指定可能）
kubectl run nginx --image=nginx --labels="env=prod,tier=frontend"

# 特定ラベルのPodを検索
kubectl get pods -l env=prod

# アノテーションを付加
kubectl annotate pod nginx description="Prod-Pod"
```
---
## 8. DaemonSetについて
DaemonSetは、各ノードに1つずつPodを配備する際に使用します（例：ログ収集エージェントなど）。
まず、以下のファイルを作成します。
```bash
# log-agent-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: log-agent
  template:
    metadata:
      labels:
        name: log-agent
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:v1.11
```
```bash
# DaemonSetの作成
kubectl apply -f log-agent-daemonset.yaml

# DaemonSetの確認
kubectl get daemonsets

# DaemonSetの削除
kubectl delete -f log-agent-daemonset.yaml
```
---
## まとめ
kubectl はKubernetes運用の基本。まずは、

「作ってみる」→「get/describe」→「削除してみる」
というループで操作感覚を身につけるのがおすすめです。

必要に応じて、気になった部分などはKubernetes公式ドキュメント(https://kubernetes.io/docs/reference/kubectl/) やkubectlのクイックリファレンス(https://kubernetes.io/docs/reference/kubectl/cheatsheet/) を調べることがおすすめです。CKA試験では試験中にKubernetes公式ドキュメントのみ参照できるので受験予定の方は公式ドキュメントに慣れておくことを推奨します。