[VMware] 73. 가상화, IaaC, vSan 환경 구축 15 (Openshift 4.3에 대한 baremetal UPI방식 설치_제한된 네트워크 - 실패)

전 시간에는 아래의 블로그를 보고 참고하여 서버에 Openshift를 UPI방식으로 구성하는 것을 도전해 보았습니다.

하지만 ens192 failed라는 오류로 인해 설치 도중 실패하여 이번엔 오프라인 방식으로 설치를 시도해 보았습니다.

결론부터 말하자면 이 방식도 실패 하였습니다.

 

실패 후, 해당 오류의 해결방법을 찾지못해 다른 방법을 찾아보았습니다.

그래서 다음시간에는 일단 RHCOS를 부팅시키고 내부에서 파라미터를 설정해주는 방식으로 진행해보려고 합니다.

RHCOS 4.3.8 버전은 부팅시 파라미터 값을 입력해야 부팅이 성공하기 때문에 RHCOS와 CentOS를 더 높은 버전을 사용하여 구성해 보도록 하겠습니다.

 

아래는 해당 글을 쓰면서 참고한 사이트 입니다.

https://gruuuuu.github.io/ocp/ocp-restricted-network/

 

Openshift4.3 Baremetal 설치 - Restricted Network

Overview 약 5개월 전에는 베어메탈에 UPI방식으로 openshift 4.3을 설치해보는 문서를 포스팅했었습니다. -> Openshift4.3 Installation on Baremetal 이번엔 Restricted Network, 즉 Offline에서 openshift 4.3을 설치해보는

gruuuuu.github.io

 

 

OpenShift 4.3: 베어메탈 설치의 차이 - 일반 네트워크 vs 제한된 네트워크

1. Openshift4.3 Installation on Baremetal
이 방법은 일반적인 베어메탈 환경에 OpenShift 4.3을 설치하는 방법을 설명합니다. 이 경우, 설치 프로세스는 네트워크에 자유롭게 접근할 수 있으며, 필요한 모든 리소스를 인터넷에서 직접 다운로드할 수 있습니다.

2. Openshift4.3 Installation on Baremetal - Restricted Network
이 방법은 제한된 네트워크 또는 연결이 끊긴 환경에서 OpenShift 4.3을 베어메탈에 설치하는 방법을 설명합니다. 이 경우, 설치 프로세스는 인터넷에 직접 접근할 수 없으므로, 필요한 모든 리소스를 로컬 레지스트리에서 가져와야 합니다.

 


설치 과정

제가 이번에 사용한 노드들의 스펙입니다.

Machine os vCPU RAM Storage number
Infra1 CentOS7 4 8GB 500GB 1개
Infra2 CentOS7 4 8GB 200GB 1개
Bootstrap RHCOS 4 16GB 120GB 1개
Control plane RHCOS 4 16GB 120GB 1개
Compute RHCOS 2 8GB 120GB 1개

 

사용한 노드들의 아키텍처는 다음과 같습니다.

 

 

예전에 설치했던 Openshift4.3 Installation on Baremetal과 달리 사용하는 Infra 노드가 두개입니다.

기존엔 Bastion+http+dns+lb를 한 노드에서 사용했다면, 이번에는 두 노드로 나눠서 구성을 해봤습니다.

또 하나 추가된 점은 Mirror Registry입니다. 기존의 설치방식(Online)에서는 각 노드가 인터넷과 연결되어있기 때문에 Quay에서 바로 이미지를 pulling할 수 있지만,
이번엔 Offline에서 설치를 진행할 것이기 때문에 각 클러스터 구성에 필요한 이미지 정보들을 미리 Mirror하여 로컬 레지스트리로 구성해주어야합니다.

Infra2 - DNS, LoadBalancer 구성

도메인 기반으로 로컬이미지레지스트리를 구성할것이기 때문에 로컬 DNS부터 구성해주도록 하겠습니다.

DNS

1. named서버를 위한 패키지 설치

$ yum install -y bind bind-utils

2. zone 추가 (/etc/named.rfc1912.zones)

zone "team3.local" IN {
        type master;
        file "team3.local.zone";
        allow-update { none; };
};

