본문 바로가기
AWS

[EKS] Python 코드로 EKS 클러스터 접근하기

by HH_g 2024. 9. 29.

파이썬 코드로 EKS 클러스터에 접근하기 위해서는 Kubernetes 클라이언트를 설정해주어야 합니다. 아래 방법으로 Lambda에서 AWS EKS 클러스터에 안전하게 연결하고 클러스터와의 통신을 자동화할 수 있게 했습니다.

  • AWS의 SSM Parameter Store에서 EKS 클러스터에 대한 정보를 가져오고, STS 토큰을 생성하여 Kubernetes 클라이언트를 설정합니다.
  • 템플릿을 사용해 Kubernetes 구성 파일을 생성하고, config.load_kube_config를 호출해 Kubernetes API와 상호작용할 수 있는 클라이언트를 준비합니다.

아래는 구성했던 방법입니다.

 

1. Kubernetes 클러스터 연결을 위한 YAML 템플릿

TEMPLATE = """
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: $ca_auth_data
    server: $cluster_endpoint
  name: $cluster_arn
contexts:
- context:
    cluster: $cluster_arn
    user: $cluster_arn
  name: $cluster_arn
current-context: $cluster_arn
kind: Config
preferences: {}
users:
- name: $cluster_arn
  user:
    token: $token
"""
 
  • 이 템플릿은 Kubernetes 클러스터에 연결할 수 있도록 구성 파일을 생성하기 위한 YAML 템플릿입니다. 이 템플릿에 필요한 변수들(예: 클러스터 ARN, 인증서, 토큰)을 삽입해 클러스터에 연결할 때 사용할 구성을 만듭니다.

 

2. load_kube_config 함수

def load_kube_config(region, env):
    # AWS SSM을 통해 클러스터 관련 정보 불러오기
    ssm = boto3.client("ssm")
    config_dir_path = f"/tmp/{env}/{region}"
    config_path = f"/tmp/{env}/{region}/config"
    makedirs(config_dir_path, exist_ok=True)

    # 클러스터 정보 가져오기
    ca_auth_data = ssm.get_parameter(Name=f"/kube/credentials/{env}/{region}/ca_auth_data", WithDecryption=True)["Parameter"]["Value"]
    cluster_endpoint = ssm.get_parameter(Name=f"/kube/credentials/{env}/{region}/cluster_endpoint", WithDecryption=True)["Parameter"]["Value"]
    cluster_arn = ssm.get_parameter(Name=f"/kube/credentials/{env}/{region}/cluster_arn", WithDecryption=True)["Parameter"]["Value"]
    cluster_name = cluster_arn.split("/")[-1]

    kube_config = {
        "ca_auth_data": ca_auth_data,
        "cluster_endpoint": cluster_endpoint,
        "cluster_arn": cluster_arn,
        "cluster_name": cluster_name,
        "region": region,
        "account_id": ACCOUNTS[env],
        "token": __get_eks_token(cluster_name, region),
    }
    
    __update_yaml_file(TEMPLATE, config_path, kube_config)
    config.load_kube_config(config_path)
    logger.info("Kubernetes config loaded")
  • AWS SSM Parameter Store에서 EKS 클러스터와 관련된 정보를 가져옵니다(인증서, 클러스터 ARN, 엔드포인트 등).
  • 가져온 정보를 이용해 TEMPLATE YAML 템플릿에 값을 채워 Kubernetes 클라이언트 구성 파일을 생성합니다.

 

3. __get_eks_token 함수

AWS EKS에서는 클러스터에 대한 API 호출을 인증하기 위해 JWT 토큰 기반의 인증을 사용합니다. 이를 위해 STS를 이용해 임시 자격 증명으로 인증을 수행하고, 이를 통해 생성된 URL을 JWT 형식으로 변환해 사용합니다.

def __get_eks_token(cluster_name, region):
    # STS로 EKS 클러스터 토큰 생성
    sts_token_expires_in = 60
    sts = boto3.client("sts", region_name=region)
    service_id = sts.meta.service_model.service_id
    session = boto3.session.Session()

    signer = RequestSigner(
        service_id, region, "sts", "v4", session.get_credentials(), session.events
    )

    params = {
        "method": "GET",
        "url": f"https://sts.{region}.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
        "body": {},
        "headers": {"x-k8s-aws-id": cluster_name},
        "context": {},
    }

    signed_url = signer.generate_presigned_url(params, region_name=region, expires_in=sts_token_expires_in, operation_name="")
    base64_url = base64.urlsafe_b64encode(signed_url.encode("utf-8")).decode("utf-8")

    return "k8s-aws-v1." + re.sub(r"=*", "", base64_url)
  • AWS STS(Secure Token Service)를 사용해 EKS 클러스터에 연결할 수 있는 Bearer 토큰을 생성합니다.
  • 이 토큰은 Kubernetes 클러스터와의 통신을 인증하는 데 사용됩니다.

 

4. __update_yaml_file 함수

EKS 클러스터에 연결할 때, 클러스터의 ARN, 인증서, 엔드포인트, Bearer 토큰 등을 포함한 YAML 형식의 구성 파일이 필요합니다. 이 함수는 그 구성을 파일로 저장합니다.

def __update_yaml_file(template, output_file, variables):
    formatted_template = Template(template).safe_substitute(variables)
    with open(output_file, "w", encoding="utf-8") as file:
        ctx = yaml.safe_load(formatted_template)
        yaml_data = yaml.dump(ctx)
        file.write(yaml_data)
  • 템플릿 YAML 파일에서 변수를 치환하여 Kubernetes 클라이언트가 사용할 구성을 만듭니다.

 

5. setup_kubernetes_client 함수

 

Kubernetes 클라이언트를 설정하는 메인 함수로, 클라이언트를 안전하게 설정하고 필요 시 오류를 처리하기 위한 구조입니다.

def setup_kubernetes_client(region, env):
    try:
        load_kube_config(region, env)
        return True
    except Exception as e:
        logger.error(f"Error setting up Kubernetes client: {e}")
        return False
  • load_kube_config 함수를 호출해 Kubernetes 클라이언트를 설정합니다. 실패 시 오류를 로깅합니다.

'AWS' 카테고리의 다른 글

[EKS] PVC 로 EBS 동적 프로비저닝하기  (0) 2024.09.29
[AWS] SSM, KSM  (1) 2024.09.29
[AWS] Assume role  (0) 2024.09.29
[AWS] EBS EFS 선택 기준  (0) 2024.09.17
[EKS 모범 사례] 스케쥴링/probe  (0) 2024.08.10