내용으로 건너뛰기

Karpenter로 생성되는 인스턴스에 SSH 키 등록 방법

3분 분량
콘텐츠 수준: 중급
2

Karpenter에서는 SSM 사용을 권장하고 있습니다. 다만, 환경에 따라 SSH를 사용해야할 수 있습니다. 해당 글에서는 Karpenter의 EC2NodeClass에서 사용자 데이터를 수정하여 SSH 키를 자동으로 등록하는 방법에 대해 설명합니다.

Karpenter에서 공식적으로 SSH 키를 등록하는 기능을 제공하고 있지 않습니다. Karpenter에서는 SSM을 통해 노드에 접근하는 것을 권장하지만, 특정 상황에서는 SSH를 통해 접근해야 할 수도 있습니다.

예시

SCP(Secure Copy Protocol)를 사용하여 인스턴스의 파일을 다른 호스트로 복사 Ansible등의 도구에서 SSH를 통해 인스턴스 관리

다음은 Karpenter에서 사용자 데이터를 활용하여 자동으로 SSH 키를 등록하는 방법입니다.

사전 조건

1. 사용하려는 SSH 키의 공개 키

EC2 콘솔에서 생성한 SSH 키에 대해 공개 키를 생성하는 방법은 다음과 같습니다.

ssh-keygen을 사용하여 퍼블릭 키 구성 요소를 검색하는 방법
$ ssh-keygen -y -f {EC2 프라이빗 키}
AWS CLI를 사용하여 퍼블릭 키 구성 요소를 검색하는 방법
$ aws ec2 describe-key-pairs \
    --key-names {EC2 프라이빗 키} \
    --include-public-key \
    --query "KeyPairs[].PublicKey"

2. Karpenter 노드의 보안 그룹에서 SSH에 대한 인바운드 규칙 허용

SSH는 일반적으로 22번 포트를 사용합니다.
Karpenter 노드의 보안 그룹에서 SSH를 위한 적절한 인바운드 규칙을 설정해야 SSH를 통한 접근이 가능합니다.

Karpenter 노드의 SSH 설정 방법

다음 예시는 Karpenter 공식 문서의 Userdata 활용 방법AL2023에서 Userdata 예시를 참고하였으며
AL2023 기반으로 설정한 것입니다.

---
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: al2023
  annotations:
    kubernetes.io/description: "EC2NodeClass for running Amazon Linux 2023 nodes with custom user data"
spec:
  role: "KarpenterNodeRole-${CLUSTER_NAME}" # replace with your cluster name
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: "${CLUSTER_NAME}" # replace with your cluster name
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: "${CLUSTER_NAME}" # replace with your cluster name
  amiSelectorTerms:
    - alias: al2023@latest # Amazon Linux 2023
  userData: |
    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary="//"

    --//
    Content-Type: text/x-shellscript; charset="us-ascii"

    #!/bin/bash
    echo "ssh-rsa AAAAB...VvhffSqnlXr" >> /home/ec2-user/.ssh/authorized_keys
    --//

이 때, 공개 키를 직접적으로 EC2NodeClass Yaml에 작성하는 것이 아닌 SSM 파라미터 스토어에 저장하여 사용할 수 있습니다.

이러한 예시는 다음과 같습니다.

---
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: al2023
  annotations:
    kubernetes.io/description: "EC2NodeClass for running Amazon Linux 2023 nodes with custom user data"
spec:
  role: "KarpenterNodeRole-eks-1-32-karpenter"
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: "eks-1-32-karpenter"
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: "eks-1-32-karpenter"
  amiSelectorTerms:
    - alias: al2023@latest # Amazon Linux 2023
  userData: |
    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary="//"

    --//
    Content-Type: text/x-shellscript; charset="us-ascii"

    #!/bin/bash
    aws ssm get-parameter --name {parameter-name} --region {region} --with-decryption --query "Parameter.Value" --output text >> /home/ec2-user/.ssh/authorized_keys
    --//

상기의 예시에서 {parameter-name}과 {region}은 공개 키를 저장한 항목에 따라 변경하여 사용할 수 있습니다.

이러한 EC2NodeClass를 NodePool에서 사용하도록 설정한 후 이를 기반으로 Karpenter에서 노드를 생성할 경우
노드 부트스트랩 과정에서 SSH 키가 EC2 인스턴스에 등록되게 됩니다.

이후 해당 SSH키를 통해 EC2 인스턴스에 접속할 수 있으며,
인스턴스에서 다음 명령어를 통해 등록된 키를 확인할 수 있습니다.

$ cat /home/ec2/.ssh/authorized_keys
ssh-rsa AAAAB...VvhffSqnlXr
AWS
지원 엔지니어
게시됨 8달 전432회 조회
1 댓글

유용한 정보 감사합니다.

AWS
답글을 게시함 8달 전

관련 콘텐츠