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
'Development > Docker&Kubernetes' 카테고리의 다른 글
taint, cordon 의 차이점은? (0) | 2021.11.04 |
---|---|
[K8S] static pod 에 대해서 몇가지. (0) | 2021.02.04 |
쿠버네티스 입문 12장 파드스케줄링 (0) | 2020.12.31 |
쿠버네티스 입문 11장 secret (0) | 2020.12.30 |
쿠버네티스 입문 9장 레이블&애너테이션 (0) | 2020.12.30 |