View a markdown version of this page

직접 SSH - Amazon SageMaker AI

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

직접 SSH

보안 공지

Direct SSH는 클러스터 포드에서 인바운드 TCP 포트를 엽니다. 열린 인바운드 포트가 필요하지 SSM을 통한 SSH를 사용한 원격 액세스 않기 때문에 권장합니다. SSM을 통한 원격 액세스가 요구 사항을 충족할 수 없는 경우에만 Direct SSH를 활성화합니다(예: 인터넷 액세스 없음 또는 표준 SSH 도구 필요).

활성화하기 전에 다음을 검토합니다.

클러스터 전반의 영향

directSSH.enabled: true는 선택한 워크스페이스 또는 사용자뿐만 아니라 클러스터 전체의 모든 워크스페이스 포드에서 구성된 포트를 엽니다.

보안 그룹 범위

인바운드 규칙을 가능한 가장 좁은 소스 CIDR(Classless Inter-Domain Routing) 블록으로 제한합니다. 를 사용하지 마십시오0.0.0.0/0. AWS Config restricted-ssh 관리형 규칙을 사용하여 정기적으로 감사합니다.

SSH 키 수명 주기

SSH 키 수명 주기를 관리합니다. SSH 키는 수명이 긴 자격 증명입니다. 교체 정책이 없으면 손상된 키는 영구 액세스 권한을 부여합니다. 팀에 롤아웃하기 전에 SSH 키 교체 정책을 설정하고 주기적으로 키를 교체합니다.

VPC 네트워크 격리

VPC 네트워크 격리를 관리합니다. Direct SSH를 활성화하면 포드와 VPC 보안 그룹 및 라우팅 제어에서 sshd가 시작됩니다. 신뢰할 수 있는 네트워크 소스(VPN 서브넷, Direct Connect CIDR 또는 회사 네트워크 범위)만 구성된 포트에 도달할 수 있는지 확인합니다. Direct SSH는 VPC 내의 포드 프라이빗 IP 주소에 SSH 포트를 노출합니다. 클라이언트는 동일한 VPC, VPC 피어링, VPN 또는 Direct Connect를 통해 해당 VPC에 대한 네트워크 연결이 있는 경우에만 연결할 수 있습니다.

사전 조건

Direct SSH에는 ExternalDNS, Amazon Route 53 Private Hosted Zone, 클라이언트 시스템의 VPC 연결 및 (선택 사항) AWS Load Balancer Controller가 필요합니다. 사전 조건의 전체 목록은 섹션을 참조하세요Direct SSH의 사전 조건.

클러스터에서 웹 브라우저 액세스가 이미 활성화된 경우 모든 사전 조건이 적용됩니다. 계속하기 전에 ExternalDNS가 로 구성되어 있는지 확인합니다--policy=sync. 자세한 내용은 ExternalDNS 구성을 참조하세요.

웹 브라우저 액세스가 아직 구성되지 않은 경우 섹션을 참조하세요(선택 사항) 사전 조건 설정. 웹 브라우저 액세스 활성화에 대한 자세한 내용은 섹션을 참조하세요EKS 추가 기능 설치 - WebUI를 사용하는 Jupyter K8s.

클러스터에 대한 Direct SSH 구성

클러스터 전체 범위

directSSH.enabled: true는 클러스터 전체의 모든 워크스페이스 포드에서 구성된 포트에서 sshd를 시작합니다. SSH는 JupyterLab 터미널과 동일한 액세스 권한, 즉 동일한 사용자(sagemaker-user), 동일한 파일 시스템을 제공합니다.

1단계: SSH에 대한 보안 그룹 규칙 추가

웹 브라우저 액세스는 Application Load Balancer(ALB)를 통해 HTTPS(443)를 사용합니다. Direct SSH는 구성된 포트의 포드 IPs에 직접 연결되므로 보안 그룹 인바운드 규칙을 추가해야 합니다.

VPC 구성은 사용자의 책임입니다.

