OKD 4.7 설치

Gyullbb·2021년 7월 20일
3

OKD

목록 보기
1/3
post-thumbnail

OKD 설치에 필요한 VM을 생성하는 방법은 크게 두 가지가 존재한다

1) openshift에서 제공하는 IaC를 통한 설치

2) 직접 설치

1) Openshift에서 제공하는 IaC(Terraform)를 통한 설치

1-1 ) 설치 VM 생성

설치를 위한 VM을 따로 AWS에 생성한다.

t2.micro, Linux로 EC2를 생성한다.

보안 그룹은 Inboundrule : 22 / OutboundRule : All Traffic 으로 설정한다.

1-2) install-config.yaml 파일 생성

  1. 인스톨러 설치 : openshift-install-linux-4.7.0-0.okd-2021-06-19-191547.tar.gz

  2. 인스톨러 집 해제 : $ tar xvf openshift-install-linux.tar.gz

  3. Pull Secret Download

    • Pull Secret이란?

      OKD 리소스들을 생성할 때 [Quay.io](http://quay.io)[registry.redhat.io](http://registry.redhat.io) 등 에서 필요한 컨테이너 이미지를 가져오기 위해서는 인증정보가 있어야한다. 이 인증정보를 Pull Secret이라 한다.
      [설명정보]

  4. install-config.yaml 파일 생성

    • 위에서 다운받은 installer 내부의 openshift-install 스크립트로 install-config.yaml 파일을 생성

    사전 준비 사항
    1) AWS access key ID, secret access key 생성
    2) Route 53 Base Domain 생성 (public Route 53 hosted zone) : 링크
    3) Pull Secret Download

    • 비어있는 폴더를 하나 생성한 후 설치 스크립트 실행
    $ ./openshift-install create install-config --dir=<installation_directory>

    생성 시 선택하는 목록
    1) Platform : AWS
    2) AWS Access Key ID
    3) AWS Secret Access Key
    4) Region
    5) Base Domain
    6) Cluster Name (subdomain으로 사용되기 때문에 소문자여야한다.)
    7) Pull Secret

    과정을 마무리하면 install-config.yaml 이 생성된다.

  • 생성된 install-config.yaml 파일

    apiVersion: v1
    baseDomain: cloudmanaged.com
    compute:
    - architecture: amd64
      hyperthreading: Enabled
      name: worker
      platform: {}
      replicas: 3
    controlPlane:
      architecture: amd64
      hyperthreading: Enabled
      name: master
      platform: {}
      replicas: 3
    metadata:
      creationTimestamp: null
      name: cloudmanaged
    networking:
      clusterNetwork:
      - cidr: 10.128.0.0/14
        hostPrefix: 23
      machineNetwork:
      - cidr: 10.0.0.0/16
      networkType: OVNKubernetes
      serviceNetwork:
      - 172.30.0.0/16
    platform:
      aws:
        region: us-west-2
    publish: External
    pullSecret: '{"auths":{"

1-3) 도메인 구매 및 등록

OKD에서 제공하는 Kubernetes API과 통신하고 OKD콘솔에 접근하기 위해서는 유효한 도메인과 인증서가 필요하다. install-config.yaml 파일의 baseDomain부분에 해당한다.

도메인 구매

도메인은 freenom이라는 사이트에서 무료로 구매할 수 있다.

  1. 회원가입
  2. 원하는 도메인 검색
  3. 구매할 도메인 선택 : cmmanaged.ml 구매

AWS Route53에서 퍼블릭 호스트존 추가

cmmanaged.ml이름으로 퍼블릭 호스트 존 추가를 하면 레코드가 생성이된다.

레코드 중 NS유형에 해당하는 레코드를 복사해서 freenom 사이트에서 구매한 도메인 설정에 붙여넣는다.

1-4) install-config.yaml 파일 수정

설정에 맞게 install-config.yaml 파일을 수정한다.

  • 수정한 install-config.yaml 파일

    apiVersion: v1
    baseDomain: cmmanaged.ml
    credentialsMode: Mint 
    compute: 
    - hyperthreading: Enabled 
      name: worker
      platform:
        aws:
          rootVolume:
            iops: 2000
            size: 500
            type: io1 
          type: c5.4xlarge
          zones:
          - us-west-2c
      replicas: 3
    controlPlane:   
      hyperthreading: Enabled 
      name: master
      platform:
        aws:
          zones:
          - us-west-2a
          - us-west-2b
          rootVolume:
            iops: 4000
            size: 500
            type: io1 
          type: m5.xlarge
      replicas: 3
    metadata:
      creationTimestamp: null
      name: okd
    networking:
      clusterNetwork:
      - cidr: 10.128.0.0/14
        hostPrefix: 23
      machineNetwork:
      - cidr: 10.0.0.0/16
      networkType: OVNKubernetes
      serviceNetwork:
      - 172.30.0.0/16
    platform:
      aws:
        region: us-west-2
        amiID: ami-001d0de8e6019b8cc
    sshKey: 
    pullSecret: '{"auths":{
  • sshKey : 스크립트를 이용해서 생성한 리소스들에 접근할 수 있는 키를 지정하는 곳이다. public키를 넣도록 한다.

  • pullSecret : 앞서 다운받은 pullSeret을 넣되, ' ' 을 추가해야한다.

  • 사용한 ami : Fedora CoreOS 33

sshKey 접속 설정

키를 설정하면 Ignition구성파일을 통해 각 노드의 ~/.ssh/authorized_keyscore 사용자 목록에 추가된다.

  1. 키생성 $ssh-keygen -t ed25519 -N '' -f <path>/<file_name>
  2. 공개키 확인 후 install-config.yaml 에 추가

1-5) cluster 생성

수정한 install-config.yaml과 다운 받은 openshift-install 스크립트로 클러스터를 생성한다.

$ ./openshift-install create cluster --dir=<installation_directory> \ 
    --log-level=info

<installation_directory>는 install-config.yaml이 존재하는 폴더를 지정해야한다. 클러스터를 생성하고 나면 install-config.yaml 파일이 사라지기 때문에 다른 경로에 미리 백업해두도록 한다.

생성이후 구조도

OKD4 7구성도

Security Group
OKD4 7 Security Group

OC CLI 다운로드 및 설정

  1. oc.tar.gz 다운로드
  2. tar xvzf <file>
  3. echo $PATH 후 폴더 내의 oc 파일 PATH하위로 이동
  4. oc 명령어 사용 가능

kubeconfig 설정

클러스터가 설치되면 생성되는 kubeconfig파일에는 클러스터 및 API서버에 클라이언트를 연결할 때 필요한 정보가 설정되어 있다. kubeconfig 내의 kubeadmin 자격 증명을 내보냄으로써 oc 명령어를 수행할 수 있다.

$ export KUBECONFIG=<your working directory>/auth/kubeconfig
$ oc whoami
system:admin

웹 콘솔 경로 확인

$ oc get routes -n openshift-console | grep 'console-openshift'
$ oc whoami --show-console

cluster 삭제

$ ./openshift-install destroy cluster --dir=/install/onpenshift-install-set --log-level=info
  • 리소스 삭제 : 무엇이 설치되었었는가

콘솔 접속

인증서를 등록하지 않은 상태에서도 콘솔에 접속할 수 있다. 신뢰된 인증 기관에서 이 인증서를 검증할 수 없다는 표시가 뜬다.

🎈접속 주소 : https://console-openshift-console.apps.okd.cmmanaged.ml/

🎈ID : kubeadmin

🎈passwd : cat <installation_directory>/auth/kubeadmin-password

3
4

1-6) Node 접속

클러스터를 설치한 VM VPC와 클러스터 VPC가 다르기 때문에 클러스터 VPCpublic subnetVM을 하나 생성한 후 해당 VM을 통해서 접속한다.

  1. 새로 생성한 VM 내에 key 복사
  2. ssh -i <key name> core@<node private ip>

1-7) 인증서 등록

웹 콘솔로 접속하기 위해서는 HTTPS접속을 하기 위한 인증서가 필요하다.

Route53에 들어가면 기존에 생성되었던 퍼블릭 호스팅존 이외에 프라이빗 호스팅 존이 생성되었음을 볼 수 있다.

프라이빗 호스팅 존 명명법 : .

호스팅 존에서 보면 OKD콘솔에 해당하는 url이 elb와 매핑되어있음을 볼 수 있다.
5

기본 인증서 워크플로우 vs 사용자 정의 인증서 워크플로우

📚출처 : https://access.redhat.com/documentation/en-us/openshift_container_platform/4.3/html-single/authentication/index

OKD를 설치하게 되면 Ingress-Operator는 기본적으로 자체 서명된 인증서를 사용해서 default 인증서에 서명하게된다. 자체 제공한 인증서는 신뢰할 수 없는 인증기관에서 발급했다 인식하기 때문에 사용자가 인증서를 제공해야한다.

Ingress-Operator가 사용하는 인증서
1. Prometheus의 metric을 통한 액세스 보호
2. route에 대한 액세스 보호

[기본 인증서 워크플로우]

6

  • 기본 인증서 워크플로우

    1. Ingress Operator가 자체서명한 CA를 사용하여 지정된 도메인에 대해 인증서를 제공하도록 한다.

    2. Ingress Operator에 의해 default CA인증서와 키가 생성된다.

    3. Ingress Operator가 생성한 default CA인증서로 서명한 와일드카드 default serving 인증서이다. (cf. 사용자정의 인증서에서는 사용자가 제공한 인증서를 의미한다.)

    4. router deployment로 2번(router-certs-default) 내의 인증서를 사용한다.

    5. OAuth(플랫폼 환경에 권한을 부여하는 프로토콜)통합을 위해 와일드카드 default serving 인증서의 내용이 복사된다.

    6. OAuth와 웹 콘솔의 신뢰관계를 설정하기 위해 필요한 전환 리소스. 운영자가 생성한 default CA인증서가 포함되어 있다. 향후 이 구성은 release에서 삭제된다.

    7. default serving 인증서의 public부분으로 configmaps/router-ca를 대체한다.

    8. OKD 4.3 이하 버전은 router-ca를 대신 사용한다.

[사용자 정의 인증서 워크플로우]

7

  • 사용자 정의 인증서 워크플로우

    1. Ingress Operator가 자체서명한 CA를 사용하여 지정된 도메인에 대해 인증서를 제공하도록 한다.

    2. 사용자가 제공한 인증서로 서명한 와일드카드 default serving 인증서이다.

    3. router deployment로 2번(router-certs-default) 내의 인증서를 사용한다.

    4. OAuth(플랫폼 환경에 권한을 부여하는 프로토콜)통합을 위해 와일드카드 default serving 인증서의 내용이 복사된다.

    5. default serving 인증서의 public부분으로 configmaps/router-ca를 대체한다.

    6. 사용자 번들이 제공되지 않았으 ㄹ경우 제공하는 RHCOS(RedHatEnterPriseLinuxCoreOS)전용 번들이다.

    7. 사용자 정의 CA인증서 번들로, 사용자 지정 인증서로 구성된 수신 컨트롤러를 신뢰하도록 다른 구성요소에 지시한다.

    8. trustedCA 필드는 사용자가 제공한 CA번들을 참조하는데 사용한다.

    9. Cluster Network Operator는 신뢰할 수 있는 CA번들을 proxy-ca ConfigMap에 주입한다.

    10. OKD 4.3 이하 버전은 router-ca를 대신 사용한다.

사용자 정의 인증서로 교체

출처 : https://access.redhat.com/documentation/en-us/openshift_container_platform/4.1/html/authentication/configuring-certificates

출처 : https://www.agolis.xyz/posts/okd-4.4-custom-ssl-letsencrypt/

대표적으로 무료 사용자 정의 인증서를 생성하는 방법은 두 가지가 있다.

  1. Certbot(Let's encrypt)
  2. acme.sh

1번을 시도하였으나 dns challenge를 증명하기 위해 수동으로 Route53에 TXT 레코드를 넣는 과정에서 계속 오류가 생겨 2번 방법으로 진행하였다.

1) AWS Credential export

계정에 존재하는 Route53에 레코드를 추가하기 위해서 필요하다.

$ export AWS_ACCESS_KEY_ID = <AWS_ACCESS_KEY_ID>
$ export AWS_SECRET_KEY_ID = <AWS_SECRET_KEY_ID>

2) 클러스터 내 로그인 여부 확인

$ oc whoami
system:admin

만약 로그인이 안되어있거나 kubeconfig설정이 되어있지 않다면 아래 과정을 진행한다.

$ export KUBECONFIG=<your working directory>/auth/kubeconfig
$ oc login -u kubeadmin -p <provided>

3) acme.sh github 레포지토리 Clone

$ git clone https://github.com/neilpang/acme.sh

4) LE_API와 LE_WILDCARD 변수 export

$ export LE_API=$(oc whoami --show-server | cut -f 2 -d ':' | cut -f 3 -d '/' | sed 's/-api././')
$ export LE_WILDCARD=$(oc get ingresscontroller default -n openshift-ingress-operator -o jsonpath='{.status.domain}')
$ env | grep LE_
LE_WILDCARD=apps.okd.cmmanaged.ml
LE_API=api.okd.cmmanaged.ml

5) 인증서 요청

$ ~/acme.sh/acme.sh --issue -d ${LE_API} -d \*.${LE_WILDCARD} --dns dns_aws
...
[Fri Jul 16 02:57:57 UTC 2021] Your cert is in  /root/.acme.sh/api.okd.cmmanaged.ml/api.okd.cmmanaged.ml.cer 
[Fri Jul 16 02:57:57 UTC 2021] Your cert key is in  /root/.acme.sh/api.okd.cmmanaged.ml/api.okd.cmmanaged.ml.key 
[Fri Jul 16 02:57:57 UTC 2021] The intermediate CA cert is in  /root/.acme.sh/api.okd.cmmanaged.ml/ca.cer 
[Fri Jul 16 02:57:57 UTC 2021] And the full chain certs is there:  /root/.acme.sh/api.okd.cmmanaged.ml/fullchain.cer

이 과정을 진행하면 DNS를 증명하는데 필요한 TXT 레코드를 도메인에 생성한 후 증명이 완료되었으면 TXT레코드를 다시 삭제한다. 이후 인증이 완료된다.

6) 인증서 설치

$ export CERTDIR=./certificates
$ mkdir -p ${CERTDIR}
$ ./acme.sh/acme.sh --install-cert -d ${LE_API} -d \*.${LE_WILDCARD} --cert-file ${CERTDIR}/cert.pem --key-file ${CERTDIR}/key.pem --fullchain-file ${CERTDIR}/fullchain.pem --ca-file ${CERTDIR}/ca.cer
[Fri Jul 16 02:58:43 UTC 2021] Installing cert to:./certificates/cert.pem
[Fri Jul 16 02:58:43 UTC 2021] Installing CA to:./certificates/ca.cer
[Fri Jul 16 02:58:43 UTC 2021] Installing key to:./certificates/key.pem
[Fri Jul 16 02:58:43 UTC 2021] Installing full chain to:./certificates/fullchain.pem

디렉토리를 생성한 후 해당 디렉토리에 인증서를 설치한다.

7) openshift-ingress 네임스페이스에 인증서를 기반으로 한 secret 생성(위 그림 2번에 해당)

$ oc create secret tls router-certs --cert=${CERTDIR}/fullchain.pem --key=${CERTDIR}/key.pem -n openshift-ingress
secret/router-certs created
  • 설명

    <certificate> is the name of the secret that will contain the certificate and private key.

    </path/to/cert.crt> is the path to the certificate on your local file system.

    </path/to/cert.key> is the path to the private key associated with this certificate.

8)ingress-controller 설정에 새로 생성한 secret 적용(위 그림 0, 2 연결에 해당)

$ oc patch ingresscontroller default -n openshift-ingress-operator --type=merge --patch='{"spec": { "defaultCertificate": { "name": "router-certs" }}}'
ingresscontroller.operator.openshift.io/default patched

9) 새로운 pod(router)가 생성되는 것을 확인

$ oc get po -w -n openshift-ingress
NAME                              READY   STATUS        RESTARTS   AGE
router-default-57bd6bb76-nrdqt    1/1     Terminating   0          2d18h
router-default-57bd6bb76-phdm4    0/1     Terminating   0          2d18h
router-default-6db487d756-jtqx2   1/1     Running       0          24s
router-default-6db487d756-nrrd2   1/1     Running       0          24s

10) route 확인

$ oc get route -n openshift-console
NAME        HOST/PORT                                           PATH   SERVICES    PORT    TERMINATION          WILDCARD
console     console-openshift-console.apps.okd.cmmanaged.ml            console     https   reencrypt/Redirect   None
downloads   downloads-openshift-console.apps.okd.cmmanaged.ml          downloads   http    edge/Redirect        None

다음 사진과 같이 유효한 인증서로 교체된 것을 확인할 수 있다.

8
9

9개의 댓글

comment-user-thumbnail
2021년 7월 26일

이 글에서 다루는 OKD를 설치하는 VM이 마스터(오케스트레이터) 노드 입니까? 워커 노드 입니까? https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.7/html/installing/ipi-install-installation-workflow

1개의 답글
comment-user-thumbnail
2022년 3월 9일

같은 방법으로 4.9이상의 버전도 설치가 잘되나요?
버전 별 이슈에 대해 혹시 경험하신것이 있는지 여쭤봅니다

1개의 답글
comment-user-thumbnail
2024년 7월 12일

유익한 글 감사합니다.
내용 중에 궁금한 점이 있는데, install-config.yaml 파일로 클러스터 생성하면 ec2는 자동으로 생성되는건가요?

1개의 답글
comment-user-thumbnail
2024년 7월 24일

안녕하세요. 좋은 글 감사합니다. 질문이 있는 데요.
install-config.yaml 에서 pullSecret 어디에서 생성하나요?
redhat 에서 생성하나요?

1개의 답글