Infra & DevOps/k8s(EKS)

[EKS] network

용감한 개복치 2024. 3. 17. 01:22

 

Amazon Eks Workshop Study 2기

 

2주차

eks 노드 - 파드 통신을 중점적으로

 

VPC CNI

사전 개념 정리

https://bravesunfish.tistory.com/69

 

[EKS] VPC CNI

CNI 개념 - Container Network Interface - CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나 - 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준 - 쿠버네티스에서는 Pod 간의 통신을

bravesunfish.tistory.com

참고 자료

https://malwareanalysis.tistory.com/555

 

pkos 스터디 2주차 2편 - AWS VPC CNI

이 글은 쿠버네티스에서 AWS VPC CNI 동작과정을 설명합니다. 몇 가지 선수지식이 필요합니다. 네트워크 인터페이스 iptables route table arp 프로토콜 AWS VPC 쿠버네티스 AWS VPC CNI란? AWS에서 쿠버네티스

malwareanalysis.tistory.com

 

실습 환경 배포

1 bastion host + 3 node group

출처 : 스터디 자료

확인

 

실습

bastion ssh 접속

default 네임스페이스 적용

kubectl ns default
# 현재 설정된 Kubernetes 컨텍스트(즉, 클러스터와 사용자 인증 정보)에서 "default" 네임스페이스의 정보를 표시

 

eks 설치 확인

kubectl cluster-info
#현재 설정된 Kubernetes 클러스터의 정보를 표시
eksctl get cluster
#eks 클러스터의 상태, 리전, 이름 등을 포함한 정보를 표시
eksctl get nodegroup --cluster $CLUSTER_NAME
#특정 EKS 클러스터에 속한 노드 그룹의 정보를 표시

 

노드 ip 확인 및 private ip 변수 지정

aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})
N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile
echo "export N3=$N3" >> /etc/profile
echo $N1, $N2, $N3

#특정 가용영역에 있는 node ip(지금 만든거)를 조회하고 n1, n2, n3변수에 할당
#/etc/profile 환경변수로 추가하여, 전역으로 사용

 

노드 보안그룹 확인 & bastion host에서 각 노드(파드)에 접속 가능하도록 룰 설정

# 보안그룹 ID와 보안그룹 이름(Name아님을 주의!) 확인
aws ec2 describe-security-groups --query 'SecurityGroups[*].[GroupId, GroupName]' --output text

# 노드 보안그룹 ID 확인
aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)
echo $NGSGID
echo "export NGSGID=$NGSGID" >> /etc/profile

aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32

 

bastion-host > node ip or coredns pod ip ping 테스트

ping -c 1 $N1
ping -c 1 $N2
ping -c 1 $N3

 

노드에서기본 네트워크 정보 확인

워커 노드1 기본 네트워크 구성

- 특정 파드(kube-proxy, aws-node) 는 호스트(root)의 ip 그대로 사용

- t3.medium 의 경우 ENI 마다 최대 6개의 IP

- ENI0, ENI1 으로 2개의 ENI는 자신의 IP 이외에 추가적으로 5개의 보조 프라이빗 IP를 가질수 있음

- coredns 파드는 veth 으로 호스트에는 eniY@ifN 인터페이스와 파드에 eth0 과 연결되어 있다

출처: 스터디 자료

network namespace

- 호스트(root), 파드 별(per pod)로 구분 > Kubernetes 클러스터에서 각 파드는 고유한 네트워크 네임스페이스(network namespace)에 속함

- 리눅스 커널에서 제공하는 가상화 기술 중 하나로, 네트워크 관련 설정과 자원을 격리하는 데 사용

 

eth0

- 일반적으로 클러스터 내부 통신에 사용

- 일반적으로 AWS EC2 인스턴스를 생성할 때 기본적으로 할당되는 첫 번째 네트워크 인터페이스

- 대부분의 경우, 인스턴스의 주요 네트워크 트래픽은 이 인터페이스를 통해 이동, 보통 이것이 퍼블릭 IP 주소로 노출

 

eth1

- 보조 ENI는 추가적인 네트워크 세그먼트나 특정 서비스와의 통신을 위해 구성

- VPC 내에서 특정 서비스나 데이터베이스와의 통신을 위해 별도의 네트워크 인터페이스를 설정할 때 사용

- 네트워크 트래픽을 분리하거나 보안 요구 사항을 충족

 

coreDNS

- Kubernetes 클러스터 내에서 도메인 이름을 IP 주소로 해석하고 서비스 디스커버리를 지원

- 파드 간 통신을 위해 DNS 이름을 사용할 수 있게 해주며, 서비스 디스커버리를 통해 서비스 간 통신 지원

 

veth

- 가상 이더넷 인터페이스로, 호스트와 파드 간의 가상 네트워크 연결

 

실습 

- 보조 IPv4 주소를 파드가 사용하는가 > YES

노드의 라우팅 정보 확인 >> EC2 네트워크 정보의 '보조 프라이빗 IPv4 주소'와 비교

# coredns 파드 IP 정보 확인
kubectl get pod -n kube-system -l k8s-app=kube-dns -owide
NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE                                               NOMINATED NODE   READINESS GATES
coredns-55474bf7b9-5lmn5   1/1     Running   0          5h52m   192.168.2.96   ip-192-168-2-135.ap-northeast-2.compute.internal   <none>           <none>
coredns-55474bf7b9-zrmhx   1/1     Running   0          5h52m   192.168.1.55   ip-192-168-1-222.ap-northeast-2.compute.internal   <none>           <none>

for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done

>> node 192.168.1.222 <<
default via 192.168.1.1 dev eth0 
169.254.169.254 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.222
192.168.1.55 dev eni7d713474173 scope link

>> node 192.168.2.135 <<
default via 192.168.2.1 dev eth0 
169.254.169.254 dev eth0
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.135
192.168.2.96 dev enie18f46b398b scope link

>> node 192.168.3.181 <<
default via 192.168.3.1 dev eth0 
169.254.169.254 dev eth0
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.181
192.168.3.232 dev eni76fedc7fdd0 scope link

 

- 테스트용 파드 생성

# [터미널1~3] 노드 모니터링
ssh ec2-user@$N1
watch -d "ip link | egrep 'eth|eni' ;echo;echo "[ROUTE TABLE]"; route -n | grep eni"

ssh ec2-user@$N2
watch -d "ip link | egrep 'eth|eni' ;echo;echo "[ROUTE TABLE]"; route -n | grep eni"

ssh ec2-user@$N3
watch -d "ip link | egrep 'eth|eni' ;echo;echo "[ROUTE TABLE]"; route -n | grep eni"

# 테스트용 파드 netshoot-pod 생성
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: netshoot-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: netshoot-pod
  template:
    metadata:
      labels:
        app: netshoot-pod
    spec:
      containers:
      - name: netshoot-pod
        image: nicolaka/netshoot
        command: ["tail"]
        args: ["-f", "/dev/null"]
      terminationGracePeriodSeconds: 0
EOF

# 파드 이름 변수 지정
PODNAME1=$(kubectl get pod -l app=netshoot-pod -o jsonpath={.items[0].metadata.name})
PODNAME2=$(kubectl get pod -l app=netshoot-pod -o jsonpath={.items[1].metadata.name})
PODNAME3=$(kubectl get pod -l app=netshoot-pod -o jsonpath={.items[2].metadata.name})

# 파드 확인
kubectl get pod -o wide
kubectl get pod -o=custom-columns=NAME:.metadata.name,IP:.status.podIP

# 노드에 라우팅 정보 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done

 

터미널 두 개로 두 노드 관찰 중

 

nest-hood 라는 이름의 파드 생성, 라우팅 테이블 등록 보임

 

테스트용 파드 eniY 정보 확인 - 워커 노드 EC2 (node 3번)

# 노드3에서 네트워크 인터페이스 정보 확인
ssh ec2-user@$N3
----------------
ip -br -c addr show
ip -c link
ip -c addr
ip route # 혹은 route -n

# 마지막 생성된 네임스페이스 정보 출력 -t net(네트워크 타입)
sudo lsns -o PID,COMMAND -t net | awk 'NR>2 {print $1}' | tail -n 1

# 결과
122695

# 마지막 생성된 네임스페이스 net PID 정보 출력 -t net(네트워크 타입)를 변수 지정
MyPID=$(sudo lsns -o PID,COMMAND -t net | awk 'NR>2 {print $1}' | tail -n 1)

# PID 정보로 파드 정보 확인
sudo nsenter -t $MyPID -n ip -c addr

#결과
-t $MyPID -n ip -c route1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
    link/ether 86:6c:24:0b:99:72 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.3.77/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::846c:24ff:fe0b:9972/64 scope link
       valid_lft forever preferred_lft forever
       
sudo nsenter -t $MyPID -n ip -c route

#결과
default via 169.254.1.1 dev eth0 
169.254.1.1 dev eth0 scope link

exit
----------------

 

테스트용 파드 접속

# 테스트용 파드 접속(exec) 후 Shell 실행
kubectl exec -it $PODNAME1 -- zsh

# 아래부터는 pod-1 Shell 에서 실행 : 네트워크 정보 확인
----------------------------
ip -c addr
ip -c route
route -n
ping -c 1 <pod-2 IP>
ps
cat /etc/resolv.conf
exit
----------------------------

# 파드2 Shell 실행
kubectl exec -it $PODNAME2 -- ip -c addr

# 파드3 Shell 실행
kubectl exec -it $PODNAME3 -- ip -br -c addr

 

해당 ip 로 통신

 

노드 간 파드 통신

출처 : 스터디 자료

pod <-> pod

- 다른 워커 노드의 파드 통신

- 별도의 nat 설정 x

- kube-proxy Pod to Pod 통신에는 관여x

 

파드에서 외부 통신

iptable 에 SNAT 을 통하여 노드의 eth0 IP로 변경되어서 외부와 통신

# 작업용 EC2 : pod-1 Shell 에서 외부로 ping
kubectl exec -it $PODNAME1 -- ping -c 1 www.google.com

 

# 워커 노드 EC2 : 퍼블릭IP 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i curl -s ipinfo.io/ip; echo; echo; done

 

SNAT

- Source Network Address Translation

- 출발지 주소를 변경하는 nat

- 내부 IP:PORT를 호스트 서버의 IP:PORT로 치환

- 도착지 주소를 변경하는 경우엔 dnat

 

 

노드에 파드 생성 갯수 제한

시각화 툴인 kube-ops-view 설치 및 웹 확인

# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'

# kube-ops-view 접속 URL 확인 (1.5 배율)
kubectl get svc -n kube-system kube-ops-view -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "KUBE-OPS-VIEW URL = http://"$1":8080/#scale=1.5"}'

 

# 작업용 EC2 - 터미널2
# 디플로이먼트 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/2/nginx-dp.yaml
kubectl apply -f nginx-dp.yaml

# 파드 확인
kubectl get pod -o wide
kubectl get pod -o=custom-columns=NAME:.metadata.name,IP:.status.podIP

# 파드 증가 테스트
kubectl scale deployment nginx-deployment --replicas=8

 

Service & AWS LoadBalancer Controller

 

AWS LoadBalancer Controller

 

개념

- ELB를 쿠버네티스 클러스터에서 관리할 수 있도록 함

-> eks에서 쿠버네티스 spec 으로 aws nlb / alb 를 생성하기 위해 필요

 

동작 방식

출처 : https://malwareanalysis.tistory.com/597

 

기능

Kubernetes Custom Resource Definitions(CRDs)를 사용하여 로드 밸런서를 정의하고 관리

-  Kubernetes 리소스를 사용하여 AWS 로드 밸런서를 생성하고 구성

- 로드 밸런서와 AWS Auto Scaling 그룹을 연결하여 인스턴스의 상태에 따라 트래픽을 분산

- TLS/SSL 인증서를 로드 밸런서에 연결하여 암호화된 트래픽을 처리(그림에서 3번 과정)

- 로드 밸런서의 타깃 그룹을 설정하여 백엔드 인스턴스를 관리하고 트래픽을 분산

-  Application Load Balancer의 경로 기반 라우팅을 설정하여 특정 경로를 다른 서비스로 라우팅

- Network Load Balancer를 Kubernetes 리소스와 함께 사용하여 네트워크 트래픽을 관리

 

service

 

개념

- 파드들을 통해 실행되고 있는 애플리케이션을 네트워크에 노출(expose)시키는 가상의 컴포넌트

- 파드는 무언가가 구동 중인 상태를 유지하기 위해 동원되는 일회성 자원, 언제든 다른 노드로 옮겨지거나 삭제될 수 있음 -> 파드는 생성될 때마다 새로운 내부 IP 할당

-> 러스터 내/외부와 통신을 계속 유지 어려움

 

- 파드가 외부와 통신할 수 있도록 클러스터 내부에서 고정적인 IP를 갖는 서비스(Service)를 이용

- 같은 애플리케이션을 구동하도록 구성된 여러 파드들에게 단일한 네트워크 진입점을 부여

 

유형

cluster ip

출처 : 스터디 자료

- 쉬운버전

출처 : https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

 

nodeport

출처 : 스터디 자료

-

 

lb(default : NLB 인스턴스)

출처 : 스터디 자료

-

 

service(LB Controller : AWS LB Controller + NLB IP 모드 with AWS VPC CNI) -> 실습대상

출처 : 스터디 자료

 

 

실습

 

OIDC 확인

aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text
aws iam list-open-id-connect-providers | jq

 

OIDC

- OpenID Connect

- 인증 및 인가를 위한 표준 프로토콜 중 하나

 


IAM Policy (AWSLoadBalancerControllerIAMPolicy) 생성

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json



생성된 IAM Policy Arn 확인

aws iam list-policies --scope Local | jq
aws iam get-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy | jq
aws iam get-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --query 'Policy.Arn'

#결과
"arn:aws:iam::349873998748:policy/AWSLoadBalancerControllerIAMPolicy"



# AWS Load Balancer Controller를 위한 ServiceAccount를 생성 >> 자동으로 매칭되는 IAM Role 을 CloudFormation 으로 생성됨!
# IAM 역할 생성. AWS Load Balancer Controller의 kube-system 네임스페이스에 aws-load-balancer-controller라는 Kubernetes 서비스 계정을 생성하고 IAM 역할의 이름으로 Kubernetes 서비스 계정에 주석을 답니다

eksctl create iamserviceaccount --cluster=$CLUSTER_NAME --namespace=kube-system --name=aws-load-balancer-controller --role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve



IRSA 정보 확인

eksctl get iamserviceaccount --cluster $CLUSTER_NAME

 

IRSA 란?

- Instance Role for Service Accounts

- AWS에서 실행되는 Kubernetes 클러스터 내에서 AWS IAM 역할을 Kubernetes 서비스 계정에 할당하는 메커니즘을 제공

- Kubernetes 서비스 계정에 대해 특정 AWS IAM 역할을 할당함으로써 각 서비스 계정이 서로 다른 AWS 리소스에 접근할 수 있도록 함

서비스 어카운트 확인

kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml | yh


Helm Chart 설치

helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller



설치 확인

kubectl get crd
kubectl describe deploy -n kube-system aws-load-balancer-controller | grep 'Service Account'
  Service Account:  aws-load-balancer-controller


# 클러스터롤, 롤 확인

kubectl describe clusterrolebindings.rbac.authorization.k8s.io aws-load-balancer-controller-rolebinding
kubectl describe clusterroles.rbac.authorization.k8s.io aws-load-balancer-controller-role

 

모니터링

watch -d kubectl get pod,svc,ep


작업용 EC2 - 디플로이먼트 & 서비스 생성

curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/2/echo-service-nlb.yaml
cat echo-service-nlb.yaml | yh
kubectl apply -f echo-service-nlb.yaml


확인

kubectl get deploy,pod
kubectl get svc,ep,ingressclassparams,targetgroupbindings
kubectl get targetgroupbindings -o json | jq



(옵션) 빠른 실습을 위해서 등록 취소 지연(드레이닝 간격) 수정 : 기본값 300초

vi echo-service-nlb.yaml
..
apiVersion: v1
kind: Service
metadata:
  name: svc-nlb-ip-type
  annotations:
    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-healthcheck-port: "8080"
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
    service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: deregistration_delay.timeout_seconds=60
...
:wq!
kubectl apply -f echo-service-nlb.yaml



웹 접속 주소 확인

kubectl get svc svc-nlb-ip-type -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Pod Web URL = http://"$1 }'


파드 로깅 모니터링

kubectl logs -l app=deploy-websrv -f



분산 접속 확인

NLB=$(kubectl get svc svc-nlb-ip-type -o jsonpath={.status.loadBalancer.ingress[0].hostname})
curl -s $NLB
for i in {1..100}; do curl -s $NLB | grep Hostname ; done | sort | uniq -c | sort -nr

실습 리소스 삭제

kubectl delete deploy deploy-echo; kubectl delete svc svc-nlb-ip-type

 

Ingress

개념

- 클러스터 내부의 서비스(ClusterIP, NodePort, Loadbalancer)를 외부로 노출(HTTP/HTTPS) - Web Proxy 역할

 

실습

- 서비스/파드 배포 테스트 with Ingress(ALB)

 

게임 파드와 Service, Ingress 배포

curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ingress1.yaml
cat ingress1.yaml | yh
kubectl apply -f ingress1.yaml



모니터링

watch -d kubectl get pod,ingress,svc,ep -n game-2048



생성 확인

kubectl get-all -n game-2048
kubectl get ingress,svc,ep,pod -n game-2048
kubectl get targetgroupbindings -n game-2048



ALB 생성 확인

aws elbv2 describe-load-balancers --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-game2048`) == `true`]' | jq
ALB_ARN=$(aws elbv2 describe-load-balancers --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-game2048`) == `true`].LoadBalancerArn' | jq -r '.[0]')
aws elbv2 describe-target-groups --load-balancer-arn $ALB_ARN
TARGET_GROUP_ARN=$(aws elbv2 describe-target-groups --load-balancer-arn $ALB_ARN | jq -r '.TargetGroups[0].TargetGroupArn')
aws elbv2 describe-target-health --target-group-arn $TARGET_GROUP_ARN | jq



Ingress 확인

kubectl describe ingress -n game-2048 ingress-2048
kubectl get ingress -n game-2048 ingress-2048 -o jsonpath="{.status.loadBalancer.ingress[*].hostname}{'\n'}"


게임 접속 : ALB 주소로 웹 접속

kubectl get ingress -n game-2048 ingress-2048 -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Game URL = http://"$1 }'

 

...

아이고

ExternalDNS

개념

-  Public한 도메인서버를 사용하여 쿠버네티스의 리소스를 쿼리할 수 있게 해주는 오픈소스 솔루션

- K8S 서비스/인그레스 생성 시 도메인을 설정하면, AWS(Route 53), Azure(DNS), GCP(Cloud DNS) 에 A 레코드(TXT 레코드)로 자동 생성/삭제

- 메인서버에 종속되지 않고 쿠버네티스 리소스를 통해 DNS레코드를 동적으로 관리

 

실습

- 나의 도메인과 연결하자!

 

도메인

 

 

자신의 도메인 변수 지정

MyDomain=peachengineer.click
echo "export MyDomain=peachengineer.click" >> /etc/profile



자신의 Route 53 도메인 ID 조회 및 변수 지정

aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." | jq
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Name"
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text
MyDnzHostedZoneId=`aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text`
echo $MyDnzHostedZoneId

 


A 레코드 값 반복 조회

while true; do aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A']" | jq ; date ; echo ; sleep 1; done

 

도메인 확인

MyDomain=peachengineer.click

# 자신의 Route 53 도메인 ID 조회 및 변수 지정
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)

# 변수 확인
echo $MyDomain, $MyDnzHostedZoneId


ExternalDNS 배포

curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
sed -i "s/0.13.4/0.14.0/g" externaldns.yaml
cat externaldns.yaml | yh
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -



확인 및 로그 모니터링

kubectl get pod -l app.kubernetes.io/name=external-dns -n kube-system
kubectl logs deploy/external-dns -n kube-system -f

 

service(NLB) + 도메인 연동

 

터미널1 (모니터링)

watch -d 'kubectl get pod,svc'
kubectl logs deploy/external-dns -n kube-system -f



테트리스 디플로이먼트 배포

cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tetris
  labels:
    app: tetris
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tetris
  template:
    metadata:
      labels:
        app: tetris
    spec:
      containers:
      - name: tetris
        image: bsord/tetris
---
apiVersion: v1
kind: Service
metadata:
  name: tetris
  annotations:
    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-cross-zone-load-balancing-enabled: "true"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
    #service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "80"
spec:
  selector:
    app: tetris
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  type: LoadBalancer
  loadBalancerClass: service.k8s.aws/nlb
EOF

# 배포 확인
kubectl get deploy,svc,ep tetris


NLB에 ExternanDNS 로 도메인 연결

kubectl annotate service tetris "external-dns.alpha.kubernetes.io/hostname=tetris.$MyDomain"
while true; do aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A']" | jq ; date ; echo ; sleep 1; done



Route53에 A레코드 확인



도메인 체크

echo -e "My Domain Checker = https://www.whatsmydns.net/#A/tetris.$MyDomain"


웹 접속 주소 확인 및 접속

echo -e "Tetris Game URL = http://tetris.$MyDomain"

 


참고 자료

https://www.joinc.co.kr/w/man/12/NetworkNamespace

 

Network Namespace

Network Namespace리눅스 시스템에서 네트워크는 단지 하나만(single)존재하는 글로벌 자원이다. 네트워크 인터페이스, 라우팅테이블 등은 하나만 있으며 모든 계정이 이 자원을 공유해서 사용한다.

www.joinc.co.kr

https://popappend.tistory.com/110

 

[2주차] EKS Networking

Amazon VPC CNI란? Amazon VPC Container Network Interface의 약자로 Pod가 VPC 네트워크의 IP를 사용할 수 있게 해주는 플러그인입니다. 또한, Pod 안의 컨테이너들이 network namespace를 공유하여 local port를 통해 통

popappend.tistory.com

https://thebook.io/007046/0036/

 

IT 엔지니어를 위한 네트워크 입문: 7.1.4 SNAT와 DNAT

더북(TheBook): (주)도서출판 길벗에서 제공하는 IT 도서 열람 서비스입니다.

thebook.io

https://coffeewhale.com/packet-network3

 

[번역]쿠버네티스 패킷의 삶 - #3

쿠버네티스 패킷의 삶 #3에서는 Service 네트워크가 동작하는 방법에 대해 심층적으로 알아 봅니다.

coffeewhale.com

https://kubernetes.io/ko/docs/concepts/services-networking/

 

서비스, 로드밸런싱, 네트워킹

쿠버네티스의 네트워킹에 대한 개념과 리소스에 대해 설명한다.

kubernetes.io

https://velog.io/@ironkey/AWS-EKS%EC%97%90%EC%84%9C-%EB%8F%99%EC%9E%91%EC%A4%91%EC%9D%B8-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%97%90-External-DNS%EB%A1%9C-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0

 

AWS EKS에서 동작중인 컨테이너에 External DNS로 도메인 연결하기

External DNS에 대해 알아보고 컨테이너에 도메인을 연결해봅시다🧐

velog.io

 

'Infra & DevOps > k8s(EKS)' 카테고리의 다른 글

[EKS] Observability  (0) 2024.03.31
[EKS] Storage  (0) 2024.03.22
[EKS] VPC CNI  (1) 2024.03.16
[EKS] 설치 및 기본 사용  (0) 2024.03.10
[Kubernetes] http 에러 검증, 파드, pv  (0) 2022.04.26