문제사항
내부에 기구축된 k8s 클러스터가 존재하여 외부에서 `kubectl`을 통한 클러스터 접근이 필요한 상황에서, 공유기의 포트포워딩 설정 후 공인아이피로 kubeconfig 파일수정 후 접근 시 아래 오류 발생
Unable to connect to the server: tls: failed to verify certificate: x509: certificate is valid for 10.96.0.1, 192.168.219.200, not {public-ip}
임시 해결 방법
`kubectl [command] --insecure-skip-tls-verify`시 인증서 검증 없이 명령을 처리하기 때문에 조회가 가능함
kubectl get pod --insecure-skip-tls-verify
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 12 (13m ago) 53d
문제 원인
임시 해결 방법에서 유추 가능하듯이 k8s 클러스터에 생성된 사설 인증기관에 공인ip에 대한 내용이 제외되어 있기 때문에 인증서 검증 오류가 발생함
root@controller:/etc/kubernetes/pki# openssl x509 -in apiserver.crt -text -noout
Certificate:
--생략--
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:controller.junkmm.lab, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:192.168.219.200
`kubeadm init`으로 클러스터 생성 시 내부 IP 정보로 SAN이 등록되어 apiserver.crt의 `X509v3 Subject Alternative Name.DNS` 필드 확인 시 공인 ip에 대한 정보가 없음
결론 : 공인 ip로 k8s apiserver 까지의 통신상 문제는 없으나 인증서 SANS가 등록되지 않아 검증 오류 발생
문제 해결
먼저 기존 apiserver 인증서를 백업한다.
# kubernetes 인증서 폴더 이동
cd /etc/kubernetes/pki
# bak 폴더를 만들고 apiserver.crt 및 .key를 bak 폴더로 옮김
mkdir bak && mv apiserver.* ./bak
아래 명령어를 통해 apiserver에 sans를 추가해준다. `8.8.8.8`은 예시 ip이고 본인의 ip나 dns를 입력해도 된다.
kubeadm init phase certs apiserver --apiserver-cert-extra-sans "8.8.8.8"
명령어가 정상 수행되었다면 `/etc/kubernetes/pki`폴더에 새로운 apiserver.crt와 key파일이 생겼을 것이다. 다시 openssl 명령을 통해 SANS 정보를 확인해보자.
openssl x509 -in apiserver.crt -text -noout
Certificate:
--생략--
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:controller.junkmm.lab, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:192.168.219.200, IP Address:{public-ip}
오류 발생 전과 비교해보면 `X509v3 Subject Alternative Name.DNS`필드에 새로 추가한 공인 ip를 확인할 수 있다.
기존의 api-server를 삭제하고 재기동 해야 한다. 본인 클러스터에 배포된 api-server의 이름에 맞춰 pod를 삭제하자.
kubectl delete pod -n kube-system kube-apiserver-controller.junkmm.lab
잘 작동하는지 확인하기 위해 ~/.kube/config 파일에 클러스터 ip주소를 공인ip로 변경한 상태로 `kubectl` 명령을 실행해보자.
참고
kubeadm init phase
kubeadm init phase enables you to invoke atomic steps of the bootstrap process. Hence, you can let kubeadm do some of the work and you can fill in the gaps if you wish to apply customization. kubeadm init phase is consistent with the kubeadm init workflow,
kubernetes.io
'ETC' 카테고리의 다른 글
HP SSA(Smart Storage Administrator) RAID 구성하기 (0) | 2023.07.04 |
---|