Openshift 4.12.0 on BareMetal 설치 및 설정

리눅스/OpenShift|2023. 1. 20. 10:02
반응형

Openshift 의 무료 버전이 있습니다. 예전 커뮤니티 버전 Openshift origin 이 새 이름 OKD 로 배포되고 있는데요.

공식 홈페이지는 https://www.okd.io 이며, 관련 문서는 https://docs.okd.io/ 에서 확인하실 수 있습니다.

그리고 Openshift 의 Documents 는 다음과 같습니다.

https://docs.openshift.com/container-platform/4.12/welcome/index.html

양쪽 Documents 를 살펴보니 설치와 운영상의 차이는 없어보이고, master 노드와 worker 노드에 사용되는 운영체제가 각각 FCOS (OKD), RHCOS (Openshift) 이라는게 눈에 띄는데요. OKD 가 무료이면 Openshift 는 유료인가 싶어서 레드햇사에 문의를 해보았더니 배포되는 Openshift 이미지로 서비스를 만들어서 무료 제공하면 괜찮지만, 유료로 판매하면 안된다고 하였습니다. 하지만 OKD 는 서비스 구성후 상업용으로 판매해도 된다고 확인하였으며, 운영 환경에서 발생되는 다양한 오류나 버그는 직접 해결해야하는 단점이 있다고 하였습니다.

여기에서는 테스트 목적이므로 Openshift 기반으로 작성되었음을 알려드립니다.

 

[ 테스트에 사용된 서버 ]

- OCP 서버 제외하고, 기입된 CPU, RAM, Disk, IOPS 는 최소 리소스 요구사항입니다.

- 테스트를 진행했던 모든 서버는 공인 IP 1개씩만 사용하였습니다.

  혹시 공인 IP 로 테스트하기 어려운 환경일 경우 사설 IP 를 사용하고 마스커레이드 서버 (게이트웨이) 에서

  외부망으로 연결이 가능하도록 셋팅해 놓으면 됩니다.

- bootstrap 및 master (Control plane) 서버를 지원하는 유일한 운영체제는 RHCOS (Redhat CoreOS) 입니다.

  worker (Compute) 서버는 RHCOS, RHEL 8.4, RHEL 8.5 로 사용이 가능합니다.

- az1 은 클러스터명입니다. 여러개의 클러스터를 구분하기 위해 사용하였습니다.

- 공식 Document 상의 명칭 정리 : Control plane = master, Compute = worker

- 주 명령을 실행하는 첫번째 서버는 Bastion 서버라고도 불리는데 여기에서는 OCP 서버라고 명칭 하도록 하겠습니다.

Hostname IP OS CPU RAM Disk IOPS
ocp.az1.sysdocu.kr 115.68.142.99 CentOS 7.9 2 4GB 50GB 300
bootstrap.az1.sysdocu.kr 115.68.142.100 RHCOS 4.12.0 4 16GB 100GB 300
master01.az1.sysdocu.kr 115.68.142.101 RHCOS 4.12.0 4 16GB 100GB 300
master02.az1.sysdocu.kr 115.68.142.102 RHCOS 4.12.0 4 16GB 100GB 300
master03.az1.sysdocu.kr 115.68.142.103 RHCOS 4.12.0 4 16GB 100GB 300
worker01.az1.sysdocu.kr 115.68.142.104 RHCOS 4.12.0 2 8GB 100GB 300
worker02.az1.sysdocu.kr 115.68.142.105 RHCOS 4.12.0 2 8GB 100GB 300

* OS 이미지 다운로드

CentOS : https://centos.org/download/

RHCOS : https://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.12

 

 

1. DNS 설치

 

Openshift 사용을 위해 내부 DNS 를 준비해야 합니다.

OCP 서버에서 DNS, LoadBalancer 및 http 파일 서버 역할을 담당하게 됩니다.

미리 준비가 된 OCP 서버 (CentOS 7) 에서 작업을 진행합니다.

 

# yum -y update

# yum -y upgrade

 

SELinux 비활성화 설정을 하고 적용합니다.

# vi /etc/selinux/config

SELINUX=disabled

 

# setenforce 0

 

호스트 네임을 적용 합니다.

예) hostnamectl set-hostname ocp.az1.sysdocu.kr

 

bind 패키지를 설치합니다.

# yum -y install bind bind-utils

 

정방향 및 역방향 zone 파일을 생성합니다. (둘 다 필요)

# vi /var/named/sysdocu.kr.zone

$TTL 60
@    IN    SOA    ocp.az1.sysdocu.kr.    root (
                                                              2023012001    ; serial
                                                              1D       ; refresh
                                                              1H       ; retry
                                                              1W      ; expire
                                                              3H )    ; minimum

                        IN      NS      ocp.az1.sysdocu.kr.

