brunch

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

by Master Seo


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


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 에 접속

20 node port.png


클라이언트 - 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

클라이언트에서 확인

20 node port.png


클라이언트에서 접근 확인


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




감사합니다.

keyword
매거진의 이전글쿠버1탄-15. Cluser IP, 블루 그린 배포