๐ŸŽ„์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ„ฐ๋”” PKOS 2์ฃผ์ฐจ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ

Burstยท2023๋…„ 2์›” 27์ผ
0

๐Ÿ˜ŽPKOS์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
2/7

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ
ใ…‡ใ…‡ใ…‡ใ…‡ใ…‡ใ…‡ใ…‡ใ…‡

๋ชฉํ‘œ

์ด๋ฒˆ 2์ฃผ์ฐจ ์Šคํ„ฐ๋””์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด์„œ ํ•™์Šต ํ•  ์˜ˆ์ •์ด๋‹ค.
๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” CNI(calico, weave net, Flannel)๊ฐ€ ์•„๋‹Œ AWS VPC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ผ๋ฐ˜์ ์ธ CNI์™€ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ํ•™์Šต ํ•  ์˜ˆ์ •์ด๋‹ค.
์ถ”๊ฐ€์ ์œผ๋กœ AWS ELB๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ•™์Šต ํ•  ์˜ˆ์ •์ด๋‹ค.

AWS VPC

CNI(Container Network Interface)๋Š” Pod๊ฐ„ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์„, ์ฆ‰ ํ†ต์‹  ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด ์ค€๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” CNI๋Š” calico, weave net, Flannel ๋“ฑ์ด ์žˆ๋‹ค.
์ด๋ฒˆ ์Šคํ„ฐ๋””์—์„œ ์‚ฌ์šฉํ•˜๋Š” KOPS์—์„œ๋Š” AWS์—์„œ ๊ตฌ์„ฑ๋˜์—ˆ๊ณ , CNI๋˜ํ•œ AWS VPC๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
AWS VPC๊ฐ€ ๋‹ค๋ฅธ CNI์™€ ๋‹ค๋ฅธ ์ ์€ ๋…ธ๋“œ์™€ ํŒŒ๋“œ์˜ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญ์ด ๊ฐ™์•„ ํ†ต์‹  ์ƒํ™ฉ์ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๋‹ค๋Š” ๋ถ€๋ถ„์ด๋‹ค.

  • K8S Calico CNI ์™€ AWS VPC CNI ์ฐจ์ด
    • ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ์ตœ์ ํ™”(์„ฑ๋Šฅ, ์ง€์—ฐ)๋ฅผ ์œ„ํ•ด์„œ ๋…ธ๋“œ์™€ ํŒŒ๋“œ์˜ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญ์„ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•จ.
    • ํŒŒ๋“œ๊ฐ„ ํ†ต์‹  ์‹œ ์ผ๋ฐ˜์ ์œผ๋กœ K8S CNI๋Š” ์˜ค๋ฒ„๋ ˆ์ด(VXLAN, IP-IP ๋“ฑ) ํ†ต์‹ ์„ ํ•˜๊ณ , AWS VPC CNI๋Š” ๋™์ผ ๋Œ€์—ญ์œผ๋กœ ์ง์ ‘ ํ†ต์‹ ์„ ํ•œ๋‹ค.

๋„คํŠธ์›Œํฌ ์ •๋ณด ํ™•์ธ

# CNI ์ •๋ณด ํ™•์ธ
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
amazon-k8s-cni-init:v1.11.4
amazon-k8s-cni:v1.11.4

# ๋…ธ๋“œ 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

# ํŒŒ๋“œ IP ํ™•์ธ
kubectl get pod -n kube-system -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase

๋…ธ๋“œ์—์„œ ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ์ •๋ณด

