이 글은 Application 프로젝트의 격리(isolation)가 주된 포인트이다.
보안 정책상 ‘Application 간에 확실한 격리가 되어야 한다’ 또는 ‘타 부서에 간섭 없이 나이스하게 격리 할 방법없어요?’ 라는 전제가 있는 경우
Multitenant 방식을 사용해서 프로젝트(namespace)로만 격리시켜 두면 간단하기 때문에, 이를 변경하는 방법에 대해서 작성 되었다.
OpenShift에서 제공하는 SDN(Software-Defined Networking)은 OpenVSwitch 기반으로 3가지 모드를 지원 한다.
Layer 2 레벨로 모든 서비스간에 통신이 허용 된다.
모든 서비스간에 통신은 격리(isolation)가 기본이며,
개별 프로젝트(namespace)마다 Virtual Network ID(VNID)를 부여 받아 관리 된다.
만일, Subnet과 동일한 효과를 보고자 한다면, VNID를 0으로 사용하면 된다.
관리자가 방화벽 정책 처럼 기준을 정하여 설정할 수 있다.
별도의 설정이 없는 경우에 기본은 모두 허용으로 되어있다.
openshift-installer를 기반으로 별도 설정 없이 클러스터를 구성하면 Network Policy로 구성이 된다.
보통은 All Deny 정책을 글로벌하게 설정한 후 세부적으로 허용할 부분만 설정 해주는 것이 가장 기본적인 방법이다.
다만, 설정 한번 잘못하면 전체 서비스가 장애가 발생할 수 있기 때문에,
이 부분에 대해서 사전에 충분히 고려가 되어야 할 사항이다.
SDN Plugin을 구성하는 방법은 크게 2가지가 있다.
클러스터 초기 구성시 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 파일을 생성하고 이후 작업은 PXE 또는 ISO 파일을 통해 설치를 진행한다.
[root@bastion ~]# openshift-install create ignition-configs
설치 이후 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
openshift-network-operator 프로젝트(namespace)에서 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
기본 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 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)