OKD 4.17 설치하기

안녕하세요. 팡킨입니다.

OpenShift는 RedHat의 Kubernetes 배포판으로 Kubernetes에 몇 가지 기능을 추가한 것입니다. OKD는 OpenShift의 오픈소스 배포판으로 RedHat의 기술 지원을 받을 수는 없으나 무료로 사용할 수 있다는 장점이 있습니다.

클러스터 구성 시 고려 사항

OKD는 클러스터의 경계에 DNS 서버와 로드벨런서가 있어야 합니다. 또한 클러스터 구성에만 사용할 부트스트랩 노드도 필요합니다. 따라서 경계에 둘 관리 서버, 부트스트랩 노드, 클러스터에 사용할 노드들이 필요합니다.

최소 사양

NODE OS CPU RAM Disk IOPS
bootstrap CentOS Stream CoreOS 4 16GB 100GB 300
control plane CentOS Stream CoreOS 4 16GB 100GB 300
Compute CentOS Stream CoreOS 2 8GB 100GB 300

설치 구성

HOSTNAME IP OS
manager.okd4.cluster.local 192.168.10.10 Rocky Linux9
bootstrap.okd4.cluster.local 192.168.10.50 CentOS Stream CoreOS
control-plane0.okd4.cluster.local 192.168.10.100 CentOS Stream CoreOS
control-plane1.okd4.cluster.local 192.168.10.101 CentOS Stream CoreOS
control-plane2.okd4.cluster.local 192.168.10.102 CentOS Stream CoreOS
  • manager 노드에는 2 CPU/2GB RAM/50GB DISK를 사용합니다.
  • 다른 노드는 최소사양입니다.
  • okd4는 클러스터 이름입니다. 변경하셔도 됩니다.
  • 저는 리소스가 부족하여 Control-plane0 단일 노드로 진행합니다.
  • 제 Gateway 주소는 192.168.10.2입니다(VMware Workstation Pro). 자신의 환경에 맞게 변경하세요.

Manager 서버 구성

DNS 설정

dnsmasq를 설치합니다.

sudo dnf -y install dnsmasq

/etc/dnsmasq.conf 파일 열고 아래와 같이 수정합니다.

# 19번 라인 주석 해제
domain-needed

# 21번 라인 주석 해제
bogus-priv

# 53번 라인 주석 해제
strict-order

# 67번 라인 내용 추가
server=1.1.1.1
server=1.0.0.1

# 76번 라인 내용 추가
local=/cluster.local/

# 81번 라인 내용 추가
address=/apps.okd4.cluster.local/192.168.10.10

# 109번 라인 주석 처리
#interface=lo

# 135번 라인 주석 처리
#bind-interfaces

# 146번 라인 주석 해제
expand-hosts

# 156번 라인 내용 추가
domain=okd4.cluster.local

/etc/hosts 파일을 열고 아래 내용을 추가합니다. 3노드로 진행하시는 경우 주석을 해제하시면 됩니다.

192.168.10.10   api api-int
192.168.10.50   bootstrap
192.168.10.100  control-plane0
#192.168.10.101  control-plane1
#192.168.10.102  control-plane2

dnsmasq 서비스를 재시작합니다.

sudo systemctl enable --now dnsmasq
sudo systemctl restart dnsmasq

방화벽이 동작 중인 경우 방화벽에 dns 허용 규칙을 추가합니다.

sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload

DNS 서버로 dnsmasq를 사용하도록 NetworkManager를 설정합니다.

sudo nmcli connection modify ens160 ipv4.dns "192.168.10.10"
sudo nmcli connection modify ens160 ipv4.dns-search "okd4.cluster.local"
sudo nmcli connection up ens160

적용이 잘 되었는지 확인합니다.

nslookup api.okd4.cluster.local
nslookup -type=ptr 192.168.10.10

Nginx 설정

OKD를 사용하기 위해서는 클러스터 외부에서 내부로 연결시켜 줄 로드벨런서가 필요합니다. 또한 CoreOS 초기 구성을 위한 Ignition 파일도 제공해야 합니다.

nginx를 설치합니다.

sudo dnf install -y nginx nginx-mod-stream

/etc/nginx/nginx.conf 파일을 열고 server 블록의 listen 포트를 8080으로 변경합니다.

/etc/nginx/nginx.conf 파일 제일 아래에 아래 내용을 넣습니다. 3노드로 진행하시는 경우 주석을 해제하시면 됩니다.