보안 그룹, 라우팅 및 네트워크 액세스 제어를 포함하여 VPC를 올바르게 구성해야 합니다. 다이렉트 SSH는 포드에서 sshd를 시작합니다. VPC는 누가 연결할 수 있는지 결정합니다. 워크스페이스(예: 회사 네트워크 범위, VPN 터널 서브넷 또는 Direct Connect CIDRs)로 SSH할 수 있는 CIDR에 대한 액세스만 제한합니다. 0.0.0.0/0는 사용하지 마세요.

수정하기 전에 올바른 보안 그룹을 확인합니다.

HyperPod 인스턴스 그룹은 보안 그룹을 OverrideVpcConfig포함하여를 통해 그룹 수준에서 VPC 구성을 재정의할 수 있습니다. 수정할 올바른 보안 그룹은 워크스페이스 인스턴스 그룹에 재정의가 있는지 여부에 따라 달라집니다. 규칙을 잘못된 보안 그룹에 추가하면 자동 Connection timed out 오류가 발생합니다.

워크스페이스 인스턴스 그룹에 SG 재정의가 있는지 확인합니다.

aws sagemaker describe-cluster \ --cluster-name <HYPERPOD_CLUSTER_NAME> \ --region <AWS_REGION> \ --query 'InstanceGroups[*].{Name:InstanceGroupName, OverrideSGs:OverrideVpcConfig.SecurityGroupIds}'

옵션 A: 인스턴스 그룹에 보안 그룹 재정의가 있음

OverrideSGs가 null이 아닌 경우 해당 보안 그룹에 규칙을 추가합니다.

SG_ID=<SG_ID_FROM_OVERRIDE_VPC_CONFIG> aws ec2 authorize-security-group-ingress \ --group-id $SG_ID \ --protocol tcp \ --port <SSH_PORT> \ --cidr <SOURCE_CIDR> \ --region <AWS_REGION>

옵션 B: 인스턴스 그룹에 보안 그룹 재정의가 없음

OverrideSGs가 null인 경우 SageMaker HyperPod 클러스터 VPC 구성의 클러스터 수준 보안 그룹을 사용합니다.

SG_ID=$(aws sagemaker describe-cluster --cluster-name <HYPERPOD_CLUSTER_NAME> --region <AWS_REGION> \ --query 'VpcConfig.SecurityGroupIds[0]' --output text) aws ec2 authorize-security-group-ingress \ --group-id $SG_ID \ --protocol tcp \ --port <SSH_PORT> \ --cidr <SOURCE_CIDR> \ --region <AWS_REGION>

다음 표에는 각 자리 표시자 값을 찾을 수 있는 위치가 나와 있습니다.

Placeholder 가져와야 할 위치
<HYPERPOD_CLUSTER_NAME> SageMaker AWS Management Console에서 HyperPod 클러스터를 선택합니다. 또는를 실행합니다aws sagemaker list-clusters.
<SSH_PORT> 에서 구성한 포트directSSH.port(기본값은 22). 보안 그룹 인바운드 규칙과 일치해야 합니다.
<AWS_REGION> HyperPod 및 EKS 클러스터가 배포되는 AWS 리전입니다.
<SOURCE_CIDR> 신뢰할 수 있는 네트워크의 CIDR: VPN 터널 서브넷, Direct Connect CIDR 또는 회사 네트워크 범위(예: 10.192.16.0/24). 0.0.0.0/0이 아니어야 합니다.

2단계: 직접 SSH 활성화

와 함께 추가 기능 구성directSSH에를 추가합니다clusterWebUI.

jupyter-k8s-aws-hyperpod: clusterWebUI: enabled: true domain: "<DOMAIN_NAME>" awsCertificateArn: "<ACM_CERTIFICATE_ARN>" traefik: shouldInstall: true directSSH: enabled: true port: <SSH_PORT> # default: 22 domain: "<ROUTE53_HOSTED_ZONE_DOMAIN>"

다음 표에는 각 자리 표시자 값을 찾을 수 있는 위치가 나와 있습니다.

