引き続き kubernetes で学習。今回はネットワークポリシー初回
caloco の Simple policy tutorial
Configure namespaces
ネームスペース作成...の前に確認
$ kubectl get ns NAME STATUS AGE default Active 22h kube-node-lease Active 22h kube-public Active 22h kube-system Active 22h
ネームスペース作成
$ kubectl create ns policy-demo namespace/policy-demo created
確認
$ kubectl get ns NAME STATUS AGE default Active 22h kube-node-lease Active 22h kube-public Active 22h kube-system Active 22h policy-demo Active 11s
Create demo Pods
NAMESPACE:policy-demo でいろいろやる前に確認
$ kubectl get all --namespace=policy-demo No resources found.
deployment とか作成。警告されるがスルーで。
$ kubectl run --namespace=policy-demo nginx --replicas=2 --image=nginx kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/nginx created
確認。pod, deployment, replicaset ができている。
$ kubectl get all --namespace=policy-demo NAME READY STATUS RESTARTS AGE pod/nginx-7db9fccd9b-fgd66 1/1 Running 0 66s pod/nginx-7db9fccd9b-kp2d5 1/1 Running 0 66s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx 2/2 2 2 66s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-7db9fccd9b 2 2 2 66s
pod を wide で確認
$ kubectl get pod --namespace=policy-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7db9fccd9b-fgd66 1/1 Running 0 5m26s 10.244.2.2 kb3 <none> <none> nginx-7db9fccd9b-kp2d5 1/1 Running 0 5m26s 10.244.1.2 kb2 <none> <none>
deployment にサービス:nginxをつける。これでpodからサービス名でアクセスできるようになる、のは以前調べた。
$ kubectl expose --namespace=policy-demo deployment nginx --port=80 service/nginx exposed
access pod をrunする。プロンプトが表示される。
$ kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. If you don't see a command prompt, try pressing enter. / #
access pod で nginx サービスにアクセス。nginx がレスポンスする。
/ # wget -q nginx -O -
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Enable isolation
policy-demo名前空間で分離を有効にする。Calicoはこの名前空間のポッドへの接続を禁止する。
kind: NetworkPolicy
Network Policies https://kubernetes.io/docs/concepts/services-networking/network-policies/
$ kubectl create -f - <<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: default-deny
namespace: policy-demo
spec:
podSelector:
matchLabels: {}
EOF
networkpolicy.networking.k8s.io/default-deny created
また access pod で wget してみる。タイムアウトする。
/ # wget -q nginx -O - ^C / # wget -q --timeout=5 nginx -O - wget: download timed out
Allow access using a network policy
NetworkPolicyを使ってnginxサービスへのアクセスを有効にする。accessポッドからの着信接続は許可されますが、他の場所からの接続は許可されない。
新しいNetworkPolicy:access-nginxを作成。前のはdefault-deny。
kubectl create -f - <<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: access-nginx
namespace: policy-demo
spec:
podSelector:
matchLabels:
run: nginx
ingress:
- from:
- podSelector:
matchLabels:
run: access
EOF
networkpolicy.networking.k8s.io/access-nginx created
また access pod で wget してみる。アクセスできた。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> :
pod:cant-access から wgetしてみる。タイムアウトした。
$ kubectl run --namespace=policy-demo cant-access --rm -ti --image busybox /bin/sh : If you don't see a command prompt, try pressing enter. / # wget -q --timeout=5 nginx -O - wget: download timed out
いろいろ確認
ここでチュートリアルはお掃除して終了だが、もう少し見てみる。
$ kubectl get networkpolicy --namespace=policy-demo NAME POD-SELECTOR AGE access-nginx run=nginx 9m54s default-deny <none> 15m
default-deny
$ kubectl describe networkpolicy default-deny --namespace=policy-demo
Name: default-deny
Namespace: policy-demo
Created on: 2019-04-18 19:28:37 +0900 JST
Labels: <none>
Annotations: <none>
Spec:
PodSelector: <none> (Allowing the specific traffic to all pods in this namespace)
Allowing ingress traffic:
<none> (Selected pods are isolated for ingress connectivity)
Allowing egress traffic:
<none> (Selected pods are isolated for egress connectivity)
Policy Types: Ingress
access-nginx
$ kubectl describe networkpolicy access-nginx --namespace=policy-demo
Name: access-nginx
Namespace: policy-demo
Created on: 2019-04-18 19:34:31 +0900 JST
Labels: <none>
Annotations: <none>
Spec:
PodSelector: run=nginx
Allowing ingress traffic:
To Port: <any> (traffic allowed to all ports)
From:
PodSelector: run=access
Allowing egress traffic:
<none> (Selected pods are isolated for egress connectivity)
Policy Types: Ingress