25๋ ๋ Cilium Study 1๊ธฐ ์ ๋ฆฌ ๊ธ์ ๋๋ค.
์ค์ต ํ๊ฒฝ ์ ํ
Cilium์ LoadBalancer IP Pool ๊ธฐ๋ฅ์ ํ์ฉํด ์ฌ์ ์ ์ ์ํ IP ๋์ญ์์ Kubernetes LoadBalancer ์๋น์ค์ VIP๋ฅผ ์๋ ํ ๋นํ๊ณ L2Announce๋ฅผ ํตํด ๋คํธ์ํฌ์ ํด๋น VIP๋ฅผ ๊ด๊ณ ํ๋ ๊ณผ์ ์ ์์๋ณธ๋ค!
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get CiliumLoadBalancerIPPool -A
No resources found
(โ|HomeLab:N/A) root@k8s-ctr:~# cat << EOF | kubectl apply -f -
apiVersion: "cilium.io/v2"
kind: CiliumLoadBalancerIPPool
metadata:
name: "cilium-lb-ippool"
spec:
blocks:
- start: "192.168.10.211"
stop: "192.168.10.215"
EOF
ciliumloadbalancerippool.cilium.io/cilium-lb-ippool created
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl api-resources | grep -i CiliumLoadBalancerIPPool
ciliumloadbalancerippools ippools,ippool,lbippool,lbippools cilium.io/v2 false CiliumLoadBalancerIPPool
์ค์ ํ์ธ
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl api-resources | grep -i CiliumLoadBalancerIPPool
ciliumloadbalancerippools ippools,ippool,lbippool,lbippools cilium.io/v2 false CiliumLoadBalancerIPPool
ํด๋ฌ์คํฐ์ CiliumLoadBalancerIPPool CRD๊ฐ ๋ฑ๋ก๋์ด ์๋๋ฐ ์ด๋ LB์ฉ IP ํ์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ก ๊ด๋ฆฌํ ์ ์๋ ์ํ๋ค.
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get ippools
NAME DISABLED CONFLICTING IPS AVAILABLE AGE
cilium-lb-ippool false False 5 44s
cilium-lb-ippool์ด ํ์ฑํ๋์ด ์๊ณ ์ถฉ๋ ์์ด(Conflicting=False) ํ ๋น ๊ฐ๋ฅํ IP๊ฐ 5๊ฐ ๋จ์ ์๋ค๊ณ ๋์จ๋ค. ์ด ํ์์ ์๋น์ค ํ์ ์ด ๋ก๋๋ฐธ๋ฐ์์ธ ์๋น์ค๋ค์ ์ธ๋ถ IP๊ฐ ์๋์ผ๋ก ๋ถ๋ฐฐ๋๋ค.
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get svc webpod -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
LBIP=$(kubectl get svc webpod -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
192.168.10.211
๊ธฐ์กด webpod ์๋น์ค๋ฅผ LoadBalancer ํ์ ์ผ๋ก ๋ฐ๋๊ฒ ๋์ด์ Cilium LB IPAM์ด ํ์์ IP ํ๋๋ฅผ ๊บผ๋ด ์๋น์ค์ ๋ถ์ธ๋ค. ์ดํ kubectl get svc webpod์์ EXTERNAL-IP๊ฐ 192.168.10.211๋ก ์ฑ์์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ด๋ถ ClusterIP(10.96.177.120)๋ ๊ทธ๋๋ก ์ ์ง๋๊ณ NodePort(80:30905/TCP)๋ ๊ณ์ ๋ ธ์ถ๋์ง๋ง L2 ์์ VIP(192.168.10.211)๋ฅผ ํตํด ์ง์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค. Cilium์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด VIP๋ฅผ L2(ARP/NDP)๋ก ๊ด๊ณ ํด ๋์ผ L2 ์ธ๊ทธ๋จผํธ์์ ๊ณง๋ฐ๋ก ๋ผ์ฐํ ์์ด ๋๋ฌ๋๊ฒ ํ๋ค.
๊ฐ์ ๋ ธ๋์ ์๋ ํ๋ ํธ์ถ ์
kubectl get svc webpod -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
LBIP=$(kubectl get svc webpod -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
# k8s-ctr์์ VIP๋ก HTTP ์์ฒญ
(โ|HomeLab:N/A) root@k8s-ctr:~# curl -s $LBIP
Hostname: webpod-697b545f57-j524d
IP: 127.0.0.1
IP: ::1
IP: 172.20.0.102
IP: fe80::854:22ff:fea8:fcf4
RemoteAddr: 172.20.0.65:59194
GET / HTTP/1.1
Host: 192.168.10.211
User-Agent: curl/8.5.0
Accept: */*
RemoteAddr: 172.20.0.65:59194์ธ๋ฐ ์ฌ๊ธฐ์ 172.20.0.65๋ k8s-ctr ๋ ธ๋์ cilium_host ์ธํฐํ์ด์ค IP์ด๋ค.
VIP → ๋ก๋๋ฐธ๋ฐ์ฑ → ๊ฐ์ ๋ ธ๋์ ์๋ ํ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ณด๋ด๋ฉด ์๊ธฐ ์์ ์ ๋ค์ ๊ฑฐ์น๋ ์์ฒญํ๋ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด SNATํ์ฌ ์์ค ip๋ฅผ cilium_host๋ก ๋ฐ๊พธ๊ฒ ๋๊ณ ํ๋ ์ ์ฅ์์๋ ์์ฒญ์ด ๋ ธ๋(cilium_host)์์ ์จ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋๋ค.
๋ค๋ฅธ ๋ ธ๋์ ์๋ ํ๋ ํธ์ถ ์
# ํด๋ฌ์คํฐ ๋ด๋ถ์ Pod(curl-pod) ์์ VIP๋ก ์์ฒญ
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl exec -it curl-pod -- curl -s $LBIP
Hostname: webpod-697b545f57-7vgtj
IP: 127.0.0.1
IP: ::1
IP: 172.20.1.25 # k8s-w1 ๋
ธ๋์ ์๋ ํ๋
IP: fe80::301b:7cff:fee1:9a9b
RemoteAddr: 172.20.0.221:35828
GET / HTTP/1.1
Host: 192.168.10.211
User-Agent: curl/8.14.1
Accept: */*
curl-pod์ ํ๋ IP๋ก ๋ค๋ฅธ ํ๋์์ VIP๋ก ์์ฒญํ๋ฉด ์์ฒ๋ผ SNAT ์์ด ํด๋ผ์ด์ธํธ ํ๋ IP๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ฃผ์ด ์ด๋์ ํธ์ถํ์๋์ง๋ฅผ ํ์ธํ ์ ์๋ค.
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get ippools
NAME DISABLED CONFLICTING IPS AVAILABLE AGE
cilium-lb-ippool false False 4 20m
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get ippools -o jsonpath='{.items[*].status.conditions[?(@.type!="cilium.io/PoolConflict")]}' | jq
...
{
"lastTransitionTime": "2025-08-09T14:34:47Z",
"message": "1",
"observedGeneration": 1,
"reason": "noreason",
"status": "Unknown",
"type": "cilium.io/IPsUsed"
}
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get svc webpod -o jsonpath='{.status}' | jq
{
"conditions": [
{
"lastTransitionTime": "2025-08-09T14:35:37Z",
"message": "",
"reason": "satisfied",
"status": "True",
"type": "cilium.io/IPAMRequestSatisfied"
}
],
"loadBalancer": {
"ingress": [
{
"ip": "192.168.10.211",
"ipMode": "VIP"
}
]
}
}
ํ๋๋ฅผ ํ ๋นํด์ 5 -> 4๋ก ๋ณํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ผ์ฐํฐ์์ LBIP๋ก ํต์
root@router:~# LBIP=192.168.10.211
root@router:~# curl --connect-timeout 1 $LBIP
curl: (28) Failed to connect to 192.168.10.211 port 80 after 1003 ms: Timeout was reached
root@router:~# arping -i eth1 $LBIP -c 1
ARPING 192.168.10.211
Timeout
root@router:~# arp -a
? (192.168.10.211) at <incomplete> on eth1 # ARP ์์ฒญ์ ๋ณด๋์ง๋ง MAC ์ฃผ์๋ฅผ ๋ชป ๋ฐ์ ์ํ๋ก ๋์ ํธ์คํธ๊ฐ ๊ฐ์ ๋ธ๋ก๋์บ์คํธ ๋๋ฉ์ธ์ ์๊ฑฐ๋ ์๋ตํ์ง ์๋ ์ํ
? (192.168.10.100) at 00:0c:29:2c:5d:fa [ether] on eth1
? (192.168.20.100) at 00:0c:29:92:fa:d7 [ether] on eth2
? (192.168.163.1) at 9e:58:84:52:81:66 [ether] on eth0
_gateway (192.168.163.2) at 00:50:56:f1:a5:32 [ether] on eth0
? (192.168.163.254) at 00:50:56:f5:76:f6 [ether] on eth0
192.168.10.211์ MAC ์ฃผ์๋ฅผ ๋ชจ๋ฅด๋๋ฐ ๊ฐ์ Layer2์ ์๊ฑฐ๋ ํด๋น IP๋ฅผ ๊ฐ์ง ์ฅ์น๊ฐ ๋คํธ์ํฌ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ค๋ฆฌ์ L2 ๊ด๊ณ
์ ์ฆ์์ ํด๊ฒฐํ๊ธฐ ์ํด l2 ๊ด๊ณ ๋ชจ๋๋ฅผ ์ผ์ค๋ค.
(โ|HomeLab:N/A) root@k8s-ctr:~# helm upgrade cilium cilium/cilium --namespace kube-system --version 1.18.0 --reuse-values \
--set l2announcements.enabled=true && watch -d kubectl get pod -A
Release "cilium" has been upgraded. Happy Helming!
NAME: cilium
LAST DEPLOYED: Sun Aug 10 00:07:55 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble Relay and Hubble UI.
Your release version is 1.18.0.
For any further help, visit https://docs.cilium.io/en/v1.18/gettinghelp
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl rollout restart -n kube-system ds/cilium
daemonset.apps/cilium restarted
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl -n kube-system exec ds/cilium -c cilium-agent -- cilium-dbg config --all | grep EnableL2Announcements
EnableL2Announcements : true
(โ|HomeLab:N/A) root@k8s-ctr:~# cilium config view | grep enable-l2
enable-l2-announcements true
enable-l2-neigh-discovery false
(โ|HomeLab:N/A) root@k8s-ctr:~# cat << EOF | kubectl apply -f -
apiVersion: "cilium.io/v2alpha1" # not v2
kind: CiliumL2AnnouncementPolicy
metadata:
name: policy1
spec:
serviceSelector:
matchLabels:
app: webpod
nodeSelector:
matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- k8s-w0
interfaces:
- ^eth[1-9]+
externalIPs: true
loadBalancerIPs: true
EOF
ciliuml2announcementpolicy.cilium.io/policy1 created
๋ฆฌ๋ ํ์ธ
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl -n kube-system get lease | grep "cilium-l2announce"
cilium-l2announce-default-webpod k8s-ctr 2m1s
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl -n kube-system get lease/cilium-l2announce-default-webpod -o yaml | yq
{
"apiVersion": "coordination.k8s.io/v1",
"kind": "Lease",
"metadata": {
"creationTimestamp": "2025-08-09T16:06:01Z",
"name": "cilium-l2announce-default-webpod",
"namespace": "kube-system",
"resourceVersion": "101975",
"uid": "7563bc1e-b8ef-4fff-b9d7-99110ef32a26"
},
"spec": {
"acquireTime": "2025-08-09T16:06:01.973450Z",
"holderIdentity": "k8s-ctr",
"leaseDurationSeconds": 15,
"leaseTransitions": 0,
"renewTime": "2025-08-09T16:08:10.585356Z"
}
}
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl exec -n kube-system $CILIUMPOD0 -- cilium-dbg shell -- db/show l2-announce
IP NetworkInterface
192.168.10.211 eth1
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl exec -n kube-system $CILIUMPOD1 -- cilium-dbg shell -- db/show l2-announce
IP NetworkInterface
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl exec -n kube-system $CILIUMPOD2 -- cilium-dbg shell -- db/show l2-announce
IP NetworkInterface
VIP 192.168.10.211์ k8s-ctr ๋ ธ๋์ Cilium์ด eth1์์ ๋จ๋ ์ผ๋ก L2 ๊ด๊ณ ์ค์ธ ์ํ์ด๋ค.
๋ค๋ฅธ ๋ ธ๋๋ ๊ด๊ณ ํ์ง ์์์ผ๋ก์จ ๋จ์ผ ๋ฆฌ๋ ๋ ธ๋๋ก ARP ์ถฉ๋์ ๋ฐฉ์งํ๋ค.
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl -n kube-system logs ds/cilium | grep "l2"
Found 3 pods, using pod/cilium-69nxs
...
# ํ๋ผ๋ฏธํฐ ํ์ธ
--enable-l2-announcements=true
--l2-announcements-lease-duration=15s
--l2-announcements-renew-deadline=5s
--l2-announcements-retry-period=2s
# ์ปดํฌ๋ํธ ์ด๊ธฐํ
l2announcer.init...
l2responder.NewL2ResponderReconciler...
# BPF ๋งต ๋ฑ๋ก
Registered BPF map /sys/fs/bpf/tc/globals/cilium_l2_responder_v4
l2 announcer table full reconciliation
# ๋ฆฌ๋ ์ ์ถ
attempting to acquire leader lease kube-system/cilium-l2announce-default-webpod...
successfully acquired lease ...
# ํฌ์ค ์ฒดํฌ
Timer job triggered ... l2-announcer-lease-gc
Timer job finished ...
๋ผ์ฐํฐ์์ ํต์ ํ์ธ
L2 ์๋ต ํ์ธ
root@router:~# arping -i eth1 $LBIP -c 1000
ARPING 192.168.10.211
60 bytes from 00:0c:29:2c:5d:fa (192.168.10.211): index=0 time=195.438 usec
60 bytes from 00:0c:29:2c:5d:fa (192.168.10.211): index=1 time=304.491 usec
60 bytes from 00:0c:29:2c:5d:fa (192.168.10.211): index=2 time=821.920 usec
60 bytes from 00:0c:29:2c:5d:fa (192.168.10.211): index=3 time=491.136 usec
60 bytes from 00:0c:29:2c:5d:fa (192.168.10.211): index=4 time=299.574 usec
^C
--- 192.168.10.211 statistics ---
5 packets transmitted, 5 packets received, 0% unanswered (0 extra)
rtt min/avg/max/std-dev = 0.195/0.423/0.822/0.221 ms
ํด๋น VIP๊ฐ ์ ์์ ์ผ๋ก L2์์ ์๋ตํ๊ณ ์๋ค.
ARP ํ ์ด๋ธ ํ์ธ
root@router:~# arp -a
? (192.168.10.211) at 00:0c:29:2c:5d:fa [ether] on eth1 # VIP์ ์ด VIP์ ๋งฅ ์ฃผ์
? (192.168.10.100) at 00:0c:29:2c:5d:fa [ether] on eth1 # 192.168.10.100๋ ๊ฐ์ MAC ์ฃผ์๋ฅผ ์ฌ์ฉ → ๊ฐ์ ๋
ธ๋์ ์ํ ๋ค๋ฅธ IP
? (192.168.20.100) at 00:0c:29:92:fa:d7 [ether] on eth2
? (192.168.163.1) at 9e:58:84:52:81:66 [ether] on eth0
_gateway (192.168.163.2) at 00:50:56:f1:a5:32 [ether] on eth0
? (192.168.163.254) at 00:50:56:f5:76:f6 [ether] on eth0
root@router:~# curl -s $LBIP | grep Hostname
curl -s $LBIP | grep RemoteAddr
Hostname: webpod-697b545f57-7vgtj
RemoteAddr: 172.20.0.65:42486 # VIP๋ฅผ ๊ด๊ณ ํ ๋
ธ๋์ cilium_host ์ธํฐํ์ด์ค IP
์ธ๋ถ์์ VIP๋ก ์ ์ํ๋ฉด ์์ฒญ์ VIP๋ฅผ ๋ณด์ ํ ๋ ธ๋๋ก ๋ค์ด์ค๊ฒ ๋๊ณ Cilium์ด Pod ๋คํธ์ํฌ(cilium_host) IP๋ฅผ ์์ค๋ก ํ์ฌ Pod๋ก ์ ๋ฌํ๋ค.
๊ทธ๋์ ์๋ฒ ์๋ต ์ ์ธ๋ถ IP ๋์ VIP๋ฅผ ๊ฐ์ง ๋ ธ๋์ ํ๋ ๋คํธ์ํฌ IP๊ฐ ํ์๋๋ค.
์๋น์ค ์ถ๊ฐ ์ ๋์ ํ์ธ
(โ|HomeLab:N/A) root@k8s-ctr:~# cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: netshoot-web
labels:
app: netshoot-web
spec:
replicas: 3
selector:
matchLabels:
app: netshoot-web
template:
metadata:
labels:
app: netshoot-web
spec:
terminationGracePeriodSeconds: 0
containers:
- name: netshoot
EOF done080 -q 1;HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nOK from \$POD_NAM
deployment.apps/netshoot-web created
(โ|HomeLab:N/A) root@k8s-ctr:~# cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: netshoot-web
labels:
app: netshoot-web
spec:
type: LoadBalancer
selector:
app: netshoot-web
ports:
- name: http
port: 80
targetPort: 8080
EOF
service/netshoot-web created
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get svc netshoot-web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
netshoot-web LoadBalancer 10.96.70.7 192.168.10.212 80:31636/TCP 8s
(โ|HomeLab:N/A) root@k8s-ctr:~# cat << EOF | kubectl apply -f -
apiVersion: "cilium.io/v2alpha1" # not v2
kind: CiliumL2AnnouncementPolicy
metadata:
name: policy2
spec:
serviceSelector:
matchLabels:
app: netshoot-web
nodeSelector:
matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- k8s-w0
interfaces:
- ^eth[1-9]+
externalIPs: true
loadBalancerIPs: true
EOF
ciliuml2announcementpolicy.cilium.io/policy2 created
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl -n kube-system get lease | grep "cilium-l2announce"
cilium-l2announce-default-netshoot-web k8s-w1 27s
cilium-l2announce-default-webpod k8s-ctr 27m
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get svc netshoot-web -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
(โ|HomeLab:N/A) root@k8s-ctr:~# LB2IP=$(kubectl get svc netshoot-web -o jsonpath='{.status.loadBalancer.ingress[0].ip}')gress[0].ip}')
(โ|HomeLab:N/A) root@k8s-ctr:~# curl -s $LB2IP
OK from netshoot-web-5c59d94bd4-x7c6l
root@router:~# arping -i eth1 $LB2IP -c 2
ARPING 192.168.10.212
60 bytes from 00:0c:29:79:f7:02 (192.168.10.212): index=0 time=584.052 usec
60 bytes from 00:0c:29:79:f7:02 (192.168.10.212): index=1 time=276.338 usec
--- 192.168.10.212 statistics ---
2 packets transmitted, 2 packets received, 0% unanswered (0 extra)
rtt min/avg/max/std-dev = 0.276/0.430/0.584/0.154 ms
root@router:~# curl -s $LB2IP
OK from netshoot-web-5c59d94bd4-42xwj
์๋ก์ด ์๋น์ค(netshoot-web)๋ฅผ LoadBalancer ํ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด Cilium LoadBalancer IP Pool์์ ์๋ก์ด VIP(192.168.10.212)๊ฐ ํ ๋น๋๋ค.
VIP๋ L2Announce๋ฅผ ํตํด ๋คํธ์ํฌ ์์ ๊ด๊ณ ๋๊ณ ์ธ๋ถ ์ฅ๋น(๋ผ์ฐํฐ)์์๋ ํด๋น VIP๋ฅผ ARP๋ก ์กฐํํ ์ ์๋ค.
netshoot-web ์ EX-IP๋ฅผ ์ง์ ๋ณ๊ฒฝ

K9S > SVC > netshoot-web E

root@router:~# arping -i eth1 192.168.10.215 -c 2
ARPING 192.168.10.215
60 bytes from 00:0c:29:79:f7:02 (192.168.10.215): index=0 time=310.505 usec
60 bytes from 00:0c:29:79:f7:02 (192.168.10.215): index=1 time=479.675 usec
--- 192.168.10.215 statistics ---
2 packets transmitted, 2 packets received, 0% unanswered (0 extra)
rtt min/avg/max/std-dev = 0.311/0.395/0.480/0.085 ms
Sharing Keys : EX-IP 1๊ฐ๋ฅผ ๊ฐ๊ธฐ ๋ค๋ฅธ ํฌํธ ์ฌ์ฉํ๊ธฐ
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: netshoot-web2
labels:
app: netshoot-web
spec:
type: LoadBalancer
selector:
app: netshoot-web
ports:
- name: http
port: 8080
targetPort: 8080
EOF
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get svc -l app=netshoot-web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
netshoot-web LoadBalancer 10.96.70.7 192.168.10.215 80:31636/TCP 11m
netshoot-web2 LoadBalancer 10.96.58.141 192.168.10.212 8080:31282/TCP 115s

๊ฐ์ external ip๋ก ๋ณ๊ฒฝ๋ ์ ํ์ธ
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl get svc -l app=netshoot-web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
netshoot-web LoadBalancer 10.96.70.7 192.168.10.215 80:31636/TCP 11m
netshoot-web2 LoadBalancer 10.96.58.141 192.168.10.215 8080:31282/TCP 115s
(โ|HomeLab:N/A) root@k8s-ctr:~# kubectl -n kube-system get lease | grep "cilium-l2announce"
cilium-l2announce-default-netshoot-web k8s-w1 11m
cilium-l2announce-default-netshoot-web2 k8s-w1 2m51s
cilium-l2announce-default-webpod k8s-ctr 39m
root@router:~# LB2IP=192.168.10.215
root@router:~# curl -s $LB2IP
OK from netshoot-web-5c59d94bd4-x7c6l
root@router:~# arping -i eth1 $LB2IP -c 2
ARPING 192.168.10.215
60 bytes from 00:0c:29:79:f7:02 (192.168.10.215): index=0 time=477.965 usec
60 bytes from 00:0c:29:79:f7:02 (192.168.10.215): index=1 time=193.587 usec
--- 192.168.10.215 statistics ---
2 packets transmitted, 2 packets received, 0% unanswered (0 extra)
rtt min/avg/max/std-dev = 0.194/0.336/0.478/0.142 ms
root@router:~# curl -s $LB2IP:8080
OK from netshoot-web-5c59d94bd4-bhs69
๋ผ์ฐํฐ์์ ์ ์์ ์ผ๋ก ํต์ ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.