stream {
    upstream k8s-api {
        server 192.168.10.50:6443; # Bootstrap 노드, 설치 후 제거합니다.
        server 192.168.10.100:6443;
        #server 192.168.10.101:6443;
        #server 192.168.10.102:6443;
    }
    upstream machine-config {
        server 192.168.10.50:22623; # Bootstrap 노드, 설치 후 제거합니다.
        server 192.168.10.100:22623;
        #server 192.168.10.101:22623;
        #server 192.168.10.102:22623;
    }
    upstream ingress-http {
        server 192.168.10.100:80;
        #server 192.168.10.101:80;
        #server 192.168.10.102:80;
    }
    upstream ingress-https {
        server 192.168.10.100:443;
        #server 192.168.10.101:443;
        #server 192.168.10.102:443;
    }
    upstream ingress-health {
        server 192.168.10.100:1936;
        #server 192.168.10.101:1936;
        #server 192.168.10.102:1936;
    }
    server {
        listen 6443;
        proxy_pass k8s-api;
    }
    server {
        listen 22623;
        proxy_pass machine-config;
    }
    server {
        listen 80;
        proxy_pass ingress-http;
    }
    server {
        listen 443;
        proxy_pass ingress-https;
    }
    server {
        listen 1936;
        proxy_pass ingress-health;
    }
}

SELinux가 켜진 경우 아래 명령어를 입력합니다.

sudo setsebool -P httpd_can_network_connect on
sudo setsebool -P httpd_graceful_shutdown on
sudo setsebool -P httpd_can_network_relay on
sudo setsebool -P nis_enabled on
sudo semanage port -a -t http_port_t -p tcp 6443
sudo semanage port -a -t http_port_t -p tcp 22623
sudo semanage port -a -t http_port_t -p tcp 1936

방화벽이 동작 중인 경우 방화벽에 포트 허용 규칙을 추가합니다.

sudo firewall-cmd --permanent --add-service={http,https}
sudo firewall-cmd --permanent --add-port={6443/tcp,22623/tcp,1936/tcp,8080/tcp}
sudo firewall-cmd --reload

Nginx를 재시작합니다.

sudo systemctl enable --now nginx
sudo systemctl restart nginx

OKD 설치

Ignition 파일 생성

사용자 홈 디렉토리에 작업 디렉토리를 생성하고 해당 디렉토리로 이동합니다.

mkdir okd4
cd okd4

Ignition 파일 생성에 필요한 도구를 다운로드 받습니다.

wget https://github.com/okd-project/okd-scos/releases/download/4.17.0-okd-scos.3/openshift-client-linux-4.17.0-okd-scos.3.tar.gz

tar -xvf openshift-client-linux-4.17.0-okd-scos.3.tar.gz

sudo mv oc kubectl /usr/local/bin

아래 명령어를 통해 openshift-install 파일을 다운로드 받습니다. oc adm release extract 명령어는 몇 분정도 기다려야 합니다.

oc adm release extract --tools quay.io/okd/scos-release:4.17.0-okd-scos.3

rm -f ccoctl-linux-* openshift-client-linux-* release.txt sha256sum.txt

tar -xvf openshift-install-linux-4.17.0-okd-scos.3.tar.gz

rm -f openshift-install-linux-4.17.0-okd-scos.3.tar.gz README.md

SSH key-peir를 생성합니다. 노드에 SSH로 접근할 때 사용합니다.

ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519

okd4 디렉토리 안에 ignition 디렉토리를 생성합니다. 생성된 디렉토리로 이동하지는 않습니다.

mkdir ignition

아래 링크로 접속하여 RedHat ID로 로그인한 후에 pullSecret을 복사합니다.
https://console.redhat.com/openshift/install/pull-secret

$HOME/okd4/ignition/install-config.yaml 파일을 생성하고 아래 내용을 넣습니다.

  • pullSecret: 위에서 받은 Pull secret
  • sshKey: 위에서 생성한 SSH 공개키(cat $HOME/.ssh/id_ed25519.pub)
apiVersion: v1
baseDomain: cluster.local
compute:
- hyperthreading: Enabled
  name: worker
  replicas: 0
controlPlane:
  hyperthreading: Enabled
  name: master
  replicas: 1 # 3노드 구성은 3으로 변경
metadata:
  name: okd4
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  networkType: OVNKubernetes
  serviceNetwork:
  - 172.30.0.0/16
platform:
  none: {}
pullSecret: '{"auths": ...}'
sshKey: 'ssh-ed25519 AAAA...'

install-config.yaml 파일은 다음 단계에서 자동으로 삭제되므로 백업을 해둡니다.

cp ignition/install-config.yaml install-config.yaml.bak

아래 명령어로 Manifest 파일을 생성합니다.

./openshift-install create manifests --dir ignition

아래 명령어로 Ignition 파일을 생성합니다.

./openshift-install create ignition-configs --dir ignition

생성된 Ignition 파일을 nginx 디렉토리로 복사합니다.

sudo cp ./ignition/{bootstrap.ign,master.ign,worker.ign} /usr/share/nginx/html/
sudo chmod 644 /usr/share/nginx/html/{bootstrap.ign,master.ign,worker.ign}

Bootstrap 노드에 Fedora CoreOS 설치

OKD 4.16+ 버전부터 노드의 운영체제가 Fedora CoreOS(FCOS)에서 CentOS Stream CoreOS(SCOS)로 변경되었습니다. 그러나 SCOS를 바로 설치할 수 있는 ISO 파일이 아직 제공되지 않습니다. FCOS를 설치하여 OKD 설치를 진행하면 자동으로 SCOS로 피벗됩니다.

아래 명령어를 통해 설치에 사용할 Fedora CoreOS 링크를 얻고 ISO 파일을 다운받습니다.

./openshift-install coreos print-stream-json | jq -r .architectures.x86_64.artifacts.metal.formats.iso.disk.location

DVD나 USB 드라이브에 넣고 Bootstrap 노드를 실행합니다.

부팅이 완료되면 아래 명령어로 네트워크 설정을 진행합니다.

nmcli device

nmcli connection add type ethernet autoconnect yes con-name ens160 ifname ens160
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.10.50/24
nmcli connection modify ens160 ipv4.dns 192.168.10.10
nmcli connection modify ens160 ipv4.gateway 192.168.10.2
nmcli connection modify ens160 ipv4.dns-search okd4.cluster.local
nmcli connection up ens160

아래 명령어로 설치할 디스크 이름을 찾습니다.

sudo fdisk -l

아래 명령어로 OS 설치를 진행합니다.

sudo coreos-installer install /dev/sda --ignition-url=http://192.168.10.10:8080/bootstrap.ign --copy-network --insecure-ignition

아래와 같이 출력되면 설치 DVD/USB를 제거하고 재부팅합니다.

부팅이 완료되었을 때 아래와 같은 프롬프트가 떠야합니다.

Control-plane 노드에 Fedora CoreOS 설치

DVD나 USB 드라이브에 넣고 Control-plane0 노드를 실행합니다.

부팅이 완료되면 아래 명령어로 네트워크 설정을 진행합니다.

nmcli device

nmcli connection add type ethernet autoconnect yes con-name ens160 ifname ens160
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.10.100/24
nmcli connection modify ens160 ipv4.dns 192.168.10.10
nmcli connection modify ens160 ipv4.gateway 192.168.10.2
nmcli connection modify ens160 ipv4.dns-search okd4.cluster.local
nmcli connection up ens160

아래 명령어로 설치할 디스크 이름을 찾습니다.

sudo fdisk -l

아래 명령어로 OS 설치를 진행합니다.

sudo coreos-installer install /dev/sda --ignition-url=http://192.168.10.10:8080/master.ign --copy-network --insecure-ignition

아래와 같이 출력되면 설치 DVD/USB를 제거하고 재부팅합니다.

Control-plane 개수에 맞게 이 과정을 반복하시면 됩니다.

설치 완료

설치 과정 모니터링

Manager 노드로 돌아와서 아래 명령어를 통해 부트스트랩 진행 상황을 모니터링합니다.

./openshift-install --dir ignition wait-for bootstrap-complete --log-level=info

완료되면 Bootstrap 노드를 종료합니다. oc 명령어를 통해 제어하기 위한 설정을 진행합니다.

export KUBECONFIG=~/okd4/ignition/auth/kubeconfig
echo 'export KUBECONFIG=~/okd4/ignition/auth/kubeconfig' >> ~/.bashrc

oc get nodes

oc get nodes 명령어로 노드의 상태를 확인할 수 있습니다.

oc get nodes -o wide 명령어를 통해 OS-IMAGE가 CentOS Stream CoreOS로 변경되었음을 확인할 수 있습니다.

/etc/nginx/nginx.conf 파일을 열고 upstream k8s-api와 upstream machine-config 블록의 Bootstrap 노드를 제거합니다. 제거 후 아래 명령어로 nginx 서비스를 재시작합니다.

sudo systemctl restart nginx

OKD의 정상 작동 여부를 확인하기 위해 테스트 파드를 생성합니다.

oc run test-web --image nginx --port=80

파드를 외부로 노출시키기 위해 서비스와 Route를 생성합니다.

oc expose pod/test-web --name test-web

oc expose service/test-web --name test-web

아래 명령어를 통해 Route의 주소를 찾고 브라우저를 통해 웹 요청을 합니다.

oc get route

Ingress Operator 오류 해결 방법

컨테이너 내부에서 위에서 구축한 dns 서버에 접근하지 못하는 문제가 있을 수 있습니다. 그런 경우 Ingress Operator에 canary 경로 관련 문제가 생겨 웹 콘솔에 접근할 수 없게 됩니다. 이런 경우 CoreDNS에 직접 dns서버를 지정하여 해결할 수 있습니다.

아래 명령어로 dns Operator를 수정합니다.

oc edit dns.operator/default

spec 아래에 아래 내용을 추가합니다.

servers:
  - forwardPlugin:
      policy: Sequential
      upstreams:
      - 192.168.10.10
    name: cluster-dns
    zones:
    - okd4.cluster.local

ClusterOperator를 확인하면 문제가 사라진 것을 볼 수 있습니다.

watch -n5 oc get clusteroperator

브라우저를 열고 아래 링크에 접속하여 웹 콘솔을 이용할 수 있습니다.
https://console-openshift-console.apps.okd4.cluster.local/

~/okd4/ignition/auth/kubeadmin-password 파일을 열어 비밀번호를 확인할 수 있습니다.

  • ID: kubeadmin
  • PASS: kubeadmin-password 파일 내용(cat ~/okd4/ignition/auth/kubeadmin-password)