Skip to content

Instantly share code, notes, and snippets.

@ruo91
Last active January 25, 2023 06:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ruo91/7b7ac3d510c4574c2281f94337d5b6b4 to your computer and use it in GitHub Desktop.
Save ruo91/7b7ac3d510c4574c2281f94337d5b6b4 to your computer and use it in GitHub Desktop.
OpenShift v3.11 - Cluster & Component 인증서 재갱신 방법

OpenShift v3.11 - Cluster & Component 인증서 재갱신 방법

OpenShift v3.11 버전에서 클러스터 및 각종 컴포넌트 인증서에 대한 재갱신 방법에 대해서 설명한다.
본 글에서 설명하는 OpenShift v3.11 버전은 레드햇(RedHat)에서 EoL(End of Life) 및 EoS(End of Service)된
제품이기 때문에 사용자가 일부 설정 파일의 내용을 추가 또는 변경하는 부분이 있으므로,
이에 대한 모든 책임은 본인한테 있음을 이해하며, RedHat에서 권장하지 않는 방법이고, 지원 범위도 아님을 알린다.

또한, OpenShift v3.11를 설치시 기본 인증서 10년(3650) 기반으로 설치되었고, 재갱신이 필요한 상황에서
100년(36500)으로 변경하는 내용을 가정하였고 실제 고객사 작업 계획서 내용과 동일하게 작성되었다.

어차피 지원도 안되고 안쓰는 버전이라 정리하기 귀찮고 해서 그냥 오픈 한다.

1. 개요

  • 기존 OpenShift v3.11 버전의 인증서 만료로 인한 인증서 업데이트 필요에 따른 작업.
  • 신규 인증서를 생성하여 클러스터 및 각 컴포넌트 재생성 작업.

2. 작업 대상

시스템 구분 작업 시간 영향도
Master 1 시간 삭제 후 재배포가 되므로 작업 시간 동안 미작동
ETCD 1 시간 삭제 후 재배포가 되므로 작업 시간 동안 미작동
Node 1 시간 삭제 후 재배포가 되므로 작업 시간 동안 미작동
Router 20 분 삭제 후 재배포가 되므로 작업 시간 동안 미작동
Cluster Logging (EFK Stack) 20 분 삭제 후 재배포가 되므로 작업 시간 동안 미작동
Hawkular Metrics 20 분 삭제 후 재배포가 되므로 작업 시간 동안 미작동
Metrics Server 20 분 삭제 후 재배포가 되므로 작업 시간 동안 미작동
Prometheus 20 분 삭제 후 재배포가 되므로 작업 시간 동안 미작동

3. 작업 세부 내용

3.1. Ansible Inventory 백업

작업 전 히스토리 관리를 위해 반드시 기존 Inventory 파일을 백업 한다.

[root@bastion ~]# cp /etc/ansible/hosts /etc/ansible/hosts-$(date "+%Y-%m-%d").bak

3.2. Ansible Inventory 변수 추가

OpenShift 관련 인증서의 기간을 100년(36500day)로 변경한다.
또한, 인증서 재갱신을 위한 Ansible Inventory에 변수를 추가한다.

[root@bastion ~]# vi /etc/ansible/hosts
[OSEv3:vars]
...
#### Certification Setting ####
etcd_ca_default_days=36500
openshift_ca_cert_expire_days=36500
openshift_node_cert_expire_days=36500
openshift_master_cert_expire_days=36500
openshift_hosted_registry_cert_expire_days=36500

## Redeploy Certificates ##
# Master CA 재갱신 (bool)
openshift_redeploy_openshift_ca=true

# Node Drain 사용 여부 (bool)
openshift_node_restart_drain=true

# Docker 데몬 재시작 (bool)
# 재갱신 된 인증서를 반영하기 위한 docker 데몬 재시작
openshift_node_restart_docker_required=true

# Router 및 Registry 인증서 재갱신 (bool)
# 수동으로 인증서 반영하기 위해 사용하지 않음.
openshift_hosted_manage_router=false
openshift_hosted_manage_registry=false

