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 를 생성하기 위해 필요
동작 방식
기능
- 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
- 쉬운버전
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
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 |