Placeholder 가져와야 할 위치
<DOMAIN_NAME> 웹 브라우저 액세스를 활성화할 때 구성한 도메인(예: spaces.example.com). 자세한 내용은 EKS 추가 기능 설치 - WebUI를 사용하는 Jupyter K8s 단원을 참조하십시오.
<ACM_CERTIFICATE_ARN> AWS Certificate Manager(ACM) AWS Management Console에서 인증서를 선택한 다음 와일드카드 인증서 ARN을 선택합니다.
<ROUTE53_HOSTED_ZONE_DOMAIN> Route 53 AWS Management Console에서 호스팅 영역을 선택한 다음 ExternalDNS에 사용되는 프라이빗 호스팅 영역 이름(예: workspaces.internal)을 선택합니다.
<SSH_PORT> 포트 sshd는 내부 워크스페이스 포드에서 수신 대기합니다. 기본값은 22입니다. 보안 그룹 또는 회사 정책이 포트 22를 제한하는 경우 권한이 없는 포트(예: 2222)를 사용합니다. SG 인바운드 규칙은이 값과 일치해야 합니다.
directSSH와 remoteAccess는 상호 배타적입니다.

directSSHremoteAccess는 상호 배타적입니다. helm upgrade "directSSH와 remoteAccess는 상호 배타적입니다. 하나만 활성화합니다.” 를 활성화remoteAccess하기 전에를 비활성화합니다directSSH.

추가 기능을 업데이트합니다.

aws eks update-addon \ --cluster-name <CLUSTER_NAME> \ --addon-name amazon-sagemaker-spaces \ --configuration-values file://addon-config.yaml \ --resolve-conflicts OVERWRITE \ --region <AWS_REGION>

Direct SSH를 비활성화하려면 섹션을 참조하세요직접 SSH 액세스 취소.

3단계: Direct SSH가 활성 상태인지 확인

# Check addon status aws eks describe-addon \ --cluster-name <CLUSTER_NAME> \ --addon-name amazon-sagemaker-spaces \ --region <AWS_REGION> # Check headless services created for workspaces kubectl get svc -l app.kubernetes.io/component=direct-ssh # Verify DNS record resolves (from within VPC) dig <workspace-name>.<namespace>.<ROUTE53_HOSTED_ZONE_DOMAIN>

Direct SSH를 사용하여 워크스페이스에 연결

다음 절차에 따라 Direct SSH를 사용하여 워크스페이스에 연결하고, SSH 키를 관리하고, 연결 문제를 해결합니다.

SSH 인증 작동 방식

Direct SSH는 표준 퍼블릭 키 인증을 사용합니다. 각 사용자는 자체 SSH 키 페어를 생성하고 워크스페이스에 퍼블릭 키를 추가합니다. 프라이빗 키는 사용자의 머신을 벗어나지 않습니다.

다음은 SSH 액세스에 대한 주요 사실입니다.

  • SSH는 JupyterLab 터미널과 동일한 액세스 권한, 즉 동일한 사용자(sagemaker-user), 동일한 파일 시스템, 동일한 도구를 제공합니다.

  • 키는 워크스페이스당입니다. 한 워크스페이스의 키는 다른 워크스페이스에 대한 액세스 권한을 부여하지 않습니다.

  • SageMaker AI Spaces 시작 스크립트는 올바른 권한을 가진 .ssh/ 디렉터리를 자동으로 생성합니다.

  • 키는 워크스페이스 재시작(PVC에 저장) 전반에 걸쳐 유지되며 워크스페이스가 삭제되면 삭제됩니다.

현재 제한 사항

SSH 사용자 이름은 연결 대상에 sagemaker-user 관계없이 항상 적용됩니다. 개인 사용자 이름은 사용할 수 없습니다. 모든 세션은 동일한 워크스페이스 사용자로 실행됩니다. 쉘 프롬프트 및 감사 로그의 사용자별 자격 증명은 현재 릴리스에서 사용할 수 없습니다.

1단계: 클라이언트 시스템에서 SSH 키 생성

이 명령을 한 번 실행하여 키 페어를 생성합니다.

ssh-keygen -t ed25519 -f ~/.ssh/my-workspace-key

이렇게 하면 다음이 생성됩니다.

  • ~/.ssh/my-workspace-key - 프라이빗 키(암호 유지, 공유 금지)

  • ~/.ssh/my-workspace-key.pub - 퍼블릭 키(워크스페이스에 추가)

2단계: 워크스페이스에 퍼블릭 키 추가