# Web Console 인증서 재갱신 (bool)
openshift_web_console_install=true
openshift_console_install=true

# Metrics Server 인증서
# 수동으로 인증서 반영하기 위해 사용하지 않음.
openshift_metrics_server_install=false

# Logging 인증서 재갱신 (bool)
# 수동으로 인증서 반영하기 위해 사용하지 않음.
openshift_logging_install_logging=false

# Monitoring 인증서 재갱신 (bool)
# 수동으로 인증서 반영하기 위해 사용하지 않음.
openshift_cluster_monitoring_operator_install=false

# Service Catalog 인증서 재갱신 (bool)
# Service Catalog 사용하지 않으므로 재갱신 불필요
openshift_enable_service_catalog=false

[1]: OpenShift Docs - Redeploying Certificates

3.3. Master 인증서 재구성

Ansible의 "playbooks/openshift-master/redeploy-openshift-ca.yml"을 통해 Master CA, Server, Client를 재갱신 한다.
재갱신시 반드시 "3.2. Ansible Inventory 변수 추가" 항목에서 추가한 변수인 openshift_redeploy_openshift_ca=true가
반드시 추가되어 있어야 한다. 재갱신시 롤링 업데이트(Rolling Update) 방식으로 Kubelet, Docker 데몬이 재시작 된다.

본 작업은 클러스터 전체에 영향이 있는 작업이므로, 반드시 서비스 영향도가 없는 상황에서 진행 되어야 한다.

3.3.1. Master CA 인증서 재구성
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/openshift-master/redeploy-openshift-ca.yml
3.3.2. Master Server, Client 인증서 재구성
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/openshift-master/redeploy-certificates.yml

[2]: OpenShift Docs - Redeploying a New or Custom OpenShift Container Platform CA

3.4. ETCD 인증서 재구성

OpenShift Object 저장소로 사용되는 ETCD에 대한 CA, Server, Client, Peer 인증서 재갱신을 진행한다.
본 작업은 클러스터 전체에 영향이 있는 작업이므로, 반드시 서비스 영향도가 없는 상황에서 진행 되어야 한다.

[root@bastion ~]# sed -i 's/openssl ca -name {{ etcd_ca_name }} -config {{ etcd_openssl_conf }}/openssl ca -name {{ etcd_ca_name }} -config {{ etcd_openssl_conf }} -days 36500/g' \
/usr/share/ansible/openshift-ansible/roles/etcd/tasks/certificates/fetch_client_certificates_from_ca.yml

[root@bastion ~]# sed -i 's/openssl req -new -keyout {{ etcd_cert_prefix }}client.key/openssl req -new -keyout {{ etcd_cert_prefix }}client.key -days 36500/g' \
/usr/share/ansible/openshift-ansible/roles/etcd/tasks/certificates/fetch_client_certificates_from_ca.yml

[root@bastion ~]# sed -i 's/openssl ca -name {{ etcd_ca_name }} -config {{ etcd_openssl_conf }}/openssl ca -name {{ etcd_ca_name }} -config {{ etcd_openssl_conf }} -days 36500/g' \
/usr/share/ansible/openshift-ansible/roles/etcd/tasks/certificates/fetch_server_certificates_from_ca.yml

[root@bastion ~]# sed -i 's/openssl req -new -keyout {{ etcd_cert_prefix }}server.key/openssl req -new -keyout {{ etcd_cert_prefix }}server.key -days 36500/g' \
/usr/share/ansible/openshift-ansible/roles/etcd/tasks/certificates/fetch_server_certificates_from_ca.yml

[root@bastion ~]# sed -i 's/openssl req -new -keyout {{ etcd_cert_prefix }}peer.key/openssl req -new -keyout {{ etcd_cert_prefix }}peer.key -days 36500/g' \
/usr/share/ansible/openshift-ansible/roles/etcd/tasks/certificates/fetch_server_certificates_from_ca.yml

