Openshift에서 동작하는 웹 서비스들에 대해 TLS인증서를 적용해야하는 일이 생겼다.
지금까지는 개인적인 용도로의 인증서는 Openssl
을 사용했고 공식적인 용도로는 관련 부서에 요청하면 되었기에 인증서에 대해서 신경쓸 것이 없어서 흥미로운 작업이었다.
이를 위해서 잘 정리된 블로그는 아래에 있다.
Openshift Ingress Certificate 구성
위 블로그를 따라하면 Openshift를 설치하면 기본으로 따라오는 Openshift console에 secure하게 접근할 수 있다.
그런데 나는 Openshift 위에 설치된 Cloud Pak for Data(cp4d)라는 앱에 접근하고자 하는데 console과 다르게 해당 앱에는 인증서가 적용되지 않는 모양이었다.
이를 위해 console
서비스와 cp4d
서비스의 route를 각각 비교해보니 아래 차이점이 있었다.
console 서비스의 TLS termination
cp4d 서비스의 TLS termination
console에 도착한 TLS 트래픽은 Ingress Operator를 통해 새로 암호화되고, cp4d에 도착한 TLS 트래픽은 복호화되지 않고 그대로 다음 서비스로 전달되는 것을 알 수 있다.
TLS termination에 대해선 다음 포스트에 정리되어있다. Openshift의 네트워킹
cp4d 라우트의 TLS termination이 passthrough
이니 이 라우트가 연결하는 서비스, 그 서비스로 접근할 수 있는 pod를 봐야한다. 확인해보니 cp4d에 포함된 nginx 인스턴스였다.
이제 옵션은 두가지이다.
오퍼레이터를 설치한 후 해당 오퍼레이터의 작동 방식을 변경하는 건 지양해야하므로 두번째 옵션을 선택하고 문서를 찾았다.
처음 찾은 문서는 v1.0 버전으로 nginx의 PV에 키 파일을 두고 nginx 서비스를 재시작하는 방법을 안내한다. 최신 문서가 없는 줄 알고 이렇게 적용했었는데, 빠르고 쉽지만 PV의 reclaim policy
가 Delete
이므로 좋은 방법은 아니다.
4.5 이상에선 cpd-cli
를 사용하는 것을 가이드한다. 다만, 문서대로 따라하면 안되는 것들이 몇개 있다.
cpd-cli
는 명령어 수행을 위해서 ansible 컨테이너를 만든다. 이 컨테이너는cpd-cli-workspace
을 볼륨으로 사용하기 때문에 필요한 파일들이 있다면 반드시cpd-cli-workspace/olm-utils-workspace/work
디렉토리에 위치해야 한다. 또한 수행하는 유저가cpd-cli-workspace
에 대해write
권한을 가져야 한다.
$ export PROJECT_CPD_INSTANCE=cp4d \
CPD_SECRET_NAME=cpd-tls-secret \
CPD_CLI_WORKSPACE=/opt/cpd-cli-workspace/olm-utils-workspace/work
$ oc login --token=sha256... --server=https://api.{clusterName].{baseDomain}:6443
문서를 따라하면 cpd-cli manage login-to-ocp
에서 --kubeconfig
옵션에 상관없이 kubeconfig 파일을 못찾는 에러가 발생한다. 컨테이너의 ansible
유저가 kubeconfig를 읽을 수 없기 때문이므로 아래 경로에 컨피그 파일을 넣어주고 권한을 주어야 한다.
$ cp ~/.kube/config ${CPD_CLI_WORKSPACE}/.olm-utils/.kubeconfig
$ chmod o+r ${CPD_CLI_WORKSPACE}/.olm-utils/.kubeconfig
$ cpd-cli manage login-to-ocp --server=https://api.{clusterName].{baseDomain}:6443
$ oc create secret generic ${CPD_SECRET_NAME} -n ${PROJECT_CPD_INSTANCE} --from-file=tls.crt=./fullchain.pem --from-file=tls.key=./privkey.pem
아래 명령을 통해 라우트를 삭제 후 재생성한다. 라우트 이름, hostname, TLS termination 등이 디폴트로 설정되므로 변경이 필요하면 문서를 참고하여 필요한 옵션을 지정할 수 있다.
$ cpd-cli manage setup-route \
--cpd_instance_ns=${PROJECT_CPD_INSTANCE} \
--cert_secret=${CPD_SECRET_NAME}
이제 cp4d 프론트엔드 페이지로 secure하게 접근할 수 있다.