클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

k8s cluster를 설치할 때 API server의 IP는 보안 때문에 보통 private IP를 지정합니다. 

아래와 같이 말입니다. 

 kubeadm init --pod-network-cidr=<value> --apiserver-advertise-address=<master node의 private ip>

 

어떠한 이유로 외부에서 k8s의 API server로 접근해야 한다면 kubernetes cluster를 다시 설치해야 할까요 ?

예를 들어 본인 PC에 Oracle VirtualBox같은걸로 Centos를 설치하고, 그 VM에서 kubectl로 k8s cluster를 접근하고 싶을때 말입니다.

 아래 글에 그 방법을 자세하게 설명하고 있습니다. 

https://blog.dudaji.com/kubernetes/2020/04/08/add-ip-to-kube-api-cert.html

 

GCE에 설치한 쿠버네티스 클러스터를 내 로컬 kubectl에서

한줄요약내용 : 기구축된 쿠버네티스 클러스터 kube-api-server의 certificate에 추가 IP, hostname을 넣기

blog.dudaji.com

단, 위에서 'kubeadm init phase certs apiserver --config {yaml file path}'명령 대신에 아래 명령을 사용하셔야 합니다. 

kubeadm init phase upload-config kubelet --config {yaml file path}

 

시간 없으신 분을 위해 간단히 정리하면 아래와 같습니다. 

1) 작업 디렉토리 생성

$ mkdir -p ~/work

$ cd ~/work

 

2) kubeadm config 내용 추출

$ kubectl get configmap kubeadm-config -n kube-system -o jsonpath='{.data.ClusterConfiguration}' > kubeadm-conf.yaml

 

3) kubeadm-conf.yaml파일에 certSANS항목 추가

아래 예처럼 apiServer밑에 'certSANs'를 추가하고, master node의 private, public IP를 지정합니다. 

apiServer:
  certSANs:
  - 169.56.70.205
  - 10.178.189.25
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.22.1
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

 

4) api server CERT key 재생성

- 기존 api server CERT key들을 백업합니다. 기존에 key가 있으면 생성 되지 않습니다. 

$ cd /etc/kubernetes/pki
$ mkdir backup
$ mv apiserver.* backup

- key파일 생성

$ kubeadm init phase certs apiserver --config ~/work/kubeadm-conf.yaml
$ ls -al /etc/kubernetes/pki/apiserver.*
-rw-r--r--. 1 root root 1302 Aug 23 08:57 /etc/kubernetes/pki/apiserver.crt
-rw-------. 1 root root 1679 Aug 23 08:57 /etc/kubernetes/pki/apiserver.key

 

5) configmap 'kubeadm-config'에 변경 사항 반영
$ kubeadm init phase upload-config kubelet --config ~/work/kubeadm-conf.yaml

6) 접근할 외부 서버(예: bastion)에 k8s config파일 다시 다운로드 하고 k8s config의 API Server IP를 public IP로 변경 

scp root@{k8s master ip}:~/.kube/config ~/.kube/config

vi ~/.kube/config

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림