본문 바로가기

테스트/TestCase

TCP IP InputStream, OutputStream 테스트 with EKS

무식하면 용감하다고, ㅋㅋㅋ

로컬 환경에서 TCP/IP 테스트 한다고 별도의 애플리케이션으로 서버 클라이언트 만들고, 별도의 포트로 찌르고 받는거 테스트한다고 총 4개의 애플리케이션을 띄웠다. 이게 하나의 프로그램으로 끝낼수 있을거 같은데 시간이 없어서 그것까지는 못하겠고, 당장 지금 해야되니까 ㅋㅋㅋ

일단 논리적으로 당연히 가능하다고 생각은한다.

일단 하려는것은 아래와 같다.(대충 그려보자. 시간이 없으니께)

3분만에 완성된 플로우

일단, 하려는것은 아래와 같다.

간단히 설명하자면 하나의 파드에서 2개의 작업이 TCP/IP로 이루어 져야한다.

하나는 5000번으로 받는 InputStream이고 하나는 6300으로 보내는 OutPutStream 이다.

일단 현재는 하나씩 단방향으로 세팅을 했지만 결국 단반향이 된다는건 양방향이 된다는것과 마찬가지 이므로 나중에 양방향도 테스트를 해야한다. (왜 이런 짓? 을 하냐면 내가 가이드를 제시해야 하는 입장이라... 나도 받아서 하고싶다... ing)

그래서 구성한 테스트 구성도 아키는 아래와 같다. 이것도 2분컷으로 빨리 그리자 아아아아ㅏㅏㅏㅏㅏㅏㅏㅏ

시간이 없다구우우우우우우

그리고 나서 보니까 바뀐게 별로 없는거 같은데? 응응

음 그러면 일단 NLB 엔드포인드로 각각의 리스너 포트로 찔러보면 되겠구먼

자 올려봅시다.

일단

예전에 올렸던게 있으니까 아래 링크 참고 해서 올려봅시다.

https://may9noy.tistory.com/1633

 

SpringBoot TCP, HTTP 테스트

# spring boot 간단하게 hello word 띄우기 1. start.spring.io/ 접속 2. 디펜던시 에서 Spring Web 추가 3. Generate 클릭 후 프로젝트 생성 후 압축해제 4. 인텔리j로 프로젝트 오픈 5. 아레 코드 입력 후 실행 package

may9noy.tistory.com

올리면 일단, 아 렉걸림 노트북 인텔리제이 안꺼짐 ~~ 살려주세요.

어떻게든 끄고

올려봅시다.

아 위의 링크 아님 아래것임. 위의 링크는 그냥 ec2에서 gradle 빌드하는거고 아래링크가 docker로 말아서 올리는거.

https://may9noy.tistory.com/1562

 

Springboot "helloword" 띄우기 with docker, pod

# spring boot 간단하게 hello word 띄우기 1. start.spring.io/ 접속 2. 디펜던시 에서 Spring Web 추가 3. Generate 클릭 후 프로젝트 생성 후 압축해제 4. 인텔리j로 프로젝트 오픈 5. 아레 코드 입력 후 실행 package

may9noy.tistory.com

자 총 2개의 레포지토리 생성 완료, 태그 다르게 달면 서비스 별도로 실행가능

deployment.yaml 만들어보까

아니 그전에 namesapce를 만들자

kubectl create ns tcpip

deployment.yaml

이미지 주소 방금 생성한 ecr 주소로 하는거 잊지말기

아 그리고 참고로 서비스에서 지정한 targetPort와 컨테이너에서 사용하는 ContainerPort가 일치하지 않는다면, 서비스는 해당 컨테이너로 트래픽을 전달할 수 없기에 에러가 발생 한다. 참고!

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tcpip
  namespace: tcpip
  labels:
    app: tcpip
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tcpip
  template:
    metadata:
      labels:
        app: tcpip
    spec:
      containers:
      - name: tcpip
        image: 11111111111.dkr.ecr.ap-northeast-2.amazonaws.com/test1:ver-01
        ports:
        - containerPort: 5000

service.yaml

nlb 니께 아래처럼

apiVersion: v1
kind: Service
metadata:
  name: tcpip
  namespace: tcpip
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  selector:
     app: tcpip
  type: LoadBalancer
  ports:
  - port: 5000
    protocol: TCP
    targetPort: 5000

하나의 NLB에서 여러개의 서비스를 등록해서 사용하려면 아래처럼 해야되고, 일단 시간 없으니까 패스

https://may9noy.tistory.com/1161

 

EKS에 NLB 적용시 리스너 여러개 등록하기

# EKS에서 NLB 적용시 리스너를 여러개 등록하는 과정을 알아보자. 1. TargetGroupBinding을 활용한 구현 - 설치하기 kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master" kubectl get crd

may9noy.tistory.com

무식하게 NLB 한개더 만들어버리자 시간이 없으니까

