본문 바로가기
Linux/OpenShift

RHOCP) Infra node 구성과 워크로드 격리

by LILO 2023. 7. 29.
반응형

INTRO

이전의 RHOCP TB Architecture에서는 Infra node 별도로 구성하지 않고 클러스터 구축을 하였습니다.

RHOCP에서 Infra node는 Cluster Logging(EFK), Openshift Monitoring Stack, Image Registry Operator 등을 배포하여 OpenShift 클러스터에서 인프라적인 요소들을 관리하는데 사용되는 node입니다.

리소스적인 여유가 있는 환경이라면 Infra node를 별도로 구축하면 좋고 여유가 되지 않는다면 Infra적인 요소를 관리하는 APP들을 모두 Worker node나 Master node에 배포하여도 상관없습니다.

 

아래의 그림은 Infra node가 포함된 Architecture입니다. 

http://v1.uncontained.io/images/ocp_smart_start_diagram.png

 

RHOCP TB에 대한 최종적인 정보는 아래와 같습니다.

Machine OS CPU (vCPU) RAM (GB) Storage (GB) Container Tool
harbor RHEL 8.8 2 4 100 + NFS Docker
bastion1 RHEL 8.8 2 4 100 Podman
bastion2 RHEL 8.8 2 4 100 Podman
master1 RHCOS 4.13.0 4 16 100 CRI-O
master2 RHCOS 4.13.0 4 16 100 CRI-O
master3 RHCOS 4.13.0 4 16 100 CRI-O
worker1 RHCOS 4.13.0 2 8 100 CRI-O
worker2 RHCOS 4.13.0 2 8 100 CRI-O
infra1 RHCOS 4.13.0 2 8 100 CRI-O
infra2 RHCOS 4.13.0 2 8 100 CRI-O
infra3 RHCOS 4.13.0 2 8 100 CRI-O

 

 

Infra node 구성 및 클러스터 Join

아래의 글에서 클러스터 Worker node 설치 및 Join하는 과정을 참고해주시면 됩니다.

 

RHOCP Installation (9) - OCP 클러스터 구축

INTRO RHOCP 설치를 위한 모든 설정 준비는 완료되었고 Bootstrap을 설치하고 아래의 네모 박스 안에 있는 RHOCP 클러스터의 노드인 Master node, Worker node를 설치하는 단계입니다. 아래의 사진은 앞에서 작

lilo.tistory.com

Ingress Router 설정을 Compute node가 아닌 Infra node로 변경하기 위해 HAProxy 설정을 수정하고 Bastion2로 설정을 SCP를 이용해 전송합니다.

# vi /etc/haproxy/haproxy.cfg
..(생략)
# RHOCP Ingress Router for 443 port
listen ingress-router-443
    bind *:443
    mode tcp
    balance source
    server infra1 infra1.ocp4.example.com:443 check inter 1s
    server infra2 infra2.ocp4.example.com:443 check inter 1s
    server infra3 infra3.ocp4.example.com:443 check inter 1s

# RHOCP Ingress Router for 80 port
listen ingress-router-80
    bind *:80
    mode tcp
    balance source
    server infra1 infra1.ocp4.example.com:80 check inter 1s
    server infra2 infra2.ocp4.example.com:80 check inter 1s
    server infra3 infra3.ocp4.example.com:80 check inter 1s
    
    
# scp /etc/haproxy/haproxy.cfg bastion2:/etc/haproxy

 

수정된 내용을 반영합니다.

ssh 명령을 통해 bastion2번 서버를 대상으로 명령어를 수행합니다.

# systemctl restart haproxy
# ssh bastion2 "systemctl restart haproxy"

 

 

 

Infra node를 통한 Infra Workload 격리

처음에 Infra node를 구축하고 나면 아래와 같이 노드에 대한 role이 worker로 출력됩니다.

위에서 말씀드렸다 싶이 Infra node는 클러스터의 Infra적인 요소를 관리하는데 사용되기 때문에 리소스적인 여유가 있는 환경이라면 Infra node에 APP이 배포되지 않도록 격리할 필요가 있습니다.

# oc get node
NAME                       STATUS   ROLES    AGE    VERSION
infra1.ocp4.example.com    Ready    worker    1h    v1.26.5+7d22122
infra2.ocp4.example.com    Ready    worker    1h    v1.26.5+7d22122
infra3.ocp4.example.com    Ready    worker    1h    v1.26.5+7d22122
master1.ocp4.example.com   Ready    master   4d2h   v1.26.5+7d22122
master2.ocp4.example.com   Ready    master   4d2h   v1.26.5+7d22122
master3.ocp4.example.com   Ready    master   4d2h   v1.26.5+7d22122
worker1.ocp4.example.com   Ready    worker   4d2h   v1.26.5+7d22122
worker2.ocp4.example.com   Ready    worker   4d2h   v1.26.5+7d22122

Infra node에 infra role을 정의하고 infra role 가진 node에 대해 taint를 걸어서 pod가 배포되지 않게 설정하는 작업이 필요합니다..

※ taint: 일반적인 방법으로 Pod를 배포할 수 없으며 toleration을 적용해야 배포할 수 있음

 

infra node로 사용할 node에 infra role을 정의합니다. 기존의 worker role은 제거하여야 합니다.

<infra role 추가>
# oc label node infra1.ocp4.example.com  node-role.kubernetes.io/infra=
# oc label node infra2.ocp4.example.com  node-role.kubernetes.io/infra=
# oc label node infra3.ocp4.example.com  node-role.kubernetes.io/infra=

<worker role 제거>
# oc label node infra1.ocp4.example.com  node-role.kubernetes.io/worker-
# oc label node infra2.ocp4.example.com  node-role.kubernetes.io/worker-
# oc label node infra3.ocp4.example.com  node-role.kubernetes.io/worker-

infra role을 가진 node에 일반적인 방법으로 pod가 배포될 수 없게 taint 설정을 합니다.

# oc adm taint nodes -l node-role.kubernetes.io/infra node-role.kubernetes.io/infra=reserved:NoSchedule node-role.kubernetes.io/infra=reserved:NoExecute
node/infra1.ocp4.example.com tainted
node/infra2.ocp4.example.com tainted
node/infra3.ocp4.example.com tainted

Router를 Infra node로 이동하기 위해 아래의 작업을 진행하여 아래의 설정을 추가합니다.

# oc patch ingresscontroller/default -n  openshift-ingress-operator  --type=merge -p '{"spec":{"nodePlacement": {"nodeSelector": {"matchLabels": {"node-role.kubernetes.io/infra": ""}},"tolerations": [{"effect":"NoSchedule","key": "node-role.kubernetes.io/infra","value": "reserved"},{"effect":"NoExecute","key": "node-role.kubernetes.io/infra","value": "reserved"}]}}}'
ingresscontroller.operator.openshift.io/default patched

Router의 Replica 수를 2개에서 3개로 변경합니다. (Infra node의 수가 3개)

oc patch ingresscontroller/default -n openshift-ingress-operator --type=merge -p '{"spec":{"replicas": 3}}'

Ingresscontroller에 대한 toleration를 infra node 대상으로 설정되었는지 확인하고 replica 복제 수가 3인지 확인합니다.

# oc get ingresscontroller default -n openshift-ingress-operator -o json |jq .spec
..(생략)
  "nodePlacement": {
    "nodeSelector": {
      "matchLabels": {
        "node-role.kubernetes.io/infra": ""
      }
    },
    "tolerations": [
      {
        "effect": "NoSchedule",
        "key": "node-role.kubernetes.io/infra",
        "value": "reserved"
      },
      {
        "effect": "NoExecute",
        "key": "node-role.kubernetes.io/infra",
        "value": "reserved"
      }
    ]
  },
  "replicas": 3,
..(생략)

 

 

Infra node로 Openshift Monitoring Stack 이동하기

현재 클러스터 Monitoring Stack을 조회하기 위해 openshift-monitoring 네임스페이스에서 pod를 조회합니다.

prometheus, alertmanager, thanos 등의 pod가 worker에서 실행되고 있는것을 확인합니다.

# oc get pod -n openshift-monitoring -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName
NAME                                                    STATUS    NODE
alertmanager-main-0                                     Running   worker1.ocp4.example.com
alertmanager-main-1                                     Running   worker2.ocp4.example.com
cluster-monitoring-operator-5855ddbb88-cc277            Running   master2.ocp4.example.com
kube-state-metrics-7878c7c5bf-8rr9d                     Running   worker1.ocp4.example.com
node-exporter-b5c98                                     Running   infra3.ocp4.example.com
node-exporter-b6vsd                                     Running   infra1.ocp4.example.com
node-exporter-cbntp                                     Running   infra2.ocp4.example.com
node-exporter-cwc7w                                     Running   master3.ocp4.example.com
node-exporter-fv6tp                                     Running   worker2.ocp4.example.com
node-exporter-k695h                                     Running   master1.ocp4.example.com
node-exporter-tztpg                                     Running   master2.ocp4.example.com
node-exporter-vpbwf                                     Running   worker1.ocp4.example.com
openshift-state-metrics-f786884ff-hwjzv                 Running   worker2.ocp4.example.com
prometheus-adapter-78cf478d9d-fbdzp                     Running   worker2.ocp4.example.com
prometheus-adapter-78cf478d9d-rtlgq                     Running   worker1.ocp4.example.com
prometheus-k8s-0                                        Running   worker1.ocp4.example.com
prometheus-k8s-1                                        Running   worker2.ocp4.example.com
prometheus-operator-admission-webhook-5bccb5d8c-p7j4p   Running   worker1.ocp4.example.com
prometheus-operator-admission-webhook-5bccb5d8c-r7s5m   Running   worker2.ocp4.example.com
prometheus-operator-d6fc645d8-f4ld6                     Running   master3.ocp4.example.com
thanos-querier-7f6cb64654-lp7bw                         Running   worker1.ocp4.example.com
thanos-querier-7f6cb64654-z95xk                         Running   worker2.ocp4.example.com

Infra node로 이동하기 위해 아래의 configmap을 적용합니다.

