Kubernetes Engine 문제 해결
본 문서는 Kubernetes Engine 서비스와 관련된 주요 문제와 해결 방법을 정리한 문서입니다.
Cluster Failed: 리소스 부족
Cluster의 상태가 Failed로 변경된 후 다음의 에러가 발생합니다.
Error from server (Forbidden): the targeted Availability Zone "region-name", does not currently have sufficient capacity to support the cluster.
해당 에러는 클러스터 생성 시, 지정한 가용 영역 중 일부에 클러스터를 지원할 수 있는 충분한 용량이 확보되지 않은 경우 발생합니다.
▶️ 해결 방법: 클러스터가 상주할 수 없는 가용 영역이 있습니다. 서브넷이 속한 가용 영역을 다시 확인 후 클러스터를 재생성합니다.
Cluster Failed: 내부 처리 오류
Cluster의 상태가 Failed로 변경된 후 다음의 에러가 발생합니다.
Error from server (Forbidden): Cluster processing has failed because of an internal error, exception or failure
해당 에러는 클러스터 생성 시, 내부 시스템 오류 또는 예외 상황으로 인해 클러스터 생성이 실패한 경우 발생합니다.
▶️ 해결 방법: 클러스터 정보를 포함하여 헬프데스크로 문의합니다.
kubectl: Namespace is forbidden
kubectl 제어 설정을 모두 했지만 kubectl 명령어 사용하면 Namespace is forbidden 에러가 발생합니다.
Error from server (Forbidden): namespaces is forbidden: User "poby.hyeon@kakaoenterprise.com" cannot list resource "namespaces" in API group "" at the cluster scope
사용자가 발급한 액세스 키 발급시 선택한 프로젝트가 제어를 해야할 클러스터의 프로젝트와 일치하지 않아 forbidden 에러가 발생합니다.
사용자가 액세스키 생성시 프로젝트 지정에 제어할 클러스터가 속한 프로젝트를 지정해야 합니다. 사용자 액세스 키 생성 방법에 대한 자세한 설명은 액세스 키 발급를 참고하시기 바랍니다.
Kubelet: Nameserver limits exceeded
Kubernetes Engine 클러스터에서 노드 풀을 생성한 후, kublet log 부분에 다음의 에러가 발생합니다.
카카오클라우드의 Kubernetes Engine을 통해 생성된 노드는 Linux(Ubuntu) 기반으로 3개의 DNS nameserver 레코드까지 추가가 가능하며,
Kubernetes는 1개의 DNS nameserver 레코드를 사용해야 합니다.
이러한 제약 상황에서 만약 노드가 이미 3개의 네임서버를 사용하고 있다면, Nameserver limit exceeded
에러가 발생합니다.
Jul 15 16:42:22 {Node-name} kubelet[6020]: E0715 16:42:22.417041 6020 dns.go:153] "Nameserver limits exceeded" err="Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: ~ ~ ~"
▶️ 해결 방법: 노드 풀 생성 시 [고급 설정] > [사용자 스크립트] 등을 통해 네임서버를 resolv.conf
파일에 추가했는지 확인하고, nameserver 레코드 수를 조정합니다.
DNS 서버 레코드 제한에 대한 이슈는 쿠버네티스 공식 가이드를 참고해 주세요.
kubectl: Please enter Username
kubectl 제어 설정을 모두 했지만 kubectl 명령어 사용하면 Please enter Username 에러가 발생합니다.
Please enter Username:
kubeconfig 파일의 내용중 contexts>context>cluster>user에 설정된 클러스터의 이름과 users>name에 설정된 이름과 Sync 가 맞지 않아 에러가 발생합니다.
contexts>context>cluster>user에 설정된 클러스터의 이름과 users>name에 설정된 이름을 동일하게 설정합니다.
kubectl: Unable to connect to the server
kubectl 제어 설정을 모두 완료했지만, kubectl 명령어를 사용하면 다음의 에러가 발생합니다.
Unable to connect to the server: getting credentials: exec: executable kic-iam-auth failed with exit code 1
kubeconfig 파일의 users>user>exec>env 에 설정된 사용자 액세스 키의 정보를 활용하여 사용자 인증 설정을 진행하게 되지만 사용자 액세스 키의 정보가 일치하지 않아 에러가 발생합니다.
사용자 인증 설정을 참고하여 사용자 인증 재 설정이 필요합니다.
CSI Provisioner deployment, pod
cinder-csi 설치 완료 후 파드 상태가 CrashLoopBackOff 에러 발생 및 하단 에러가 발생합니다.
E0123 07:54:11.985138 1 openstack.go:102] Failed to open OpenStack configuration file: open /etc/kubernetes/cloud.conf: no such file or directory
E0123 07:54:11.985145 1 openstack.go:144] GetConfigFromFiles [/etc/kubernetes/cloud.conf] failed with error: open /etc/kubernetes/cloud.conf: no such file or directory
helm chart install 시 필요한 파라미터를 추가하지 않아 발생
helm install cinder-csi 설치 진행시 필수 파라미터 입력 후 재 설치 진행
$ helm install cinder-csi cpo/openstack-cinder-csi \
--version 2.3.0 \
--set secret.enabled=true \ #필수 파라미터
--set secret.name=cloud-config \ #필수 파라미터
--namespace kube-system
helm: kubernetes cluster unreachable
helm 설치하여 cli 를 통해 명령어 실행시 Kubernetes cluster unreachable 에러가 발생합니다.
Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp [::1]:8080: connect: connection refused
helm 은 쿠버네티스 클러스터와 연결에 필요한 정보를 등록해야 하지만 클러스터 정보를 가지고 있는 kubeconfig 를 찾지 못해 에러가 발생합니다.
kubeconfig.yaml 파일을 $KUBECONFIG 변수로 등록하는 방법과 --kubeconfig 옵션을 사용하는 방법
- $KUBECONFIG 환경변수 등록
export KUBECONFIG="{kubeconfig path}
- --kubeconfig 옵션 사용
$ helm --kubeconfig={Download_Path/kubeconfig.yaml} list
Istio Install Failed to call Webhook
istio를 K8SE로 구성시 마스터와 워커 노드간 네트워크 통신이 되지 않아 에러가 발생합니다.
Error creating: Internal error occurred: failed calling webhook "namespace.sidecar-injector.istio.io": failed to call webhook: Post "https://istiod.istio-system.svc:443/inject?timeout=10s": context deadline exceeded
Master 노드들은 컨테이너 네트워크에 포함되어 있지 않기 때문에 https://instiod/validate(validation webhook)
와 통신이 불가하여 에러 발생합니다.
▶️ hostNetwork: true
설정을 istiod
에 추가하여 노드 간 직접 통신이 가능하도록 설정합니다.
또한 hostNetwork: true
를 사용하는 경우 dnsPolicy: ClusterFirstWithHostNet
으로 명시적으로 설정 해야 합니다.
$ kubectl edit deployment -n istio-system istiod
***
spec:
hostNetwork: true # 추가
dnsPolicy: ClusterFirstWithHostNet
containers:
***
dnsPolicy 설정 정보
dnsPolicy: Default
노드의 '/etc/resolv.conf' 파일에 있는 설정을 사용하여 DNS 쿼리를 처리합니다.dnsPolicy: ClusterFirst
클러스터 도메인 접미사(예:'.cluster.local')와 일치하지 않는 모든 DNS 쿼리는 DNS 서버에 의해 상위 네임 서버로 전달됩니다.dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
를 사용하는 pod의 경우dnsPolicy: ClusterFirstWithHostNet
으로 명시적으로 설정 해야 합니다.
만약hostNetwork: true
를 사용하는 pod가dnsPolicy: ClusterFirst
정책을 사용하면 실제로는dnsPolicy: Default
정책의 동작으로 전환됩니다. 즉, 호스트 네트워크 모드로 실행되는 Pod가 클러스터 DNS 설정을 유지하기 위한 설정입니다.dnsPolicy: None
이 정책은 Pod가 Kubernetes 환경에서의 DNS 설정을 무시하도록 허용합니다.
사용자 정의 DNS 서버 사용이 필요한 Pod에 사용합니다.
- 자세한 사항은 (Kubernetes Documentation)에서 확인하시기 바랍니다.