EKS ์Šคํ„ฐ๋”” ๊ตฌ์„ฑ๋„ ๊ทธ๋ฆผ

  • Network ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํ˜ธ์ŠคํŠธ(Root)์™€ ํŒŒ๋“œ ๋ณ„(Per Pod)๋กœ ๊ตฌ๋ถ„๋œ๋‹ค
  • ํŠน์ •ํ•œ ํŒŒ๋“œ(kube-proxy, aws-node)๋Š” ํ˜ธ์ŠคํŠธ(Root)์˜ IP๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค
  • t3.medium ์˜ ๊ฒฝ์šฐ ENI ์— ์ตœ๋Œ€ 6๊ฐœ์˜ IP๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค
  • ENI0, ENI1 ์œผ๋กœ 2๊ฐœ์˜ ENI๋Š” ์ž์‹ ์˜ IP ์ด์™ธ์— ์ถ”๊ฐ€์ ์œผ๋กœ 5๊ฐœ์˜ ๋ณด์กฐ ํ”„๋ผ์ด๋น— IP๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค
  • coredns ํŒŒ๋“œ๋Š” veth ์œผ๋กœ ํ˜ธ์ŠคํŠธ์—๋Š” eniY@ifN ์ธํ„ฐํŽ˜์ด์Šค์™€ ํŒŒ๋“œ์— eth0 ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค

[Node2์˜ ๋„คํŠธ์›Œํฌ ์ •๋ณด]
ํ˜„์žฌ NIC๊ฐ€ 2๊ฐœ(ens5, ens6), ๋…ผ๋ฆฌ NIC๊ฐ€ 2๊ฐœ

  • AWS ์ฝ˜์†” ํ™”๋ฉด ํ™•์ธ

๋…ธ๋“œ ๊ฐ„ ํŒŒ๋“œ ํ†ต์‹ 

ํŒŒ๋“œ๊ฐ„ ํ†ต์‹  ํ๋ฆ„ : ๋ณ„๋„์˜ ์˜ค๋ฒ„๋ ˆ์ด(Overlay) ํ†ต์‹  ๊ธฐ์ˆ  ์—†์ด, VPC Native ํ•˜๊ฒŒ ํŒŒ๋“œ๊ฐ„ ์ง์ ‘ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

ํŒŒ๋“œ๊ฐ„ ํ†ต์‹  ํ…Œ์ŠคํŠธ ๋ฐ ํ™•์ธ : ๋ณ„๋„์˜ NAT ๋™์ž‘ ์—†์ด ํ†ต์‹  ๊ฐ€๋Šฅ!

# ํŒŒ๋“œ IP ๋ณ€์ˆ˜ ์ง€์ •
POD1=$(kubectl get pod pod-1 -o jsonpath={.status.podIP})
POD2=$(kubectl get pod pod-2 -o jsonpath={.status.podIP})

# ํŒŒ๋“œ1 Shell ์—์„œ ํŒŒ๋“œ2๋กœ ping ํ…Œ์ŠคํŠธ
kubectl exec -it pod-1 -- ping -c 2 $POD2

# ํŒŒ๋“œ2 Shell ์—์„œ ํŒŒ๋“œ1๋กœ ping ํ…Œ์ŠคํŠธ
kubectl exec -it pod-2 -- ping -c 2 $POD1

#๊ฐ ๋…ธ๋“œ์—์„œ tcpdump ๋ชจ๋‹ˆํ„ฐ๋ง
sudo tcpdump -i any -nn icmp 

[TIP] ๋‘ ๋ฒˆ์งธ ENI์—์„œ ํ• ๋‹น๋œ ๋ณด์กฐ IP๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ฌด์กฐ๊ฑด ์ฒซ๋ฒˆ์งธ ENI๋ฅผ ํ†ตํ•ด ํ†ต์‹ ์ด ๋˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Œ. ๋”ฐ๋ผ์„œ ens6์˜ ping์€ tcpdump์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์—†์Œ!!

ํŒŒ๋“œ์—์„œ ์™ธ๋ถ€ ํ†ต์‹ 

ํŒŒ๋“œ์—์„œ ์™ธ๋ถ€ ํ†ต์‹  ํ๋ฆ„ : iptable ์— SNAT ์„ ํ†ตํ•˜์—ฌ ๋…ธ๋“œ์˜ eth0 IP๋กœ ๋ณ€๊ฒฝ๋˜์–ด์„œ ์™ธ๋ถ€์™€ ํ†ต์‹ ๋จ