다음 방법 중 하나를 사용하여 퍼블릭 키를 추가합니다. 둘 다 수행할 필요는 없습니다.

웹 브라우저 액세스를 통해 키 추가

  1. 브라우저에서 워크스페이스를 엽니다( 참조웹 브라우저 액세스).

  2. 터미널을 엽니다. JupyterLab에서 파일, 신규, 터미널을 선택합니다. 코드 편집기에서 터미널, 새 터미널을 선택합니다.

  3. 로컬 시스템에서 퍼블릭 키를 복사합니다. cat ~/.ssh/my-workspace-key.pub

  4. 워크스페이스 터미널에 붙여넣습니다.

    echo "ssh-ed25519 AAAA...your-key... user@machine" >> ~/.ssh/authorized_keys

kubectl을 통해 키 추가

POD=$(kubectl get pods -n <namespace> -l workspace.jupyter.org/workspace-name=<space-name> \ -o jsonpath='{.items[0].metadata.name}') cat ~/.ssh/my-workspace-key.pub | kubectl exec -n <namespace> -i $POD -c workspace -- \ bash -c "cat >> /home/sagemaker-user/.ssh/authorized_keys"

3단계: SSH를 사용하여 워크스페이스에 연결

ssh -p <SSH_PORT> -i ~/.ssh/my-workspace-key sagemaker-user@<space-name>.<namespace>.<domain>
SSH 포트

관리자가 Direct SSH에 대해 구성한 SSH 포트를 사용합니다. 관리자가 기본 포트(22)를 유지한 경우 -p 옵션을 생략할 수 있습니다. 기본 포트가 아닌 포트(예: 2222)를 구성한 경우를 포함해야 합니다. -p <SSH_PORT> 그렇지 않으면 와의 연결이 실패합니다Connection refused. 사용할 포트가 확실하지 않은 경우 관리자에게 문의하세요.

예제:

ssh -p 2222 -i ~/.ssh/my-workspace-key sagemaker-user@my-space.default.spaces.example.com

4단계: 쉽게 액세스할 수 있도록 SSH 구성

이 선택적 단계는 향후 연결을 간소화합니다. 다음을 ~/.ssh/config로 추가하세요:

Host my-space HostName <space-name>.<namespace>.<domain> Port <SSH_PORT> User sagemaker-user IdentityFile ~/.ssh/my-workspace-key ServerAliveInterval 15 ServerAliveCountMax 3

관리자가 구성한 포트Port로를 설정합니다. Direct SSH가 기본 포트(22)를 사용하는 경우이 줄을 생략할 수 있습니다. 그런 다음에 연결합니다. ssh my-space

5단계: 원격 IDE 연결

Direct SSH가 터미널에서 작동한 후(3단계) 원격 SSH 지원 IDE는 동일한 ~/.ssh/config 항목을 사용하여 연결됩니다. 이 연결에는 추가 AWS 구성이 필요하지 않습니다.

원격 SSH 확장 설치

IDE 확장
VS Code 확장, "Remote - SSH" 검색, 설치(Microsoft 제공) 선택
Kiro 확장, "Remote - SSH" 검색, 설치 선택
Cursor 확장, "Remote - SSH" 검색, 설치 선택

IDE에서 연결

  1. Command Palette를 열고 "Remote-SSH: Connect to Host..."를 선택합니다.

  2. 목록에서 워크스페이스를 선택합니다(4단계~/.ssh/config에서 사용).

  3. IDE는 워크스페이스에 서버 구성 요소를 설치합니다(일회성, 약 30초).

  4. IntelliSense, 터미널 및 파일 탐색기를 포함한 전체 편집기 기능이 포함된 원격 창이 열립니다.

VS Code에서 워크스페이스 파일 열기

VS Code에서 연결 후 파일, 폴더 열기/home/sagemaker-user를 선택하여 워크스페이스 파일을 직접 엽니다.

키 관리 및 해지

SSH 키를 관리합니다. SSH 키는 자동 만료 없이 수명이 긴 자격 증명입니다. 의 키는 사용자가 명시적으로 제거할 때까지 워크스페이스에 대한 액세스 권한을 authorized_keys 부여합니다.

키를 교체하려면

키를 주기적으로 교체하는 것이 좋습니다.

  1. 클라이언트 머신에서 새 키 페어를 생성합니다. ssh-keygen -t ed25519 -f ~/.ssh/my-workspace-key-new

  2. 워크스페이스에 새 퍼블릭 키를 추가합니다(2단계). 이전 키와 새 키가 동시에 작동합니다.

  3. 새 키가 작동하는지 확인합니다. ssh -p <SSH_PORT> -i ~/.ssh/my-workspace-key-new sagemaker-user@<hostname>

  4. 워크스페이스 터미널의 authorized_keys에서 이전 키를 제거합니다.

    # List current keys with line numbers cat -n ~/.ssh/authorized_keys # Remove a specific line (for example, line 1) sed -i '1d' ~/.ssh/authorized_keys

프라이빗 키가 손상된 경우

즉시 조치를 취합니다. 손상된 키는에서 제거할 때까지 전체 워크스페이스 액세스 권한을 부여합니다authorized_keys.

  1. 웹 브라우저 액세스(JupyterLab 또는 코드 편집기)를 통해 워크스페이스를 엽니다. 지침은 웹 브라우저 액세스 섹션을 참조하세요.

  2. 에서 손상된 키를 제거합니다authorized_keys.

    # View all authorized keys cat ~/.ssh/authorized_keys # Option A: Edit directly nano ~/.ssh/authorized_keys # Option B: Remove all keys and re-add only trusted ones > ~/.ssh/authorized_keys echo "ssh-ed25519 AAAA...new-trusted-key..." >> ~/.ssh/authorized_keys
  3. 손상된 키와 연결을 시도하여 더 이상 작동하지 않는지 확인합니다. 를 수신해야 합니다Permission denied (publickey).

  4. 웹 브라우저 액세스를 통해 워크스페이스에 액세스할 수 없는 경우 클러스터 관리자에게 문의하여 포드를 실행하고 authorized_keys 직접 지웁니다.

모범 사례

연습 이유
ed25519 키 사용 RSA보다 더 짧고 빠르며 안전함
프라이빗 키에 암호 사용 키 도용으로부터 보호합니다. 도난당한 경우에도 암호 없이 키를 사용할 수 없습니다.
디바이스당 키 1개 다른 디바이스에 영향을 주지 않고 단일 디바이스의 액세스를 더 쉽게 취소
프라이빗 키 공유 안 함 각 사용자와 디바이스에는 자체 키 페어가 있어야 합니다.
authorized_keys 주기적으로 검토 더 이상 사용하지 않는 디바이스의 키 제거

직접 SSH 액세스 취소

Direct SSH를 비활성화한 후 열린 보안 그룹 규칙을 벗어나지 않으려면 세 단계를 순서대로 모두 완료하세요. 2단계를 건너뛰지 마십시오.

액세스를 취소하기 전에 사용자에게 알립니다.

액세스를 취소하기 전에 사용자에게 알립니다. ExternalDNS는 3단계 후 약 30초 이내에 DNS 레코드를 제거하여 새 연결을 차단합니다.

1단계: 차트 Helm에서 비활성화

추가 기능 구성 파일에서 directSSH 섹션을 완전히 제거합니다. Helm은 키가 없는 false 경우 기본적으로 directSSH.enabled로 설정됩니다.

jupyter-k8s-aws-hyperpod: clusterWebUI: enabled: true domain: "<DOMAIN_NAME>" ... # directSSH section removed

또는를 명시적으로 설정합니다enabled: false.

directSSH: enabled: false

2단계: 보안 그룹 인바운드 규칙 제거

# Find the rule ID aws ec2 describe-security-group-rules \ --filters Name=group-id,Values=<SG_ID> \ --query 'SecurityGroupRules[?IpProtocol==`tcp` && FromPort==`<SSH_PORT>`].[SecurityGroupRuleId,CidrIpv4]' \ --output table \ --region <AWS_REGION> # Remove the rule aws ec2 revoke-security-group-ingress \ --group-id <SG_ID> \ --security-group-rule-ids <RULE_ID> \ --region <AWS_REGION>

3단계: 클러스터에 적용

