EKS-NodeLess-03-Karpenter-01-intro

NodeLess 컨셉에서 제일 중요한 역할을 맡고 있는 Karpenter 다. Karpenter 의 기본적인 아키텍처 부터 리뷰해볼까 한다. 그렇다면 그전에 Cluster Autoscaler 부터 설명해야 한다. Cluster Autoscaler 는 보통 CA라 부른다. 간략하게 플로우를 설명하겠다. Kubernetes에 새로운 Pod 가 프로비저닝 되었을때 Pod는 노드그룹에 스케줄링 된다. 노드그룹에 자원이 부족하면 CA가 트리거 된다. CA는 AWS 의 ASG에 새로운 로드를 요청한다. ASG는 새로운노드를 생성하고 노드그룹에 추가한다. 새로 스케줄링된 노드에 Pod가 생성된다. 생략된 단계가 있지만 실제로 이 단계를 모두 거쳐야 인스턴스가 EKS에 연결되고 노드그룹에 인스턴스가 노출된다. 그렇다면 단순히 ASG에서 노드를 제거해본 경험이 있는가? 있다면 알것이다. 이건 가끔 커피한잔하고 와도 제거안된 인스턴스가 있는 경우도 있다. ...

May 12, 2023 · 1 min · 📁 AWS, Kubernetes · 🏷️ EKS, nodeless, karpenter

EKS-NodeLess-02-Fargate

# k get pod -A -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES default nginx-pod 1/1 Running 0 11m 192.168.12.217 ip-192-168-12-150.ap-northeast-2.compute.internal <none> <none> karpenter karpenter-5bffc6f5d8-6f779 1/1 Running 0 125m 192.168.12.99 fargate-ip-192-168-12-99.ap-northeast-2.compute.internal <none> <none> karpenter karpenter-5bffc6f5d8-84mjn 1/1 Running 0 130m 192.168.11.201 fargate-ip-192-168-11-201.ap-northeast-2.compute.internal <none> <none> kube-system aws-node-h5z8d 1/1 Running 0 11m 192.168.12.150 ip-192-168-12-150.ap-northeast-2.compute.internal <none> <none> kube-system coredns-fd69467b9-4nk6x 1/1 Running 0 127m 192.168.12.52 fargate-ip-192-168-12-52.ap-northeast-2.compute.internal <none> <none> kube-system coredns-fd69467b9-cqqpq 1/1 Running 0 125m 192.168.11.122 fargate-ip-192-168-11-122.ap-northeast-2.compute.internal <none> <none> kube-system kube-proxy-z8qlj 1/1 Running 0 11m 192.168.12.150 ip-192-168-12-150.ap-northeast-2.compute.internal <none> <none> 먼저 예제를 보여준다. NodeLess EKS 컨셉의 기반이다. nginx-pod / aws-node-h5z8d / kube-proxy-z8qlj 는 카펜터가 만든 노드위에 올라가 있다. ...

May 7, 2023 · 2 min · 📁 AWS, Kubernetes · 🏷️ EKS, nodeless, fargate

EKS-NodeLess-01-CoreDNS

EKS의 관리영역중 Addon 이나 필수 컴포넌트중에 Node에서 동작해야하는 것들이 있다. 이 경우에 NodeGroup을 운영해야한다. NodeGroup에 여러 파드들이 스케줄링되고 관리형 Pod들은 다른 서비스에 운영되는 NodeGroup과 섞여서 스케줄리되어야 하는데, 이것의 가장큰 문제는 Node의 사망이 기능의 장애로 이어진다는 점이다. 따라서 Node를 전용 Node로 사용하면 좋은데 아주작은 노드를 스케줄링한다고 해도 관리되어야 하는 대상이 됨은 틀림없고, 노드를 정해서 사용해야 하는 문제점들이 생기게된다. 이러한 문제를 해결하기에 EKS에서는 Fargate가 있다. 1Node - 1Pod 라는게 아주 중요한 포인트다. ...

