Kubernetes Service(5): Cillium Quick-start w/Hubble UI

  • kkumtree

2024-10-26T01:35:59+09:00

kans
ebpf
cilium
kubeadm
kubernetes

๊ทธ๋Ÿผ ๋งค๋ฒˆ ์‹คํŒจ๋งŒ ํ–ˆ๋˜ Cilium ๋ฐฐํฌ๋ฅผ ํ•œ๋ฒˆ ํ•ด๋ณผ๊นŒ์š”?

CloudNet@์—์„œ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” K8s Advanced Network Study(์ดํ•˜, KANS)๋ฅผ ํ†ตํ•ด ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. CSP VM ๊ณจ๋ผ๋ณด๊ธฐ

์ด๋ ‡๊ฒŒ ์“ด ์ด์œ ๋Š” ๊ฒฐ๊ตญ ๋„คํŠธ์›Œํฌ๋ฅผ ์ž˜ ์•Œ์•„์•ผํ•˜๋Š”๋ฐ,
์ž‘๋…„์— ํ•  ๋•Œ๋Š” ๊ทธ๋Ÿฐ๊ฑฐ ์ƒ๊ฐ๋„ ์•ˆํ•˜๊ณ  ๊ทธ๋ƒฅ ์˜ฌ๋ ค๋ณด๋ ค ํ–ˆ์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์•ˆ ๋Œ์•„๊ฐ€๊ฒ ์ฃ ?

๊ทธ๋ƒฅ ๊ณฐ๊ณฐํžˆ ์˜ค๋ฆฌduckduckgo๋ž‘ ํˆฌ๋‹ฅ๊ฑฐ๋ฆฌ๋‹ค๋ณด๋‹ˆ, ๋น„๋ก ์—ฐ์‹์ด ๋˜๊ธด ํ–ˆ์ง€๋งŒ
ํด๋ฆญ์„ ์•ˆํ•˜๊ณ ๋Š” ๋ชป๋ฐฐ๊ธธ ์œ„์˜ ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ์ด ๋ˆˆ์— ๋„์˜€์Šต๋‹ˆ๋‹ค.

a. ์‚ฌ์ „ ์กฐ์‚ฌ

  1. ์ปค๋„:
  • ํ˜„์žฌ ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๋ฒ„์ „์ด ๋งˆ์ด๋„ˆ ๋ฒ„์ „์€ ๋ชป ์™ธ์šฐ๊ฒ ์ง€๋งŒ, ๋Œ€์ถฉ ๋ฉ”์ด์ €๊ฐ€ 6๋ฒ„์ „์ด๋‹ˆ PASS
  1. NIC:
  • ENA(Elastic Network Adapter) ๋“œ๋ผ์ด๋ฒ„ ์–ธ๊ธ‰์ด ๋‚˜์˜จ ๊ฒƒ์œผ๋กœ ๋ด์„ ,
    ์ง€์› ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋œ ํ—ค๋ฉœ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.
  1. MTU ์ƒํ•œ:
  • cilium ์ตœ์‹  ๋ฒ„์ „๋„ ์ƒํ•œ๊ฐ’์ด 3818์ธ์ง€ ํ™•์ธํ•˜๋ฉด ์ข‹์„ ๋“ฏํ•ฉ๋‹ˆ๋‹ค.
  1. NIC channels for RX/TX Queue:
  • ์ ˆ๋ฐ˜ ์ด์ƒ์„ ๋น„์›Œ์•ผํ•œ๋‹ค๋Š”๋ฐ, ์ฑ„๋„ ์ˆ˜ ๋ชจ๋ฅด๋ฉด ์ข€ ๋งŽ์ด ํ—ค๋งฌ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

b. AWS CLI๋กœ ํ™•์ธ

์Šคํ„ฐ๋””์—์„œ ์ œ๊ณต๋œ CloudFormationํŒŒ์ผ ์ค‘ AMI์€
Canonical์—์„œ ๊ด€๋ฆฌํ•˜๋Š” SSM ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์ตœ์‹ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ์ด SSM ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด AMI ID๋ฅผ ์–ป์–ด์™€ ๋ณด์ฃ .

aws ssm get-parameters --names /aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id --region ap-northeast-2
{
    "Parameters": [
        {
            "Name": "/aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id",
            "Type": "String",
            "Value": "ami-042e76978adeb8c48",
            "Version": 30,
            "LastModifiedDate": "2024-09-27T13:11:50.127000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-2::parameter/aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id",
            "DataType": "aws:ec2:image"
        }
    ],
    "InvalidParameters": []
}

