NetworkPolicy with Calico
EKS で NetworkPolicy を利用する場合、手動で Calico を導入する必要があるみたい。
(GCP では組み込まれている模様)
以下を参考に進める。
Amazon EKS に Calico をインストールする
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/calico.html
※ そもそも Calico って?
Kubernetes のみならず、 OpenStack や Mesos, Docker などといったプロジェクトとインテグレーションする OSS プロジェクトらしい。
SDN に近いようなプロジェクトっぽい。
導入
以下からマニフェストを持ってくる。
aws/amazon-vpc-cni-k8s | Github
https://github.com/aws/amazon-vpc-cni-k8s
$ kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/v1.2/calico.yaml
daemonset.extensions "calico-node" created
customresourcedefinition.apiextensions.k8s.io "felixconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "bgpconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "ippools.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "hostendpoints.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "clusterinformations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "globalnetworkpolicies.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "globalnetworksets.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "networkpolicies.crd.projectcalico.org" created
serviceaccount "calico-node" created
clusterrole.rbac.authorization.k8s.io "calico-node" created
clusterrolebinding.rbac.authorization.k8s.io "calico-node" created
deployment.extensions "calico-typha" created
clusterrolebinding.rbac.authorization.k8s.io "typha-cpha" created
clusterrole.rbac.authorization.k8s.io "typha-cpha" created
configmap "calico-typha-horizontal-autoscaler" created
deployment.extensions "calico-typha-horizontal-autoscaler" created
role.rbac.authorization.k8s.io "typha-cpha" created
serviceaccount "typha-cpha" created
rolebinding.rbac.authorization.k8s.io "typha-cpha" created
service "calico-typha" created
$ kubectl get daemonset calico-node --namespace kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 3 3 3 3 3 <none> 33s
calico-node が 3 台 READY になれば準備完了。
NetworkPolicy の作成
ベースは以下のような形である。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: sample-networkpolicy
namespace: default # NetworkPolicyを作成するNamespaceを指定
spec:
podSelector:
# 設定する対象のPodをここに書く
# ラベルセレクタなので、複数のPodを対象にできる
policyTypes:
- Ingress # Ingressルールを作成する場合明示
- Egress # Egressルールを作成する場合明示
ingress:
- from:
# Ingressルールをここに書く(Egressルールと形式は同じ)
ports:
# このIngressルールで許可する受信Port番号とプロトコルを書く
egress:
- to:
# Egressルールをここに書く(Ingressルールと形式は同じ)
ports:
# このEgressルールで許可する宛先Port番号とプロトコルを書く
テスト
以下のデモを参考にする。
Stars Policy Demo | Project Calico
https://docs.projectcalico.org/v3.1/getting-started/kubernetes/tutorials/stars-policy/
環境構築
以下 5 つのマニフェストを適用。
$ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/tutorials/stars-policy/manifests/00-namespace.yaml
namespace "stars" created
$ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/tutorials/stars-policy/manifests/01-management-ui.yaml
namespace "management-ui" created
service "management-ui" created
replicationcontroller "management-ui" created
$ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/tutorials/stars-policy/manifests/02-backend.yaml
service "backend" created
replicationcontroller "backend" created
$ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/tutorials/stars-policy/manifests/03-frontend.yaml
service "frontend" created
replicationcontroller "frontend" created
$ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/tutorials/stars-policy/manifests/04-client.yaml
namespace "client" created
replicationcontroller "client" created
service "client" created
起動を確認。
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
client client-cstbk 1/1 Running 0 1m
management-ui management-ui-bcddg 1/1 Running 0 2m
stars backend-jrbs2 1/1 Running 0 2m
stars frontend-kmqtl 1/1 Running 0 1m
...
NodePort で外部からの接続を受け付けようと思ったが、デフォルトで NodePort は作られているみたい。
$ kubectl get services --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
client client ClusterIP 172.20.185.194 <none> 9000/TCP 2h
default kubernetes ClusterIP 172.20.0.1 <none> 443/TCP 7d
kube-system calico-typha ClusterIP 172.20.80.158 <none> 5473/TCP 3h
kube-system kube-dns ClusterIP 172.20.0.10 <none> 53/UDP,53/TCP 7d
management-ui management-ui NodePort 172.20.191.49 <none> 9001:30002/TCP 2h
stars backend ClusterIP 172.20.218.80 <none> 6379/TCP 2h
stars frontend ClusterIP 172.20.230.212 <none> 80/TCP 2h
ワーカーノード (EC2) のセキュリティグループで 30002 を開けてあげれば、 web ブラウザから確認できる。

ネットワークポリシーについては別途まとめる。
