advertise-address가 내부 네트워크 IP인 내부 네트워크에 구축된 kubernetes 클러스터에 외부 네트워크 장치가 액세스하는 문제에 대해
환경 설명
- 쿠버네티스 버전 1.22
- 테스트 클라이언트 centos7
문제 설명
- 클라우드/인트라넷 네트워크 환경에 구축된 kubernetes 클러스터의 /etc/kubernetes/admin.conf 파일을 외부 네트워크의 kubectl이 장착된 장치에 복사하고 파일 내용을 외부 네트워크 장치의 ~/.kube에 넣습니다. 구성 파일
- 그런 다음 구성 파일에서 서버를 수정합니다. https://${ip}:6443 여기에 있는 ip는 kubernetes 클러스터 마스터 노드의 공용 네트워크 IP입니다.
- 그런 다음 kubectl get pods와 같은 방법을 사용하여 kubernetes 클러스터에 액세스합니다.
- 반환된 결과는 Unable to connect to the server: x509: certificate is valid for ${the internal network IP list of the kubernetes cluster}, not ${the external network IP of the master device of the kubernetes cluster}입니다.
문제 원인
우리 kubernetes의 apiserver-advertise-address는 인트라넷 IP입니다. 기본적으로 kubernetes의 자체 구축 CA는 apiserver에 대한 인증서를 발급합니다. 기본 액세스 가능한 인증서는 인트라넷 IP, kubernetes, kubernetes.default kubernetes.default 입니다. svc 및 kubernetes.default.svc.cluster.local에는 마스터 노드의 퍼블릭 IP가 포함되지 않습니다. 따라서 admin.conf를 통해 직접 kubernetes에 액세스하는 것은 불가능합니다.
마스터 노드에서 다음 명령을 실행하면 apiserver 인증서를 파싱하여 서버에 접근할 수 있는 주소 정보를 얻을 수 있습니다.
openssl x509 -noout -text -in /etc/kubernetes/pki/apiserver.crt |grep IP
해결책
현재 kubernetes 클러스터에서 apiserver의 인증서와 키를 삭제합니다.
rm /etc/kubernetes/pki/apiserver.*
새 apiserver 인증서 및 키 생성
실러를 통해 설치했기 때문에 컨트롤 플레인 노드 구성 파일에 구성된 서버 주소를 두 번째 IP 주소 문자열인 apiserver.cluster.local에 추가해야 합니다.
kubeadm init phase certs apiserver \
--apiserver-advertise-address ${原来的advertise ip} \
--apiserver-cert-extra-sans ${master的外网ip}
admin.conf 새로 고침
kubeadm alpha certs renew admin.conf
apiserver 다시 적용
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
이때 인증서 내용을 얻기 위한 openssl 분석을 통해 확장하려는 주소가 추가되었음을 알 수 있습니다.
프로그램을 apiserver에 원격으로 직접 연결하는 방법
또한 문제 설명의 2단계에 있는 kubeconfig 파일에서 가져온 go-client를 사용하여 rest.Config를 빌드하고 멤버 변수 Insecure of rest.Config를 true로 수정하여 인증서 확인을 건너뛸 수 있습니다.
config.Insecure = true
계속 실행하면 ca 파일이 insecure 플래그 매개변수를 지원하지 않는다는 피드백이 있습니다. 이를 위해 구성 파일에서 ca 데이터를 삭제하고 계속 시도하면 정상적으로 액세스할 수 있습니다. kubectl의 소스 코드에.