이 글은 Application 프로젝트의 격리(isolation)가 주된 포인트이다.

보안 정책상 ‘Application 간에 확실한 격리가 되어야 한다’ 또는 ‘타 부서에 간섭 없이 나이스하게 격리 할 방법없어요?’ 라는 전제가 있는 경우

Multitenant 방식을 사용해서 프로젝트(namespace)로만 격리시켜 두면 간단하기 때문에, 이를 변경하는 방법에 대해서 작성 되었다.

0. SDN Plugin 종류

OpenShift에서 제공하는 SDN(Software-Defined Networking)은 OpenVSwitch 기반으로 3가지 모드를 지원 한다.

– Subnet

Layer 2 레벨로 모든 서비스간에 통신이 허용 된다.

– Multitenant

모든 서비스간에 통신은 격리(isolation)가 기본이며,

개별 프로젝트(namespace)마다 Virtual Network ID(VNID)를 부여 받아 관리 된다.

만일, Subnet과 동일한 효과를 보고자 한다면, VNID를 0으로 사용하면 된다.

– NetworkPolicy

관리자가 방화벽 정책 처럼 기준을 정하여 설정할 수 있다.

별도의 설정이 없는 경우에 기본은 모두 허용으로 되어있다.

openshift-installer를 기반으로 별도 설정 없이 클러스터를 구성하면 Network Policy로 구성이 된다.

보통은 All Deny 정책을 글로벌하게 설정한 후 세부적으로 허용할 부분만 설정 해주는 것이 가장 기본적인 방법이다.

다만, 설정 한번 잘못하면 전체 서비스가 장애가 발생할 수 있기 때문에,

이 부분에 대해서 사전에 충분히 고려가 되어야 할 사항이다.

1. SDN Plugin 구성

SDN Plugin을 구성하는 방법은 크게 2가지가 있다.

1.1. manifests 수정하여 구성

클러스터 초기 구성시 install-config.yaml 파일을 기반으로 manifests 파일을 만들어 custom yaml을 통해 구성하는 방법이다.

이 문서 마지막 부분의 링크1 예제를 통해 install-config.yaml 파일을 사용자 환경에 맞게 수정 후 manifests를 추출 한다.

manifests를 추출하면 cluster-network-02-config.yml 예제 파일이 생성 된다.

[root@bastion ~]# openshift-install create manifests
[root@bastion ~]# vi manifests/cluster-network-02-config.yml
apiVersion: config.openshift.io/v1
kind: Network
metadata:
  creationTimestamp: null
  name: cluster
spec:
  clusterNetwork:
  - cidr: 172.40.0.0/16
    hostPrefix: 24
  externalIP:
    policy: {}
  networkType: OpenShiftSDN
  serviceNetwork:
  - 172.30.0.0/16
status: {}

여기서 clusterNetwork, serviceNetwork, networkType 항목은 install-config.yaml 파일을 기반으로, openshift-installer가 자동 생성하는 항목이기 때문에 수정할 수 없다.

따라서, 위의 항목을 제외한 부분만을 YAML 파일로 만들어 둔다.

[root@bastion ~]# cd manifests
[root@bastion ~]# vi cluster-network-03-config.yml
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  creationTimestamp: null
  name: cluster
spec:
  defaultNetwork:
    type: OpenShiftSDN
    openshiftSDNConfig:
      mode: Multitenant
      vxlanPort: 4789
      mtu: 1450
      enableUnidling: true
      useExternalOpenvswitch: false
status: {}

– ignition 생성

클러스터 구성을 위한 ignition 파일을 생성하고 이후 작업은 PXE 또는 ISO 파일을 통해 설치를 진행한다.

[root@bastion ~]# openshift-install create ignition-configs

– SDN 정보 확인

설치 이후 SDN Plugin을 확인 한다.

[root@bastion ~]# oc get clusternetwork
NAME      CLUSTER NETWORK   SERVICE NETWORK   PLUGIN NAME
default   172.40.0.0/16     172.30.0.0/16     redhat/openshift-ovs-multitenant

1.2. Operator/Configmap을 통한 변경

openshift-network-operator 프로젝트(namespace)에서 operator 설정 파일과 configmap의 정보를 수정하여 반영하는 방법이다.

설정 이후 클러스터 전체 노드를 재부팅을 해야만 반영 되는 형태이기 때문에, 반드시 운영 담당자와 일정을 잡고 진행하는 것이 안전하다.

– Operator / Configmap 설정 백업

openshift-network-operator 프로젝트에서 기존 설정파일을 yaml 파일로 백업 받아 놓고 수정 한다.

[root@bastion ~]# oc project openshift-network-operator
[root@bastion ~]# oc get networks.operator.openshift.io cluster -o yaml > networks-operator-sdn-plugin.yaml.back
[root@bastion ~]# oc get configmap applied-cluster -o yaml > applied-cluster-configmap.yaml.back

– SDN 정보 변경

기본 NetworkPolicy에서 Multitenant로 변경 한다.

[root@bastion ~]# oc edit networks.operator.openshift.io cluster
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  creationTimestamp: "2021-02-14T12:10:49Z"
  generation: 2
  name: cluster
  resourceVersion: "2436"
  selfLink: /apis/operator.openshift.io/v1/networks/cluster
  uid: 8239f17f-028b-48cf-bafc-796a53650973
spec:
  clusterNetwork:
  - cidr: 172.40.0.0/16
    hostPrefix: 24
  defaultNetwork:
    openshiftSDNConfig:
      mode: Multitenant
      mtu: 1450
      vxlanPort: 4789
    type: OpenShiftSDN
  logLevel: ""
  serviceNetwork:
  - 172.30.0.0/16
status: {}

Configmap에서 json 형식으로 들어간 내용중에 문법에 주의하여 NetworkPolicy에서 Multitenant로 변경 한다.

[root@bastion ~]# oc edit configmap applied-cluster
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  applied: '{"clusterNetwork":[{"cidr":"172.40.0.0/16","hostPrefix":24}],"serviceNetwork":["172.30.0.0/16"],"defaultNetwork":{"type":"OpenShiftSDN","openshiftSDNConfig":{"mode":"Multitenant","vxlanPort":4789,"mtu":1450,"enableUnidling":$
kind: ConfigMap
metadata:
  creationTimestamp: "2021-02-14T12:15:01Z"
  name: applied-cluster
  namespace: openshift-network-operator
  ownerReferences:
  - apiVersion: operator.openshift.io/v1
    blockOwnerDeletion: true
    controller: true
    kind: Network
    name: cluster
    uid: 8239f17f-028b-48cf-bafc-796a53650973
  resourceVersion: "2794"
  selfLink: /api/v1/namespaces/openshift-network-operator/configmaps/applied-cluster
  uid: f9f52b25-d1b2-426d-8aa8-a26731ae62be

– 재부팅

전체 클러스터 노드를 재부팅 한다.

[root@bastion ~]# for ocp-node in {master01,master02,master03,router01,router02,router03,worker01,worker02}; do \
  ssh core@$ocp-node "sudo reboot";
done

– SDN 정보 확인

재부팅 이후 SDN Plugin을 확인 한다.

[root@bastion ~]# oc get clusternetwork
NAME      CLUSTER NETWORK   SERVICE NETWORK   PLUGIN NAME
default   172.40.0.0/16     172.30.0.0/16     redhat/openshift-ovs-multitenant

– RefURL

[1]: [OpenShift v4.x – Example install-config.yaml](https://gist.github.com/ruo91/88d9f3a923e1526aab9c7f61c5809b1e)
[2]: [OpenShift – Cluster Network Operator](https://github.com/openshift/cluster-network-operator#cluster-network-operator)
[3]: [OpenShift – Cluster Network Operator CRD](https://github.com/openshift/cluster-network-operator/blob/release-4.6/manifests/0000_70_cluster-network-operator_01_crd.yaml)
[4]: [](https://docs.openshift.com/container-platform/4.6/post_installation_configuration/network-configuration.html#nw-operator-cr_post-install-network-configuration)