brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 04. 2021

쿠버1탄-16. 쿠버네티스 - NodePort


다음은 쿠버네티스 스터디 자료를 참고해  정리한 내용입니다.


nodeport 서비스는 외부에서 접근 할수 있는 서비스이다.

서비스 노드 포트를 이용해 Pod에 접속 한다.



<1>  nodeport 서비스 알아보기

<2> 서비스 생성과 확인

<3> 삭제 

<4> 정리




<1>  nodeport 서비스 알아보기


1

동작 ?

node port 접속시   nat되어 pod 에서  소스 ip를 알수 없음


구조

nodeport -> cluster ip -> pod ip


외부 ------>  node 1, node2  (모든 노드에 Port할당)---- 클러스터------ Pod 에 접속


클라이언트 -  Master node host -  클라이언트 IP를 소스 nat한다.




2

master node api 서버에 추가 접속

ssh -i ~/.ssh/id_rsa ubuntu@api.seo31.cndk.k8s


기존  모두 삭제

kubectl delete deploy,svc --all


별도 터미널에서 모니터링

watch -d 'kubectl get pods,svc,ep -o wide'




3

nginx11.yaml 을 활용


cat << EOF > nginx11.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: deploy-nginx11

spec:

  replicas: 3

  selector:

    matchLabels:

      app: deploy-nginx11

  template:

    metadata:

      labels:

        app: deploy-nginx11

    spec:

      containers:

      - name: deploy-nginx11

        image: nginx:1.11

EOF



kubectl apply -f nginx11.yaml


pod 3개 생성됨


4

nginx 1.11 의 index.html 내용 변경


for pod in $(kubectl get pod -l app=deploy-nginx11 |awk 'NR>1 {print $1}'); do kubectl exec $pod -- /bin/sh -c "hostname > /usr/share/nginx/html/index.html; echo 'nginx:v1.11 END' >> /usr/share/nginx/html/index.html"; done


5

log 확인

kubectl logs -l app=deploy-nginx11 -f




<2> 서비스 생성과 확인


1

cat << EOF > svc-nodeport.yaml

apiVersion: v1

kind: Service

metadata:

  name: svc-nodeport

spec:

  ports:

    - name: svc-webport

      port: 9000

      targetPort: 80

  selector:

    app: deploy-nginx11

  type: NodePort

EOF


// 타입은  nodeport 임

// 실제 pod에 접근할때 80

// 클러스터 ip로 접근할때는 9000

//  nodePort는 30000~32767번으로 램던하게 됨

// 노드포트는 클러스터 IP를 포함한다.


5

kubectl apply -f svc-nodeport.yaml

service/svc-nodeport created



6



7

클라이언트에서 확인


클라이언트에서 접근 확인


Master API  Server에서 


포트 확인

kubectl get service svc-nodeport

service/svc-nodeport   NodePort    100.71.60.23   <none>        9000:30865/TCP   7m34s   app=deploy-nginx11

// 30865 노드 포트


8

마스터 ip  확인

k get nodes -A -owide

ip-172-20-60-173.ap-northeast-1.compute.internal   Ready    control-plane,master   44h   v1.20.11   172.20.60.173   18.183.248.245  


 watch -d kubectl get pods,svc,ep -owide

NAME                     ENDPOINTS                                               AGE

endpoints/kubernetes     172.20.60.173:443                                       17h



10

클라이언트에서  Master 접근 확인 ?

k8s vpc  에 클라이언트 ec2  1개 생성, 접속해 테스트 하자

 k8s   maser  서버에 icmp  허용 작업

ping 172.20.60.173

ping 된다.


11

Master node 보안 그룹에서 30865 포트를 허용 필요!!


12

MASTER=172.20.60.173

(service-account-context:default)]$ curl -s $MASTER:30865

deploy-nginx11-656d5495b7-2t525

nginx:v1.11 END


curl -s $MASTER:30865


13

for i in {1..100}; do curl -s $MASTER:30865 ; done | sort | uniq -c | sort -nr


14

while true; do curl -s --connect-timeout 1 $MASTER:30865 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done


15

log 확인

 kubectl logs -l app=deploy-nginx11 -f


클라이언트 ip 가 안찍히고 nat  된다.

100.124.116.128 - - [06/Oct/2021:04:06:03 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.76.1" "-"

100.124.116.128 - - [06/Oct/2021:04:06:04 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.76.1" "-"

100.124.116.128 - - [06/Oct/2021:04:06:05 +0000] "GET / HTTP/1.1" 200 48 "-" "curl/7.76.1" "-"


16

kubectl get service svc-nodeport

NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE

svc-nodeport   NodePort   100.71.60.23   <none>        9000:30865/TCP   61m


17

NAT  되는것 확인


conntrack -L -n

root@ip-172-20-60-173:~# conntrack -L -n

tcp      6 86387 ESTABLISHED src=172.20.60.173 dst=100.64.0.1 sport=33364 dport=443 src=172.20.60.173 dst=172.20.60.173 sport=443 dport=56826 [ASSURED] mark=0 use=1

tcp      6 86369 ESTABLISHED src=172.20.60.173 dst=100.64.0.1 sport=33362 dport=443 src=172.20.60.173 dst=172.20.60.173 sport=443 dport=37834 [ASSURED] mark=0 use=1

tcp      6 86369 ESTABLISHED src=172.20.60.173 dst=100.64.0.1 sport=33366 dport=443 src=172.20.60.173 dst=172.20.60.173 sport=443 dport=19426 [ASSURED] mark=0 use=1

tcp      6 86398 ESTABLISHED src=172.20.60.173 dst=100.64.0.1 sport=33380 dport=443 src=172.20.60.173 dst=172.20.60.173 sport=443 dport=4928 [ASSURED] mark=0 use=1

conntrack v1.4.5 (conntrack-tools): 4 flow entries have been shown.




<3> 삭제 


삭제

kubectl delete deploy,svc --all



<4>  정리


장점

node port  서비스는 외부에서 파드 내부로 접속 된다.


단점

node port  서비스는  NAT IP 나와 보안 감사시 문제

node의 포트와  IP 를 알아야 연결이 가능하다.  30000번? 

클라이언트 IP  확인은 기본적으로 안된다.



참고

클라이언트 IP  확인 관련 ?

externalTrafficPolicy : Cluster 를 local로 변경하면  클라이언트 IP 확인이 가능

Snat 를 안하고 클라이언트 IP를 보내주는 옵션


현재 

kubectl get svc svc-nodeport -o yaml | grep externalTrafficPolicy:

 f:externalTrafficPolicy: {}

  externalTrafficPolicy: Cluster


변경

kubectl get svc svc-nodeport -o yaml | sed -e "s/externalTrafficPolicy: Cluster/externalTrafficPolicy: Local/" | kubectl apply -f -


kubectl get svc svc-nodeport -o yaml | grep externalTrafficPolicy:

        f:externalTrafficPolicy: {}

  externalTrafficPolicy: Local


로그에서  클라이언트 IP 확인이 가능




다음 과정
https://brunch.co.kr/@topasvga/1685




감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari