헤드램프 애드온 설정하기
헤드램프는 클러스터 리소스를 관리하고 모니터링하기 위한 그래픽 사용자 인터페이스를 제공하는 Kubernetes 대시보드입니다. IBM Cloud® Kubernetes Service 용 헤드 램프 애드온은 자동 수명 주기 관리 및 인증을 위한 IBM Cloud Identity and Access Management (IAM)과의 통합을 통해 헤드 램프를 원활하게 설치할 수 있습니다.
헤드램프 애드온 이해
헤드램프 애드온은 아카이브된 쿠버네티스 대시보드 프로젝트를 대체할 것을 권장합니다. Headlamp는 클러스터의 Kubernetes 리소스를 보고 관리할 수 있는 사용자 친화적인 최신 인터페이스를 제공합니다.
헤드램프 애드온의 주요 기능은 다음과 같습니다:
- IAM OIDC 인증: IAM OIDC를 사용하여 IBM Cloud 계정으로 원활하게 인증하세요.
- 독립적인 수명 주기 관리: 애드온 버전은 클러스터 마스터 BOM 버전과 분리되어 독립적으로 업데이트할 수 있습니다.
- 액세스 준비 완료: 추가 기능은 클러스터의 기본 공개 인그레스 호스트 이름에
headlamp하위 도메인이 있는 인그레스 리소스를 통해 자동으로 노출됩니다. - 보안 액세스: 각 클러스터는 인증 스푸핑 공격을 방지하기 위해 고유한 OIDC 클라이언트 ID를 받습니다.
전제조건
헤드램프 애드온을 설치하기 전에 클러스터가 다음 요구 사항을 충족하는지 확인하세요:
- IBM Cloud Kubernetes Service 에 대한 작성자 또는 관리자 IBM Cloud IAM 서비스 액세스 권한이 있어야 합니다.
- 클러스터가 지원되는 Kubernetes 버전을 실행 중이어야 합니다.
- 클래식 클러스터의 경우 VRF 및 서비스 엔드포인트를 사용하도록 설정해야 합니다.
- 브라우저에 액세스 권한이 있어야 합니다:
- 클러스터의 기본 인그레스 호스트 이름입니다.
- IBM Cloud IAM 인증 엔드포인트(
https://iam.cloud.ibm.com).
헤드램프 애드온 설치하기
헤드램프 애드온은 현재 CLI를 통해서만 사용할 수 있습니다. IBM Cloud 콘솔에서는 애드온을 설치하거나 관리할 수 없습니다.
CLI를 사용하여 헤드램프 애드온 설치하기
container-service플러그인을 최신 버전으로 업데이트하십시오.ibmcloud update && ibmcloud plugin update container-service- 클러스터를 대상으로 지정하십시오.
ibmcloud ks cluster config --cluster CLUSTER_NAME_OR_ID headlamp추가 기능을 사용으로 설정하십시오.ibmcloud ks cluster addon enable headlamp --cluster CLUSTER_NAME_OR_ID- 헤드램프 애드온의 상태가 ‘
Addon Ready’인지 확인하십시오.
출력 예:ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_IDNAME Version Health State Health Status headlamp 0.1.0 normal Addon Ready - 헤드램프 유닛이 작동하는지 확인하십시오.
kubectl get pods -n ibm-system -l app.kubernetes.io/name=addon-headlamp
헤드램프 대시보드에 액세스하기
헤드램프 애드온을 설치한 후에는 클러스터의 기본 인그레스 호스트명을 통해 대시보드에 액세스할 수 있습니다.
-
클러스터의 기본 인그레스 호스트명을 가져옵니다.
ibmcloud ks cluster get --cluster <cluster_name_or_ID> | grep "Ingress Subdomain" -
브라우저를 열고
https://headlamp.<ingress_subdomain>으로 이동합니다. 여기서<ingress_subdomain>은 클러스터의 기본 인그레스 호스트 이름입니다.예:
https://headlamp.mycluster-abc123-0000.us-south.containers.appdomain.cloud -
로그인을 클릭하여 IBM Cloud IAM으로 인증합니다.
-
IBM Cloud 에 아직 로그인하지 않은 경우 IAM 로그인 페이지로 리디렉션됩니다. 인증이 완료되면 헤드램프 대시보드로 다시 리디렉션됩니다.
-
인증이 완료되면 헤드램프 인터페이스를 통해 클러스터 리소스를 보고 관리할 수 있습니다.
쿠버네티스 대시보드에서 마이그레이션하기
Kubernetes 커뮤니티에서 kubernetes-dashboard 프로젝트를 보관하고 있습니다. Headlamp 애드온을 설치한 후, 클러스터에서 실행 중인 경우 kubernetes 대시보드 배포를 축소할 수 있습니다.
Headlamp를 설치한 후 kubernetes 대시보드 배포를 축소하려면:
kubectl scale deployment -n kube-system kubernetes-dashboard --replicas=0
kubectl scale deployment -n kube-system dashboard-metrics-scraper --replicas=0
헤드램프 인증 이해
헤드램프 애드온은 IBM Cloud IAM OIDC 인증을 사용하여 클러스터 리소스에 대한 액세스를 보호합니다.
헤드램프 애드온을 활성화하면 다음 인증 구성 요소가 자동으로 구성됩니다:
- 고유 클라이언트 ID: 클러스터에 대해 고유한 OIDC 클라이언트 ID가 생성되어
ibm-system네임스페이스의 Kubernetes 비밀에 저장됩니다. - 하이브리드 프라이빗-퍼블릭 OIDC: Headlamp는 백채널 요청에는 프라이빗 IAM 엔드포인트를 사용하고, 프론트채널(브라우저 로그인)은 퍼블릭 IAM 엔드포인트를 통해 이루어집니다.
- 토큰 관리: 인증 토큰은 브라우저 쿠키에 저장되며 Kubernetes API 서버에 대한 요청에 자동으로 포함됩니다.
인증 흐름은 다음과 같이 작동합니다:
- 헤드램프 대시보드에 액세스하면 로그인 페이지가 표시됩니다.
- 로그인을 클릭하면 공개 IBM Cloud IAM 인증 엔드포인트로 리디렉션됩니다.
- 인증에 성공하면 IAM은 인증 코드와 함께 사용자를 Headlamp로 다시 리디렉션합니다.
- 헤드램프는 사설 네트워크를 통해 인증 코드를 액세스 토큰으로 교환합니다.
- 액세스 토큰은 Kubernetes API 서버에 대한 요청을 인증하는 데 사용됩니다.
클러스터 리소스에 대한 액세스 권한은 IBM Cloud IAM 역할과 Kubernetes API 서버에서 시행하는 Kubernetes RBAC 권한에 따라 결정됩니다.
헤드램프 애드온 업데이트
헤드램프 애드온은 새 버전이 출시되면 자동으로 업데이트됩니다. 언제든지 애드온의 현재 버전과 상태 상태를 확인할 수 있습니다.
애드온 버전을 확인하려면 다음과 같이 하세요:
ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>
헤드램프 애드온 비활성화하기
헤드램프 대시보드가 더 이상 필요하지 않은 경우 추가 기능을 비활성화할 수 있습니다.
헤드램프 애드온을 비활성화하면 다음 리소스가 제거됩니다:
- 헤드램프 배포 및 포드
- 전조등 서비스 및 출입 리소스
- OIDC 클라이언트 ID 및 관련 비밀
CLI로 헤드램프 애드온 비활성화하기
- 헤드램프 애드온을 비활성화합니다.
ibmcloud ks cluster addon disable headlamp --cluster <cluster_name_or_ID> - 추가 기능이 제거되었는지 확인하십시오.
ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>
VPC 클러스터에서 프라이빗 인그레스를 통해 헤드램프에 액세스하기
보안을 강화하기 위해 공개 인그레스 대신 비공개 인그레스를 통해 Headlamp에 액세스하도록 VPC 클러스터를 구성하세요.
VPC VPN을 통해 사설 네트워크에서 Headlamp에 액세스하기로 선택한 경우 다음 단계에 따라 클러스터를 재구성할 수 있습니다:
-
클러스터의 공용 ALB를 비활성화합니다.
ibmcloud ks ingress alb disable --cluster <cluster_name_or_ID> --alb <public_ALB_ID> -
비공개 액세스를 사용하도록 설정합니다.
ibmcloud ks ingress alb enable vpc-gen2 --cluster <cluster_name_or_ID> --alb <private_ALB_ID> -
비공개 ALB에 도메인을 등록합니다.
ibmcloud ks ingress domain create --cluster <cluster_name_or_ID> --hostname $<private_ALB_ID_hostname> -
새 도메인을 기본값으로 설정합니다.
ibmcloud ks ingress domain default replace --cluster <cluster_name_or_ID> --domain <new_domain>
IBM Cloud 백엔드에서 약 5분 후에 헤드램프를 업데이트합니다. 업데이트가 완료되면 대시보드는 새로운 기본 인그레스 호스트 이름( headlamp. 하위 도메인)에서 사용할 수 있습니다.
Istio 침투 게이트웨이를 이용한 헤드램프 노출
클러스터가 ‘ Istio ’ 인그레스 게이트웨이를 통해 외부 트래픽을 라우팅하는 경우, Headlamp 애드온이 생성하는 기본 인그레스 리소스를 비활성화하고, 대신 Istio Gateway 및 VirtualService 을 통해 Headlamp를 노출할 수 있습니다.
Headlamp는 *.containers.appdomain.cloud 도메인 내의 IBM 에서 제공하는 서브도메인을 통해 노출되어야 합니다. 클러스터의 OIDC 클라이언트 ID는 해당 도메인과 일치하는 리디렉션 URI와 함께 등록되어 있습니다. istio-ingressgateway 로드 밸런서의 원본 호스트명은 해당 도메인에 속하지 않으므로, 이를 직접 사용하면 인증에 실패합니다.
시작하기 전에
- 관리 Istio 추가 기능을 사용으로 설정합니다.
kubectl를 해당 클러스터를 대상으로 설정합니다.
-
headlamp-values( ConfigMap ) 파일을 편집하여 Headlamp 애드온이 생성하는 기본 Ingress 리소스를 비활성화하십시오.kubectl edit cm -n ibm-system headlamp-values애드온이 기본 NGINX 및 Traefik Ingress 리소스를 생성하지 못하도록 하려면
data섹션에 다음 내용을 추가하십시오.data: values.yaml: |- createDefaultPublicIngressNginx: false createDefaultPrivateIngressNginx: false createDefaultPublicIngressTraefik: false createDefaultPrivateIngressTraefik: false -
업데이트된 값이 클러스터 전체에 반영될 때까지 최대 5분 정도 기다려 주십시오.
-
기본 Ingress 리소스가 제거되었는지 확인하십시오.
kubectl get ingress -n ibm-system -
istio-ingressgateway로드 밸런서의 IP 주소(클래식 클러스터) 또는 호스트 이름(VPC 클러스터)을 확인합니다.- 클래식 클러스터:
kubectl get service istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}' ``` * VPC 클러스터: ```sh {: pre} kubectl get service istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' ``` 명령어의 반환 값이 비어 있다면, 로드 밸런서가 아직 프로비저닝되지 않은 것입니다. 서비스에 공용 IP가 할당되어 있는지 확인하고, 서비스 이벤트에서 로드 밸런서 할당량 제한과 같은 오류가 있는지 확인하십시오. {: note} ```sh {: pre} kubectl describe service istio-ingressgateway -n istio-system -
IBM 에서 제공하는 서브도메인을 생성하여 로드 밸런서의 IP 주소(클래식) 또는 호스트 이름(VPC)을 등록합니다. TLS 시크릿에 대해
istio-system네임스페이스를 지정하여, TLS 인증서를istio-ingressgateway에서 사용할 수 있도록 하십시오.- 클래식 클러스터:
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_ID> --ip <istio_ingressgateway_IP> --secret-namespace istio-system ``` * VPC 클러스터: ```sh {: pre} ibmcloud ks nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <istio_ingressgateway_hostname> --secret-namespace istio-system ``` -
서브도메인이 생성되었는지 확인하고, 서브도메인과 ‘ SSL ’ 인증서 비밀 이름을 기록해 둡니다.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_ID>클래식 클러스터의 출력 예:
Subdomain IP(s) SSL Cert Status SSL Cert Secret Name Secret Namespace mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] created mycluster-a1b2cdef345678g9hi012j3kl4567890-0001 istio-systemVPC 클러스터의 출력 예:
Subdomain Target(s) SSL Cert Status SSL Cert Secret Name Secret Namespace mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud 1234abcd-us-south.lb.appdomain.cloud created mycluster-a1b2cdef345678g9hi012j3kl4567890-0001 istio-system클러스터에 NLB-DNS 항목이 여러 개 있는 경우, ‘
Target(s)’ 또는 ‘IP(s)’ 열의 값을 ‘istio-ingressgateway’ 로드 밸런서 주소와 대조하고, ‘Secret Namespace’ 열에 ‘istio-system’이 표시되는지 확인하여 이전 단계에서 생성한 하위 도메인을 식별하십시오. -
Headlamp용
Gateway및VirtualService을 정의하는headlamp-istio.yaml이라는 파일을 생성합니다.<subdomain>을 이전 단계에서 확인한 하위 도메인으로,<ssl_cert_secret_name>을 SSL 인증서의 비밀 이름으로 각각 대체하십시오.TLS 인증서 비밀은
istio-system네임스페이스에서 생성됩니다.istio-ingressgateway는 해당 네임스페이스에서 ‘credentialName’ 필드에 명시된 비밀을 읽어옵니다.Gateway리소스에 인증서 값을 복사하지 마십시오.apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: headlamp-gateway namespace: ibm-system spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: <ssl_cert_secret_name> hosts: - <subdomain> --- apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: headlamp namespace: ibm-system spec: hosts: - <subdomain> gateways: - headlamp-gateway http: - route: - destination: host: headlamp.ibm-system.svc.cluster.local port: number: 80 -
Gateway및VirtualService리소스를 적용하십시오.kubectl apply -f headlamp-istio.yaml -
6단계에서 기록해 둔 하위 도메인을 사용하여 웹 브라우저에서 Headlamp 대시보드를 엽니다.
https://<subdomain>명령줄에서 연결 상태를 확인하려면 다음 명령을 실행하십시오.
-k옵션을 사용하면 테스트 중에만 인증서 검증을 건너뛸 수 있습니다. 실제 운영 환경에서는-k를 사용하지 마십시오.curl -k -s -o /dev/null -w "%{http_code}\n" https://<subdomain>
Kubernetes 애드온으로 생성된 리소스
헤드램프 애드온은 적절한 네트워크 구성이 필요한 여러 Kubernetes 리소스를 클러스터에 생성합니다.
사용자 지정 방화벽 또는 네트워크 설정이 있는 경우 다음 리소스 간의 통신을 허용하도록 해당 설정을 구성해야 합니다:
- 4가지 잉그레스 리소스
- private-iks-k8s-nginx 으로 비공개 ingressClass
- 공개 public-iks-k8s-nginx ingressClass
- private with private-iks-traefik ingressClass
- public with public-iks-traefik ingressClass
- 1 서비스 (포트 80 → 4466의 ClusterIP )
- 1 배포
- 전조등 컨테이너(포트 4466)
- nginx 사이드카 컨테이너
공용 엔드포인트를 통해 Headlamp 애드온에 OIDC 활성화
클러스터가 비공개 IAM 엔드포인트에 연결할 수 없는 경우, OIDC 엔드포인트 설정을 재정의하여 공개 엔드포인트를 사용하십시오.
이 단계들은 클러스터가 IAM 공용 엔드포인트에 액세스할 수 있다고 가정합니다.
시작하기 전에, 클러스터에 대해 kubectl 가 구성되어 있는지 확인하십시오.
-
headlamp-values( ConfigMap ) 파일을 편집하기 위해 엽니다:kubectl edit cm -n ibm-system headlamp-values편집기에서 ‘
data’ 섹션에 다음 내용을 추가하십시오.<account_id>을 클러스터가 배포된 계정의 ID로 대체하십시오.data: values.yaml: |- oidc: overrides: tokenEndpointUrl: "https://iam.cloud.ibm.com/identity/token?account=<account_id>" jwksUri: "https://iam.cloud.ibm.com/identity/keys" -
업데이트된 값이 클러스터 전체에 반영될 때까지 최대 5분 정도 기다려 주십시오.
-
헤드램프 배포를 다시 시작합니다:
kubectl rollout restart deployment/headlamp -n ibm-system
헤드램프 애드온 문제 해결하기
다음 정보를 사용하여 헤드램프 애드온의 일반적인 문제를 해결하세요.
헤드램프 대시보드에 액세스할 수 없습니다
헤드램프 대시보드에 액세스할 수 없는 경우 다음을 확인하세요:
- 애드온이 설치되어 있고 정상적으로 작동하는지 확인하십시오.
ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID> - 헤드램프 유닛이 작동하는지 확인하십시오.
kubectl get pods -n ibm-system -l app.kubernetes.io/name=addon-headlamp - ingress 리소스가 올바르게 구성되었는지 확인하십시오.
kubectl get ingress -n ibm-system - 공개 전용 클러스터의 경우, 네트워크 보안 규칙에서 공개 IAM 엔드포인트로의 아웃바운드 HTTPS 연결이 허용되는지 확인하십시오. 필요한 경우, ‘공용 엔드포인트를 통해 Headlamp 애드온에 OIDC 활성화’ 문서를 참조하여 OIDC 구성을 업데이트하십시오.
인증 실패
헤드램프 대시보드에 액세스할 때 인증에 실패하는 경우:
-
클러스터에 액세스하는 데 필요한 IAM 권한이 있는지 확인합니다.
-
브라우저에서
https://iam.cloud.ibm.com에 액세스할 수 있는지 확인합니다. -
브라우저 쿠키를 삭제하고 다시 시도하세요.
-
클러스터에 OIDC 클라이언트 ID 비밀 번호가 있는지 확인합니다.
kubectl get secret clientid-secrets -n ibm-system
파드가 실행 중이 아닙니다
헤드램프 포드가 실행되고 있지 않은 경우:
- 포드 상태 및 이벤트를 확인합니다.
kubectl describe pods -n ibm-system -l app.kubernetes.io/name=addon-headlamp - 포드 로그에서 오류가 있는지 확인하십시오.
kubectl logs -n ibm-system -l app.kubernetes.io/name=addon-headlamp