KubernetesのNetworkPolicyとかNodeAffinityやinitContainersを備忘録的にメモ

f:id:komeiy:20150107164847j:plain

タイトルの通りですが、備忘録です。 色々と機能あるので知らないことがいっぱいです。記憶定着させる意味も込めて書いているのでそんなたいした内容はないです。

The NetworkPolicy Resource

ほぼ公式に書いてあるから不要かもですが、サンプルだとこんな感じ。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

この pod からあのへの通信だけ許可するみたいなときに使います。 以下のように記載して、 role: db というラベルがついた pod へは role: frontend というラベルがついた pod からしか通信できないようにするものです。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: frontend

使い所ありそう。

Node Affinity

これもほぼ公式に書いてあるのですが、初見でちょっとうわってなるのでかいつまんでメモ。

まずサンプルはこんな感じです。

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - e2e-az1
            - e2e-az2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: k8s.gcr.io/pause:2.0

requiredDuringSchedulingIgnoredDuringExecution がスケジューリング中のものに適用して、すでに実行済みのものは対象外だよ的な意味です。

matchExpressionskey の部分なのですが、node で describe 見るとわかりやすいです。 Labels: kubernetes.io/role=node とか記載があるはずです。もしくは、 kubectl get nodes --show-labels でもいいかもしれません(ちょっと見づらいですが)

例えば、 kubernetes.io/hostname を使えば指定したホスト名を持った node に pod を固めることもできます。ゾーンとかの方が使うのかな。

initContainers

公式ですが、ここをみるよりはこっちを見た方がわかりやすかったです。

サンプルは以下の通りです。

apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  # These containers are run during pod initialization
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://kubernetes.io
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  dnsPolicy: Default
  volumes:
  - name: workdir
    emptyDir: {}

emptyDir なので非永続化ボリュームを用意しています。それをまず initContainers で定義した busybox/work-dir にマウントして wget を利用して index.html を emptyDir に保存しています。nginx コンテナも workdir を /usr/share/nginx/html へボリュームマウントしていますので、先ほど保存した index.html が保存された状態であがってきます。Kubernetes の世界でクローズ出来ていいですね。使い所あるかな。

その他

ちなみに Kubernetes の基礎知識が足りてないな、知識ちゃんと保管したいな・・・って人は以下の参考書がオススメです。 かなり詳細にそして網羅されているので、これ一冊読んでおけば大丈夫です。電子書籍版もあります

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

入門 Kubernetes

入門 Kubernetes

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門