๋‹น์—ฐํžˆ enaSupport๊ฐ€ true๋กœ ๋‚˜์˜ค๋„ค์š”.

aws ec2 describe-images --image-id ami-042e76978adeb8c48 --query "Images[].EnaSupport"
# [
#     true
# ]

๋ˆˆ๊ฐ๊ณ  c5.16xlarge ๋ฅผ ๋„์›Œ๋ณผ๊นŒ ์‹ถ๊ธดํ•œ๋ฐ, ์•„๋ž˜ ๋ฌธ์„œ์—์„œ Nitro v2 ๋ฒ„์ „ ํƒญ์— T3๋„ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋„ค์š”.
Cloudformation YAML์— ๊ธฐ๋ณธ ์ •์˜๋œ t3.xlarge๋ฅผ ์จ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

c. ํ”„๋กœ๋น„์ €๋‹ ํ›„ ๊ธฐ๋ณธ ์ฒดํฌ

  • ์Šคํ„ฐ๋””์—์„œ ์ œ๊ณต๋œ ๋Œ€๋กœ, kube-proxy ์—†์ด ์šด์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๊ฒƒ์ด๊ธฐ์— ํ™•์ธ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฏธ kubeadm ๋ฐฐํฌ ์‹œ, --skip-phases=addon/kube-proxy param์ด ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • No kube-proxy

# Access to Control Plane Node
ssh -i $Keypair ubuntu@$ControlPlaneIP  

# Not ready because of no kube-proxy 
kubectl get nodes
# NAME     STATUS     ROLES           AGE   VERSION
# k8s-s    NotReady   control-plane   14m   v1.30.6
# k8s-w1   NotReady   <none>          13m   v1.30.6
# k8s-w2   NotReady   <none>          13m   v1.30.6

# No kube-proxy
kubectl cluster-info
# Kubernetes control plane is running at https://192.168.10.10:6443
# CoreDNS is running at https://192.168.10.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

# No kube-proxy  
kubectl get pod -A
# NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
# kube-system   coredns-55cb58b774-h9dnm        0/1     Pending   0          14m
# kube-system   coredns-55cb58b774-vjzrk        0/1     Pending   0          14m
# kube-system   etcd-k8s-s                      1/1     Running   0          14m
# kube-system   kube-apiserver-k8s-s            1/1     Running   0          14m
# kube-system   kube-controller-manager-k8s-s   1/1     Running   0          14m
# kube-system   kube-scheduler-k8s-s            1/1     Running   0          14m
  • ์ปค๋„ ํ™•์ธ: ์•ˆํ•ด๋„ ๋˜์ง€๋งŒ, ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
# Kernel Version
uname -a
# Linux k8s-s 6.8.0-1015-aws #16~22.04.1-Ubuntu SMP Mon Aug 19 19:38:17 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
hostnamectl | grep Kernel
          # Kernel: Linux 6.8.0-1015-aws

# XDP Support
grep -i CONFIG_XDP_SOCKETS /boot/config-$(uname -r)
# CONFIG_XDP_SOCKETS=y
# CONFIG_XDP_SOCKETS_DIAG=m
  • NIC ํ™•์ธ
netplan status | grep ethernet
# โ—  1: lo ethernet UNKNOWN/UP (unmanaged)
# โ—  2: ens5 ethernet UP (networkd: ens5)

# MTU
ip link show ens5 | grep mtu
# 2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000


# RX/TX Queue
ethtool -l ens5
# Channel parameters for ens5:
# Pre-set maximums:
# RX:		n/a
# TX:		n/a
# Other:		n/a
# Combined:	4
# Current hardware settings:
# RX:		n/a
# TX:		n/a
# Other:		n/a
# Combined:	4

# Driver
ethtool -i ens5 | grep ena
# driver: ena

Cilium์—์„œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋”ฐ๋กœ ์‚ดํŽด๋ด์•ผ๊ฒ ์ง€๋งŒ,
MTU ๋ฐ RX/TX Queue ๊ด€๋ จ ์ฑ„๋„ ๊ฐ’์„ ๋ฐ”๊ฟ”์•ผํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

2. Cilium ์„ค์น˜

  • ์„ค์น˜ ์ „์— ๋ฏธ๋ฆฌ OS์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

a. ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •

ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •ํ•ด๋‘ก๋‹ˆ๋‹ค.

  • Maxium MTU: 3498
    • ์ตœ์‹ ๋ฌธ์„œ(v1.16.3)์—์„œ๋Š” ๊ฐ’์ด ๋” ๋‚ฎ์•„์ ธ์„œ 3498๋กœ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • RX/TX Queue: more than half

RX/TX Queue๋Š” ๊ทธ๋ ‡๋‹ค๊ณ  ์น˜๊ณ , MTU์˜ ๊ฒฝ์šฐ์—๋Š” ์™œ ์กฐ์ •ํ•ด์•ผ๋˜๋Š”์ง€ ์•„๋ž˜์—๋„ ์„ค๋ช…๋˜์–ด์žˆ์œผ๋‹ˆ ์ฐธ์กฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

# MTU
ip link set dev ens5 mtu 3498
ip link show ens5 | grep mtu
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 3498 qdisc mq state UP mode DEFAULT group default qlen 1000

# RX/TX Queue
ethtool -L ens5 combined 1
ethtool -l ens5
# Channel parameters for ens5:
# Pre-set maximums:
# RX:		n/a
# TX:		n/a
# Other:		n/a
# Combined:	4
# Current hardware settings:
# RX:		n/a
# TX:		n/a
# Other:		n/a
# Combined:	1

b. Cilium CLI ์„ค์น˜

๊ทธ๋ƒฅ ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ Cilium CLI ์„ค์น˜ ๋ฏธ๋ฆฌ ํ•ด๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์ง Major๊ฐ€ v1์€ ์•„๋‹™๋‹ˆ๋‹ค.

curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt  
# v0.16.19
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

๋ฒ„์ „ ํ™•์ธ์„ ์•ˆ๋‚ด๋Œ€๋กœ ํ•ด๋ด…์‹œ๋‹ค.

cilium version --client
# cilium-cli: v0.16.19 compiled with go1.23.1 on linux/amd64
# cilium image (default): v1.16.2
# cilium image (stable): v1.16.3

c. helm ๋ฐฐํฌ

๊ทธ๋ƒฅ ์‹คํŒจํ•˜๋ฉด cilium CLI๋กœ ์„ค์น˜ํ•˜๊ณ  ๋ˆˆ ๊ฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

helm repo add cilium https://helm.cilium.io/
# "cilium" has been added to your repositories
helm repo update
# Hang tight while we grab the latest from your chart repositories...
# ...Successfully got an update from the "cilium" chart repository
# Update Complete. โŽˆHappy Helming!โŽˆ

helm install cilium cilium/cilium --version 1.16.3 --namespace kube-system \
--set k8sServiceHost=192.168.10.10 --set k8sServicePort=6443 --set debug.enabled=true \
--set rollOutCiliumPods=true --set routingMode=native --set autoDirectNodeRoutes=true \
--set bpf.masquerade=true --set bpf.hostRouting=true --set endpointRoutes.enabled=true \
--set ipam.mode=kubernetes --set k8s.requireIPv4PodCIDR=true --set kubeProxyReplacement=true \
--set ipv4NativeRoutingCIDR=192.168.0.0/16 --set installNoConntrackIptablesRules=true \
--set hubble.ui.enabled=true --set hubble.relay.enabled=true --set prometheus.enabled=true --set operator.prometheus.enabled=true --set hubble.metrics.enableOpenMetrics=true \
--set hubble.metrics.enabled="{dns:query;ignoreAAAA,drop,tcp,flow,port-distribution,icmp,httpV2:exemplars=true;labelsContext=source_ip\,source_namespace\,source_workload\,destination_ip\,destination_namespace\,destination_workload\,traffic_direction}" \
--set operator.replicas=1
  • ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช…
ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช…
debug.enabled cilium ํŒŒ๋“œ์— ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ debug ์„ค์ •
autoDirectNodeRoutes ๋™์ผ ๋Œ€์—ญ ๋‚ด์˜ ๋…ธ๋“œ๋“ค ๋ผ๋ฆฌ๋Š” ์ƒ๋Œ€ ๋…ธ๋“œ์˜ podCIDR ๋Œ€์—ญ์˜ ๋ผ์šฐํŒ…์ด ์ž๋™์œผ๋กœ ์„ค์ •
endpointRoutes.enabled ํ˜ธ์ŠคํŠธ์— endpoint(ํŒŒ๋“œ)๋ณ„ ๊ฐœ๋ณ„ ๋ผ์šฐํŒ… ์„ค์ •
hubble.relay.enabled hubble ํ™œ์„ฑํ™”
hubble.ui.enabled hubble UI ํ™œ์„ฑํ™”
ipam.mode k8s IPAM ํ™œ์šฉ
k8s.requireIPv4PodCIDR k8s์—์„œ IPv4 Pod CIDR๋ฅผ ์š”๊ตฌ
kubeProxyReplacement kube-proxy ์—†์ด (์ตœ๋Œ€ํ•œ) ๋Œ€์ฒดํ• ์ˆ˜ ์žˆ์ˆ˜ ์žˆ๊ฒŒ
ipv4NativeRoutingCIDR=192.168.0.0/16 ํ•ด๋‹น ๋Œ€์—ญ๊ณผ ํ†ต์‹  ์‹œ IP Masq ํ•˜์ง€ ์•Š์Œ, ๋ณดํ†ต ์‚ฌ๋‚ด๋ง ๋Œ€์—ญ์„ ์ง€์ •
operator.replicas cilium-operator ํŒŒ๋“œ ๊ธฐ๋ณธ 1๊ฐœ
enableIPv4Masquerade ํŒŒ๋“œ๋ฅผ ์œ„ํ•œ Masquerade
bpf.masquerade ์ถ”๊ฐ€๋กœ Masquerade ์„ BPF ๋กœ ์ฒ˜๋ฆฌ
NAME: cilium
LAST DEPLOYED: Sun Oct 27 11:58:59 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble Relay and Hubble UI.