ETCD CA 인증서를 재갱신 한다.
Master 노드 중 admin.kubeconfig 파일이 재갱신 되었으므로 Bastion 노드에 다시 복사한다.

[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/openshift-etcd/redeploy-ca.yml
[root@bastion ~]# scp root@master01:/etc/origin/master/admin.kubeconfig $HOME/.kube/config

[3]: OpenShift Docs - Redeploying a New etcd CA

ETCD Server, Client, Peer 인증서를 재갱신 한다.

[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/openshift-etcd/redeploy-certificates.yml

3.5. Node 인증서 재구성

Master CA 재배포시 클러스터 Node에 대한 인증서를 신규 CA 인증서 기반으로 반영하기 위해 인증서 재구성 한다.
Node 인증서는 1년의 기간만 지정이 되고, 만료가 되기 전 사용자가 수동 승인 해줘야 한다.

단, Ansible Inventory에 openshift_master_bootstrap_auto_approve=true 변수가 있는 경우,
openshift-infra 네임스페이스에 존재하는 bootstrap-autoapprover Pod가 노드의 CSR을 자동 승인 해준다.

[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts /usr/share/ansible/openshift-ansible/playbooks/redeploy-certificates.yml

[4]: OpenShift Docs - Redeploying Node Certificates
[5]: OpenShift Docs - Configuring Automatic Approval of Certificate Signing Requests

3.6. Router 인증서 재구성

Ansible을 통해 생성하지 않고, oc 명령어로 YAML 파일을 생성하여 100년(36500) 인증서를 만든다.

3.6.1. Master CA 인증서 복사
[root@bastion ~]# mkdir certs
[root@bastion ~]# scp root@master01:/etc/origin/master/ca.{crt,key,serial.txt} certs/
3.6.2. 인증서 생성 스크립트 작성

Master CA 인증서를 기반으로 Router 인증서를 PEM 형식으로 인증서를 만든다.

[root@bastion ~]# vi create-cert.sh
#!/bin/bash
EXPIRE_DAYS=36500
CA_DIR=certs/
DOMAIN='*.apps.ocp3.local'

oc adm ca create-server-cert \
--signer-cert=$CA_DIR/ca.crt \
--signer-key=$CA_DIR/ca.key \
--signer-serial=$CA_DIR/ca.serial.txt \
--cert=$CA_DIR/router.crt \
--key=$CA_DIR/router.key \
--expire-days=$EXPIRE_DAYS \
--hostnames=$DOMAIN

cat $CA_DIR/router.crt $CA_DIR/router.key $CA_DIR/ca.crt > $CA_DIR/router.pem
3.6.3. 인증서 생성
[root@bastion ~]# chmod a+x create-cert.sh
[root@bastion ~]# ./create-cert.sh
3.6.4. Router YAML 생성

스크립트 내용은 사용자 환경에 맞게 수정한다.

[root@bastion ~]# vi create-router.sh
#!/bin/bash
export PATH=$PATH
CA_DIR=certs/

oc adm policy add-scc-to-user hostnetwork -z router
oc adm router \
--replicas=2 \
--stats-user='admin' \
--stats-password='rplinux' \
--stats-port='1936' \
--service-account='router' \
--ports='80:80,443:443' \
--default-cert=$CA_DIR/router.pem \
--selector='node-role.kubernetes.io/router=true' \
--images='registry.ocp3.local:5000/openshift3/ose-${component}:${version}' \
-o yaml > router.yaml
[root@bastion ~]# chmod a+x create-router.sh
[root@bastion ~]# ./create-router.sh
3.6.5. Router Pod 재생성

기존 Router Pod를 삭제 후 재생성 한다.

[root@bastion ~]# oc delete -f router.yaml -n default
[root@bastion ~]# oc create -f router.yaml -n default

3.7. Cluster Logging (EFK Stack) 재구성

Cluster Logging(EFK Stack)의 인증서를 Custom 하여 100년으로 설정하기 위한 방법이다.

3.7.1. 인증서 만료 일자 변경

본 명령어는 최초 한번만 진행하며, 기본 1.95~2년(712 or 730day)에서 100년(36500day)으로 변경한다.

[root@bastion ~]# sed -i 's/712/36500/g' /usr/share/ansible/openshift-ansible/roles/openshift_logging/files/generate-jks.sh 
[root@bastion ~]# sed -i 's/730/36500/g' /usr/share/ansible/openshift-ansible/roles/openshift_logging/templates/signing.conf.j2
[root@bastion ~]# sed -i 's/712/36500/g' /usr/share/ansible/openshift-ansible/roles/openshift_logging/tasks/generate_pems.yaml

[root@bastion ~]# sed -i 's/openssl ca/openssl ca -days 36500/g' \
/usr/share/ansible/openshift-ansible/roles/openshift_logging/tasks/generate_pems.yaml

[root@bastion ~]# sed -i 's/ca create-signer-cert/ca create-signer-cert --expire-days=36500/g' \
/usr/share/ansible/openshift-ansible/roles/openshift_logging/tasks/generate_certs.yaml

[root@bastion ~]# sed -i 's/ca create-server-cert/ca create-server-cert --expire-days=36500/g' \
/usr/share/ansible/openshift-ansible/roles/openshift_logging/tasks/procure_server_certs.yaml
3.7.2. PV(Persistent Volumes) 백업

기존에 사용하고 있는 PV를 백업 받는다.

[root@bastion ~]# oc get pv logging-pv -o yaml > logging-pv.yaml
3.7.3. 삭제
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml -e openshift_logging_install_logging=false
3.7.4. 기존 인증서 삭제

Master01 노드에 접근하여 /etc/origin/logging/ 디렉토리를 삭제한다.

[root@bastion ~]# ssh master01
[root@bastion ~]# cd /etc/origin
[root@bastion ~]# rm -r logging
3.7.5. 재구성
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml -e openshift_logging_install_logging=true

[6]: RedHat Knowledge-Centered Support - How to renew and redeploy internal logging certificates in OpenShift 3
[7]: OpenShift Docs - Redeploying EFK Certificates

3.8. Hawkular Metrics 재구성

Hawkular Metrics의 인증서를 Custom 하여 100년으로 설정하기 위한 방법이다.

3.8.1. 인증서 만료 일자 변경

본 명령어는 최초 한번만 진행하며, 기본 2년(730day)에서 100년(36500day)으로 변경한다.

[root@bastion ~]# sed -i 's/adm ca create-server-cert/adm ca create-server-cert --expire-days\=36500/g' \
/usr/share/ansible/openshift-ansible/roles/openshift_metrics/tasks/setup_certificate.yaml
3.8.2. PV(Persistent Volumes) 백업
[root@bastion ~]# oc get pv hawkular-metrics-pv -o yaml > hawkular-metrics-pv.yaml
3.8.3. 삭제
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml -e openshift_metrics_install_metrics=False
3.8.4. 재구성
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml -e openshift_metrics_install_metrics=true

[8]: RedHat Knowledge-Centered Support - Metrics is not available on the Hawkular dashboard & OCP web-console

3.9. Metric Server 재구성

Metrics Server의 인증서를 Custom 하여 100년으로 설정하기 위한 방법이다.

3.9.1. 인증서 만료 일자 변경
[root@bastion ~]# sed -i 's/adm ca create-signer-cert/adm ca create-signer-cert --expire-days=36500/g' \
/usr/share/ansible/openshift-ansible/roles/metrics_server/tasks/generate_certs_and_apiservice.yaml
[root@bastion ~]# sed -i 's/adm ca create-server-cert/adm ca create-server-cert --expire-days=36500/g' \
/usr/share/ansible/openshift-ansible/roles/metrics_server/tasks/generate_certs_and_apiservice.yaml
3.9.2. 기존 Secret 인증서 삭제
[root@bastion ~]# oc delete secret metrics-server-certs -n openshift-metrics-server
3.9.3. Metrics Server 재구성
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/metrics-server/config.yml -e openshift_metrics_server_install=true

3.10. Prometheus 재구성

Prometheus의 경우 Operator Pod 배포 형태로 지원이 되어 인증서 만료일자 변경은 지원되지 않으며,
만료가 되기 전에 아래와 같은 방법으로 수동 재갱신을 해야한다. (기본 만료시간 2년)

3.10.1. secret 인증서 삭제
[root@bastion ~]# oc delete secret -n openshift-monitoring alertmanager-main-tls grafana-tls kube-state-metrics-tls node-exporter-tls prometheus-k8s-tls
3.10.2. Pod 재기동
[root@bastion ~]# oc project openshift-monitoring
[root@bastion ~]# oc delete pod --all -n openshift-monitoring

[9]: RedHat Knowledge-Centered Support - x509: certificate signed by unknown authority error in Red Hat OpenShift Monitoring components, after redeploying new certificates

4. 인증서 확인

클러스터 및 컴포넌트들에 대한 인증서 만료일자를 확인한다.

4.1. Router 인증서 확인

[root@bastion ~]# oc get secrets router-certs -n default \
-o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text | grep -A2 Validity

4.2. Logging (EFK Stack) 인증서 확인

[root@bastion ~]# oc get secrets logging-elasticsearch -n openshift-logging \
-o jsonpath='{.data.admin-cert}' | base64 -d | openssl x509 -text | grep -A2 Validity

4.3. Hawkular Metrics 인증서 확인

[root@bastion ~]# oc get secrets hawkular-metrics-certs -n openshift-infra \
-o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text | grep -A2 Validity

4.4. Metrics Server 인증서 확인

[root@bastion ~]# oc get secret metrics-server-certs -n openshift-metrics-server \
-o jsonpath={.data."tls\.crt"} | base64 -d | openssl x509 -text | grep -A2 Validity

4.5. Prometheus 인증서 확인

[root@bastion ~]# oc get secret prometheus-k8s-tls -n openshift-monitoring \
-o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text | grep -A2 Validity

4.6. 클러스터 인증서 Summary HTML 생성

OpenShift 클러스터에서 사용하는 인증서 부분을 Summary 형태로 확인 할 수 있도록 생성한다.

4.6.1. Report HTML 생성
[root@bastion ~]# ansible-playbook -i /etc/ansible/hosts \
/usr/share/ansible/openshift-ansible/playbooks/openshift-checks/certificate_expiry/easy-mode.yaml

[10]: OpenShift Docs - Running Certificate Expiration Playbooks

생성 후 사용자 $HOME 디렉토리에 HTML, JSON 두 가지 파일이 생성되며, HTML 파일만 확인 한다.

4.6.2. Report 파일 확인
[root@bastion ~]# ls -al $HOME | grep cert-expiry-report
-rw-r--r--.  1 root root      79590 Jan  1 11:50 cert-expiry-report.20190101T115032.html
-rw-r--r--.  1 root root      37549 Jan  1 11:50 cert-expiry-report.20190101T115032.json

4.7. 클러스터 인증서 Summary HTML 내용 확인

4.7.1. Master 노드

OpenShift v3.11 - Cert Expiry Report: Master

4.7.2. Worker 노드

OpenShift v3.11 - Cert Expiry Report: Worker

[11]: OpenShift v3.11 - Cert Expiry Report (HTML)

4.8. 사용되지 않는 인증서 변경 사항

아래는 인증서는 OpenShift에서 더 이상 사용되지 않는 인증서 목록이며, 무시해도 된다.

[root@bastion ~]# ls -al /etc/origin/master/ | egrep "frontprox|openshift-aggregator"
-rw-r--r--. 1 root root   1078 Oct 30 03:25 frontproxy-ca.crt
-rw-r--r--. 1 root root   1099 Oct 30 03:25 openshift-aggregator.crt

[12]: RedHat Knowledge-Centered Support - Outdated certificate files not in use in OpenShift 3.11 runtime

끝.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment