본문 바로가기
Development/Docker&Kubernetes

[K8S] apiserver 에 SAN(Subject Alternative Name) 추가

by 폴피드 2021. 1. 5.
728x90
반응형

Lens 라는 툴을 사용해 보려고 host pc 에서 VM 에 있는 K8S 를 연결시켜보려고 시도를 해봤다.

2021/01/05 10:08:52 http: proxy error: x509: certificate is valid for 10.96.0.1, 10.0.1.7, not [ip]

그런데 위와 같은 에러 메세지가 나면서 연결이 되지 않았다. 위에 [ip] 는 host pc 의 ip 이다.

Google에서 찾아보니 인증서에 나의 로컬 ip 가 들어가 있지 않아서 라는 이야기가 나왔다.

그럼 현재 k8s 에 있는 apiserver 인증서 내용을 살펴보자.

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text

위와 같이 입력하면 apiserver.crt 파일에 있는 내용을 출력해서 볼 수 있다. 출력되는 항목중에 Subject Alternative Name 이라는 항목이 있다.

 X509v3 Subject Alternative Name:
                DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:master01-virtualbox, IP Address:10.96.0.1, IP Address:10.0.1.7

여기 정보를 보면 10.96.0.1, 10.0.1.7 로 정의 되어 있다. 이곳에 내 로컬pc 의 ip 가 정의되어있어야 인증서 오류가 안나게 된다. 그럼 어떻게 해야 저부분을 수정을 할수 있나.

kube-system 네임스페이스에 있는 configmap 중에 kubeadm-config 라는 항목이 있다.

kubectl -n kube-system get configmap kubeadm-config -o yaml

apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        authorization-mode: Node,RBAC
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: k8s.gcr.io
    kind: ClusterConfiguration
    kubernetesVersion: v1.19.2
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
  ClusterStatus: |
    apiEndpoints:
      master01-virtualbox:
        advertiseAddress: 10.0.1.7
        bindPort: 6443
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterStatus
kind: ConfigMap
metadata:
  creationTimestamp: "2020-10-12T10:21:12Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:ClusterConfiguration: {}
        f:ClusterStatus: {}
    manager: kubeadm
    operation: Update
    time: "2020-10-12T10:21:12Z"
  name: kubeadm-config
  namespace: kube-system
  resourceVersion: "168"
  selfLink: /api/v1/namespaces/kube-system/configmaps/kubeadm-config
  uid: 93b6e988-686e-449b-9bd1-a6f02b15d1ea

위처럼 정의 되어있다.

update 를 위해서는 다음과 같이 명령어로 수행해 볼 수 있다.

kubeadm init phase certs --apiserver-cert-extra-sans stringSlice
Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names.

(kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-certs)

kubeadmin init phase certs apiserver --apiserver-cert-extra-sans "추가할 IP"

그런데 먼저 하기전에 한가지 더 할 일이 있다.

/etc/kubernetes/pki 에 있는 apiserver.key, apiserver.crt 파일을 다른곳에 옮겨야 한다. 그렇지 않으면 인증서가 새로 생성되지 않는다. 다른 위치에 옮기고 나서 명령어를 실행한다.

sudo kubeadm init phase certs apiserver --apiserver-cert-extra-sans=X.X.X.X
I0105 11:06:44.899381    1295 version.go:252] remote version is much newer: v1.20.1; falling back to: stable-1.19
W0105 11:06:46.225883    1295 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master01-virtualbox] and IPs [10.96.0.1 10.0.1.7 X.X.X.X]

위와같이 실행 결과를 볼수 있다. 실제 인증서를 확인해 보면 다음과 같이 들어가 있다.

 X509v3 Subject Alternative Name:
                DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:master01-virtualbox, IP Address:10.96.0.1, IP Address:10.0.1.7, IP Address:X.X.X.X

그런데 다시 Lens 로 접속 해보니 에러 발생

2021/01/05 13:14:53 http: proxy error: x509: certificate signed by unknown authority

그래서 결국 configmap 도 수정해주고 재기동 한 결과 정상적으로 접속이 됐다.

apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      certSANs:
      - X.X.X.X

 

728x90
반응형

댓글0