az1                   IN      A        115.68.142.99
ocp.az1            IN      A        115.68.142.99
helper.az1        IN      A        115.68.142.99
api.az1             IN      A        115.68.142.99
api-int.az1        IN      A        115.68.142.99
*.az1                 IN      A        115.68.142.99

bootstrap.az1   IN      A        115.68.142.100

master01.az1    IN      A        115.68.142.101
master02.az1    IN      A        115.68.142.102
master03.az1    IN      A        115.68.142.103

worker01.az1    IN      A        115.68.142.104
worker02.az1    IN      A        115.68.142.105

 

# vi /var/named/142.68.115.rev.zone

$TTL 60
@    IN    SOA    ocp.az1.sysdocu.kr.    root (
                                                              2023012001    ; serial
                                                              1D       ; refresh
                                                              1H       ; retry
                                                              1W      ; expire
                                                              3H )    ; minimum

             IN    NS    ocp.az1.sysdocu.kr.

99          IN    PTR    api.az1.sysdocu.kr.
99          IN    PTR    api-int.az1.sysdocu.kr.

100         IN    PTR    bootstrap.az1.sysdocu.kr.

101         IN    PTR    master01.az1.sysdocu.kr.
102         IN    PTR    master02.az1.sysdocu.kr.
103         IN    PTR    master03.az1.sysdocu.kr.

104         IN    PTR    worker01.az1.sysdocu.kr.
105         IN    PTR    worker02.az1.sysdocu.kr.

 

외부에서도 질의가 가능하도록 하고 zone 파일을 config 파일에 연결 합니다.

# vi /etc/named.conf

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory  "/var/named";
        dump-file  "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };

        recursion yes;

        forwarders { 168.126.63.1; };

        dnssec-enable yes;
        dnssec-validation yes;

        bindkeys-file "/etc/named.root.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

...

 

아래 파일에 zone 파일을 연결합니다.

# vi /etc/named.rfc1912.zones

...

zone "sysdocu.kr" IN {
        type master;
        file "sysdocu.kr.zone";
        allow-update { none; };
};

zone "142.68.115.in-addr.arpa" IN {
        type master;
        file "142.68.115.rev.zone";
        allow-update { none; };
};

 

데몬을 재시작하고 정방향과 역방향 질의가 잘 되는지 테스트 합니다.

# systemctl enable named

# systemctl start named

# nslookup ocp.az1.sysdocu.kr localhost
Server: localhost
Address: 127.0.0.1#53

Name: ocp.az1.sysdocu.kr
Address: 115.68.142.99

 

# nslookup 115.68.142.99 localhost
99.142.68.115.in-addr.arpa name = api-int.az1.sysdocu.kr.
99.142.68.115.in-addr.arpa name = api.az1.sysdocu.kr.

 

서버의 1차, 2차 네임서버를 지정합니다.

네트워크 설정 파일에서의 DNS 도 올바르게 입력해주세요.

NetworkManager 사용시 설정파일에서 바꾸고 데몬 재시작을 해주면 resolv.conf 에도 적용됩니다.

# cat /etc/resolv.conf

# Generated by NetworkManager
search az1.sysdocu.kr
nameserver 115.68.142.99    // 내부 DNS (우선)
nameserver 168.126.63.1      // 외부 DNS

 

2. HTTP 파일 서버 설정

 

# vi /etc/yum.repos.d/nginx.repo

