Openshift SNO ISO로 설치하기

5–7분

개요

○ 기본 구성 요약

  • openshift-install 명령을 사용하여 부팅 가능한 이미지(ISO) 생성 하여 클러스터 배포
  • 단일 노드 구성(SNO) 3-NODE 클러스터 설치 지원 (이번 가이드는 SNO)
  • 완전히 연결되지 않은 배포에서 작동 및 미러링 된 로컬 레지스트리와 함께 작동

○ 최소 사양

TopologyMaster NodeWorker NodevCPUMemoryDisk
bastion-server008 vCPU cores16GB of RAM120GB
Single-node cluster108 vCPU cores16GB of RAM120GB

설치 사전 준비

  • 부팅 가능한 이미지(ISO)를 만들 Node 1대(RHEL 8.7)로 구성 진행
  • 구성 서버는 Bastion 서버로 명명함

Bastion 구성

  • localrepo 만들기 – Bastion 서버에서 진행
[root@bastion ~]# mkdir /repository
[root@bastion ~]# mount -t iso9660 -o loop /root/rhel-8.7-x86_64-dvd.iso /repository
[root@bastion ~]# cat <<EOF  > /etc/yum.repos.d/local-repo.repo
[BaseOS]
name=RHEL 8 - BaseOS
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///repository/BaseOS
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[AppStream]
name=RHEL 8 - AppStream
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///repository/AppStream/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
EOF

[root@bastion ~]# yum clean all
[root@bastion ~]# subscription-manager clean
[root@bastion ~]# yum repolist
  • SELinux 및 방화벽 종료
[root@bastion ~]# yum update -y
[root@bastion ~]# yum install -y unzip bash-completion httpd bind bind-utils haproxy nfs-utils jq podman
[root@bastion ~]# mkdir -pv /opt/registry/{auth,certs,data}
  • 패키지 설치
[root@bastion ~]# yum update -y
[root@bastion ~]# yum install -y unzip bash-completion httpd bind bind-utils haproxy nfs-utils jq podman
[root@bastion ~]# mkdir -pv /opt/registry/{auth,certs,data}
  • HTTP 구축
[root@bastion ~]# vim /etc/httpd/conf/httpd.conf
~
 45 Listen 8080
~
:wq
[root@bastion ~]# mkdir -pv /var/www/html/ocp
[root@bastion ~]# chmod -R 755 /var/www/html/ocp/
[root@bastion ~]# systemctl enable --now httpd
  • NFS 구축
[root@bastion ~]# systemctl enable --now nfs-server
[root@bastion ~]# mkdir -pv /var/nfsshare
[root@bastion ~]# chown -R nobody:nobody /var/nfsshare/  #RHEL7 경우 nfsnobody:nfsnobody
[root@bastion ~]# echo '/var/nfsshare 192.168.0.0/16(rw,sync,root_squash)' >> /etc/exports
[root@bastion ~]# exportfs -r
[root@bastion ~]# systemctl restart nfs-server
  • DNS 구축
[root@bastion ~]# vim /etc/named.conf
~
 11         listen-on port 53 { any; };
 19         allow-query     { any; };
~
:wq
  • ZONE 추가
