kubeconfig 파일은 x509 인증서 인증 문제를 해결하기 위해 kubectl을 실행합니다.

advertise-address가 내부 네트워크 IP인 내부 네트워크에 구축된 kubernetes 클러스터에 외부 네트워크 장치가 액세스하는 문제에 대해

환경 설명

문제 설명

문제 원인

해결책


환경 설명

  • 쿠버네티스 버전 1.22
  • 테스트 클라이언트 centos7


문제 설명

  1. 클라우드/인트라넷 네트워크 환경에 구축된 kubernetes 클러스터의 /etc/kubernetes/admin.conf 파일을 외부 네트워크의 kubectl이 장착된 장치에 복사하고 파일 내용을 외부 네트워크 장치의 ~/.kube에 넣습니다. 구성 파일
  2. 그런 다음 구성 파일에서 서버를 수정합니다. https://${ip}:6443 여기에 있는 ip는 kubernetes 클러스터 마스터 노드의 공용 네트워크 IP입니다.
  3. 그런 다음 kubectl get pods와 같은 방법을 사용하여 kubernetes 클러스터에 액세스합니다.
  4. 반환된 결과는 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의 소스 코드에.

추천

출처blog.csdn.net/kingu_crimson/article/details/127806193