Your release version is 1.16.3.

For any further help, visit https://docs.cilium.io/en/v1.16/gettinghelp

… ์Šคํ„ฐ๋””์—์„œ ์•ˆ๋‚ดํ•ด์ฃผ์‹  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ ํ–ˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์ด๊ฒŒ ์™œ ๋˜์ง€…?
์ด์ œ, ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ ์ฃผ์ž…์•ˆํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ํ•ด๋‹น ๋ฒ„์ „์ด ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

cilium version
# cilium-cli: v0.16.19 compiled with go1.23.1 on linux/amd64
# cilium image (default): v1.16.2
# cilium image (stable): v1.16.3
# cilium image (running): 1.16.3

3. Cilium ์‚ดํŽด๋ณด๊ธฐ

a. ๋ฐฐํฌ ์ดํ›„ ์ƒํƒœ

์ด์ œ kube-proxy ์—†์ด๋„ ๊ฐ Node๊ฐ€ Ready ์ƒํƒœ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl get nodes
# NAME     STATUS   ROLES           AGE   VERSION
# k8s-s    Ready    control-plane   20h   v1.30.6
# k8s-w1   Ready    <none>          20h   v1.30.6
# k8s-w2   Ready    <none>          20h   v1.30.6

kube-proxy๋Š” ์—†์Šต๋‹ˆ๋‹ค.

kubectl get pods -A
# NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
# kube-system   cilium-2g4bh                       1/1     Running   0          91m
# kube-system   cilium-522nn                       1/1     Running   0          91m
# kube-system   cilium-csdd7                       1/1     Running   0          91m
# kube-system   cilium-envoy-82drs                 1/1     Running   0          91m
# kube-system   cilium-envoy-96vst                 1/1     Running   0          91m
# kube-system   cilium-envoy-gnh2q                 1/1     Running   0          91m
# kube-system   cilium-operator-76bb588dbc-57945   1/1     Running   0          91m
# kube-system   coredns-55cb58b774-h9dnm           1/1     Running   0          20h
# kube-system   coredns-55cb58b774-vjzrk           1/1     Running   0          20h
# kube-system   etcd-k8s-s                         1/1     Running   0          20h
# kube-system   hubble-relay-88f7f89d4-r4ccq       1/1     Running   0          91m
# kube-system   hubble-ui-59bb4cb67b-l5ttc         2/2     Running   0          91m
# kube-system   kube-apiserver-k8s-s               1/1     Running   0          20h
# kube-system   kube-controller-manager-k8s-s      1/1     Running   0          20h
# kube-system   kube-scheduler-k8s-s               1/1     Running   0          20h

kubectl get svc -A
# NAMESPACE     NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
# default       kubernetes       ClusterIP   10.10.0.1       <none>        443/TCP                  20h
# kube-system   cilium-envoy     ClusterIP   None            <none>        9964/TCP                 93m
# kube-system   hubble-metrics   ClusterIP   None            <none>        9965/TCP                 93m
# kube-system   hubble-peer      ClusterIP   10.10.161.48    <none>        443/TCP                  93m
# kube-system   hubble-relay     ClusterIP   10.10.150.231   <none>        80/TCP                   93m
# kube-system   hubble-ui        ClusterIP   10.10.183.16    <none>        80/TCP                   93m
# kube-system   kube-dns         ClusterIP   10.10.0.10      <none>        53/UDP,53/TCP,9153/TCP   20h

