[K3s-02] Kubectl을 사용하여 외부에서 K3s API server에 접근하는 방법
목차
문제: 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