[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/centos/7/$basearch/ 
gpgcheck=0 
enabled=1

 

# yum -y install nginx
# systemctl start nginx

 

nginx 를 설정 파일을 열고 아래 내용으로 수정합니다.

 

# vi /etc/nginx/conf.d/default.conf

server {
    listen       8080;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html/files;
        index  index.html index.htm;
        autoindex on;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

파일 서버로 사용할 디렉토리를 만듭니다.

# mkdir /usr/share/nginx/html/files

 

설정했던 내용이 적용되도록 합니다.

# systemctl reload nginx

 

방화벽 사용중일 경우 8080 포트 접근이 가능하도록 룰 추가 및 데몬 재시작을 해줍니다.

저는 테스트가 목적이므로 아래와 같이 모든 방화벽 룰을 내렸습니다.

하지만 실제 서비스 구성시 방화벽에 필요한 포트만 오픈하는것이 좋습니다.

# systemctl stop firewalld

 

웹브라우저로 OCP 서버 8080 포트로 접속하면 현재는 파일이 없으므로 상위 디렉토리 이동 링크만 확인됩니다.

http://115.68.142.99:8080

 

3. LB (LoadBalancer) 설정

 

LB 구성을 위해 haproxy 를 설치하고 설정파일을 아래 내용으로 변경 합니다.

# yum -y install haproxy

# cp -arp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.ori
# vi /etc/haproxy/haproxy.cfg

global
  log         127.0.0.1 local2
  pidfile     /var/run/haproxy.pid
  maxconn     4000
  daemon

defaults
  mode                    http
  log                     global
  option                  dontlognull
  option http-server-close
  option                  redispatch
  retries                 3
  timeout http-request    10s
  timeout queue           1m
  timeout connect         10s
  timeout client          1m
  timeout server          1m
  timeout http-keep-alive 10s
  timeout check           10s
  maxconn                 3000

frontend stats
  bind *:1936
  mode            http
  log             global
  maxconn 10
  stats enable
  stats hide-version
  stats refresh 30s
  stats show-node
  stats show-desc Stats for az1 cluster 
  stats auth admin:az1@
  stats uri /stats

listen api-server-6443 
  bind *:6443
  mode tcp
  server bootstrap bootstrap.az1.sysdocu.kr:6443 check inter 1s backup 
  server master01 master01.az1.sysdocu.kr:6443 check inter 1s
  server master02 master02.az1.sysdocu.kr:6443 check inter 1s
  server master03 master03.az1.sysdocu.kr:6443 check inter 1s

listen machine-config-server-22623 
  bind *:22623
  mode tcp
  server bootstrap bootstrap.az1.sysdocu.kr:22623 check inter 1s backup 
  server master01 master01.az1.sysdocu.kr:22623 check inter 1s
  server master02 master02.az1.sysdocu.kr:22623 check inter 1s
  server master03 master03.az1.sysdocu.kr:22623 check inter 1s

listen ingress-router-443 
  bind *:443
  mode tcp
  balance source
  server worker01 worker01.az1.sysdocu.kr:443 check inter 1s
  server worker02 worker02.az1.sysdocu.kr:443 check inter 1s

listen ingress-router-80 
  bind *:80
  mode tcp
  balance source
  server worker01 worker01.az1.sysdocu.kr:80 check inter 1s
  server worker02 worker02.az1.sysdocu.kr:80 check inter 1s

 

데몬이 서버 부팅시 자동 구동 되도록 하고, 설정된 값은 재시작하여 적용합니다.

# systemctl enable haproxy

# systemctl start haproxy

참고로 HAproxy 로드발란서 상태 및 전송량 등 통계를 확인하려면 위에서 설정한대로 아래 URL 및 계정을 이용하여 로그인하면 됩니다.

http://115.68.142.99:1936/stats

계정 : admin / az1@

 

4. Openshift Installer 설치

 

Openshift Installer 는 Redhat 계정을 만들고 다운로드 해야 하지만 미러 서버에서도 설치 파일을 배포하고 있으므로

여기에서는 설치파일을 계정 없이 다운로드 받아 설치를 진행하겠습니다.

하지만 하단에서 secret 키가 필요하므로 반드시 Redhat 계정으로 로그인하여 확인하는 작업이 필요합니다.

 

다운로드 미러 서버 : https://mirror.openshift.com/pub/openshift-v4/clients/ocp/

 

1) install 및 client 파일 다운로드

설치 파일을 미러 서버에서 다운로드 받습니다.

# yum -y install wget

# wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.12.0/openshift-install-linux-4.12.0.tar.gz

 

압축을 해제 합니다.

# tar xvzf openshift-install-linux-4.12.0.tar.gz

# ./openshift-install version
./openshift-install 4.12.0
built from commit ba940311c8cb2a07173725e5c2f668df7c61924c
release image quay.io/openshift-release-dev/ocp-release@sha256:4c5a7e26d707780be6466ddc9591865beb2e3baa5556432d23e8d57966a2dd18
release architecture amd64

 

Client 파일을 다운로드 받아 설치합니다.

# wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.12.0/openshift-client-linux-4.12.0.tar.gz

# tar xvzf openshift-client-linux-4.12.0.tar.gz

# mv oc kubectl /usr/local/bin/

# oc version
Client Version: 4.12.0
Kustomize Version: v4.5.7

# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.1", GitCommit:"854f807d8a84dde710c062a5281bca5bc07cb562", GitTreeState:"clean", BuildDate:"2023-01-05T01:27:27Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
Error from server (NotFound): the server could not find the requested resource

 

2) ssh key 생성

클러스터 노드 SSH 접근을 위해 키를 생성합니다.

생성된 키가 노드에 전달되면 클러스터 각 노드 SSH 원격 접속을 할 수 있습니다.

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

# cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMbzVOXu4A6uUsYyD0cbGAhWTF2HdqOIQaIwuk+b4qCQ root@ocp.az1.sysdocu.kr

 

아래 OpenShift 컨테이너 플랫폼을 설치할 때 설치 프로그램에 해당 키를 입력할 예정입니다.

 

3) 설치 구성 파일 생성

설치 디렉토리를 만들고 이동합니다.

# mkdir installation_directory
# cd installation_directory

 

Redhat 로그인 후 아래 URL (Downloads 메뉴) 페이지 맨 하단부에 Tokens 항목을 확인합니다.

https://console.redhat.com/openshift/downloads

 

'Pull secret' 이 있는데 행 끝에 'Copy' 버튼을 눌러 내용을 복사하고 기록해 둡니다.

 

아래 내용으로 yaml 파일을 생성합니다.

# vi install-config.yaml

apiVersion: v1
baseDomain: sysdocu.kr
compute:
- hyperthreading: Enabled
  name: worker
  replicas: 0
controlPlane:
  hyperthreading: Enabled
  name: master
  replicas: 3     
metadata:
  name: az1
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  networkType: OpenShiftSDN
  serviceNetwork:
  - 172.30.0.0/16
platform:
  none: {}
fips: false
pullSecret: '{"auths": ...}'
sshKey: 'ssh-ed25519 AAAA... root@ocp.az1.sysdocu.kr'

 

baseDomain : DNS 서버 구축시 사용한 도메인

compute: replicas: 수동으로 연결해주어야 하기 때문에 반드시 0 으로 설정합니다.

metadata: name: 클러스터 이름

clusterNetwork : Pod IP 주소가 할당되는 범위

serviceNetwork : 서비스 IP 주소가 할당되는 범위

pullSecret : Redhat 홈페이지에서 복사한 Pull secret 키

sshKey : 위에서 ssh-keygen 으로 생성한 public key

               # cat ~/.ssh/id_ed25519.pub 으로 출력된 키 (행 전체)

networkType : 설치할 클러스터 네트워크 플러그인입니다. (설치 후 변경 불가)

                        지원되는 값은 OVNKubernetes (Default) 및 OpenShiftSDN 입니다.

install-config.yaml 파일에 대한 자세한 설명 : https://docs.openshift.com/container-platform/4.12/installing/installing_bare_metal/installing-bare-metal.html#installation-bare-metal-config-yaml_installing-bare-metal

 

아래에서 manifest 파일 생성시 install-config.yaml 파일이 삭제되므로 만일을 위해 백업을 해둡니다.

# cp -arp install-config.yaml install-config.yaml.bak

# cd ..

 

4) manifest 파일 생성

# ./openshift-install create manifests --dir installation_directory/

INFO Consuming Install Config from target directory 
WARNING Making control-plane schedulable by setting MastersSchedulable to true for Scheduler cluster settings 
INFO Manifests created in: installation_directory/manifests and installation_directory/openshift 

 

생성된 두 개의 디렉토리 안에 다양한 manifest 파일이 생성되었습니다.

# cd installation_directory

# ll
합계 12
-rw-r--r-- 1 root root 3572  1월 26 11:20 install-config.yaml.bak
drwxr-x--- 2 root root 4096  1월 26 11:21 manifests
drwxr-x--- 2 root root 4096  1월 26 11:21 openshift

 

* 참고

manifests/cluster-scheduler-02-config.yml 파일의 mastersSchedulable 파라미터 값은 아래와 같습니다.

- true : Master 에 POD 가 스케쥴링 될 수 있으며, Master 가 Worker 의 역할까지 수행 (Default 값)

- false : Master 는 컨트롤플레인의 역할만 하게 되어 Worker 노드가 추가로 필요 함. (권장 사항)

 

위 내용대로 리소스를 많이 사용하게 될 Worker 노드를 별도로 둘 예정이므로 yaml 파일을 수정합니다.

(mastersSchedulable: true -> false)

# sed -i 's/true/false/' manifests/cluster-scheduler-02-config.yml

 

5) ignition 파일 생성

CoreOS 를 초기 구성하는데 필요한 파일 ignition 파일을 생성합니다.

# cd ..
# ./openshift-install create ignition-configs --dir installation_directory/

INFO Consuming Openshift Manifests from target directory 
INFO Consuming Master Machines from target directory 
INFO Consuming Worker Machines from target directory 
INFO Consuming OpenShift Install (Manifests) from target directory 
INFO Consuming Common Manifests from target directory 
INFO Ignition-Configs created in: installation_directory and installation_directory/auth 

 

# cd installation_directory

# ll

합계 292
drwxr-x--- 2 root root     48  1월 26 11:38 auth
-rw-r----- 1 root root 280621  1월 26 11:38 bootstrap.ign
-rw-r--r-- 1 root root   3572  1월 26 11:20 install-config.yaml.bak

drwxr-x--- 2 root root   4096  1월 26 11:33 manifests.bak
-rw-r----- 1 root root   1719  1월 26 11:38 master.ign
-rw-r----- 1 root root     98  1월 26 11:38 metadata.json

drwxr-x--- 2 root root   4096  1월 26 11:33 openshift.bak
-rw-r----- 1 root root   1719  1월 26 11:38 worker.ign

 

생성된 ignition 파일들을 nginx 파일 서버 디렉토리로 복사하고 다운로드가 가능하도록 퍼미션을 조정합니다.

# cp -arp *.ign /usr/share/nginx/html/files/

# chmod 644 /usr/share/nginx/html/files/*

 

* 참고

추후 클러스터 명 변경 (예 : az1)을 위해 다시 ignition 파일을 생성할 경우 아래 파일은 덮어씌워지지 않으므로 

아래 파일을 수동으로 삭제 후 ignition 파일을 생성해야 합니다.

installation_directory/auth/.openshift_install_state.json

 

5. bootstrap 서버 설치

 

ISO 다운로드 : https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/

 

위 URL 에서 RH CoreOS ISO 파일을 다운로드 하고, OS 설치를 위해 CD 굽기 또는 iODD 와 같은 장치에 넣어둡니다.

나머지 서버 6대 (bootstrap, master, worker) 에 설치를 해야 합니다.

- 파일명 : rhcos-4.12.0-x86_64-live.x86_64.iso

 

파일 URL 은 아래와 같은 명령으로도 쉽게 확인이 가능합니다. (위와 같은파일)

# ./openshift-install coreos print-stream-json | grep '\.iso[^.]' | grep x86_64
                "location": "https://rhcos.mirror.openshift.com/art/storage/prod/streams/4.12/builds/412.86.202212081411-0/x86_64/rhcos-412.86.202212081411-0-live.x86_64.iso",

 

* OCP 서버에서 작업합니다.

추후 bootstrap.ign 검증을 위해 해시값이 필요한데, 해시값의 길이가 길어 타이핑이 어려우므로 bootstrap.hash 파일에 해시값 넣습니다.

# cd /usr/share/nginx/html/files

# sha512sum bootstrap.ign |awk {'print $1'} > bootstrap.hash

# sha512sum master.ign |awk {'print $1'} > master.hash

# sha512sum worker.ign |awk {'print $1'} > worker.hash

 

* 여기부터 bootstrap 서버에서의 작업입니다.

bootstrap 서버에 CD 또는 iODD 장치를 연결하고 위에서 다운로드 받았던 RH CoreOS ISO 이미지로 부팅하면 시간이 지나 명령 수행이 가능한 쉘프롬프트로 떨어지게 됩니다.

 

우선 네트워크에 연결되어진 장치명을 확인하고 nmtui (Network Manager TUI) 명령을 이용하여 네트워크 설정을 진행합니다.

$ nmcli d

DEVICE  TYPE        STATE                                                    CONNECTION

eno2        ethernet    connecting (getting IP configuration)     Wired connection 2

eno1        ethernet    unavailable                                             --

lo             loopback   unmanaged                                            --

 

$ nmtui

* IPv4 설정에 아래 내용만 입력하면 됩니다. (IP 와 Subnet 같이 입력, 내부 DNS)

  DNS 는 내부 DNS 만 입력해주세요.

- Addresses : 115.68.142.100/27

- Gateway : 115.68.142.97

- DNS servers : 115.68.142.99

 

셋팅 후 자동으로 네트워크가 구성되는데, 간혹 네트워크 연결이 늦는 경우가 있어

sudo 를 붙여 root 권한으로 데몬을 재시작 해줍니다.

$ sudo systemctl restart NetworkManager

 

ignition 파일의 해시값을 변수에 저장하고 이를 이용하여 OS 설치를 진행합니다.

OS 설치 명령줄 앞에 sudo 를 붙여 root 권한으로 설치 해야 합니다.

$ hash=`curl http://115.68.142.99:8080/bootstrap.hash`

$ sudo coreos-installer install --copy-network --ignition-url http://115.68.142.99:8080/bootstrap.ign /dev/sda --ignition-hash sha512-${hash}

* 사용한 옵션

- 현재 네트워크 정보 복사 (/etc/NetworkManager/system-connections/ 디렉토리 아래 네트워크 설정 파일)

- 노드 유형의 ignition 파일

- 설치할 HDD 장치명

- 노드 유형의 ignition 파일 sha512 다이제스트 (해시값)

 

OS 가 설치 되면, 리부팅을 한 번 해줍니다.

정상 부팅이 될 경우 ignition 파일이 적용되면서 로그인 화면 상단에 아래와 같은 메세지가 출력됩니다.

 

Red Hat Enterprise Linux CoreOS 412.86.202212081411-0 (Optpa) 4.12

Ignition: ran on 2023/01/26 05:32:21 UTC (this boot)

Ignition: user-provided config was applied

SSH host key: SHA256:SOwMQInuqATecciNzA1NcTfAQRJvsn18EbXD9FX0Ycw (ECDSA)

SSH host key: SHA256:XvmtyNr1IWD4P+WNUhd6yIuu2b+7mEBEy+6k1swRIvu (ED25519)

SSH host key: SHA256:5ut4yCLOm0zuEmiBz9bfw75FSS8WjRt3EhyvthuV93A (RSA)

localhost login:

 

* 로그인 방법

OCP 서버에서 ssh 접근을 하면 패스워드 없이 로그인이 가능합니다.

# ssh core@115.68.142.100

 

접속후 서버 시간을 한국 표준시로 맞춰줍니다.

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

* root 로그인 허용

core 계정이 아닌 root 계정으로 로그인하고 싶을 경우 아래와 같은 절차를 따릅니다.

# ssh core@115.68.142.100

[core@bootstrap ~]$ sudo su -

[root@bootstrap ~]# passwd    // 새 패스워드 두번 입력

[root@bootstrap ~]# vi /etc/ssh/sshd_config    // ssh 설정파일에서 아래 3가지 옵션 확인 및 수정

PermitRootLogin yes

PasswordAuthentication yes
ChallengeResponseAuthentication no

[root@bootstrap ~]# systemctl restart sshd    // ssh 데몬 재시작

이제 OCP 서버에서 다른 노드로 root 접속이 가능해 졌습니다.

 

* bootstrap 서버 네트워크 문제

bootstrap 서버의 네트워크가 연결 되지 않거나 연결중 끊어지는 경우 네트워크 상태를 확인해봐야 합니다.

연결 문제가 언제 발생할지 모르므로 단절 반복 주기인 5분 동안 (icmp_seq 300회 정도) 외부망 연결을 지켜 봅니다.

여기에서 테스트 할때는 원인은 찾지 못했지만 5분 단절, 5분 연결이 반복 되었기 때문입니다.

$ ping 8.8.8.8

 

끊어진다면 bootstrap 서버에서 NetworkManager 데몬을 몇차례 다시 재시작 해보고 5분 정도 추가 모니터링을 합니다.

끊김이 없다면 bootstrap 서버 설치를 완료한 것이므로 Kubernetes API 연결이 잘 되는지 아래 명령으로 확인해봅니다.

(OCP 서버에서)

# ./openshift-install --dir installation_directory wait-for bootstrap-complete --log-level=info
INFO Waiting up to 20m0s (until 9:17AM) for the Kubernetes API at https://api.az1.sysdocu.kr:6443... 
INFO API v1.25.4+77bec7a up                       
INFO Waiting up to 30m0s (until 9:36AM) for bootstrapping to complete...

 

지금까지의 설정이 올바로 되었다면 파란색 두줄이 출력됩니다. Kubernetes API 연결 확인이 잘 된 것입니다.

(최대 20분까지 대기하지만 이 경우 성공 가능성 낮음)

 

에러 출력시 --------------------

INFO Waiting up to 20m0s (until 4:03PM) for the Kubernetes API at https://api.az1.sysdocu.kr:6443... 
ERROR Attempted to gather ClusterOperator status after wait failure: listing ClusterOperator objects: Get "https://api.az1.sysdocu.kr:6443/apis/config.openshift.io/v1/clusteroperators": EOF 
INFO Use the following commands to gather logs from the cluster 
INFO openshift-install gather bootstrap --help    
ERROR Bootstrap failed to complete: Get "https://api.az1.sysdocu.kr:6443/version": EOF 
ERROR Failed waiting for Kubernetes API. This error usually happens when there is a problem on the bootstrap host that prevents creating a temporary control plane. 

 

이 경우 bootstrap 서버에서 도메인 질의가 잘 되는지 확인합니다.

구입해서 사용하는 도메인일 경우 외부 DNS 로 인해 도메인 연결이 안되는 경우가 있습니다.

(bootstrap 서버에서)

$ ping api.az1.sysdocu.kr

만약 연결이 안되는 것이 맞다면 내부 DNS 에 설정한 zone 파일 내용을 외부 DNS 에도 설정해주면 됩니다.

그리고 서버내 네임서버 설정도 확인이 필요합니다. 아래처럼 내부 DNS 만 있으면 됩니다.

$ cat /etc/resolv.conf

search az1.sysdocu.kr
nameserver 115.68.142.99

------------------------------------

 

이어서 master 노드를 설치합니다.

 

6. master 서버 설치

 

master 서버도 설치 방법은 bootstrap 서버와 같습니다.

설치에 사용되는 파일만 신경써서 작업해 줍니다.

- master 서버 : master.ign 파일 사용

 

설치 후 부팅이 완료되면 한국 표준시로 맞춰줍니다.

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

그리고 master 서버들의 etcd 데몬 가동이 확인되고 네트워크 연결 (5분 이상) 이상없음이 확인되면

OCP 서버에서 아까와 같은 모니터링 명령으로 현재 상황을 확인해 봅니다. (최대 30분)

 

# ./openshift-install --dir installation_directory wait-for bootstrap-complete --log-level=info
INFO Waiting up to 20m0s (until 2:09PM) for the Kubernetes API at https://api.az1.sysdocu.kr:6443... 
INFO API v1.25.4+77bec7a up                       
INFO Waiting up to 30m0s (until 2:19PM) for bootstrapping to complete... 

INFO It is now safe to remove the bootstrap resources 
INFO Time elapsed: 15m7s 

 

master 3대 모두 설치하여 클러스터 구성이 완료되면 위와 같이 파란색으로 표시한 메세지가 출력됩니다.

