付録B:マニフェストスニペット集

本文中で利用する代表的な YAML パターンを、コピペ可能な形でまとめます。
本付録は「最小構成」を優先し、実運用で必要となる追加項目(監視/セキュリティ/ポリシー等)は運用編で扱います。

使い方

  • まず metadata.name / metadata.namespace / labels を自分の環境に合わせて置換します。
  • Selector に使う labels は、Deployment/Service/Ingress で整合させます。
  • 複数リソースを 1 ファイルで管理する場合は --- で区切ります。

最小セット(適用と確認)

以下は Namespace / Deployment / Service をまとめて適用し、kubectl で疎通まで確認する最小例です。

kubectl apply -f - <<'YAML'
apiVersion: v1
kind: Namespace
metadata:
  name: demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/instance: demo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/instance: demo
    spec:
      containers:
        - name: web
          image: nginx:stable
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: demo
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/name: web
    app.kubernetes.io/instance: demo
  ports:
    - name: http
      port: 80
      targetPort: 80
YAML

確認:

kubectl get ns demo
kubectl -n demo rollout status deploy/web
kubectl -n demo get deploy,svc,pod -o wide
kubectl -n demo get endpoints web
# 別端末で実行するか、末尾に `&` を付けてバックグラウンドで実行
kubectl -n demo port-forward svc/web 8081:80
curl -fsS http://localhost:8081/ > /dev/null

Namespace

apiVersion: v1
kind: Namespace
metadata:
  name: demo

共通ラベル(推奨)

metadata:
  labels:
    app.kubernetes.io/name: web
    app.kubernetes.io/instance: demo

Deployment(最小)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/instance: demo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/instance: demo
    spec:
      containers:
        - name: web
          image: nginx:stable
          ports:
            - containerPort: 80

Deployment(Probe + Resources の入口)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/instance: demo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/instance: demo
    spec:
      containers:
        - name: web
          image: nginx:stable
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 50m
              memory: 64Mi
            limits:
              cpu: 200m
              memory: 256Mi
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 10
            periodSeconds: 10

Service(ClusterIP)

apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: demo
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/name: web
    app.kubernetes.io/instance: demo
  ports:
    - name: http
      port: 80
      targetPort: 80

Ingress(HTTP ルーティングの最小)

前提: Ingress Controller がクラスタに導入済みであること。

置換ポイント(例):

  • metadata.name / metadata.namespace
  • spec.rules[].host
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  namespace: demo
spec:
  ingressClassName: nginx
  rules:
    - host: web.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80

補足:

  • ingressClassName の要否や値は環境により異なります(デフォルトの IngressClass が設定済み、別の Controller を利用、など)。

ConfigMap(環境変数で注入)

構成:

  • ConfigMap
  • Deployment(環境変数の注入例)

置換ポイント(例):

  • ConfigMap: metadata.name / metadata.namespace / data
  • Deployment: metadata.name / metadata.namespace / 参照する ConfigMap 名(envFrom.configMapRef.name

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: web-config
  namespace: demo
data:
  APP_ENV: "dev"

Deployment 側(envFrom で注入)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: demo
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/instance: demo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/instance: demo
    spec:
      containers:
        - name: web
          image: nginx:stable
          envFrom:
            - configMapRef:
                name: web-config

まとめて apply したい場合(multi-doc YAML)

ConfigMap と Deployment を --- で区切って、まとめて適用できます。

kubectl apply -f - <<'YAML'
apiVersion: v1
kind: ConfigMap
metadata:
  name: web-config
  namespace: demo
data:
  APP_ENV: "dev"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/instance: demo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/instance: demo
    spec:
      containers:
        - name: web
          image: nginx:stable
          envFrom:
            - configMapRef:
                name: web-config
          ports:
            - containerPort: 80
YAML

Secret(ファイルとしてマウント)

構成:

  • Secret
  • Deployment(マウント例)

置換ポイント(例):

  • Secret: metadata.name / metadata.namespace / stringData
  • Deployment: metadata.name / metadata.namespace / 参照する Secret 名(volumes[].secret.secretName

Secret

apiVersion: v1
kind: Secret
metadata:
  name: web-secret
  namespace: demo
type: Opaque
stringData:
  password: "change-me"

Deployment 側(volumeMounts / volumes)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: demo
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/instance: demo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/instance: demo
    spec:
      containers:
        - name: web
          image: nginx:stable
          volumeMounts:
            - name: secret
              mountPath: /etc/secret
              readOnly: true
      volumes:
        - name: secret
          secret:
            secretName: web-secret

まとめて apply したい場合(multi-doc YAML)

Secret と Deployment を --- で区切って、まとめて適用できます。

kubectl apply -f - <<'YAML'
apiVersion: v1
kind: Secret
metadata:
  name: web-secret
  namespace: demo
type: Opaque
stringData:
  password: "change-me"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/instance: demo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/instance: demo
    spec:
      containers:
        - name: web
          image: nginx:stable
          volumeMounts:
            - name: secret
              mountPath: /etc/secret
              readOnly: true
          ports:
            - containerPort: 80
      volumes:
        - name: secret
          secret:
            secretName: web-secret
YAML

注意

  • nginx:stable は学習用途の例です。本番ではイメージの固定(digest 参照等)を検討してください。
  • Ingress の到達確認方法は環境により異なります(本書の第7章を参照してください)。