OKD 설치에 필요한 VM을 생성하는 방법은 크게 두 가지가 존재한다
1) openshift에서 제공하는 IaC를 통한 설치
2) 직접 설치
📚참고 문헌
설치를 위한 VM을 따로 AWS에 생성한다.
t2.micro, Linux로 EC2를 생성한다.
보안 그룹은 Inboundrule : 22 / OutboundRule : All Traffic 으로 설정한다.
인스톨러 설치 : openshift-install-linux-4.7.0-0.okd-2021-06-19-191547.tar.gz
인스톨러 집 해제 : $ tar xvf openshift-install-linux.tar.gz
Pull Secret이란?
OKD 리소스들을 생성할 때 [Quay.io](http://quay.io)
나 [registry.redhat.io](http://registry.redhat.io)
등 에서 필요한 컨테이너 이미지를 가져오기 위해서는 인증정보가 있어야한다. 이 인증정보를 Pull Secret이라 한다.
[설명정보]
install-config.yaml
파일 생성
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":{"
OKD에서 제공하는 Kubernetes API과 통신하고 OKD콘솔에 접근하기 위해서는 유효한 도메인과 인증서가 필요하다. install-config.yaml
파일의 baseDomain부분에 해당한다.
도메인은 freenom이라는 사이트에서 무료로 구매할 수 있다.
cmmanaged.ml
구매cmmanaged.ml이름으로 퍼블릭 호스트 존 추가를 하면 레코드가 생성이된다.
레코드 중 NS유형에 해당하는 레코드를 복사해서 freenom
사이트에서 구매한 도메인 설정에 붙여넣는다.
설정에 맞게 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_keys
의 core
사용자 목록에 추가된다.
$ssh-keygen -t ed25519 -N '' -f <path>/<file_name>
install-config.yaml
에 추가수정한 install-config.yaml과 다운 받은 openshift-install 스크립트로 클러스터를 생성한다.
$ ./openshift-install create cluster --dir=<installation_directory> \
--log-level=info
<installation_directory>는 install-config.yaml
이 존재하는 폴더를 지정해야한다. 클러스터를 생성하고 나면 install-config.yaml
파일이 사라지기 때문에 다른 경로에 미리 백업해두도록 한다.
Security Group
OC CLI 다운로드 및 설정
tar xvzf <file>
echo $PATH
후 폴더 내의 oc
파일 PATH하위로 이동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
클러스터를 설치한 VM VPC와 클러스터 VPC가 다르기 때문에 클러스터 VPC의 public subnet에 VM을 하나 생성한 후 해당 VM을 통해서 접속한다.
ssh -i <key name> core@<node private ip>
웹 콘솔로 접속하기 위해서는 HTTPS접속을 하기 위한 인증서가 필요하다.
Route53에 들어가면 기존에 생성되었던 퍼블릭 호스팅존 이외에 프라이빗 호스팅 존이 생성되었음을 볼 수 있다.
프라이빗 호스팅 존 명명법 : .
호스팅 존에서 보면 OKD콘솔에 해당하는 url이 elb와 매핑되어있음을 볼 수 있다.
OKD를 설치하게 되면 Ingress-Operator는 기본적으로 자체 서명된 인증서를 사용해서 default 인증서에 서명하게된다. 자체 제공한 인증서는 신뢰할 수 없는 인증기관에서 발급했다 인식하기 때문에 사용자가 인증서를 제공해야한다.
Ingress-Operator가 사용하는 인증서
1. Prometheus의 metric을 통한 액세스 보호
2. route에 대한 액세스 보호
[기본 인증서 워크플로우]
기본 인증서 워크플로우
Ingress Operator가 자체서명한 CA를 사용하여 지정된 도메인에 대해 인증서를 제공하도록 한다.
Ingress Operator에 의해 default CA인증서와 키가 생성된다.
Ingress Operator가 생성한 default CA인증서로 서명한 와일드카드 default serving 인증서이다. (cf. 사용자정의 인증서에서는 사용자가 제공한 인증서를 의미한다.)
router deployment로 2번(router-certs-default) 내의 인증서를 사용한다.
OAuth(플랫폼 환경에 권한을 부여하는 프로토콜)통합을 위해 와일드카드 default serving 인증서의 내용이 복사된다.
OAuth와 웹 콘솔의 신뢰관계를 설정하기 위해 필요한 전환 리소스. 운영자가 생성한 default CA인증서가 포함되어 있다. 향후 이 구성은 release에서 삭제된다.
default serving 인증서의 public부분으로 configmaps/router-ca를 대체한다.
OKD 4.3 이하 버전은 router-ca를 대신 사용한다.
[사용자 정의 인증서 워크플로우]
사용자 정의 인증서 워크플로우
Ingress Operator가 자체서명한 CA를 사용하여 지정된 도메인에 대해 인증서를 제공하도록 한다.
사용자가 제공한 인증서로 서명한 와일드카드 default serving 인증서이다.
router deployment로 2번(router-certs-default) 내의 인증서를 사용한다.
OAuth(플랫폼 환경에 권한을 부여하는 프로토콜)통합을 위해 와일드카드 default serving 인증서의 내용이 복사된다.
default serving 인증서의 public부분으로 configmaps/router-ca를 대체한다.
사용자 번들이 제공되지 않았으 ㄹ경우 제공하는 RHCOS(RedHatEnterPriseLinuxCoreOS)전용 번들이다.
사용자 정의 CA인증서 번들로, 사용자 지정 인증서로 구성된 수신 컨트롤러를 신뢰하도록 다른 구성요소에 지시한다.
trustedCA 필드는 사용자가 제공한 CA번들을 참조하는데 사용한다.
Cluster Network Operator는 신뢰할 수 있는 CA번들을 proxy-ca ConfigMap에 주입한다.
OKD 4.3 이하 버전은 router-ca를 대신 사용한다.
출처 : https://www.agolis.xyz/posts/okd-4.4-custom-ssl-letsencrypt/
대표적으로 무료 사용자 정의 인증서를 생성하는 방법은 두 가지가 있다.
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
다음 사진과 같이 유효한 인증서로 교체된 것을 확인할 수 있다.
이 글에서 다루는 OKD를 설치하는 VM이 마스터(오케스트레이터) 노드 입니까? 워커 노드 입니까? https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.7/html/installing/ipi-install-installation-workflow