이 시점에서 haproxy 내에 bootstrap 정보를 제거하고 bootstrap 서버를 종료 합니다. (더 이상 사용 안함)

- 로드밸런서에서 bootstrap 서버 정보 삭제

   > haproxy.conf 에서 bootstrap 관련 라인 2줄 주석 처리, 데몬 재시작

      # sed -i '/bootstrap/s/^/#/' /etc/haproxy/haproxy.cfg

      # systemctl restart haproxy
- bootstrap 서버 제거 (서버 종료)

 

OCP 로그인시 자동으로 쿠버네티스 관리자 계정을 설정하게 조치하고 현재 세션에도 적용합니다.

(OCP 서버에서)

# echo "export KUBECONFIG=/root/installation_directory/auth/kubeconfig" >> ~/.bash_profile

# export KUBECONFIG=/root/installation_directory/auth/kubeconfig

 

Openshift CLI 로 현재 사용자를 확인합니다.

# oc whoami
system:admin

 

연결된 노드를 확인합니다.
# oc get nodes
NAME                       STATUS   ROLES                  AGE   VERSION
master01.az1.sysdocu.kr   Ready    control-plane,master   50m   v1.25.4+77bec7a
master02.az1.sysdocu.kr   Ready    control-plane,master   37m   v1.25.4+77bec7a
master03.az1.sysdocu.kr   Ready    control-plane,master   21m   v1.25.4+77bec7a

 

7. worker 서버 설치

 

worker 서버도 설치 방법은 bootstrap 서버와 같습니다.

설치에 사용되는 파일만 신경써서 작업해 줍니다.

- worker 서버 : worker.ign 파일 사용

 

설치 후 부팅이 완료되면 한국 표준시로 맞춰줍니다.

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

worker 서버는 master 서버와 달리 부팅 후 자동으로 bootstrap 서버와 연결되지 않기때문에 수동으로 연결을 해주어야 합니다.

worker 노드가 부팅 되면 보류중인 CSR (Certificate Signing Requests) 의 이름 (맨 앞 NAME 값) 을 확인합니다.

(OCP 서버에서)

# oc get csr |grep Pending |grep node-bootstrapper
csr-c4zbq                                        9m10s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper         <none>              Pending
csr-j29kg                                        13m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper         <none>              Pending

 

이름을 이용하여 보류중인 CSR 을 승인합니다.

# oc adm certificate approve csr-c4zbq

certificatesigningrequest.certificates.k8s.io/csr-c4zbq approved
# oc adm certificate approve csr-j29kg

certificatesigningrequest.certificates.k8s.io/csr-j29kg approved

 

참고로 보류 중인 모든 CSR 을 승인하려면 다음 명령을 수행합니다.

# oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs --no-run-if-empty oc adm certificate approve

 

전체 승인에서 처리되지 않은 요청은 개별 승인을 진행해야 합니다.

 

CSR 값이 많을 경우 승인한 CSR 에 대해서 삭제하는것을 고려해볼 수 있을텐데, 만약 Approved 또는 Issued 상태의 CSR을 삭제하면 해당 CSR로 발급된 인증서는 여전히 유효하지만 해당 CSR에 대한 기록은 클러스터에서 삭제됩니다. 이는 나중에 인증서를 관리하거나 디버깅할 때 문제가 될 수 있습니다. 따라서 일반적으로 Approved 또는 Issued 상태의 CSR을 삭제하기 전에 해당 CSR을 사용하여 발급된 인증서를 확인하고 이후에 CSR을 삭제하는 것이 좋습니다.

- 한개의 CSR 을 삭제

# oc delete csr <CSR 이름>

- 모든 CSR 을 삭제

# oc delete csr --all

 

연결된 전체 노드를 출력합니다.

worker 노드가 NotReady 상태라 하더라도 시간이 조금 지나면 Ready 상태로 변경됩니다.

# oc get nodes
NAME                       STATUS   ROLES                  AGE    VERSION
master01.az1.sysdocu.kr   Ready    control-plane,master   131m   v1.25.4+77bec7a
master02.az1.sysdocu.kr   Ready    control-plane,master   118m   v1.25.4+77bec7a
master03.az1.sysdocu.kr   Ready    control-plane,master   102m   v1.25.4+77bec7a
worker01.az1.sysdocu.kr   Ready    worker                 39m    v1.25.4+77bec7a
worker02.az1.sysdocu.kr   Ready    worker                 33m    v1.25.4+77bec7a

 

아래와 같은 명령을 수행하여 클러스터 구성 요소가 모두 연결되었는지 확인합니다.

(AVAILABLE : True, PROGRESSING : False, DEGRADED : False)

시간이 걸려 값이 정상적으로 돌아오는 경우가 있으므로 조금 기다려 봅니다.

(PROGRESSING 항목이 True 인 경우 프로세스가 동작중이라는 뜻)

 