NAT ํ…Œ์ด๋ธ”์— ์„ค์ •๋œ ๋ชจ๋“  ๊ทœ์น™์„ ์•Œ์•„๋ด…์‹œ๋‹ค: iptables -t -nat -S

iptables -t nat -S
# -P PREROUTING ACCEPT
# -P INPUT ACCEPT
# -P OUTPUT ACCEPT
# -P POSTROUTING ACCEPT
# -N CILIUM_OUTPUT_nat
# -N CILIUM_POST_nat
# -N CILIUM_PRE_nat
# -N KUBE-KUBELET-CANARY
# -A PREROUTING -m comment --comment "cilium-feeder: CILIUM_PRE_nat" -j CILIUM_PRE_nat
# -A OUTPUT -m comment --comment "cilium-feeder: CILIUM_OUTPUT_nat" -j CILIUM_OUTPUT_nat
# -A POSTROUTING -m comment --comment "cilium-feeder: CILIUM_POST_nat" -j CILIUM_POST_nat

b. Cilium CLI ํ™œ์šฉํ•˜๊ธฐ

Sigrid Jin๋‹˜์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Alias ์„ค์ •์„ ํ•ด๋‘๋ฉด ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋‹ˆ, ์ผ๋‹จ ํ•ด๋ด…์‹œ๋‹ค.
helm ๋ฐฐํฌ ์‹œ, kube-proxy๋ฅผ ๋Œ€์ฒดํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€์œผ๋‹ˆ,
๋งˆ์ง€๋ง‰์— ๋‹น์—ฐํžˆ True๊ฐ€ ๋‚˜์˜ค๊ธด ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

