무식하면 용감하다고, ㅋㅋㅋ
로컬 환경에서 TCP/IP 테스트 한다고 별도의 애플리케이션으로 서버 클라이언트 만들고, 별도의 포트로 찌르고 받는거 테스트한다고 총 4개의 애플리케이션을 띄웠다. 이게 하나의 프로그램으로 끝낼수 있을거 같은데 시간이 없어서 그것까지는 못하겠고, 당장 지금 해야되니까 ㅋㅋㅋ
일단 논리적으로 당연히 가능하다고 생각은한다.
일단 하려는것은 아래와 같다.(대충 그려보자. 시간이 없으니께)
3분만에 완성된 플로우
일단, 하려는것은 아래와 같다.
간단히 설명하자면 하나의 파드에서 2개의 작업이 TCP/IP로 이루어 져야한다.
하나는 5000번으로 받는 InputStream이고 하나는 6300으로 보내는 OutPutStream 이다.
일단 현재는 하나씩 단방향으로 세팅을 했지만 결국 단반향이 된다는건 양방향이 된다는것과 마찬가지 이므로 나중에 양방향도 테스트를 해야한다. (왜 이런 짓? 을 하냐면 내가 가이드를 제시해야 하는 입장이라... 나도 받아서 하고싶다... ing)
그래서 구성한 테스트 구성도 아키는 아래와 같다. 이것도 2분컷으로 빨리 그리자 아아아아ㅏㅏㅏㅏㅏㅏㅏㅏ
시간이 없다구우우우우우우
그리고 나서 보니까 바뀐게 별로 없는거 같은데? 응응
음 그러면 일단 NLB 엔드포인드로 각각의 리스너 포트로 찔러보면 되겠구먼
자 올려봅시다.
일단
예전에 올렸던게 있으니까 아래 링크 참고 해서 올려봅시다.
https://may9noy.tistory.com/1633
올리면 일단, 아 렉걸림 노트북 인텔리제이 안꺼짐 ~~ 살려주세요.
어떻게든 끄고
올려봅시다.
아 위의 링크 아님 아래것임. 위의 링크는 그냥 ec2에서 gradle 빌드하는거고 아래링크가 docker로 말아서 올리는거.
https://may9noy.tistory.com/1562
자 총 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
무식하게 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 |