# oc get clusteroperators 또는

# oc get co

NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication                             4.12.0    True        False         False      29m     
baremetal                                  4.12.0    True        False         False      123m    
cloud-controller-manager                   4.12.0    True        False         False      130m    
cloud-credential                           4.12.0    True        False         False      3h38m   
cluster-autoscaler                         4.12.0    True        False         False      122m    
config-operator                            4.12.0    True        False         False      129m    
console                                    4.12.0    True        False         False      35m     
control-plane-machine-set                  4.12.0    True        False         False      123m    
csi-snapshot-controller                    4.12.0    True        False         False      129m    
dns                                        4.12.0    True        False         False      93m     
etcd                                       4.12.0    True        False         False      114m    
image-registry                             4.12.0    True        False         False      93m     
ingress                                    4.12.0    True        False         False      37m     
insights                                   4.12.0    True        False         False      99m     
kube-apiserver                             4.12.0    True        False         False      103m    
kube-controller-manager                    4.12.0    True        False         False      113m    
kube-scheduler                             4.12.0    True        False         False      105m    
kube-storage-version-migrator              4.12.0    True        False         False      93m     
machine-api                                4.12.0    True        False         False      123m    
machine-approver                           4.12.0    True        False         False      122m    
machine-config                             4.12.0    True        False         False      103m    
marketplace                                4.12.0    True        False         False      123m    
monitoring                                 4.12.0    True        False         False      24m     
network                                    4.12.0    True        False         False      129m    
node-tuning                                4.12.0    True        False         False      93m     
openshift-apiserver                        4.12.0    True        False         False      93m     
openshift-controller-manager               4.12.0    True        False         False      93m     
openshift-samples                          4.12.0    True        False         False      88m     
operator-lifecycle-manager                 4.12.0    True        False         False      124m    
operator-lifecycle-manager-catalog         4.12.0    True        False         False      129m    
operator-lifecycle-manager-packageserver   4.12.0    True        False         False      93m     
service-ca                                 4.12.0    True        False         False      129m    
storage                                    4.12.0    True        False         False      129m  

 

* 참고

insights 항목에 오류가 발생될 수 있으나, 이것은 운영중 버그나 오류 데이터를 redhat 에 보내 개선하기 위한 용도로 사용되는 항목으로써 클러스터 서비스에 영향 주는 부분은 아니니 무시하셔도 됩니다.

다만, 이 경우 모든 항목이 완료된 것이 아니기 때문에 아래 명령 결과는 출력되지 않습니다.

 

또는 다음 명령으로 모든 클러스터 구성이 완료되었는지 확인 할 수 있습니다.

모든 구성이 완료 되면 관리 콘솔 URL 과 접속 계정이 출력 됩니다. 이 정보는 다른 명령으로도 확인이 가능합니다.

# ./openshift-install --dir installation_directory/ wait-for install-complete
INFO Waiting up to 40m0s (until 4:28PM) for the cluster at https://api.az1.sysdocu.kr:6443 to initialize... 
INFO Checking to see if there is a route at openshift-console/console... 
INFO Install complete!                            
INFO To access the cluster as the system:admin user when using 'oc', run 'export KUBECONFIG=/root/installation_directory/auth/kubeconfig' 
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.az1.sysdocu.kr 
INFO Login to the console with user: "kubeadmin", and password: "2DBdU-YmKbC-Cn5xF-tVvdF
INFO Time elapsed: 0s                             

 

웹콘솔 URL 주소는 아래 명령으로도 확인이 되고

# oc whoami --show-console
https://console-openshift-console.apps.az1.sysdocu.kr

 

비밀번호는 아래 파일에서 찾을 수도 있습니다.

# cat installation_directory/auth/kubeadmin-password

2DBdU-YmKbC-Cn5xF-tVvdF

 

웹콘솔 계정명은 kubeadmin 입니다.

 

이제 브라우저를 통해 웹 콘솔 접근이 가능합니다.

실제 존재하지 않는 도메인을 테스트로 설정하였을 경우, 접근하려는 작업 PC 에서 아래와 같이

OpenShift web-console 에 접근하기 위해 사용하는 도메인 두개와 서버 IP 를 hosts 에 추가하면 됩니다.

# vi /etc/hosts

...
115.68.142.99 console-openshift-console.apps.az1.sysdocu.kr oauth-openshift.apps.az1.sysdocu.kr

 

* 참고

오퍼레이터 설정이 초기화 되지 않은 경우에는 아래와 같이 출력될 수 있으니 조금 더 기다려 보도록 합니다.

INFO Waiting up to 40m0s (until 4:55PM) for the cluster at https://api.az1.sysdocu.kr:6443 to initialize...

 

이제 설치에 사용되는 ignition 파일을 모두 배포하고 클러스터 구성을 마쳤으므로 nginx 는 중지해도 됩니다.

# systemctl stop nginx

 

반응형

댓글()