aws eks update-addon \ --cluster-name <CLUSTER_NAME> \ --addon-name amazon-sagemaker-spaces \ --configuration-values file://addon-config.yaml \ --resolve-conflicts OVERWRITE \ --region <AWS_REGION>

이 명령을 실행하면 모든 워크스페이스에 대한 헤드리스 서비스가 제거됩니다. 그런 다음 ExternalDNS는 약 30초 이내에 Route 53 A 레코드를 삭제합니다. ExternalDNS가 레코드를 제거한 후에는 새 SSH 연결이 더 이상 워크스페이스 호스트 이름을 확인할 수 없습니다.

취소 후 발생하는 일

구성 요소 취소 후 상태
DNS 레코드 ExternalDNS는 약 30초 이내에 이를 제거합니다. 새 연결은 워크스페이스 호스트 이름을 확인할 수 없습니다.
SG 인바운드 규칙 2단계 후에 닫힙니다. 포트에 도달하는 네트워크 경로가 없습니다.
새 SSH 연결 차단됨. 호스트 이름이 더 이상 확인되지 않고 SG 규칙이 포트를 닫습니다.
워크스페이스 데이터(PVC) 영향을 받지 않습니다. PVC는 파일, authorized_keys 및 호스트 키를 보관합니다.

문제 해결

증상 원인 수정
NXDOMAIN DNS가 해결되지 않음 호스팅 영역이 있는지, VPC가 연결되어 있는지, ExternalDNS가 실행 중인지 확인
Connection timed out SG 차단: 규칙이 잘못된 SG에 추가되거나 완전히 누락됨 OverrideVpcConfig 인스턴스 그룹을 확인합니다(관리자 1단계). TCP 인바운드 규칙이 소스 CIDR을 포함하는지 확인합니다.
Connection refused sshd가 실행되지 않음 스페이스가 실행 중 상태이고 활성화directSSH되었는지 확인
Permission denied (publickey) 에 없는 키 authorized_keys 웹 브라우저 액세스 또는 kubectl을 통해 퍼블릭 키 추가(최종 사용자 2단계)
Host key changed 경고 스페이스가 다시 생성됨(새 포드, 새 호스트 키) 클라이언트 시스템에서: ssh-keygen -R <hostname> 그런 다음 다시 연결
Stale DNS records after space deletion 에서 실행 중인 ExternalDNS --policy=upsert-only ExternalDNS 배포를 로 업데이트--policy=sync하고를 추가합니다--txt-owner-id=<cluster-name>. 기존 오래된 레코드를 수동으로 정리합니다. aws route53 list-resource-record-sets --hosted-zone-id <ZONE_ID>
IDE: "연결을 설정할 수 없음" sshd가 아직 준비되지 않음 워크스페이스 생성 후 60~90초 동안 기다린 다음 다시 시도하세요.
IDE: "VS Code Server 설치"에서 중단 Workspace에 인터넷 액세스 권한이 없음 워크스페이스는 첫 번째 연결 시 외부 호스트에서 VS Code 서버 바이너리를 다운로드합니다. 워크스페이스가 에어 갭인 경우 관리자에게 문의하세요.
IDE: Permission denied IdentityFile 경로 불일치 터미널 SSH가 먼저 작동하는지 확인한 다음에서 IdentityFile을 확인합니다. ~/.ssh/config
IDE: 유휴 후 연결이 끊어짐 keepalive가 구성되지 않음 ServerAliveInterval 15 및를 ServerAliveCountMax 3에 추가 ~/.ssh/config

(선택 사항) 사전 조건 설정

웹 브라우저 액세스가 아직 활성화되지 않았거나 ExternalDNS 구성을 확인하거나 업데이트하는 경우에만이 섹션을 사용합니다.

처음부터 설치

웹 브라우저 액세스가 아직 구성되지 않은 경우 Direct SSH를 활성화하기 전에 다음이 필요합니다.

  1. Route 53 호스팅 영역 - Route 53에 등록된 소유 도메인 또는 하위 도메인

  2. 외부 DNS - Route 53 권한이 있는 IAM 역할을 사용하여 EKS 추가 기능을 통해 배포됨

  3. AWS Load Balancer 컨트롤러 - 웹 브라우저 액세스(ALB 수신)를 사용하는 경우 필요합니다. HyperPod별 설치 정보는 섹션을 참조하세요AWS Load Balancer서 컨트롤러: HyperPod vpcId 요구 사항.

  4. VPC 연결 - 클라이언트 시스템에서 VPC로 VPN 또는 Direct Connect