zone "1.0.10.in-addr.arpa" IN {
        type master;
        file "reverse.team3.local";
        allow-update { none; };
};

클러스터는 내부 ip망을 통해서 통신을 할것이기 때문에 private ip로 적어줘야 합니다.

3. 정방향 DNS설정 (/var/named/team3.local.zone)

$TTL 1D
@   IN SOA  @ team3.local. (
                    20200917   ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
    IN NS   team3.local.
    IN A    10.0.1.12
ns  IN A    10.0.1.12
www IN A    10.0.1.12

;cluster name
team3   IN CNAME    @

api-int.team3   IN A 10.0.1.12
api.team3   IN A 10.0.1.12
*.apps.team3    IN A 10.0.1.12

;ocp cluster
bootstrap.team3   IN  A   10.0.1.13
master.team3      IN  A   10.0.1.14
worker.team3      IN  A   10.0.1.15

;ocp registry (only for restrict network)
registry.team3        IN  A  10.0.1.11

;ocp internal cluster ip
etcd-0.team3      IN A    10.0.1.14

;ocp srv records
_etcd-server-ssl._tcp.team3   86400   IN   SRV    0   10  2380    etcd-0.team3

registry 레코드 추가하는 것을 잊지 않도록 합니다.

5. 역방향 DNS설정 (/var/named/reverse.team3.local)

$TTL 900
@ IN SOA team3.local. root.team3.local. (

    20200917;
    86400;
    3600;
    86400;
    3600;

)

    IN NS team3.local.
    IN A 10.0.1.12

12 IN PTR team3.local.

13 IN PTR bootstrap.team3.team3.local.
14 IN PTR master.team3.team3.local.

15 IN PTR worker.team3.team3.local.

12 IN PTR api.team3.team3.local.
12 IN PTR api-int.team3.team3.local.

registry는 넣으셔도 되고 안넣으셔도 됩니다.

6. named설정파일 변경(/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; };

listen-on port 53, allow-query 부분을 localhost에서 any로 바꿔줍니다

7. 권한 수정

$ chown root.named /var/named/team3.local.zone
$ chown root.named /var/named/reverse.team3.local

8. check

$ named-checkzone team3.local /var/named/team3.local.zone
zone team3.local/IN: loaded serial 200522
OK

$ named-checkzone team3.local /var/named/reverse.team3.local.com
zone team3.local/IN: loaded serial 200522
OK

9. named 서비스 재시작

$ systemctl restart named

10. nslookup으로 확인

$ nslookup
> team3.local
Server:         172.16.10.88
Address:        172.16.10.88#53

Name:   team3.local
Address: 10.0.1.12

 

LoadBalancer

1. nginx repo 추가

$ vim /etc/yum.repos.d/nginx.repo

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

2. nginx 설치

$ sudo yum install -y nginx
$ systemctl start nginx
$ systemctl enable nginx

3. lb를 위한 conf파일 생성

$ mkdir /etc/nginx/tcpconf.d
$ vim /etc/nginx/tcpconf.d/lb.conf
stream{
    upstream ocp_k8s_api {
        #round-robin;
        server 10.0.1.13:6443; #bootstrap
        server 10.0.1.14:6443; #master1
    }
    server {
        listen 6443;
        proxy_pass ocp_k8s_api;
    }

    upstream ocp_m_config {
        #round-robin;
        server 10.0.1.13:22623; #bootstrap
        server 10.0.1.14:22623; #master1
    }
    server {
        listen 22623;
        proxy_pass ocp_m_config;
    }

    upstream ocp_http {
        #round-robin;
        server 10.0.1.14:80; #master1
        server 10.0.1.15:80; #worker1
    }
    server{
        listen 80;
        proxy_pass ocp_http;
    }

    upstream ocp_https {
        #round-robin;
        server 10.0.1.14:443; #master1
        server 10.0.1.15:443; #worker1
    }
    server{
        listen 443;
        proxy_pass ocp_https;
    }
    
    upstream ocp_registry {
        #round-robin;
        server 10.0.1.11:5000; #registry
    }
    server{
        listen 5000;
        proxy_pass ocp_registry;
    }
}

registry는 LISTEN port가 5000번이므로 참고해서 적어줍니다.
ip는 레지스트리를 생성할 노드의 ip를 적어주시면 됩니다.

4. 기존 nginx conf파일에 tcp/udp용 로드밸런서 include

$ vim /etc/nginx/nginx.conf
…
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    charset utf-8;
}
include /etc/nginx/tcpconf.d/*.conf;

http블럭 밖에다가 명시해주시면 됩니다.(가장 아래줄)

5. SELINUX permissive모드로 변경

권장하는 방법은 아니지만 Nginx서비스에 필요한 포트를 semanage로 열어줘도 Permission denied 에러가 나서 실습을 진행하기 위해 permissive모드로 진행하도록 하겠습니다.
추후 방법을 알아내면 수정하겠습니다.

$ setenforce 0

6. 서비스 재시작 및 확인

$ systemctl restart nginx
$ systemctl status nginx

Infra1 - Installer, MirrorRegistry, HTTP 구성

Installer

RedHat계정이 있어야 합니다.

1. Installer Download

다음 링크로 이동 -> https://cloud.redhat.com/openshift/install

UPI선택 후, Download Installer선택

해당 페이지에서는 무조건 latest버전의 openshift installer 및 client를 받을 수 있습니다.
원하는 버전으로 받으려면 다음 링크를 참고하세요.
https://mirror.openshift.com/pub/openshift-v4/clients/ocp/

이 실습에서는 4.3.8버전으로 사용할 것입니다.


openshift-client-linux와 openshift-install-linux를 다운받아 줍니다.
4.3.8태그가 붙은거나 안붙은거나 같은것이므로 둘 중 하나만 받으면 됩니다.

2. 압축해제

installer 압축해제 :

$ tar -xvf openshift-install-linux-4.3.8.tar.gz

$ ./openshift-install version
openshift-install 4.3.8
built from commit 7bc8168fbba1c831ac1b25c858f4f56cd7468801
release image quay.io/openshift-release-dev/ocp-release@sha256:919e2405322cf497165d58fbd064ddddcad1651c367362cfea078e4469803005

client 압축해제(kubectl, oc)

$ tar -xvf openshift-client-linux-4.3.8.tar.gz
$ cp ./kubectl /usr/local/bin/kubectl
$ cp ./oc /usr/local/bin/oc

버전확인

$ oc version
Client Version: 4.3.8

$ kubectl version
Client Version: version.Info{Major:"", Minor:"", GitVersion:"v0.0.0-master+$Format:%h$", GitCommit:"$Format:%H$", GitTreeState:"", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}

MirrorRegistry

참고 : openshift document - Creating a mirror registry for installation in a restricted network

Offline으로 설치를 진행하기 때문에 미리 로컬에 이미지 레지스트리를 만들어 설치에 필요한 이미지를 구성해둬야 합니다.

이미지 레지스트리는 반드시 클러스터의 모든 노드에서 접근가능해야하며, 외부 레지스트리에서 이미지를 pulling해야하기 때문에 인터넷 연결이 되어있어야 합니다.

1. SSL생성

registry와 ssl인증을 기반으로 통신을 하기 때문에 registry에 등록할 ssl certificate를 생성해주어야 합니다.

 

(1) 개인 키 생성

먼저 개인 키를 생성해야 합니다. 이 개인 키는 서버의 보안 통신을 위한 중요한 부분입니다

$ openssl genpkey -algorithm RSA -out private.key

 

(2) 사설 인증서 생성
개인 키를 사용하여 사설 인증서를 생성합니다.

하나의 certificate에 여러개의 hostname을 등록할 수 있는 subjectAltName(SAN) 방식을 통해 인증서를 생성합니다.

$ openssl req -nodes -x509 -sha256 -newkey rsa:4096 \
 -keyout private.key \
 -out certificate.crt \
 -days 356 \
 -subj "/C=KR/ST=seoul/L=seoul/O=cj/OU=cloud/CN=xxx.com" \
 -addext "subjectAltName = DNS:localhost,DNS:xxx.com,DNS:bastion.xxx.com,DNS:api.ocp.xxx.com,DNS:api-int.ocp.xxx.com,DNS:*apps.ocp.xxx.com"

 

 

이렇게 나온 crt파일을 /etc/pki/ca-trust/source/anchors/ 밑에 두고, 아래 명령어로 신뢰할 수 있는 인증서 리스트를 업데이트 해줍니다.

$ update-ca-trust extract 

그 다음, 아래 명령어로 제대로 list에 등록되었는지 확인:

$ trust list

crt파일도 검증:

$ openssl verify xxx.crt 

위에서 언급했듯이 사설인증서이므로, 이 인증서를 신뢰할 수 있는 연결(https)에 사용하려면 host와 client모두 해당 인증서를 trust list에 추가해주어야 합니다.

2. registry 설정

폴더 생성:

$ mkdir -p /opt/registry/{auth,certs,data}

위에서 생성한 crt와 key파일을 certs폴더에 옮겨주겠습니다.

$ mv certificate.crt /opt/registry/certs
$ mv private.key /opt/registry/certs

3. podman, httpd-tools 설치

centOS의 경우 epel 레포 추가 필수 (epel-release)

$ yum install -y podman httpd-tools

4. 레지스트리 사용자 생성

auth 폴더로 이동 :

$ cd /opt/registry/auth

사용자 생성

$ htpasswd -bBc /opt/registry/auth/htpasswd admin passw0rd

Adding password for user admin

만약 docker가 켜져있다면 충돌위험이 있으니 docker는 stop해주시기 바랍니다.

$ systemctl stop docker

5. registry 컨테이너 띄우기

podman으로 registry컨테이너를 띄워주도록 하겠습니다.

$ podman run --name mirror-registry -p 5000:5000 \
  -v /opt/registry/data:/var/lib/registry:z \
  -v /opt/registry/auth:/auth:z \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v /opt/registry/certs:/certs:z \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/certificate.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/private.key \
  -e REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED=true \
  -d docker.io/library/registry:2


Trying to pull docker.io/library/registry:2...
Getting image source signatures
Copying blob 47112e65547d done
Copying blob c1cc712bcecd done
Copying blob 46bcb632e506 done
Copying blob cbdbe7a5bc2a done
Copying blob 3db6272dcbfa done
Copying config 2d4f4b5309 done
Writing manifest to image destination
Storing signatures
6daeb31e5bf53d6cfb7082817b93dcb8acaf08d3da950e13b18e1b30f25e1dc5

6. 접근 테스트

제대로 registry에 접근이 가능한지 테스트해보겠습니다.

repository 출력:

$ curl -u admin:passw0rd -k https://registry.team3.team3.local:5000/v2/_catalog

{"repositories":[]}

login :

$ podman login -u admin -p passw0rd registry.team3.team3.local:5000

Login Succeeded!

발생할 수 있는 에러

Error: error authenticating creds for "registry.team3.team3.local:5001": 
error pinging docker registry registry.team3.team3.local:5001: Get https://registry.team3.team3.local:5001/v2/: 
x509: certificate signed by unknown authority

SSL 인증서가 알려지지 않은 기관에 의해 서명되었음을 나타냅니다.

이 문제는 일반적으로 자체 서명된 인증서(self-signed certificate)를 사용할 때 발생합니다. 자체 서명된 인증서는 인증서를 발급하는 기관(Certificate Authority, CA)에 의해 서명되지 않았기 때문에, 클라이언트는 이 인증서를 신뢰할 수 없다고 판단합니다.

문제를 해결하는 방법:
인증서를 신뢰하도록 설정: podman 명령에 --tls-verify=false 옵션을 추가하여 SSL 인증서 검증을 비활성화할 수 있습니다. 그러나 이 방법은 보안 위험을 초래할 수 있으므로, 신뢰할 수 있는 네트워크에서만 사용해야 합니다.

podman login -u admin -p passw0rd --tls-verify=false registry.team3.team3.local:5001

7. pull secret 설정

아래 링크에서 pull-secret을 확인하실 수 있습니다.
https://cloud.redhat.com/openshift/install/pull-secret

pull-secret을 복사해서 pull-secret.json파일로 생성해줍니다.

$ vim /opt/registry/certs/pull-secret.json

처음에 pull secret을 붙여넣기하면 json포맷의 글자들이 한줄로 나열되어있는데 이걸 보기좋게 줄 정렬을 하려면 vim의 다음 기능을 사용하시면 좋습니다.

:%!python -m json.tool 

정렬을 하게되면 다음과 같이 확인할 수 있습니다.

{
    "auths": {
        "cloud.openshift.com": {
            "auth": "b3Blbn...",
            "email": "ddd@example.com"
        },
        "quay.io": {
            "auth": "b3Blbn...",
            "email": "ddd@example.com"
        },
        "registry.connect.redhat.com": {
            "auth": "NTMwN...",
            "email": "ddd@example.com"
        },
        "registry.redhat.io": {
            "auth": "NTMwN...",
            "email": "ddd@example.com"
        }
    }
}

계정의 auth정보가 포함되어있습니다.

위에서 생성한 로컬 레지스트리의 시크릿파일 생성:

$ echo -n 'admin:passw0rd' | base64 -w0
YWRtaW46cGFzc3cwcmQ=

그 다음 pull-secret.json파일에 붙여넣습니다.

{
    "auths": {
        "cloud.openshift.com": {
            "auth": "b3Blbn...",
            "email": "ddd@example.com"
        },
        "quay.io": {
            "auth": "b3Blbn...",
            "email": "ddd@example.com"
        },
        "registry.connect.redhat.com": {
            "auth": "NTMwN...",
            "email": "ddd@example.com"
        },
        "registry.redhat.io": {
            "auth": "NTMwN...",
            "email": "ddd@example.com"
        },
        "registry.gru.hololy-dev.com:5000":{
            "auth": "YWRtaW46cGFzc3cwcmQ=",
            "email": "ddd@example.com"
        }
    }
}

8. Mirroring

이제 로컬 레지스트리에 Quay에서 필요한 이미지들을 미러링하겠습니다.

우선 설치를 편하게 하기 위해 다음 환경변수를 설정해줍니다.

환경변수 설정 :

  1. OCP_RELEASE : 설치할 OCP 버전 지정 예) 4.3.8-x86_64
  2. LOCAL_REGISTRY : Mirror Registry URL 예) registry.gru.hololy-dev.com:5000
  3. LOCAL_REPOSITORY : Registry Repository Name
  4. PRODUCT_REPO : 미러할 repo의 이름. production release인경우 openshift-release-dev 명시
  5. LOCAL_SECRET_JSON : pull secret file path 예) /opt/registry/certs/pull-secret.json
  6. RELEASE_NAME: 미러할 repo의 release 이름. production release인 경우 ocp-release 명시

원하는 release 버전은 아래 quay repo에서 검색해 태그를 확인해야 합니다.
-> openshift-release-dev / ocp-release

export OCP_RELEASE="4.3.8-x86_64" 
export LOCAL_REGISTRY='registry.gru.hololy-dev.com:5000' 
export LOCAL_REPOSITORY='ocp4.3.8-x86' 
export PRODUCT_REPO='openshift-release-dev' 
export LOCAL_SECRET_JSON='/opt/registry/certs/pull-secret.json' 
export RELEASE_NAME="ocp-release"

미러 시작은 다음 명령어를 통해 시작합니다.

$ oc adm -a ${LOCAL_SECRET_JSON} release mirror \
   --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE} \
   --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \
   --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}

 

발생할 수 있는 에러
error: unable to connect to registry.team3.team3.local:5001/ocp4.3.8-x86: 
Get https://registry.team3.team3.local:5001/v2/: x509: certificate signed by unknown authority

 

SSL 인증서가 알려지지 않은 기관에 의해 서명되었음을 나타냅니다.

문제를 해결하는 방법:
인증서를 신뢰하도록 설정: oc 명령에 --insecure 옵션을 추가하여 SSL 인증서 검증을 비활성화할 수 있습니다. 그러나 이 방법은 보안 위험을 초래할 수 있으므로, 신뢰할 수 있는 네트워크에서만 사용해야 합니다.

$ oc adm -a ${LOCAL_SECRET_JSON} release mirror \
   --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE} \
   --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \
   --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE} --insecure

 

 

설치가 끝나면 install-config.yaml파일에 추가할 imageContentSources가 출력이 되는데 복사해두도록 합니다.

repo 확인:

$ curl -u admin:passw0rd -k https://registry.team3.team3.local:5000/v2/_catalog

{"repositories":["ocp4.3.8-x86"]}

MirrorRegistry구성이 완료되었습니다!

HTTP File Server

coreOS설치에 필요한 ignition파일이나 coreOS raw이미지파일을 공유할 파일 서버를 만들어야 합니다.

1. nginx 설치

위의 nginx 설치방법 참고

2. nginx default.conf 수정

$ vim /etc/nginx/conf.d/default.conf

server {
    listen       8080;
    server_name  localhost;


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

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

}
  • 80포트 -> 8080포트로 변경
  • location / 에 파일 서버로 사용할 경로 추가
  • autoindex on 추가

3. file server 실행

# 파일 서버로 사용할 경로 생성
$ mkdir /usr/share/nginx/html/files

# 테스트용 파일 생성
$ touch /usr/share/nginx/html/files/hi

# nginx서비스 reload
$ systemctl reload nginx

인터넷 주소창에 ip:8080으로 접근해보면 다음과 비슷한 화면이 떠야합니다.

접근이 안되는 경우
-> 방화벽 stop

$ systemctl stop firewalld

Installation

이제부터 설치를 본격적으로 진행하겠습니다.
설치는 Infra1(bastion)서버에서 진행합니다.

Steps

1. 설치 폴더 생성

먼저 설치폴더를 만들어줍니다.

$ mkdir installation_directory
$ cd installation_directory

2. ssh key생성

클러스터 노드에 추가할 ssh key를 생성해주겠습니다.

$ $ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:74Hc6wjgA1ErMNoixDCdKmQR821ENJcqwf4QNBKzGxA root@ocp.ibm.cloud
The key's randomart image is:
+---[RSA 2048]----+
|E@*++= ..        |
|+OO=+.o.         |
|*+=.+o.          |
|+.o*..           |
|... =   S        |
|   o o . +       |
|    o . o +      |
|     . . o o     |
|        ..+      |
+----[SHA256]-----+

3. ssh config 설정

클러스터 노드에 편하게 접근하기 위해 설정해주겠습니다.

$ vim ~/.ssh/config

Host boot
    HostName {bootstrap_ip}
    User core
    IdentityFile ~/.ssh/id_rsa
Host master
    HostName {master_ip}
    User core
    IdentityFile ~/.ssh/id_rsa
Host worker
    HostName {worker_ip}
    User core
    IdentityFile ~/.ssh/id_rsa

이제 설치중에 편하게 ssh boot 등과 같은 명령어로 노드에 접근할 수 있습니다.

4. install-config.yaml 생성

기본 틀은 다음과 같습니다.

apiVersion: v1
baseDomain: team3.local
compute:
- hyperthreading: Enabled
  name: worker
  replicas: 1
controlPlane:
  hyperthreading: Enabled
  name: master
  replicas: 1
metadata:
  name: clusterName
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...'
imageContentSources:
- mirrors: 
  - <local_registry>/<local_repository_name>/release 
  source: quay.io/openshift-release-dev/ocp-release 
- mirrors: 
  - <local_registry>/<local_repository_name>/release 
  source: registry.svc.ci.openshift.org/ocp/release
additionalTrustBundle: | 
  -----BEGIN CERTIFICATE----- 
  ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
  -----END CERTIFICATE-----

여기서 수정해 주어야 할 것들 :

  1. baseDomain : 자신의 도메인주소로 변경
  2. compute.replicas : worker노드의 개수
  3. controlePlane.replicas : master노드의 개수
  4. metadata.name : 클러스터 이름 수정
  5. pullSecret : https://cloud.redhat.com/openshift/install/pull-secret 여기서 복사
    처음 복사하면 다음과 비슷한 포맷으로 출력되는데,
     {"auths": {"cloud.openshift.com": {"auth": "b3Blbn...","email": "ddd@example.com"},"quay.io": {"auth": "b3Blbn...","email": "ddd@example.com"},"registry.connect.redhat.com": {"auth": "NTMwN...","email": "ddd@example.com"},"registry.redhat.io": {"auth": "NTMwN...","email": "ddd@example.com"}}}
    
    여기에 위에서 생성했던 로컬registry 시크릿도 추가해줘야합니다.
    ex)
  6.  {"auths": {"cloud.openshift.com": {"auth": "b3Blbn...","email": "ddd@example.com"},"quay.io": {"auth": "b3Blbn...","email": "ddd@example.com"},"registry.connect.redhat.com": {"auth": "NTMwN...","email": "ddd@example.com"},"registry.redhat.io": {"auth": "NTMwN...","email": "ddd@example.com"},"registry.gru.hololy-dev.com:5000":{"auth": "YWRtaW46cGFzc3cwcmQ=","email": "ddd@example.com"}}}
    
  7. sshKey : 위에서 ssh-keygen으로 생성한 public key(~/.ssh/id_rsa.pub)
  8. imageContentSources : 로컬 MirrorRegistry 미러링끝나고 나서 출력된 imageContentSources를 그대로 붙여넣어주시면 됩니다.
  9. additionalTrustBundle : registry만들 때 사용한 cert파일(/opt/registry/certs/domain.crt)
    아래 사진과 같이 추가해주시면 됩니다. 왼쪽에 노란색 펜으로 표시한 부분처럼 indent에 주의하여 붙여넣어야 합니다.

    꿀팁)
     $ echo "additionalTrustBundle: |" >> install-config.yaml
     $ cat /opt/registry/certs/domain.crt |sed 's/^/\ \ /g' >> install-config.yaml
    

5. Manifests & Ignitions

설치를 진행하면서 install-config.yaml파일은 사라지므로 백업을 떠두고 진행하도록 합니다.

$ cp install-config.yaml install-config.yaml.bak

manifest파일 생성 :

# install-config.yaml파일이 있는 폴더내에서 실행하면 설치 폴더의 위치를 명시해주지 않아도 됩니다.  
$ ../openshift-install create manifests

INFO Consuming Install Config from target directory
WARNING Certificate F91CF231C699768ED98F4D5EE9EA1810 from additionalTrustBundle is x509 v3 but not a certificate authority

ignition파일 생성

$ ../openshift-install create ignition-configs 

INFO Consuming OpenShift Install (Manifests) from target directory
INFO Consuming Worker Machines from target directory
INFO Consuming Master Machines from target directory
INFO Consuming Openshift Manifests from target directory
INFO Consuming Common Manifests from target directory

생성된 ignition파일들을 HTTP파일서버의 공유폴더로 옮깁니다.

# ignition파일들을 nginx 파일 서버로 옮김
$ cp *.ign /usr/share/nginx/html/files/

# 파일 권한도 외부에서 접근 가능하게 변경
$ chmod 644 /usr/share/nginx/html/files/*.ign

6. raw파일 다운로드

다음 링크에서 원하는 버전의 coreOS raw파일을 찾아서 다운로드 받습니다.
-> https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/

# nginx파일 서버에 raw파일 다운로드
$ cd /usr/share/nginx/html/files/
$ wget https://mirror.openshift.com/pub/openshift-v4.......raw.gz

7. vm 생성 및 CoreOS설치

CoreOS 설치 초기화면 :

설치파라미터 (tab키누르고 입력) :

coreos.inst.install_dev=sda 
coreos.inst.image_url=http://{fileserver}:8080/rhcos-4.3.8-x86_64-metal.x86_64.raw.gz
coreos.inst.ignition_url=http://{fileserver}:8080/bootstrap.ign 
ip={static ip}::{gateway}:{netmask}:{hostname}:{network interface}:none
nameserver={dns}

각 파라미터간의 구별은 enter가 아닌 공백으로 구분해야합니다.

boot가 올라온 뒤, master와 worker도 띄우고 기다리면 설치가 완료되는 것을 확인하실 수 있습니다.

 

 

동일하게 부팅 도중 ens192 failed에러가 발생하여 실패 하였습니다.


성공한 이후의 프로세스는 이전에 올린 포스팅의 과정과 동일하니 참고하시면 될 것 같습니다.