2018年6月17日日曜日

OpenShift3.7/Kubernetes のLabelsを使用したFirewall設定例

前回OpenShift 3.7 + TungstenFabricをインストールしました。
今回はその環境を利用して、PODへの仮想ネットワークの適用とLabelsでのFirewall設定を行います。

まず、OpenShift上で新しいプロジェクトを作成します。
WebUIから操作する場合、初期画面のCreate Projectをクリックし、Nameにプロジェクト名を入れると作成されます。
cliの場合は
oc new-project (project名)

で作成されます。
プロジェクトに移動するには
oc project (project名)

で移動します。
次にTungstenFabricのWebUIから仮想ネットワークを作成します。
Configure > Networking > Networks をクリックし  default-domain > (プロジェクト名) を選択肢、仮想ネットワーク名とCIDRを入力し、Saveします。
このとき、Advanced option内のSNAT にチェックを入れると、podがInternetにアクセスする場合に、nodeのIPアドレスでNATしてInternetに接続します。
**専用のゲートウェイルータがない場合、このオプションを入れることでInternetには接続可能です
次にpod (Container)を作成するyamlファイルを定義します。
以下が例ですが、上記で作成した仮想ネットワークを"annotations"という項目内にドメイン名、プロジェクト名、仮想ネットワーク名を設定します。
このannotationsによって、pod-networkではなく専用の仮想ネットワークが割り当てられます。また、labelsにはこのApplicationとlabelの2を設定しています。
Applicationは複数のpodで構成されるサービスとして定義し、labelはpodのロールを定義しています。
apiVersion: v1
kind: Pod
metadata:
  name: service1-web
  labels:
    Application: service1
    label: web
  annotations: {
    "opencontrail.org/network" : '{"domain":"default-domain", "project": "test-project", "name":"VN1"}'
  }
spec:
  containers:
  - name: service1-web
    image: cirros

同様のyamlをapi,dbも同じように作成します。githubにサンプルがあります。
それではこれらのpodを作成します。
oc project test-project
Now using project "test-project" on server "https://openshift-1:8443".
oc create -f service1-web.yaml
pod "service1-web" created
podの状態を確認します。
oc get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP             NODE
service1-web   1/1       Running   0          3m        192.168.10.3   openshift-2
podへ192.168.10.0/24 より払い出されているのが確認できます。
同様にapi,dbも作成します。
作成されたら通信確認を行います。
WebUIのTerminalもしくはcliよりoc exec -it (pod 名) sh のようにpodで実行するコマンドを入れるとshellなどに入れます。
webから192.168.10.4および192.168.10.5に疎通を確認します。
[root@openshift-1 pod]# oc exec -it service1-api sh
/ # ping -c 2 192.168.10.4
PING 192.168.10.4 (192.168.10.4): 56 data bytes
64 bytes from 192.168.10.4: seq=0 ttl=64 time=0.064 ms
64 bytes from 192.168.10.4: seq=1 ttl=64 time=0.073 ms

--- 192.168.10.4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.064/0.068/0.073 ms
/ # ping -c 2 192.168.10.5
PING 192.168.10.5 (192.168.10.5): 56 data bytes
64 bytes from 192.168.10.5: seq=0 ttl=64 time=0.539 ms
64 bytes from 192.168.10.5: seq=1 ttl=64 time=0.075 ms

--- 192.168.10.5 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.075/0.307/0.539 ms
次にContrailでFirewallを作成します。
OpenShiftで作成したLabelはContrail上でも確認できます。
Configure > Tags > Global TagsをクリックするとTag(Label)の一覧が表示されます。
先にContrail側でTagを定義し、そのTagをOpenShift側で利用することも可能です。

次にTagベースのFirewallを作成します。
Configure > Security > Project Scoped Policies をクリックし、FWを適用したいプロジェクトを選択し、+ をクリックするとWizardが開きます。
Application Tagにpodが属するApplicationを選択しこのポリシーの名前を入力してAdd Firewall Policyをクリックします。

Firewall の作成画面が開くので、名前を入力してNextをクリックします。
Firewallルールの入力を行うには+をクリックして行を追加します。
後はLabelを一覧から選択し許可します。Policyを追加すると、定義されていない通信は行えなくなります。(よくあるFirewallの暗黙のDeny)入力したらSave Policyをクリックします。
画面が戻ってくるのでFinishをクリックし、Wizardを終了させます。
これでTagベースのFirewallの設定は終了です。

最後に通信確認です。
WebのpodからapiとdbにPingを打つと、apiは通信できますが、dbはタイムアウトして通史ができなくなりました。
[root@openshift-1 pod]# oc exec -it service1-web sh
/ # ip a
1: lo:  mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
27: eth0@if28:  mtu 1500 qdisc noqueue
    link/ether 02:b7:00:bf:48:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.3/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::8475:40ff:fee0:2a/64 scope link
       valid_lft forever preferred_lft forever
/ # ping -c 2 192.168.10.4
PING 192.168.10.4 (192.168.10.4): 56 data bytes
64 bytes from 192.168.10.4: seq=0 ttl=64 time=0.345 ms
64 bytes from 192.168.10.4: seq=1 ttl=64 time=0.083 ms

--- 192.168.10.4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.083/0.214/0.345 ms
/ # ping -c 2 192.168.10.5
PING 192.168.10.5 (192.168.10.5): 56 data bytes

--- 192.168.10.5 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

以上のことから、TungstenFabricを使用すると、podに任意の仮想ネットワークを割当、さらにTag(Label)ベースでの通信制御ができることようになります。

0 件のコメント:

コメントを投稿