글
쿠버네티스 좀비파드 저격용 파이썬 스크립트
IT/AWS Lambda & Resources Trouble Shooting
2020. 10. 21. 08:00
반응형
쿠버네티스 COP를 토대로, CICD를 운영하다보면 간혹 이런 현상이 나타날 때가 있습니댜
- 예를 들면.... CICD 중도 파이프라인 강제종료 (웹 통신에서 Broken Pipe 격)
앙몬드는 젠킨스를 이용한 CI & CD를 주로 사용했는데, 젠킨스 잡이 끊어지면, CD 과정이 꺠지기에, 배포 정합성이 어긋나게 되는 케이스가 발생합니댜
- ex) 블루 live / 그린 live / 쿠버프록시 스위치 미실행
따라서, 블루 & 그린 양쪽 사이드의 파드가 동시에 실행되고 있으나, 실제 요청은 블루 사이드로만 리퀘스트가 라우트
이에 대한 검증으로, 좀비 파드를, 쿠버프록시 기준으로 색출하는 작업이 필요
간단하게 파이썬으로 작성해본, 쿠버프록시 기준 좀비파드 색출 스크립트입니댜
import boto3
import time
import os
import decimal
import sys
import subprocess
from decimal import Decimal
from datetime import datetime, timedelta
from collections import deque
"""
쿠버프록시 to 파드 매핑 출력 스크립트
- 블루/그린 파드 동시 live시, 한쪽 사이드 저격용
@since 2020-07-27
@author angmond
[2020-07-27] 최초생성 (angmond)
"""
print("[K8S 시스템 스크립트 - 쿠버프록시 to 파드 매핑 출력 스크립트 ")
print("\n\n")
"""(1) 네임스페이스 아규먼드 분리 """
namespace = sys.argv[1]
print("입력 네임스페이스 : " + namespace)
"""(2) 쿠버 네임스페이스에 속하는 전체 파드 출력"""
all_pods = subprocess.check_output("kubectl get pod --namespace " + namespace, shell=True, universal_newlines=True)
list_pods = str(all_pods).split("\n")
list_pods_name_and_status = []
for idx, value in enumerate(list_pods) :
if idx is 0:
continue
sublist = " ".join(value.split())
if sublist is "":
continue
pod_name = sublist.split(" ")[0]
pod_status = sublist.split(" ")[2]
list_pods_name_and_status.append(pod_name + " / " + pod_status)
"""(3) 현재 서비스파드 (쿠버프록시) 전체 조회 """
all_kube_proxy = subprocess.check_output("kubectl describe svc --namespace " + namespace + " | grep Selector", shell=True, universal_newlines=True)
list_raw_kube_proxy = str(all_kube_proxy).split("\n")
list_kube_proxy = []
for idx, value in enumerate(list_raw_kube_proxy):
sublist = " ".join(value.split())
if sublist is "":
continue
service_name_and_route_pod_info = sublist.split(" ")[1]
service_name_and_route_pod_info = service_name_and_route_pod_info.replace("name=", "")
service_name_and_route_pod_info = service_name_and_route_pod_info.replace(",version=", "-")
list_kube_proxy.append(service_name_and_route_pod_info)
"""(4) 쿠버 프록시 리스트를 기준으로, 매핑되는 동일네임 파드를 출력한다 """
list_kube_proxy.sort()
list_complete_route_proxy = []
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("++++++++++++++++Kube-proxy -> Pod Mapping Info++++++++++++++++")
for proxy_info in list_kube_proxy:
list_abnormal_pod = []
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
for pod_info in list_pods_name_and_status:
if proxy_info in pod_info:
kube_proxy_pod_set = proxy_info + " -> " + pod_info
list_complete_route_proxy.append(kube_proxy_pod_set)
print("+++ " + kube_proxy_pod_set)
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("\n\n")
print("++++++++++++++++++++++++[비정상 파드 탐색]++++++++++++++++++++++++")
"""(5) 쿠버프록시와 매핑되지 않은, 비정상 파드를 출력한다. """
for pod_info in list_pods_name_and_status:
is_pod_not_mapped = True
for mapped_info in list_complete_route_proxy:
if pod_info in mapped_info :
is_pod_not_mapped = False
break
if is_pod_not_mapped :
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print(f"+++ {pod_info} ")
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("++++++++++++++++++++++++[비정상 파드 종료]++++++++++++++++++++++++")
반응형
'IT > AWS Lambda & Resources Trouble Shooting' 카테고리의 다른 글
AWS EKS PLEG이슈 (0) | 2020.10.28 |
---|---|
AWS 엘라스틱서치 스냅샷/특정인덱스 를 복원하는 람다 (0) | 2020.10.26 |
파이썬3를 이용한, AWS ES 인덱싱 코드 예시 (0) | 2020.10.21 |
boto3 를 이용하여, AWS 로컬스택 아키텍처 구성해보기 (0) | 2020.10.16 |
키네시스 샤드 input event driven 인/디코딩 데이터 정제 람다함수 (0) | 2020.10.16 |