ํŒŒ๋“œ์—์„œ ์™ธ๋ถ€ ํ†ต์‹  ํ…Œ์ŠคํŠธ ๋ฐ ํ™•์ธ

kubectl exec -it pod-1 -- curl -s ipinfo.io/ip : echo

#node1
curl -s ipinfo.io/ip : echo

#์ถœ๋ ฅ๋˜๋Š” ๊ณต์ธ IP ํ™•์ธ
Node1์˜ Public IP ์ถœ๋ ฅ!

iptable ํ™•์ธ

# ํŒŒ๋“œ๊ฐ€ ์™ธ๋ถ€์™€ ํ†ต์‹ ์‹œ์—๋Š” ์•„๋ž˜ ์ฒ˜๋Ÿผ 'AWS-SNAT-CHAIN-0, AWS-SNAT-CHAIN-1' ๋ฃฐ(rule)์— ์˜ํ•ด์„œ SNAT ๋˜์–ด์„œ ์™ธ๋ถ€์™€ ํ†ต์‹ !
# ์ฐธ๊ณ ๋กœ ๋’ค IP๋Š” eth0(ENI ์ฒซ๋ฒˆ์งธ)์˜ IP ์ฃผ์†Œ์ด๋‹ค
# --random-fully ๋™์ž‘ - ๋งํฌ1  ๋งํฌ2
sudo iptables -t nat -S | grep 'A AWS-SNAT-CHAIN'
-A AWS-SNAT-CHAIN-0 ! -d 172.30.0.0/16 -m comment --comment "AWS SNAT CHAIN" -j AWS-SNAT-CHAIN-1
-A AWS-SNAT-CHAIN-1 ! -o vlan+ -m comment --comment "AWS, SNAT" -m addrtype ! --dst-type LOCAL -j SNAT --to-source 172.30.85.242 --random-fully

## ์•„๋ž˜ 'mark 0x4000/0x4000' ๋งค์นญ๋˜์ง€ ์•Š์•„์„œ RETURN ๋จ!
-A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN
-A KUBE-POSTROUTING -j MARK --set-xmark 0x4000/0x0
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE --random-fully
...

# ์นด์šดํŠธ ํ™•์ธ ์‹œ AWS-SNAT-CHAIN-0, AWS-SNAT-CHAIN-1 ์— ๋งค์นญ๋˜์–ด, ๋ชฉ์ ์ง€๊ฐ€ 172.30.0.0/16 ์•„๋‹ˆ๊ณ  ์™ธ๋ถ€ ๋น ์ ธ๋‚˜๊ฐˆ๋•Œ SNAT 172.30.85.242 ๋ณ€๊ฒฝ๋˜์–ด ๋‚˜๊ฐ„๋‹ค!
sudo iptables -t filter --zero; sudo iptables -t nat --zero; sudo iptables -t mangle --zero; sudo iptables -t raw --zero
watch -d 'sudo iptables -v --numeric --table nat --list AWS-SNAT-CHAIN-0; echo ; sudo iptables -v --numeric --table nat --list AWS-SNAT-CHAIN-1; echo ; sudo iptables -v --numeric --table nat --list KUBE-POSTROUTING'

# conntrack ํ™•์ธ
sudo conntrack -L -n |grep -v '169.254.169'
conntrack v1.4.5 (conntrack-tools): 
icmp     1 28 src=172.30.66.58 dst=8.8.8.8 type=8 code=0 id=34392 src=8.8.8.8 dst=172.30.85.242 type=0 code=0 id=50705 mark=128 use=1
tcp      6 23 TIME_WAIT src=172.30.66.58 dst=34.117.59.81 sport=58144 dport=80 src=34.117.59.81 dst=172.30.85.242 sport=80 dport=44768 [ASSURED] mark=128 use=1