6300 deployment.yaml 하고 service.yaml은 위에서 생성한 deployment.yaml, service.yaml 하고 같은데 단지 포트랑 이미지 주소만 바꿔주면 된다.

그러면 아래와 같이 2개의 pod와 service가 각각 생성되었다. (시간 있을때 하나에 합쳐서 구성을 해보자...일단 테스트가 급하니께)

C:\Users\김승현\eks_tcp_ip>kubectl get pod -n tcpip & kubectl get svc -n tcpip
NAME                       READY   STATUS    RESTARTS   AGE
tcpip-01-cf799dc7c-kqhgf   1/1     Running   0          2m31s
tcpip-558877675-2c8mz      1/1     Running   0          22m
NAME       TYPE           CLUSTER-IP      EXTERNAL-IP                                           PORT(S)          AGE
tcpip      LoadBalancer   172.20.23.156   k8s-tcpip-tcpip-.elb.ap-northeast-2.amazonaws.com     5000:30815/TCP   22m
tcpip-01   LoadBalancer   172.20.147.88   k8s-tcpip-tcpip01-.elb.ap-northeast-2.amazonaws.com   6300:30887/TCP   2m25s

AWS 리소스 확인, 테스트 시간이 없어서 2개의 NLB를 막 생성해서 진행함 흠흠 이러면 안됨. 하나의 NLB에서 생성해서 리소스를 줄여야 함. 왠만하면 테라폼으로 만들어서 테스트 권장.

테스트 헷갈려서 app port : tcp port로 태그 달아버림

아 NLB 때문에 해멧다.

이게 위의 service.yaml로 서비스로 생성하면 예전에는 그냥 internet-facing으로 만들어 줬던거 같은데.

이제는 기본이 internal이네... 아무리 봐도 이상한게 없어서 nlb를 봤더니 internal...

새로운 어노테이션 먹여서 다시 생성하자.

참고로 target-type을 ip로 하면 새로운 ip를 생성하면서 타겟이 등록된다.

Instance는 인스턴스 단위로 타겟이 등록된다. 참고~~!!

인스턴수가 구성하기에 편하다. 암튼 인프라 구성에 맞게 만들면 된다.ㅏㅏㅏ

apiVersion: v1
kind: Service
metadata:
  name: tcpip-01
  namespace: tcpip
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-name: nlb-6300
    service.beta.kubernetes.io/target-group-name: nlb-6300-tg
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip or instance
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
  selector:
     app: tcpip-01
  type: LoadBalancer
  ports:
  - port: 6300
    protocol: TCP
    targetPort: 6300

그리고 pod에 포트 여러개 뚫어줄거면 아래처럼 해주면 된다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tcpip-01
  namespace: tcpip
  labels:
    app: tcpip-01
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tcpip-01
  template:
    metadata:
      labels:
        app: tcpip-01
    spec:
      containers:
      - name: tcpip-01
        image: 1111111111111.dkr.ecr.ap-northeast-2.amazonaws.com/test1:8888-6443
        ports:
        - containerPort: 8888
          name: app-port
          protocol: TCP
        - containerPort: 6300
          name: tcp-port
          protocol: TCP

삽질끝에 알아낸 사실

첫번째, TCP/IP는 Target-Type을 ip로 해야된다.

두번째, NLB를 생성하면 Internet-facing 이여도 Private 서브넷에 물려있는 경우가 있다.

Public 서브넷 으로 변경 해야한다.

참고로 deployment.yaml 코드와 service.yaml 코드는 아래와 같다.

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tcpip-01
  namespace: tcpip
  labels:
    app: tcpip-01
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tcpip-01
  template:
    metadata:
      labels:
        app: tcpip-01
    spec:
      containers:
      - name: tcpip-01
        image: 11111111111.dkr.ecr.ap-northeast-2.amazonaws.com/test1:8888-6443
        ports:
        - containerPort: 6300
          name: tcpip-01
          protocol: TCP
        - containerPort: 8888
          name: app-healthcheck
          protocol: TCP

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tcpip-01
  namespace: tcpip
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-name: nlb-6300
    service.beta.kubernetes.io/target-group-name: nlb-6300-tg
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-0000000000000000,subnet-00000000000000000
spec:
  selector:
     app: tcpip-01
  type: LoadBalancer
  ports:
  - port: 6300
    protocol: TCP
    targetPort: 6300

세번째, 이건 정확한건지 잘 모르겠지만, TargetGroup의 헬스체크 port를 해당 서비스 포트로 물려 놓으면 서비스 포트가 LB쪽과 커넥션을 맺는거 같다. (정확하진 않음) 그래서 서비스 포트와 헬스체크 포트를 분리해서 설정해 놓는게 좋을거 같다. 

 

일단 끝. 너무 길게 썼네.

'테스트 > TestCase' 카테고리의 다른 글

TCP/IP 애플리케이션 검증하기  (0) 2024.03.19
TCP/IP 소켓 연결 테스트  (0) 2024.02.26
TargetGroup Unhealthy 해결하기  (1) 2024.02.26