๊ทธ๋ผ ๋งค๋ฒ ์คํจ๋ง ํ๋ Cilium ๋ฐฐํฌ๋ฅผ ํ๋ฒ ํด๋ณผ๊น์?
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. CSP VM ๊ณจ๋ผ๋ณด๊ธฐ
์ด๋ ๊ฒ ์ด ์ด์ ๋ ๊ฒฐ๊ตญ ๋คํธ์ํฌ๋ฅผ ์ ์์์ผํ๋๋ฐ,
์๋
์ ํ ๋๋ ๊ทธ๋ฐ๊ฑฐ ์๊ฐ๋ ์ํ๊ณ ๊ทธ๋ฅ ์ฌ๋ ค๋ณด๋ ค ํ์ผ๋ ๋น์ฐํ ์ ๋์๊ฐ๊ฒ ์ฃ ?
๊ทธ๋ฅ ๊ณฐ๊ณฐํ ์ค๋ฆฌduckduckgo๋ ํฌ๋ฅ๊ฑฐ๋ฆฌ๋ค๋ณด๋, ๋น๋ก ์ฐ์์ด ๋๊ธด ํ์ง๋ง
ํด๋ฆญ์ ์ํ๊ณ ๋ ๋ชป๋ฐฐ๊ธธ ์์ ๋ธ๋ก๊ทธ ์ ๋ชฉ์ด ๋์ ๋์์ต๋๋ค.
a. ์ฌ์ ์กฐ์ฌ
- ์ปค๋:
- ํ์ฌ ๋ฆฌ๋ ์ค ์ปค๋ ๋ฒ์ ์ด ๋ง์ด๋ ๋ฒ์ ์ ๋ชป ์ธ์ฐ๊ฒ ์ง๋ง, ๋์ถฉ ๋ฉ์ด์ ๊ฐ 6๋ฒ์ ์ด๋ PASS
- NIC:
- ENA(Elastic Network Adapter) ๋๋ผ์ด๋ฒ ์ธ๊ธ์ด ๋์จ ๊ฒ์ผ๋ก ๋ด์ ,
์ง์ ์ธ์คํด์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋ ํค๋ฉ ๊ฒ ๊ฐ์ ๋๋์ด ๋ญ๋๋ค.
- MTU ์ํ:
- cilium ์ต์ ๋ฒ์ ๋ ์ํ๊ฐ์ด 3818์ธ์ง ํ์ธํ๋ฉด ์ข์ ๋ฏํฉ๋๋ค.
- NIC channels for RX/TX Queue:
- ์ ๋ฐ ์ด์์ ๋น์์ผํ๋ค๋๋ฐ, ์ฑ๋ ์ ๋ชจ๋ฅด๋ฉด ์ข ๋ง์ด ํค๋งฌ ๊ฒ ๊ฐ์ต๋๋ค.
b. AWS CLI๋ก ํ์ธ
- Docs:
์คํฐ๋์์ ์ ๊ณต๋ 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-proxyparam์ด ์ ์ฉ๋์ด ์์ต๋๋ค. -
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์ ์๋๋๋ค.
- Docs: Install the Cilium CLI
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 ์ ๋จ๋ค์.

์๋ฌด๊ฒ๋ ์๋์์, kube-system ์ดํด๋ณด๊ฒ ์ต๋๋ค.

9. ๋ฑ๋ค๋ฆฌ
a. Netplan
Ubuntu ์์๋ ์ธ์ ๋ถํฐ์ธ์ง ๊ธฐ์ต์ด ์๋๋๋ฐ, ๊ธฐ๋ณธ๊ฐ์ผ๋ก netplan์ ๋คํธ์ํฌ ์ค์ ๋๊ตฌ๋ก ์ฌ์ฉํฉ๋๋ค.
YAML๋ก ๋คํธ์ํฌ ์ค์ ์ ํ ์ ์๋ค๋ ์ ์ ํฌํจํด ๋ง์ ์ด์ ๋ ์๊ณ ,
๋ฒ์ ์ก๋ฐ์ดํธ๋ฅผ ํตํด ๊ฐ์ ์ด ๋ง์ด ์ด๋ฃจ์ด์ ธ์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ดํด๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ค์ ๋ก๋ 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
Source code on GitHub
ยฉ 2025 kkumtree and contributors All rights reserved.
Licensed under
CC BY-NC-ND 4.0