May 6, 2023 · 1 min · 📁 AWS, Kubernetes · 🏷️ EKS, fargeate, coredns

AWS-SQS-터져랏

일단 SQS를 터질때 까지 밀어넣어 보기로 했다. 목표 메시지수는 100만건. 100만건의 메시지를 100초안에 SQS에 넣는게 목표다. TPS 10000 이라는 소리다. 목표를 이루기위해선 첫번째 SQS의 TPS는 3000이다. 초당 3000의 메시지를 넣을수 있다. 먼저 큐를 4개를 만들었다. 목표수치에 가려면 TPS가 10000은 나와야한다. 그렇다면 큐를 병렬로 줄세운다 4개의 큐를 만든다. 이제 넣어봤다. import boto3 import json import uuid from concurrent.futures import ThreadPoolExecutor import random import string sqs = boto3.client('sqs') queue_urls = [ 'linuxer-sqs-1', 'linuxer-sqs-2', 'linuxer-sqs-3', 'linuxer-sqs-4' ] def random_string(length): return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) def create_dummy_data(): return { 'id': str(uuid.uuid4()), 'data': f"host-{random_string(5)}-count", 'padding': random_string(10 * 1024 - 100) # 10KB 크기의 더미 데이터를 생성 } def send_message_batch(queue_url, messages): entries = [] for idx, message in enumerate(messages): entries.append({ 'Id': str(idx), 'MessageBody': json.dumps(message) }) response = sqs.send_message_batch( QueueUrl=queue_url, Entries=entries ) return response def generate_and_send_dummy_data(num_messages=100000, batch_size=10, num_threads=10): with ThreadPoolExecutor(max_workers=num_threads) as executor: for _ in range(num_messages // (batch_size * num_threads * len(queue_urls))): batch_futures = [] for queue_url in queue_urls: messages = [create_dummy_data() for _ in range(batch_size)] future = executor.submit(send_message_batch, queue_url, messages) batch_futures.append(future) for future in batch_futures: future.result() if __name__ == '__main__': generate_and_send_dummy_data() 대충 이코드는 TPS 100 정도이다. ...

April 27, 2023 · 6 min · 📁 AWS · 🏷️ SQS, python, 터저라시냅스

CLOUDNET@ AWS네트워킹 강의 나눔이벤트

이번에 CLOUDNET@ 에서 인프런에 강의를 오픈했다. https://inf.run/Xpv1 1호 영업사원으로 뛰기로 말한 전적이 있기에 추첨으로 강의 나눔 이벤트를 했 총 60분이 참여해주셨고, 간단하게 코드를 짰다. import random def select_random_winner(filename): with open(filename, 'r', encoding='utf-8') as file: names = file.readlines() winner = random.choice(names).strip() return winner filename = "name_list.txt" winner = select_random_winner(filename) print(f"축하합니다! 상품 당첨자는 {winner}님입니다!") 랜덤으로 코드만들어서 돌렸다. python3 select_random_winner.py 축하합니다! 상품 당첨자는 김신님입니다! 김신님께서 당첨되셨다. 축하합니다!

April 16, 2023 · 1 min · 📁 기타

PKOS-5Week-Final!

마지막 주차이다. 5 주차는 보안 관련한 주제였다. 대표적으로 생각나는 쿠버네티스 보안 사건부터 이야기할까한다. 생각보다 많은 사람들이 쓰는 오픈소스중에 Rancher가 있다. Rancher가 설치된 클러스터에서 이상한 증상이 발생했다. 배포된 POD가 재대로 성능이 나지않고 WorkerNode의 CPU사용율이 굉장히 높았다. 클러스터 외부에서 원인을 파악할 수 없어서 결국 WokerNode에 SSH를 접속해서 확인했었다. WorkerNode에선 대량의 마이닝툴이 발견되었다. Pirvate 환경인데다가 외부에서 SSH도 불가능한 환경에서 발생한 침해사고라, 플랫폼의 문제로 대두되었다. 그러던 중 클러스터에서 동작중인 대시보드들을 확인하였다. 당시에는 다들 쿠버네티스에 익숙한 상황이 아니라서 확인이 좀오래 걸렸다. ...

April 7, 2023 · 4 min · 📁 Kubernetes · 🏷️ k8s, unsafe, privileged

PKOS-4Week

이번주 스터디는 K8S에서의 Pometheus Grafana 다. 이글은 chatgpt를 이용해서 삽질하는 리눅서를 담고있다. 프로메테우스는 아이콘이 불꽃 모양인데 정말 모니터링계에 불을 가져다준 혁신과도 같은 존재다. 이전에는 Nagios / Zabbix가 나눠먹고 있었다. 나는 이번에 뭘 모니터링 해볼까 고민하다가 HPA를 모니터링 해볼까한다. 먼저 내가 요즘 일하는 방식을 보여줄까한다. 바로 Chatgpt다. apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer ...

March 29, 2023 · 4 min · 📁 Kubernetes

Argo-WorkFlow/Events

이글은 Argo WorkFlow로 CI를 하려했던 나의 경험담을 담고있다. Argo WorkFlow를 쓰려고 결심하고 리서칭하는 중이라면 AirFlow가 있다. 돌아가라. Argo WorkFlow는 Flow마다 Pod를 생성한다. 그대가 원하는 패턴이 맞는지 다시한번 생각하라. 매 Flow 마다 Pod가 만들어 지는것이 맞는가? 그렇다면 맞다 Argo WorkFlow 다. 그럼다면 다시 묻는다 CI를 위해서 Argo를 찾는것인가? K8S에서 다양한 CRD에 익숙하고 강력한 러닝커브는 즐거움으로 생각되고 CNCF에 기여하는게 꿈이라면 말리지 않겠다. 잘왔다. Argo WorkFlow/Events다. 이 글에선 CI를 다룬다. 물론 글이 깊진 않다. 하지만 찍먹으론 충분한 수준으로 그대에게 전달할 것이다. 먼저 Argo-WorkFlow 를 설치해야한다. ...

March 21, 2023 · 6 min · 📁 Linux, Kubernetes

PKOS-kOps-2Week

ㅠㅠ 울고 시작하려한다. 스터디에 집중을 하려고 한다. 가시다님 그동안 숙제 너무 조금해서 죄송했어요...ㅠㅠ엉엉흑흑 일단 사과를 드리고 시작하며, 이제 살짝 각잡고 kOps 부터 설명하겠다. kOps는 Kubernetes Operations의 약자로, Kubernetes 클러스터를 AWS (Amazon Web Services)에서 손쉽게 설치, 업그레이드 및 관리할 수 있도록 해주는 오픈 소스 도구이다. Kops를 사용하면 CLI(Command Line Interface)를 통해 클러스터를 구성할 수 있으며, YAML 파일을 사용하여 쉽게 클러스터를 정의할 수 있다 Kops는 여러 가지 기능을 제공한다 클러스터 구성: Kops를 사용하여 Kubernetes 클러스터를 쉽게 구성할 수 있다. YAML 파일을 사용하여 클러스터 구성을 정의하고, AWS 리소스를 프로비저닝하고 구성을 배포한다. ...

March 16, 2023 · 2 min · 📁 Kubernetes

pod graceful shutdown

spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 resources: limits: cpu: 500m requests: cpu: 200m lifecycle: preStop: exec: command: ["/bin/sleep", "30"] . hpa 발생시 pod의 갑작스런 종료로 pod에 연결된 사용자가 502를 받게된다. 모든 리퀘스트를 처리 후에 종료되도록 30초간의 유예를 준다 설정 변경 lifecycle preStop 를 이용하여 우아한 종료를!

March 15, 2023 · 1 min · 📁 Kubernetes · 🏷️ lifecycle, preStop