메인 콘텐츠로 이동하기
  1. Posts/

[K3s-02] Kubectl을 사용하여 외부에서 K3s API server에 접근하는 방법

·220 자
목차

문제: Remote kubectl x509: certificate is valid for 127.0.0.1
kubectl은 쿠버네티스 클러스터 API 서버에 접근하기 위해 가장 잘 알려진 명령줄 도구입니다. 이는 쿠버네티스 노드 내부에서 실행하는 것뿐만 아니라 개발자와 운영자가 클러스터 외부에서 kubectl을 사용할 수 있어야 합니다. 그러나 /etc/rancher/k3s/k3s.yaml에서 kubeconfig 파일을 단순히 복사하는 것만으로는 충분하지 않습니다. 이는 위의 오류를 발생시킬 것입니다.

kubectl은 쿠버네티스 API 서버에 접근하기 위한 클라이언트 도구입니다. 이는 TLS 인증서를 사용하여 API 서버에 자신을 인증합니다. 인증서는 API 서버 자체에 의해 발급됩니다. 인증서는 서명된 IP 주소에 대해서만 유효합니다. 기본적으로 kubeconfig 인증서는 호스트 IP 주소 127.0.0.1으로 서명됩니다. 따라서 kubectl 명령은 쿠버네티스 노드 내부에서만 유효합니다. 이를 가능하게 하기 위해, 쿠버네티스 제어 플레인의 IP 주소로 새 인증서를 발급해야 합니다(kubeconfig 파일에서 IP 주소를 편집하는 것만으로는 충분하지 않습니다).

예를 들어, k3s 제어 플레인 IP 주소가 13.209.245.101입니다.
/etc/systemd/system/k3s.service를 편집합니다.

# /etc/systemd/system/k3s.service

ExecStart=/usr/local/bin/k3s \
    server \
       '–advertise-address=13.209.245.101' \
       '-tls-san=13.209.245.101' \  ## 중요
# 그런 다음, k3s 서비스를 재시작합니다
sudo k3s kubectl -n kube-system delete secrets/k3s-serving
sudo mv /var/lib/rancher/k3s/server/tls/dynamic-cert.json /tmp/dynamic-cert.json

sudo systemctl daemon-reload
sudo systemctl restart k3s

그런 다음, 새로운 kubeconfig 파일은 /etc/rancher/k3s/k3s.yaml에 위치합니다. 이 kubeconfig를 사용하면 외부에서 k3s API 서버에 접근할 수 있습니다.

# 예제 kubeconfig 파일
---
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: XXX
    server: https://13.209.245.101:6443
  name: default
contexts:
- context:
    cluster: default
    user: default
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
  user:
    client-certificate-data: XXX
    client-key-data: XXX

Reference #