kubectl get -l k8s-app=cilium pods -n kube-system --field-selector spec.nodeName=k8s-s  -o jsonpath='{.items[0].metadata.name}'
# cilium-522nn
export CILIUMPOD0=$(kubectl get -l k8s-app=cilium pods -n kube-system --field-selector spec.nodeName=k8s-s  -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $CILIUMPOD0 -n kube-system -c cilium-agent -- cilium status
# KVStore:                 Ok   Disabled
# Kubernetes:              Ok   1.30 (v1.30.6) [linux/amd64]
# Kubernetes APIs:         ["EndpointSliceOrEndpoint", "cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "cilium/v2alpha1::CiliumCIDRGroup", "core/v1::Namespace", "core/v1::Pods", "core/v1::Service", "networking.k8s.io/v1::NetworkPolicy"]
# KubeProxyReplacement:    True   [ens5   192.168.10.10 fe80::b1:11ff:feba:7ce9 (Direct Routing)]
# Host firewall:           Disabled
# SRv6:                    Disabled
# CNI Chaining:            none
# CNI Config file:         successfully wrote CNI configuration file to /host/etc/cni/net.d/05-cilium.conflist
# Cilium:                  Ok   1.16.3 (v1.16.3-f2217191)
# NodeMonitor:             Listening for events on 4 CPUs with 64x4096 of shared memory
# Cilium health daemon:    Ok   
# IPAM:                    IPv4: 4/254 allocated from 172.16.0.0/24, 
# IPv4 BIG TCP:            Disabled
# IPv6 BIG TCP:            Disabled
# BandwidthManager:        Disabled
# Routing:                 Network: Native   Host: BPF
# Attach Mode:             TCX
# Device Mode:             veth
# Masquerading:            BPF   [ens5]   192.168.0.0/16 [IPv4: Enabled, IPv6: Disabled]
# Controller Status:       29/29 healthy
# Proxy Status:            OK, ip 172.16.0.231, 0 redirects active on ports 10000-20000, Envoy: external
# Global Identity Range:   min 256, max 65535
# Hubble:                  Ok              Current/Max Flows: 4095/4095 (100.00%), Flows/s: 26.15   Metrics: Ok
# Encryption:              Disabled        
# Cluster health:          3/3 reachable   (2024-10-27T05:05:44Z)
# Modules Health:          Stopped(0) Degraded(0) OK(45)
alias c0="kubectl exec -it $CILIUMPOD0 -n kube-system -c cilium-agent -- cilium"
c0 status | grep KubeProxyReplacement
# KubeProxyReplacement:    True   [ens5   192.168.10.10 fe80::b1:11ff:feba:7ce9 (Direct Routing)]

iptables MASQ ๋Œ€์‹  eBPF MASQ ์‚ฌ์šฉ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cilium config view | grep -i masq
# enable-bpf-masquerade                             true
# enable-ipv4-masquerade                            true
# enable-ipv6-masquerade                            true
# enable-masquerade-to-route-source                 false

c. Hubble UI

๊ฐ€์‹œ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์„ ๋‹ค๋“ค ์ข‹์•„ํ•˜๊ณ , ์ €๋„… ์‚ด์ง ๊ป˜๋ฆ„์น™ํ•˜์ง€๋งŒ ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
Hublle UI๋ฅผ ๋„์›Œ๋ณผ๊นŒ์š”?

์ด๋ฏธ helm์„ ํ†ตํ•ด์„œ, ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ์˜ฌ๋ผ์™€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl get -n kube-system svc hubble-ui
# NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
# hubble-ui   ClusterIP   10.10.183.16   <none>        80/TCP    146m

์ด๊ฑธ ์‚ด์ง ๋ง˜์—๋Š” ์•ˆ๋“ค์ง€๋งŒ NodePort๋กœ ๋…ธ์ถœ์‹œ์ผœ๋ด…์‹œ๋‹ค.

kubectl patch -n kube-system svc hubble-ui -p '{"spec": {"type": "NodePort"}}'
# service/hubble-ui patched
b
HubbleUiNodePort=$(kubectl get svc -n kube-system hubble-ui -o jsonpath={.spec.ports[0].nodePort})
# 30401
echo -e "Hubble UI URL = http://$(curl -s ipinfo.io/ip):$HubbleUiNodePort"Port"
# Hubble UI URL = http://13.125.233.122:30401

์šฐ์˜ค์˜ค์˜ค… UI ์ž˜ ๋œจ๋„ค์š”.

hubble-ui-first-glance

์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋„์›Œ์„œ, kube-system ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

hubble-in-kube-system

9. ๋ฑ€๋‹ค๋ฆฌ

a. Netplan

Ubuntu ์—์„œ๋Š” ์–ธ์ œ๋ถ€ํ„ฐ์ธ์ง€ ๊ธฐ์–ต์ด ์•ˆ๋‚˜๋Š”๋ฐ, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ netplan์„ ๋„คํŠธ์›Œํฌ ์„ค์ • ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
YAML๋กœ ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ํฌํ•จํ•ด ๋งŽ์€ ์ด์ ๋„ ์žˆ๊ณ ,
๋ฒ„์ „ ์—ก๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด ๊ฐœ์„ ์ด ๋งŽ์ด ์ด๋ฃจ์–ด์ ธ์„œ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Design Overview/Netplan

์‹ค์ œ๋กœ๋„ Ubuntu ๊ธฐ๋ฐ˜์˜ EC2๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

cat /etc/netplan/50-cloud-init.yaml 
# # This file is generated from information provided by the datasource.  Changes
# # to it will not persist across an instance reboot.  To disable cloud-init's
# # network configuration capabilities, write a file
# # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# # network: {config: disabled}
# network:
#     ethernets:
#         ens5:
#             dhcp4: true
#             dhcp6: false
#             match:
#                 macaddress: 02:b1:11:ba:7c:e9
#             set-name: ens5
#     version: 2

b. ๊ทธ๋ž˜์„œ XDP๋Š” ์–ด๋””์— ์žˆ๋‚˜์š”?

์ด ๊ธ€์—์„œ ์ผ๋‹จ helm์œผ๋กœ hubble UI๊นŒ์ง€ ๋œจ๋Š” ๊ฒƒ์„ ๋ดค์œผ๋‹ˆ, ์–ธ์  ๊ฐ€… ์ด์–ด์„œ ์จ๋ณด๊ณ  ์‹ถ๋„ค์š”.

Reference

์ค‘๊ฐ„์— ์–ธ๊ธ‰๋œ Docs ์™ธ์— ์ฐธ๊ณ ํ•œ ์œ ์šฉํ•œ ๋งํฌ์ž…๋‹ˆ๋‹ค.

kkumtree

plumber for infra

kkumtree

Source code on GitHub

ยฉ 2025 kkumtree and contributors All rights reserved.
Licensed under
CC BY-NC-ND 4.0