다음은 쿠버네티스 스터디 자료를 참고해 정리한 내용입니다.
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 서버에 추가 접속
기존 모두 삭제
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
감사합니다.