Chuyển đến nội dung chính

レッスン10: NetworkPolicies & CKAD試験戦略

NetworkPolicyのingress/egressルール、default-denyパターンとpod selector。 CKAD試験戦略: kubectlショートカット、--dry-runパターンと時間管理。

NetworkPolicy — ingress/egressルール、default-denyとAND/ORロジック

1. NetworkPolicy

デフォルトでは、クラスター内のすべてのPodが相互に通信できます。NetworkPolicyはラベルに基づいてトラフィックを制限します。

デフォルト: 全PodがすべてのPodと通信可能(制限なし)

default-deny-all適用後:
  Pod A ──✗──► Pod B(ブロック)
  Pod A ──✗──► Pod C(ブロック)

allowポリシー適用後:
  Pod A (app=frontend) ──✓──► Pod B (app=backend, port 3000)
  Pod A ──✗──► Pod C (app=database)(依然ブロック)

2. NetworkPolicy構文

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-policy
  namespace: production
spec:
  podSelector:         # これらのPodに適用(空 = NS内の全Pod)
    matchLabels:
      app: backend
  policyTypes:
  - Ingress            # インバウンドトラフィックを制御
  - Egress             # アウトバウンドトラフィックを制御
  ingress:
  - from:
    - podSelector:     # このラベルのPodからの通信を許可
        matchLabels:
          app: frontend
    - namespaceSelector: # このNamespaceのPodからの通信を許可
        matchLabels:
          name: production
    ports:
    - protocol: TCP
      port: 3000
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 5432

試験のポイント — NetworkPolicyのAND vs OR:
from: [{podSelector}, {namespaceSelector}] = OR(いずれかのselectorに一致するPod)
from: [{podSelector + namespaceSelector}] 同じアイテム内 = AND(両方に一致するPod)
CKADで最もトリッキーなひっかけ問題の一つです。

3. よく使われるパターン

パターン1: 全ingressをデフォルト拒否
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
spec:
  podSelector: {}     # 空 = 全Podに一致
  policyTypes:
  - Ingress
  # ingressルールなし = 全ingressを拒否

パターン2: 全トラフィックをデフォルト拒否(ingress + egress両方)
---
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
  # ルールなし = 全拒否

パターン3: 全ingressを許可(denyをオーバーライド)
---
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - {}  # 空のルール = 全ingressを許可
パターンpolicyTypesルール効果
全ingress拒否[Ingress]ingressルールなし全インバウンドをブロック
全egress拒否[Egress]egressルールなし全アウトバウンドをブロック
特定を許可[Ingress]ingressルールを列挙一致するもののみ許可
DNS egressを許可[Egress]ポート53(UDP+TCP)宛てDNSクエリを許可

試験のポイント: NetworkPolicyはCNIプラグインがサポートしている場合のみ動作します(Calico、Cilium、Weave)。FlannelはNetworkPolicyをサポートしません! Ingress/Egressルールは加算的 — 同じPodに複数のポリシーが適用される場合、KubernetesはすべてのルールをOR結合します。

4. CKAD試験戦略

試験情報:
- 2時間、約15-20のハンズオンタスク(パフォーマンスベース)
- 各タスクの配点が異なる(配点の高いタスクを優先)
- 合格点: 66%
- 参照可能: kubernetes.io/docs + helm.sh/docs

重要なキーボードショートカット:
  k = kubectl(試験でexport alias k=kubectlが事前設定済み)
  CTRL+R = コマンド履歴を検索
  CTRL+A = 行頭に移動
各タスクのワークフロー:

1. タスク説明を注意深く読む(Namespaceに注意!)
2. 必要に応じてcontextを切り替え:
   kubectl config use-context cluster-name
3. Namespaceショートカットを設定:
   export ns=target-namespace
   alias kn="kubectl -n $ns"
4. --dry-run=client -o yamlでYAMLを生成:
   kubectl run pod --image=nginx --dry-run=client -o yaml > pod.yaml
5. YAMLを編集、apply、確認:
   kubectl apply -f pod.yaml
   kubectl get pods -n $ns

5. --dry-runパターン

# 手書きより速くYAMLテンプレートを生成:

Pod:
  kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml

Deployment:
  kubectl create deployment myapp --image=nginx --replicas=3 \
    --dry-run=client -o yaml > deploy.yaml

Service(ClusterIP):
  kubectl create service clusterip myapp --tcp=80:8080 \
    --dry-run=client -o yaml > svc.yaml

ConfigMap:
  kubectl create configmap myconfig --from-literal=k=v \
    --dry-run=client -o yaml > cm.yaml

Secret:
  kubectl create secret generic mysecret --from-literal=pass=secret \
    --dry-run=client -o yaml > secret.yaml

Job:
  kubectl create job myjob --image=busybox -- echo hello \
    --dry-run=client -o yaml > job.yaml

CronJob:
  kubectl create cronjob mycron --image=busybox --schedule="*/1 * * * *" \
    -- echo hello --dry-run=client -o yaml > cron.yaml

6. 必須kubectlショートカット

フルコマンド短縮形
kubectl get podsk get po
kubectl get deploymentsk get deploy
kubectl get servicesk get svc
kubectl get namespacesk get ns
kubectl get persistentvolumeclaimsk get pvc
kubectl get configmapsk get cm
kubectl get serviceaccountsk get sa
kubectl get networkpoliciesk get netpol
kubectl describe pod mypodk describe po mypod
kubectl delete pod mypod --forcek delete po mypod --force

7. 最終CKADチートシート

ドメイン主要トピック配点
App Design & Buildマルチコンテナ、Init Containers、Jobs、CronJobs、ボリューム20%
App DeploymentRolling updates、rollbacks、Helm、Kustomize20%
App ObservabilityProbes(liveness/readiness/startup)、logs、debug15%
App Env/Config/SecurityConfigMaps、Secrets、SecurityContext、SA、Resources、QoS25%
Services & NetworkingServices、Ingress、NetworkPolicies20%

8. 練習問題

Q1: podSelector: {} と policyTypes: [Ingress] のNetworkPolicyを適用しましたが、ingressルールはありません。何が起こりますか?

  • A) 全ingressトラフィックが許可される(ルールなし = 制限なし)
  • B) Namespace内の全Podへの全ingressトラフィックが拒否される ✓
  • C) 全Podが削除される
  • D) 外部ingressのみ拒否、内部Pod間通信は許可

解説: podSelector: {} はNamespace内の全Podに一致します。policyTypes: [Ingress] はこのポリシーがingressを制御することを示します。ingressルールがないということは、ゼロのトラフィックが許可されることを意味します。これが「全ingressをデフォルト拒否」パターンです。ソースに関係なく、クラスター内のPod間通信も拒否されます。

Q2: NetworkPolicyの以下の2つのfrom句の違いは何ですか?
句A: from: [{podSelector: {app: web}}, {namespaceSelector: {env: prod}}]
句B: from: [{podSelector: {app: web}, namespaceSelector: {env: prod}}]

  • A) 同じ意味
  • B) 句A: app=webのPodから、またはenv=prod Namespaceの任意のPodからの通信を許可。句B: env=prod Namespaceに属するapp=webのPodからのみ許可 ✓
  • C) 句AがANDロジック、句BがORロジック
  • D) 句Bは無効なYAML構文

解説: NetworkPolicyでは、podSelectorとnamespaceSelectorが別々のリストアイテム(-で区切られている)にある場合はORロジックです。同じリストアイテム(同じインデントレベル、-なし)にある場合はANDロジックです。これは重要な違いであり、試験でのよくあるひっかけ問題です。

Q3: CKAD試験中に特定のPod specを持つDeploymentを作成する必要があります。最速のアプローチはどれですか?

  • A) 暗記でYAML全体を手書き
  • B) kubernetes.ioドキュメントからサンプルYAMLを検索してコピー&ペースト
  • C) kubectl create deployment --dry-run=client -o yamlでテンプレートを生成して編集 ✓
  • D) Helmでデフォルト値のチャートをデプロイ

解説: --dry-run=client -o yaml パターンはリソースを作成せずに有効なYAMLを生成します。ファイルにリダイレクトし、異なるフィールドのみ編集して適用します。手動YAML作成より速く、構文エラーの可能性も低くなります。> file.yamlとの組み合わせで正確な編集が可能です。