쿠버네티스 일반

파이썬으로 여러 쿠버네티스의 클러스터 정보 가져오기

Jerry_이정훈 2022. 11. 5. 03:23
728x90
10개 클러스터를 운영하니 각각의 클러스터 버전을 체크하는 것도 일이다. 버전 정보야 간단히 shell로 가능한데 이번에는 파이썬 코드를 짜 보았다. 나는 시스템 운영자 출신이라 코딩은 손놓고 20년 살았다. 최근에 오래된 로그를 삭제하는 파이썬 코드를 고마운 팀분의 도움으로 작성했다. 안 잃어버릴 겸 해서 이번에도 익숙한 스크립트 대신 파이썬으로 만들었다. 아마도 허접한 코드일 것 같은데, 누군가에게는 도움이 될까 창피함을 무릅쓰고 공개한다.
# Need an aws_profile to access EKS
# Need kubectl, kubectl ctx tool

import os
import json

# Print each EKS version & total number of nodes
def print_eks_info(cluster, aws_profile):

    # AWS 2개의 계정을 사용하고 있어 계정에 따라 aws profile 분리가 필요합니다.
    os.environ['AWS_DEFAULT_PROFILE'] = aws_profile

    # Print cluster name
    print(cluster, end=', ')

    # Change kubectl context
    # remove stdout
    cmd = "kubectl ctx {0} >/dev/null 2>&1".format(cluster)
    os.system(cmd)

    # Save node list of json
    node_info = os.popen("kubectl get nodes -o json")
    node_info = node_info.read()

    # load json type variable as a list
    node_info = json.loads(node_info)
    eks_vesion = node_info['items'][0]['status']['nodeInfo']['kubeletVersion']

    # Print eks version
    print(eks_vesion, end=', ')

    #  Set nodegroup variable
    nodegroup = []

    for item in node_info['items']:
        nodegroup.append(item['metadata']['labels']['eks.amazonaws.com/nodegroup'])

    # total number of nodes
    num = len(nodegroup)
    print('{}대'.format(num))

    # 조금만 수정하면 각 클러스터의 노드 그룹 별 Spot 여부와 instance type을 출력할 수 있다.
    # print(item['metadata']['labels']['eks.amazonaws.com/nodegroup'], end=" ")
    # print(item['metadata']['labels']['eks.amazonaws.com/capacityType'], end=" ")
    # print(item['metadata']['labels']['beta.kubernetes.io/instance-type'])

# CSV 파일 포맷으로 출력하기 위해서 먼저 Column Header를 출력합니다.
# Column Name
print("EKS 이름, 버전, 노드 수량")

# List of switch, sentroid clusters
clusters_switch = ['kr-stage', 'jp-stage', 'oregon-stage', 'PROD-KR', 'PROD-JP', 'PROD-US', 'PROD-OREGON']
clusters_sentroid = ['saas-stage', 'PROD-SAAS', 'OREGON-SAAS']

# Set local AWS_DEFAULT_PROFILE as a function argument like 'switch-jerry', 'saas-devops'
for i in clusters_switch:
    print_eks_info(i, 'switch-jerry')

for i in clusters_sentroid:
    print_eks_info(i, 'saas-devops')
  • 함수의 인자로 클러스터 이름과 aws_profile 정보가 필요하다. 우리 회사는 한국, 일본, 미국 동부/서부 각 리전 별 10개의 클러스터가 있다. 비용을 분리하기 위해서 2개의 서로 다른 aws 계정을 사용하고 있다. 해당 aws_profile 정보를 전달해야 한다.
  • import os, import json
    파이썬은 고맙게도 os, json 모듈이 있어 os 출력 결과와 json 타입의 데이터를 처리하기가 용이하다. shell이면 아마 엄청 노가다 했어야 할 것 같은데 json 모듈 덕분에 오~ 이런것도 가능하구나 했다.
  • kubectl ctx
    kubectl을 사용하면 국룰인 kubectl ctx을 사용한다. 여러 쿠버네티스 클러스터를 쉽게 변경할 수 있다. k ctx, k ns, k ps 3총사는 기본이다.
  • os.popen, node_info.read()
    kubectl의 출력 결과를 json 형태로 보여줄 수 있는데(kubectl get nodes -o json) 그걸 파이썬으로 읽을 수 있다. 간단한 것 같은데 이런 걸 몰라서 한참 구글링했다.
  • node_info = json.loads(node_info)
    eks_vesion = node_info['items'][0]['status']['nodeInfo']['kubeletVersion']

    json이라 하나하나 depth를 내려가면 내가 원하는 쿠버네티스 버전 정보를 알 수 있다. 물론 버전 정보 이 외 필요한 다양한 정보를 얻을 수 있다. 이미지 버전 정보, 노드의 cpu/memory 수량 등 인자만 조금씩 변경하면 된다.
  • num = len(nodegroup), print('{}대'.format(num))
    노드의 수량 정보를 가져오기 위해서 파이썬 리스트 형태로 저장하고 리스트의 갯수(len)를 출력했다. cluster 정보를 모아 놓은 리소스가 있으면 좀 더 간략할 것 같은데, 그건 못 찾았다. 

이제 실행을 하면 10개 클러스터의 각각 버전 및 노드 갯수 가져오는 노가다를 줄일 수 있다.

별 정보는 아닌데 보안 상 ^^

조금 수정하면 노드 그룹 별 노드 수량, 인스턴스 타입 등을 뽑을 수 있어 노드 수량 줄이는 데 사용할 수 있다. 그리고 각 클러스터 별 이미지 정보도 뽑을 수 있어 리전 별, Stage/Prod 별 버전 차이도 확인할 수 있을 것 같다.

반응형

'쿠버네티스 일반' 카테고리의 다른 글

GitOps 기반 시스템 운영  (0) 2023.03.11
EKS 무중단 업그레이드 경험 공유  (1) 2023.03.10
EKS CSI Driver 설치  (2) 2022.06.15
Strimzi Kafka Operator - Kafka 토픽 생성  (0) 2022.06.12
Strimzi Kafka Operator 실습  (0) 2022.06.10