infra node에 대한 taint를 설정하였기 때문에 아래와 같이 tolerations를 사용해야 pod가 정상적으로 배포됩니다.

# cat <<EOF> cluster-monitoring-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-monitoring-config
  namespace: openshift-monitoring
data:
  config.yaml: |+
    alertmanagerMain:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    prometheusK8s:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    prometheusOperator:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    grafana:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    k8sPrometheusAdapter:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    kubeStateMetrics:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    telemeterClient:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    openshiftStateMetrics:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
    thanosQuerier:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoExecute
EOF

Configmap을 반영합니다.

# oc apply -f cluster-monitoring-cm.yaml

Openshift Monitoring Stack과 관련된 pod를 조회하고 infra node에 스케줄링되었는지 확인합니다.

(alertmanager, prometheus, openshiftStateMetrics, thanosQuerier, kubeStateMetrics)

node exporter는 모든 노드에서 정보를 수집하는 역할을 합니다.

# oc get pod -n openshift-monitoring -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName
NAME                                                     STATUS    NODE
alertmanager-main-0                                      Running   infra1.ocp4.example.com
alertmanager-main-1                                      Running   infra2.ocp4.example.com
cluster-monitoring-operator-5855ddbb88-cc277             Running   master2.ocp4.example.com
kube-state-metrics-6879bfd87c-8qmvv                      Running   infra1.ocp4.example.com
node-exporter-b5c98                                      Running   infra3.ocp4.example.com
node-exporter-b6vsd                                      Running   infra1.ocp4.example.com
node-exporter-cbntp                                      Running   infra2.ocp4.example.com
node-exporter-cwc7w                                      Running   master3.ocp4.example.com
node-exporter-fv6tp                                      Running   worker2.ocp4.example.com
node-exporter-k695h                                      Running   master1.ocp4.example.com
node-exporter-tztpg                                      Running   master2.ocp4.example.com
node-exporter-vpbwf                                      Running   worker1.ocp4.example.com
openshift-state-metrics-6c75d4f9d5-8dbmp                 Running   infra3.ocp4.example.com
prometheus-adapter-f8df8d4b4-42pfr                       Running   infra2.ocp4.example.com
prometheus-adapter-f8df8d4b4-fhkjf                       Running   infra3.ocp4.example.com
prometheus-k8s-0                                         Running   infra3.ocp4.example.com
prometheus-k8s-1                                         Running   infra1.ocp4.example.com
prometheus-operator-686ff8c7f9-tv8cc                     Running   infra2.ocp4.example.com
prometheus-operator-admission-webhook-8698c45557-6sxjm   Running   infra2.ocp4.example.com
prometheus-operator-admission-webhook-8698c45557-8hf6f   Running   infra1.ocp4.example.com
thanos-querier-68dd4c76d4-9rsg9                          Running   infra1.ocp4.example.com
thanos-querier-68dd4c76d4-nhshr                          Running   infra3.ocp4.example.com

최종적으로 Cluster Operator가 정상적인지 확인합니다.

# oc get co
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication                             4.13.4    True        False         False      6m38s
baremetal                                  4.13.4    True        False         False      4d4h
cloud-controller-manager                   4.13.4    True        False         False      4d4h
cloud-credential                           4.13.4    True        False         False      4d4h
cluster-autoscaler                         4.13.4    True        False         False      4d4h
config-operator                            4.13.4    True        False         False      4d4h
console                                    4.13.4    True        False         False      6m17s
control-plane-machine-set                  4.13.4    True        False         False      4d4h
csi-snapshot-controller                    4.13.4    True        False         False      4d4h
dns                                        4.13.4    True        False         False      4d4h
etcd                                       4.13.4    True        False         False      4d4h
image-registry                             4.13.4    True        False         False      4d4h
ingress                                    4.13.4    True        False         False      2d20h
insights                                   4.13.4    True        False         False      4d4h
kube-apiserver                             4.13.4    True        False         False      4d4h
kube-controller-manager                    4.13.4    True        False         False      4d4h
kube-scheduler                             4.13.4    True        False         False      4d4h
kube-storage-version-migrator              4.13.4    True        False         False      2d22h
machine-api                                4.13.4    True        False         False      4d4h
machine-approver                           4.13.4    True        False         False      4d4h
machine-config                             4.13.4    True        False         False      4d4h
marketplace                                4.13.4    True        False         False      4d4h
monitoring                                 4.13.4    True        False         False      4d4h
network                                    4.13.4    True        False         False      4d4h
node-tuning                                4.13.4    True        False         False      4d4h
openshift-apiserver                        4.13.4    True        False         False      19h
openshift-controller-manager               4.13.4    True        False         False      4d4h
openshift-samples                          4.13.4    True        False         False      2d22h
operator-lifecycle-manager                 4.13.4    True        False         False      4d4h
operator-lifecycle-manager-catalog         4.13.4    True        False         False      4d4h
operator-lifecycle-manager-packageserver   4.13.4    True        False         False      4d4h
service-ca                                 4.13.4    True        False         False      4d4h
storage                                    4.13.4    True        False         False      4d4h
반응형