[root@bastion ~]# vim /etc/named.rfc1912.zones
```
#문서 하단에 아래 문구 추가
# 정방향
zone "ocp.dhwon.com" IN {
    type master;
    file "ocp.dhwon.com.zone";
    allow-update { none; };
};

# 역방향
zone "1.168.192.in-addr.arpa" IN { # zone 이름이 중요하다. 하단에서 설명한다
    type master;
    file "ocp.dhwon.com.rev";
    allow-update { none; };
};
:wq
# 역방향 적을 시 자신이 사용하는 네트워크 대역 입력 필수
※ 네트워크 대역은 반드시 역방향으로 적을 것

  • zone 생성
vi /var/named/ocp.dhwon.com.zone
$TTL 1D
@       IN SOA  @ bastion.ocp.dhwon.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

; name servers - NS records
        NS     bastion.ocp.dhwon.com.

; OpenShift Container Platform Cluster - A records
master-1        IN      A       192.168.1.87
master-2        IN      A       192.168.1.88
master-3        IN      A       192.168.1.89
worker-1        IN      A       192.168.1.90
worker-2        IN      A       192.168.1.91
bootstrap       IN      A       192.168.1.86
bastion         IN      A       192.168.1.85

; OpenShift internal cluster IPs - A records
api             IN      A    192.168.1.85
api-int         IN      A    192.168.1.85
*.apps          IN      A    192.168.1.85
  • rev 생성
vi /var/named/ocp.dhwon.com.rev
$TTL 1D
@       IN SOA  @ bastion.ocp.dhwon.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
; name servers - NS records
        NS     bastion.ocp.dhwon.com.

; OpenShift Container Platform Cluster - PTR records
86     IN      PTR   bootstrap.ocp.dhwon.com.
87     IN      PTR   master-1.ocp.dhwon.com.
88     IN      PTR   master-2.ocp.dhwon.com.
89     IN      PTR   master-3.ocp.dhwon.com.
90     IN      PTR   worker-1.ocp.dhwon.com.
91     IN      PTR  worker-2.ocp.dhwon.com.
85     IN      PTR  api.ocp.dhwon.com.
85     IN      PTR  api-int.ocp.dhwon.com.
  • zone 체크
[root@bastion ~]# chmod 644 /var/named/ocp.dhwon.com.*
[root@bastion ~]# chmod 644 /var/named/ocp.dhwon.com.*
[root@bastion ~]# named-checkconf /etc/named.conf
[root@bastion ~]# named-checkconf /etc/named.rfc1912.zones
[root@bastion ~]# named-checkzone ocp.dhwon.com /var/named/ocp.dhwon.com.zone
zone ocp.dhwon.com/IN: loaded serial 0
OK
[root@bastion ~]# systemctl enable --now named
[root@bastion ~]# nmcli # dns server에 현재 작업중인 서버의 ip 추가(bastion)
  • DNS 정상 작동 확인
[root@bastion ~]# nslookup
# 정방향 조회
> bastion.ocp.dhwon.com
# 역방향 조회
> set type=ptr
> 192.168.1.85
  • HAproxy 구축
[root@bastion ~]# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_bak #원복 백업
[root@bastion ~]# vi /etc/haproxy/haproxy.cfg
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          300s
    timeout server          300s
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 20000

frontend openshift-api-server
    bind *:6443
    default_backend openshift-api-server
    mode tcp
    option tcplog

backend openshift-api-server
    balance source
    mode tcp
    server master 192.168.50.52:6443 check fall 3 rise 2

frontend machine-config-server
    bind *:22623
    default_backend machine-config-server
    mode tcp
    option tcplog

backend machine-config-server
    balance source
    mode tcp
    server master-1 192.168.50.52:22623 check fall 3 rise 2

frontend ingress-http
    bind *:80
    default_backend ingress-http
    mode tcp
    option tcplog

backend ingress-http
    balance source
    mode tcp
    server master 192.168.50.52:80 check fall 3 rise 2

frontend ingress-https
    bind *:443
    default_backend ingress-https
    mode tcp
    option tcplog

backend ingress-https
    balance source
    mode tcp
    server master 192.168.50.52:443 check fall 3 rise 2

이미지 미러링

파일 준비

Red Hat OpenShift Container Platform 4.12 for RHEL 8 – Red Hat 고객 포털
[root@bastion ~]# chmod -R 755 /var/www/html/ocp/
[root@bastion ~]# tar zxvf openshift-install-linux-4.10.9.tar
[root@bastion ~]# tar zxvf oc-4.10.9-linux.tar.gz
[root@bastion ~]# mv oc kubectl openshift-install /usr/local/bin/
[root@bastion ~]# openshift-install version
openshift-install 4.10.9
built from commit cf244530e9699eb209036670a17ab471f98f9f9b
release image quay.io/openshift-release-dev/ocp-release@sha256:39f360002b9b5c730d1167879ad6437352d51e72acc9fe80add3ec2a0d20400d
release architecture amd64
[root@bastion ~]# oc version
Client Version: 4.10.9
  • Private Image Registry 인증서 적용
[root@bastion ~]# cd /opt/registry/certs
[root@bastion certs]# openssl req -addext "subjectAltName=DNS:bastion.ocp.dhwon.com" -subj "/C=KO/ST=Seoul/L=Seoul/O=Opennaru/OU=support/CN=bastion.ocp.dhwon.com/emailAddress=weondong94@opennaru.com" -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt # RHEL7의 경우 RHEL8 서버에서 crt파일 생성 후 copy
[root@bastion certs]# cp domain.crt /etc/pki/ca-trust/source/anchors/.
[root@bastion certs]# update-ca-trust

Pull Secret 파일생성

https://cloud.redhat.com/openshift/install/metal/user-provisioned 에서 Pull secret을 복사합니다.
[root@bastion ~]# vim /root/ocp/pull-secret
`...
...secret 저장...
...`
[root@bastion ocp]# REG_SECRET_INT=`echo -n 'admin:opennaru' | base64 -w0`    # harbor 계정 정보를 환경변수에 저장
[root@bastion ocp]# cat /root/ocp/pull-secret | jq '.auths += {"bastion.ocp.dhwon.com:5000": {"auth": "REG_SECRET_INT","email": "weondong94@opennaru.com"}}' | sed "s/REG_SECRET_INT/$REG_SECRET_INT/" > /root/ocp/pull-secret.json  # harbor 정보를 추가하여 pull-secret.json 파일 생성
  • 이미지 미러링 환경변수 설정
[root@bastion ~]# vim /root/ocp/ocp_env
export OCP_RELEASE=4.12.28  #oc 및 openshift-install 버전과 동일
export LOCAL_REGISTRY='bastion.ocp.dhwon.com:5000'
export LOCAL_REPOSITORY='ocp/ocp4.12.28'
export PRODUCT_REPO='openshift-release-dev'
export LOCAL_SECRET_JSON='/root/ocp/pull-secret.json'
export RELEASE_NAME='ocp-release'
export ARCHITECTURE=x86_64
[root@bastion ~]# source /root/ocp/ocp_env
  • 이미지 미러링 실행
[root@bastion ~]# cd /opt/registry/auth/
[root@bastion auth]# htpasswd -cBb ./htpasswd admin opennaru
[root@bastion ~]# 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/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -e REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED=true -d docker.io/library/registry:2
[root@bastion ~]# podman login -u admin -p opennaru bastion.ocp.dhwon.com:5000
Login Succeeded!  # 접속 확인
[root@bastion ~]# export GODEBUG=x509ignoreCN=0; oc adm release mirror -a ${LOCAL_SECRET_JSON} --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE} --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}
  • mirrior-registry(podman) systemd 등록
# 재기동 시 container 자동 실행 파일 생성
[root@bastion ~]# podman generate systemd --restart-policy=always -f -t 1 --name mirror-registry  
# 복사
[root@bastion ~]# mv container-mirror-registry.service /etc/systemd/system  

부팅 할 ISO(CoreOS) 생성하기

# ocp 디렉토리에 설치 진행
[root@bastion ocp]# mkdir -pv /root/ocp/ocp/
  • image-config.yaml
[root@bastion ocp]# cd /root/ocp/ocp
cat << EOF > ./install-config.yaml
apiVersion: v1
baseDomain: dhwon.com
metadata:
  name: ocp
compute:
- architecture: amd64
  hyperthreading: Enabled
  name: worker
  replicas: 0
controlPlane:
  architecture: amd64
  hyperthreading: Enabled
  name: master
  replicas: 1
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  machineNetwork: # 물리장비 대역대 적어 줄 것
  - cidr: 192.168.0.0/16
  networkType: OVNKubernetes # SNO 구축시 필수
  serviceNetwork:
  - 172.30.0.0/16
platform:
  none: {}
pullSecret: '{ "auths": { "bastion.ocp.dhwon.com:5000": {"auth": "YWRtaW46b3Blbm5hcnU=","email": "weondong94@opennaru.com" } } }'
sshKey: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC5UskWOi+j8Gk/rAH80l/8jkEnKx62KU1grvIX2jv4+ykQxtSy/Hp/4yjuSRRkKty6jvhgXagJ7okLkqLJHDbf4fA6/34pSIRaDRio0gIf+YuvkJTFPUn8k5wddqOtzOKJaIijodaNErJvsCTZafWNZ9lynftvs5rZ77NMu2CuhnrblJdDIUzQfrvxBZc+Y1ymtKJnk8aAZTLUbiZcp22E0rbNVgUh0d6/Q0xOO0XMBM+3wquIM/RB7NiZ9lSCEXcAdELDE7x8NEqm0KiCwB+eVb1vfiaA2qUudMa5IGJkgtxDADOLMNRR14nPyK+pwisBF/9hieW9OJq6OpipsQF923Ig5AIYTNB9kCWB6qO0zpScct5scWwLsgImOWkTWJYyLeNl+fiPzdE93ovy3ICcEKriCoJiudHH08emRMwZsE5CaniSnYg6hvNXQO0jNOq7MU5+gVom5e2hF9knahjAIUphJvKczv3ZGQoF85Tq+HhVrH8zgU2usM5FQy2n/53yufJjX7ATBE3xVAmcni5oY8etvJIMh3/uqqQT+1mj+25vgYcGnO7RK5hL5eBOeWY4y5bGbSY7KZBR+XNspsIxtnGptHS9SFGzeCl49E0h7XF+bSd73V9t5AAKSZ5tNMLJ0/LAReZSKXQDwb+apSqVfvtXaGztLLZatoe+ycjNpw== root@bastion.ocp.dhwon.com'

additionalTrustBundle: |
  -----BEGIN CERTIFICATE-----
  MIIGOTCCBCGgAwIBAgIUYB/WeckzpVrkhfYjKGK1ITVwmCowDQYJKoZIhvcNAQEL
  BQAwgZoxCzAJBgNVBAYTAktPMQ4wDAYDVQQIDAVTZW91bDEOMAwGA1UEBwwFU2Vv
  dWwxETAPBgNVBAoMCE9wZW5uYXJ1MRAwDgYDVQQLDAdzdXBwb3J0MR4wHAYDVQQD
  DBViYXN0aW9uLm9jcC5kaHdvbi5jb20xJjAkBgkqhkiG9w0BCQEWF3dlb25kb25n
  OTRAb3Blbm5hcnUuY29tMB4XDTIzMDgxNDAxMjQxNVoXDTI0MDgxMzAxMjQxNVow
  gZoxCzAJBgNVBAYTAktPMQ4wDAYDVQQIDAVTZW91bDEOMAwGA1UEBwwFU2VvdWwx
  ETAPBgNVBAoMCE9wZW5uYXJ1MRAwDgYDVQQLDAdzdXBwb3J0MR4wHAYDVQQDDBVi
  YXN0aW9uLm9jcC5kaHdvbi5jb20xJjAkBgkqhkiG9w0BCQEWF3dlb25kb25nOTRA
  b3Blbm5hcnUuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAu2Zn
  OHNLbP/pjITBPhYRqeSeKMllfQjXFV968AUu3IGGwqiAhckBhwiOgAN1TwGbhyXe
  eIhPPkrVcS0DYC2YML7UUPsyEbJrtlc2cR6RSJkrI/HyUgmCZ6W7P9pjTEegPuHp
  fb7XkfRuEa5n28dLul4ZlZgYPT+yvmOdJM+ZnsOO6sxdxmo9YAiHG1UPYL1k2X3x
  fWviVFSiwq4phy/PLPzrum2Z3pB+ieorSxYh3E2tlNmpzdPeSw6RxI0J7+6f/3v4
  HbQtUev9XR/sWXtThfc8Kd54XJ+1czQ7C79pyjYc3mPpGu0x9rwkR45Ftw+Wd1Vs
  +8Bc7zQ2lZNmD1wTH4+rbA7AA2bwrRb6ZEPxXvPNPzSj36ZUtjEwNv1utAzZzVpK
  snjdQQBYXQNo83rhmgw1foB1uU+Pv7b8zDz7D7UFRpYL4yEOyx7cIlefcVcbMPgN
  mziDzjU84AH4XPvPZFXu77oEiRo//pFWJkM/Hok7r57elUevk67TVK6ag2k+3c9r
  vJoyQeAdMqnGY0ZeUJoiGETw8Nf87cwFLPINMGInV9VCu0YmyAYL8ZtvaecyJ53k
  yBpZav0DkgUisHHnMz73juhrNkPFzXKyZZ+N9cGkw9VFhiJP6M2iRpBnDAQZ3dEV
  8QuoYSQDHaS6SONZLELnygbK4IZy8oLZegRns6sCAwEAAaN1MHMwHQYDVR0OBBYE
  FKVEpx0iZ6l1Yjo+7BwkWR6AZGJjMB8GA1UdIwQYMBaAFKVEpx0iZ6l1Yjo+7Bwk
  WR6AZGJjMA8GA1UdEwEB/wQFMAMBAf8wIAYDVR0RBBkwF4IVYmFzdGlvbi5vY3Au
  ZGh3b24uY29tMA0GCSqGSIb3DQEBCwUAA4ICAQBjt4k08GoeT3meQ6agUOmpydrt
  YPktvRvYpI9X1oZ4EGAmNWYQ2X205iSLDZx4v0oHiqf7w3Zj0875Ywr8hPlW0QgQ
  6j+h8/8720+NOKFZed3NPHYbryKmtYozHuHosD/rQam7tu2U8LzNbVDWK8DAtEVy
  YRi00MU9pQDVlAdfVy0HcWsxRCvfn+IReSfH/0hID6aGFKbiFylmXXwK8wFQSuTa
  sjJS94jkEliF94ol2Z/pQJ7bVc5kDmol8AydZN8E8+Q47reRt0IKs8aj8Bj79PzC
  Ua9ywtlGkVWjalYppPRyol92b3FX6I6eDLIfkG8xcgvmHPLKOkO3GOZYeoHspIcl
  4/CuGPqoULjscgc1bNj923AQ1BuUxtRWpb/yQb/Orl3qygtvBz+vowGU3YU2ffhv
  bqPDLMeozEEJibuSuS0ob0ECGxYsp7kx83oPMklL7EK1XTOvkS1vaaO3QF3NRKDS
  BECvMw6TshZ4Ve0bRaxdfZZQdcJl4mUx4hdrxzqrZCQ1FszIVkBmnNuKUumc+Xuq
  LRaBokR+t1JgklPiNPr+QoUUUXSISErLecvbUH3aRtS+47DnL0LyA+oJjnqe45Ne
  L69Vx4T+4fqgxjQPb8FNCCD/hxhFVeaMxfZmlWC5dKge55m+5J0X43VRbGcxj+Dv
  OvNPCEuw7X9lZZ87Qw==
  -----END CERTIFICATE-----
imageContentSources:
- mirrors:
  - bastion.ocp.dhwon.com:5000/ocp/ocp4.12.28
  source: quay.io/openshift-release-dev/ocp-release
- mirrors:
  - bastion.ocp.dhwon.com:5000/ocp/ocp4.12.28
  source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
EOF
  • agent-config.yaml 작성
cat << EOF > ./agent-config.yaml
apiVersion: v1alpha1
metadata:
  name: ocp
rendezvousIP: 192.168.50.52
hosts:
  - hostnam///e: master
    interfaces:
     - name: ens192
       macAddress: 00:50:56:90:9d:b8 #<설치할 가상머신에 MAC Address>
    networkConfig:
      interfaces:
        - name: ens192
          type: ethernet
          state: up
          mac-address: 00:50:56:90:9d:b8 #<설치할 가상머신에 MAC Address>
          ipv4:
            enabled: true
            address:
              - ip: 192.168.50.52
                prefix-length: 16
            dhcp: false
      dns-resolver:
        config:
          server:
            - 192.168.50.51
      routes:
        config:
          - destination: 0.0.0.0/0
            next-hop-address: 192.168.0.1
            next-hop-interface: ens192
            table-id: 254
EOF

  • 파일 생성 확인
[root@bastion ocp]# ls -l /root/ocp/ocp
total 8
-rw-r--r--. 1 root root  809 Aug 14 01:38 agent-config.yaml
-rw-r--r--. 1 root root 3955 Aug 14 01:38 install-config.yaml
  • ISO 파일 생성
[root@bastion ocp]# cd /root/ocp
[root@bastion ocp]# openshift-install agent create image --dir ocp
INFO The rendezvous host IP (node0 IP) is 192.168.50.52
INFO Extracting base ISO from release payload
INFO Verifying cached file
INFO Using cached Base ISO /root/.cache/agent/image_cache/coreos-x86_64.iso
INFO Consuming Install Config from target directory
INFO Consuming Agent Config from target directory

이후 ISO 파일 생성하면 아래와 같은 파일명으로 생성 되어야 함

[root@bastion ocp]# ls -l
total 1173504
-rw-r--r--. 1 root root 1201668096 Aug 14 01:41 agent.x86_64.iso
drwxr-x---. 2 root root         50 Aug 14 01:41 auth

이 후 가상머신을 생성할 수 있는 하이퍼바이저 에 ISO를 넣고 부팅 진행하면 된다.

설치 완료

  • 설치 과정 확인
[root@bastion ~] mkdir -pv /root/.kube
[root@bastion ~] cp /root/ocp/ocp/auth/kubeconfig /root/.kube/config
[root@bastion ~] oc get co
  • 설치 완료 확인
[root@bastion ~] export KUBECONFIG=/root/ocp/ocp/auth/kubeconfig
[root@bastion ~]# cd /root/ocp/ocp
[root@bastion ocp]# openshift-install agent wait-for install-complet --dir ocp