๋…ธ๋“œ์— ํŒŒ๋“œ ์ƒ์„ฑ ๊ฐฏ์ˆ˜ ์ œํ•œ

Secondary IPv4 addresses : ์ธ์Šคํ„ด์Šค ์œ ํ˜•์— ์ตœ๋Œ€ ENI ๊ฐฏ์ˆ˜์™€ ํ• ๋‹น ๊ฐ€๋Šฅ IP ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์„ ์ •

์›Œ์ปค ๋…ธ๋“œ์˜ ์ธ์Šคํ„ด์Šค ํƒ€์ž… ๋ณ„ ํŒŒ๋“œ ์ƒ์„ฑ ๊ฐฏ์ˆ˜ ์ œํ•œ

  • ์ธ์Šคํ„ด์Šค ํƒ€์ž… ๋ณ„ ENI ์ตœ๋Œ€ ๊ฐฏ์ˆ˜์™€ ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ IP ๊ฐฏ์ˆ˜์— ๋”ฐ๋ผ์„œ ํŒŒ๋“œ ๋ฐฐ์น˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋จ
  • ๋‹จ, aws-node ์™€ kube-proxy ํŒŒ๋“œ๋Š” ํ˜ธ์ŠคํŠธ์˜ IP๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ ์ตœ๋Œ€ ๊ฐฏ์ˆ˜์—์„œ ์ œ์™ธํ•จ

    ์ตœ๋Œ€ ํŒŒ๋“œ ์ƒ์„ฑ ๊ฐฏ์ˆ˜ : (Number of network interfaces for the instance type ร— (the number of IP addressess per network interface - 1)) + 2

์›Œ์ปค๋…ธ๋“œ์˜ ์ธ์Šคํ„ด์Šค ์ •๋ณด ํ™•์ธ

# t3 ํƒ€์ž…์˜ ์ •๋ณด(ํ•„ํ„ฐ) ํ™•์ธ
aws ec2 describe-instance-types --filters Name=instance-type,Values=t3.* \
 --query "InstanceTypes[].{Type: InstanceType, MaxENI: NetworkInfo.MaximumNetworkInterfaces, IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" \
 --output table
 
 # ํŒŒ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ณ„์‚ฐ ์˜ˆ์‹œ : aws-node ์™€ kube-proxy ํŒŒ๋“œ๋Š” host-networking ์‚ฌ์šฉ์œผ๋กœ IP 2๊ฐœ ๋‚จ์Œ