추가 종속성 및 웹 브라우저 액세스 구성 단계는 섹션을 참조하세요SageMaker AI Spaces 추가 기능 설치.

AWS Load Balancer서 컨트롤러: HyperPod vpcId 요구 사항

standard AWS Load Balancer Controller 설치 설명서에는 vpcId 파라미터가 언급되어 있지 않습니다. HyperPod 클러스터에서를 생략vpcId하면 설치가 실패합니다. 명시적으로 제공해야 합니다.

VPC ID를 가져옵니다.

aws sagemaker describe-cluster \ --cluster-name <HYPERPOD_CLUSTER_NAME> \ --region <AWS_REGION> \ --query 'VpcConfig.VpcId' \ --output text

필요한 HyperPod 파라미터를 사용하여를 설치합니다.

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=<EKS_CLUSTER_NAME> \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller \ --set enableServiceMutatorWebhook=false \ --set vpcId=<VPC_ID>
파라미터 HyperPod에 필요한 이유
vpcId HyperPod VPC는 컨트롤러에서 자동으로 검색할 수 없습니다. 설치하지 않으면 설치가 실패합니다.
enableServiceMutatorWebhook=false 변형 웹후크가 HyperPod의 서비스 구성과 충돌합니다.
serviceAccount.create=false 설치하기 전에 올바른 IRSA 또는 Pod Identity 주석을 사용하여 서비스 계정을 미리 생성해야 합니다.

이 명령을 실행하기 전에 적절한 IAM 역할 주석을 사용하여 서비스 계정(aws-load-balancer-controller)을 생성합니다. IAM 정책 및 서비스 계정 생성 단계에 대한 자세한 내용은 Amazon EKS 사용 설명서의 Amazon EKS Load Balancer Controller IRSA 설정을 참조하세요.

ExternalDNS 구성

ExternalDNS는 Kubernetes 서비스를 DNS 공급자와 동기화합니다. 프로덕션 환경에서 Amazon Route 53과 함께 사용할 때 다음 설정으로 ExternalDNS를 구성합니다.

ExternalDNS에는 동기화 정책이 필요합니다.

를 사용하여 ExternalDNS를 구성해야 합니다--policy=sync.

기본적으로 ExternalDNS는를 사용합니다--policy=upsert-only. 이렇게 하면 DNS 레코드가 생성 및 업데이트되지만 삭제되지는 않습니다. 워크스페이스를 삭제하면 Amazon Route 53의 A 및 TXT 레코드가 오래된 항목으로 유지됩니다.

테스트--policy=upsert-only에만를 사용하고 프로덕션--policy=sync에는 로 변경합니다. 또한 플래그를 설정해야 합니다.이 --txt-owner-id 플래그는 자신이 소유한 레코드와 정리 시 삭제할 레코드를 ExternalDNS에 지시합니다.

다음 인수를 사용하여 ExternalDNS 배포를 구성합니다.

--provider=aws --source=service # watches Services (required for headless Services) --domain-filter=<ROUTE53_HOSTED_ZONE> # restricts ExternalDNS to your hosted zone only --policy=sync # enables deletion of stale records on space deletion --txt-owner-id=<CLUSTER_NAME> # identifies which records this ExternalDNS instance owns

앞의 인수에서 다음 값을 바꿉니다.

  • <ROUTE53_HOSTED_ZONE> - Amazon Route 53 프라이빗 호스팅 영역 도메인(예: workspaces.internal)

  • <CLUSTER_NAME> - EKS 클러스터 이름(예: my-hyperpod-cluster)

현재 ExternalDNS 정책을 확인하려면 다음 명령을 실행합니다.

kubectl get deployment -n kube-system external-dns \ -o jsonpath='{.spec.template.spec.containers[0].args}' | tr ',' '\n' | grep -E 'policy|owner|source|domain'