((MaxENI * (IPv4addr-1)) + 2)
t3.medium ๊ฒฝ์šฐ : ((3 * (6 - 1) + 2 ) = 17๊ฐœ >> aws-node ์™€ kube-proxy 2๊ฐœ ์ œ์™ธํ•˜๋ฉด 15๊ฐœ

# ์›Œ์ปค๋…ธ๋“œ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ : ๋…ธ๋“œ ์ƒ์„ธ ์ •๋ณด์˜ Allocatable ์— pods ์— 17๊ฐœ ์ •๋ณด ํ™•์ธ
kubectl describe node | grep Allocatable: -A6
Allocatable:
  cpu:                2
  ephemeral-storage:  59763732382
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             3854320Ki
  pods:               17

Service

AWS NLB์˜ ํƒ€๊ฒŸ ๊ทธ๋ฃน์— Pod์˜ IP๊ฐ€ ์ง์ ‘ ๋ฐ”์ธ๋”ฉ ๋˜์–ด ํ†ต์‹ , iptable์˜ Rule์„ ํƒ€์ง€ ์•Š์Œ!!
๋กœ๋“œ๋ฐธ๋Ÿฐ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ Endpint์˜ ์ •๋ณด๋ฅผ ์ฆ‰ Pod์˜ ์ •๋ณด๋ฅผ KOPS๋ฅผ ํ†ตํ•ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์„œ NLB์— ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ œ๊ณต!

# kOps ํด๋Ÿฌ์Šคํ„ฐ ํŽธ์ง‘ : ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€
kops edit cluster
-----
spec:
  awsLoadBalancerController:
    enabled: true
-----

# ์—…๋ฐ์ดํŠธ ์ ์šฉ : ์ ์šฉ์ด ์•ˆ๋  ๊ฒฝ์šฐ ํ•œ๋ฒˆ ๋” ์•„๋ž˜ ๋ช…๋ น ์‹คํ–‰
kops update cluster --yes && echo && sleep 5 && kops rolling-update cluster

์„œ๋น„์Šค / ํŒŒ๋“œ ๋ฐฐํฌ(NLB)

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: deploy-echo
spec: 
  replicas: 2
  selector: 
    matchLabels: 
      app: deploy-websrv
  template: 
    metadata: 
      labels: 
        app: deploy-websrv
    spec: 
      terminationGracePeriodSeconds: 0
      containers: 
      - name: akos-websrv
        image: k8s.gcr.io/echoserver:1.5
        ports: 
        - containerPort: 8080
---
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"
spec: 
  ports: 
    - port: 80
      targetPort: 8080
      protocol: TCP
  type: LoadBalancer
  loadBalancerClass: service.k8s.aws/nlb
  selector: 
    app: deploy-websrv


NLB์ฃผ์†Œ๋ฅผ 100๋ฒˆ ํ˜ธ์ถœ

NLB=$(kubectl get svc svc-nlb-ip-type -o jsonpath={.status.loadBalancer.ingress[0].hostname})

for i in {1..100}; do curl -s $NLB | grep Hostname ; done | sort | uniq -c | sort -nr

ํŒŒ๋“œ 2๊ฐœ โ†’ 1๊ฐœ โ†’ 3๊ฐœ ์„ค์ • ์‹œ ๋™์ž‘ : auto discovery

kubectl scale deployment deploy-echo --replicas=1

kubectl scale deployment deploy-echo --replicas=3


ExternalDNS

K8S ์„œ๋น„์Šค/์ธ๊ทธ๋ ˆ์Šค ์ƒ์„ฑ ์‹œ ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๋ฉด, AWS(Route 53), Azure(DNS), GCP(Cloud DNS) ์— A ๋ ˆ์ฝ”๋“œ(TXT ๋ ˆ์ฝ”๋“œ)๋กœ ์ž๋™ ์ƒ์„ฑ/์‚ญ์ œ

externalDNS์„ค์น˜

# ์„ค์น˜
kops edit cluster
--------------------------
spec:
  externalDns:
    provider: external-dns
--------------------------

# ์—…๋ฐ์ดํŠธ ์ ์šฉ
kops update cluster --yes && echo && sleep 5 && kops rolling-update cluster

# ๋ฒ„์ „ ํ™•์ธ : v0.12.2
kubectl describe deploy -n kube-system external-dns | grep Image | cut -d "/" -f 3

# externalDns ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ๋“œ ํ™•์ธ
kubectl get pod -n kube-system -l k8s-app=external-dns
NAME                            READY   STATUS    RESTARTS   AGE
external-dns-7bf9bd8994-f2r58   1/1     Running   0          16s

์„œ๋น„์Šค NLB ๋ฐฐํฌ ๋ฐ externalDNS ์„ค์ •

kubectl apply -f ~/pkos/2/echo-service-nlb.yaml

MyDOMAIN1=<๊ฐ์ž ์ž์‹ ์˜ nginx ๋„๋ฉ”์ธ ์ง€์ •>
MyDOMAIN1=nginx.burst89.com
kubectl annotate service svc-nlb-ip-type "external-dns.alpha.kubernetes.io/hostname=$MyDOMAIN1."
kubectl describe svc svc-nlb-ip-type | grep Annotations: -A5

# ํ™•์ธ
dig +short $MyDOMAIN1

# ๋ถ„์‚ฐ ์ ‘์† ํ™•์ธ
curl -s $MyDOMAIN1
for i in {1..100}; do curl -s $MyDOMAIN1 | grep Hostname ; done | sort | uniq -c | sort -nr




[๊ณผ์ œ1] ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹  ์‹œ tcpdump ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ๊ด€๋ จ ์Šค์ƒท์„ ์˜ฌ๋ ค์ฃผ์„ธ์š”.
#k get nodes -o wide(๋…ธ๋“œ ์ •๋ณด / ๋นจ๊ฐ„ Box๊ฐ€ Pod๊ฐ€ ์ƒ์„ฑ๋œ Node)

#k get pods -o wide

#kubectl exec -it pod-1 โ€“ ping -c 2 $POD2
// Pod1์—์„œ Pod2๋กœ Ping ํ†ต์‹ 

#sudo tcpdump -i ens5 -nn icmp
// Node1์—์„œ ens5 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด tcpdump -> ํ†ต์‹  ํ™•์ธ

172.30.49.61 : Pod-1 IP / 172.30.71.69 : Pod-2 IP
ํ•ด๋‹น IP๋ฅผ ํ†ตํ•ด ๋ณ„๋„์˜ NAT ๋™์ž‘ ์—†์ด ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ
-> ์ด์œ ๋Š” VPC CNI๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—!!
#sudo tcpdump -i ens5 -nn icmp
/ Node2์—์„œ ens5 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด tcpdump -> ํ†ต์‹  ํ™•์ธ

[๊ณผ์ œ2] ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋”๋ผ๊ณ  ์ข‹์œผ๋‹ˆ, ์›Œ์ปค ๋…ธ๋“œ 1๋Œ€์— 100๋Œ€์˜ ํŒŒ๋“œ๊ฐ€ ๋ฐฐํฌ๋˜๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ จ ์Šค์ƒท์„ ์˜ฌ๋ ค์ฃผ์„ธ์š”.
์ดˆ๊ธฐ kops ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ c5.large๋กœ ํ•˜๊ณ  worker node์˜ ์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.
#๊ตฌ์„ฑ ํ›„ ์ตœ๋Œ€ Pod์ˆ˜๋ฅผ๋ณด๋ฉด 29์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. VPC CNI Nerwork ์„ค์ •
    kubelet์˜ maxPods์ˆ˜๋ฅผ ์„ค์ • / networking์— WARM_PRENFIX_TARGET / PREFIX_DELEGATION ์„ค์ •
    kops edit cluster --state s3://๋ฒ„ํ‚ท์ด๋ฆ„

  2. ์„ค์ • ํ›„ cluster ์—…๋ฐ์ดํŠธ
    ์—…๋ฐ์ดํŠธ ์‹œ Master Node ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด IP๋„ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋„๋ฉ”์ธ์— api ์ฃผ์†Œ๋„ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•จ. -> ํ•ด๋‹น ์ž‘์—…์ด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ
    (์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ์•Œ์•„์„œ ์ด ๋ถ€๋ถ„๋„ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ™๋‹ค.)

  3. Worker node๊ฐ€ ๋ณ€๊ฒฝ ํ™•์ธ

  4. ๋…ธ๋“œ ์ตœ๋Œ€ Pod ์ˆ˜ ๋ณ€๊ฒฝ ํ™•์ธ

  5. PREFIX_DELEGATION ๋ฐ WARM_PREFIX_TARGET ์„ค์ • ํ™•์ธ

  6. LimitRange ์„ค์ • ๋ณ€๊ฒฝ
    ๊ธฐ์กด limits๋ผ๋Š” LimitRange ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ํ˜„์žฌ cpu 100m์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
    ์˜ค๋ธŒ์ ํŠธ์— editํ•˜์—ฌ cpu 100m ์„ค์ • ์‚ญ์ œ

  1. Pod100๊ฐœ ๋ฐฐํฌ ๋ฐ ํ™•์ธ
    kubectl apply -f ~/pkos/2/nginx-dp.yaml
    kubectl scale deployment nginx-deployment --replicas=100

  2. ์ถ”๊ฐ€์ ์œผ๋กœ t3.medium ์ธ์Šคํ„ด์Šค์—์„œ๋„ Test๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ์ „, maxpod ์ˆ˜ ํ™•์ธ : 110๊ฐœ(c5.large)์™€ ๋™์ผ

  3. ์œ„ ๊ณผ์ •์„ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰ ํ›„ ๋‹จ์ผ ๋…ธ๋“œ(t3.medium)์— Pod 100๊ฐœ ๋ฐฐํฌ ๋ฐ ํ™•์ธ

[๊ณผ์ œ3] ์„œ๋น„์Šค(NLB)/ํŒŒ๋“œ ๋ฐฐํฌ ์‹œ ExternalDNS ์„ค์ •ํ•ด์„œ, ๊ฐ์ž ์ž์‹ ์˜ ๋„๋ฉ”์ธ์œผ๋กœ NLB๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŒŒ๋“œ)๋กœ ์ ‘์†ํ•ด๋ณด๊ณ  ๊ด€๋ จ ์Šค์ƒท์„ ์˜ฌ๋ ค์ฃผ์„ธ์š”. ํผ๋ธ”๋ฆญ ๋„๋ฉ”์ธ์ด ์—†๋Š” ๋ฉค๋ฒ„๋ถ„๋“ค์€, ExternalDNS ์ œ์™ธํ•˜๊ณ  NLB ๋„๋ฉ”์ธ์œผ๋กœ ์ ‘์†ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์˜ฌ๋ ค์ฃผ์„ธ์š”.

#nginx.burst89.com

๋งˆ๋ฌด๋ฆฌ

์‚ฌ์‹ค ์ด๋ฒˆ ์Šคํ„ฐ๋”” ๋‚ด์šฉ์ด ์กฐ๊ธˆ์€ ์–ด๋ ค์› ๋‹ค. ์•„๋Š” ๋‚ด์šฉ๋„ ์žˆ์—ˆ์ง€๋งŒ, Service์˜ ๋‚ด์šฉ์ด ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ๋‹ค... ํ•ต์‹ฌ์€ AWS VPC CNI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋…ธ๋“œ์˜ IP์™€ Pod์˜ IP๊ฐ€ ๊ฐ™์€ ๋Œ€์—ญ์„ ์‚ฌ์šฉํ•œ๋‹ค.
๋˜ํ•œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๋“œ๋ฐธ๋Ÿฐ์Šค ํƒ€๊ฒŸ๋Œ€์ƒ์— Pod์˜ IP๊ฐ€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋ฉฐ, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•˜๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์„ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ ํƒ€๊ฒŸ์˜ ์ •๋ณด๋ฅผ ํ™•์ธ ํ•˜์—ฌ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ Service๋ฅผ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‚ด์šฉ์ด๋‹ค!!
์ถ”๊ฐ€์ ์œผ๋กœ ๋…ธ๋“œ์˜ ์ตœ๋Œ€ Pod ์ˆ˜ ๊ณผ์ œ๋Š” ์ง„์งœ ์–ด๋ ค์› ๋‹ค......ใ… ใ…  3์ผ์€ ๊ฑธ๋ ค์„œ ํ•ด๋‹น ๊ณผ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ ์  ๋‚œ์ด๋„๊ฐ€ ์–ด๋ ค์›Œ ์ง€๋Š” ๋Š๋‚Œ์ด ๋“ ๋‹ค.. ๊ทธ๋ž˜๋„ ํ™”์ดํŒ… !!!!!!!

profile
Cloud Developer

0๊ฐœ์˜ ๋Œ“๊ธ€