Monitoring CoreDNS in EKS with Grafana Cloud
- kkumtree
2024-10-30T23:44:01+09:00
Grafana Cloud ์ฒซ ์ฌ์ฉ๊ธฐ
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
์ด๋ฒ ์ฃผ์ฐจ๋ ์ค๊ฐ์ด ์์ง ์๋๋๋ฐ, ์คํฐ๋ ๋ง์ง๋ง ์ฃผ์ฐจ์
๋๋ค.
๊ทธ๋์ ์ฌ๋ฌ๋ถ์ด ์ ์๊ณ , ๋งค์ฐ ์ข์ํ๋ EKS๋ฅผ ํตํด, CoreDNS ์ด์๋ฅผ ๋ชจ๋ํฐ๋งํ๋ Hands-on์ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐ๋ผํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์์ Blog๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ผํด๋ณผ ๊ฒ๋๋ค.
0. EKS Cluster ์์ฑ
์คํฐ๋์์ ์ ๊ณต๋ CloudFormation์ ํตํด EKS Cluster๋ฅผ ์์ฑํด๋ณผ๊นํฉ๋๋ค.
eksctl์ด ์ธ๊ธ๋์ด ์์ด์ ์ ์ง… ๋์ค์ ๋กค๋ฐฑํ๊ณ ํ์ด๋ง์๋ถํฐ eksctl ๊ธฐ๋ฐ CloudFormation ๋ฐฐํฌ๋ฅผ ํ ๊ฒ ๊ฐ์ ๋ถ์ํจ์ด ์์ง๋ง ํด๋ณด์ฃ (?).
Kubernetes Service(5): Cillium Quick-start w/Hubble UI
- kkumtree
2024-10-26T01:35:59+09:00
๊ทธ๋ผ ๋งค๋ฒ ์คํจ๋ง ํ๋ Cilium ๋ฐฐํฌ๋ฅผ ํ๋ฒ ํด๋ณผ๊น์?
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. CSP VM ๊ณจ๋ผ๋ณด๊ธฐ
์ด๋ ๊ฒ ์ด ์ด์ ๋ ๊ฒฐ๊ตญ ๋คํธ์ํฌ๋ฅผ ์ ์์์ผํ๋๋ฐ,
์๋
์ ํ ๋๋ ๊ทธ๋ฐ๊ฑฐ ์๊ฐ๋ ์ํ๊ณ ๊ทธ๋ฅ ์ฌ๋ ค๋ณด๋ ค ํ์ผ๋ ๋น์ฐํ ์ ๋์๊ฐ๊ฒ ์ฃ ?
๊ทธ๋ฅ ๊ณฐ๊ณฐํ ์ค๋ฆฌduckduckgo๋ ํฌ๋ฅ๊ฑฐ๋ฆฌ๋ค๋ณด๋, ๋น๋ก ์ฐ์์ด ๋๊ธด ํ์ง๋ง
ํด๋ฆญ์ ์ํ๊ณ ๋ ๋ชป๋ฐฐ๊ธธ ์์ ๋ธ๋ก๊ทธ ์ ๋ชฉ์ด ๋์ ๋์์ต๋๋ค.
Why eBPF?
- kkumtree
2024-10-21T19:47:33+09:00
๊ณ ์ณ์ผํ ๋ถ๋ถ์ด
๋๋ฌด๋ง์์ ๋์ค์ ํด๋น ๋ถ๋ถ๋ง ๊ธ์ ์์ฑํ ์์ ์ ๋๋ค.
์ด๋๋ง ์ด๋ฒ ์คํฐ๋๋ ๋๋ง์ Cilium์ ๋ค๋ฃจ๊ธฐ ์์ํฉ๋๋ค.
Cilium์ ์ด๋ ๊ฒ๋ (์ ๋ฅผ ํฌํจํ) ๋ชจ?๋๊ฐ ์ด๊ดํ๋์ง ์์๋ณด๊ธฐ ์ ์
๊ทผ๊ฐ์ด ๋๋ eBPF๋ฅผ ๋จผ์ ๊ฐ๋ณ๊ฒ ์์๋ณด๊ณ ๊ฐ๋ คํฉ๋๋ค.
์ด ๋๋ ์ค๋ง ํ์ง๋ง, ์ญ์๋ ์ค๋ถ์ฌ ์๋ฉ์ด์๋ค
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. Linux Network Stack
์คํฐ๋ 1์ฃผ์ฐจ์ Jenkins ์ปจํ ์ด๋์์ Host์ Docker ๋ฐ๋ชฌ ์ฌ์ฉํ๊ธฐ์์ ๊ฐ๋ณ๊ฒ ๋ง์ ๋ณด๊ณ ๋๋ง์น๊ธฐ ๋ฐ๋นด์ง๋ง, ์ฌํผ ์๋์ ์ฌํญ์ ์ค์ณ์ง๋๊ฐ์ต๋๋ค.
Kubernetes Service(4): envoy config
- kkumtree
2024-10-19T16:59:16+09:00
์ ์ /๋์ ์ค์ ์ ์์๋ด
๋๋ค.
traefik์ ๋ง๋ณผ๋๋, ํธ๋๊ฒ ๋ฐ์ธ ๋ถ๋ถ์ธ๋ฐ envoy๋ ์๋์ ์ผ๋ก ๋ช
๋ฃํ์ต๋๋ค.
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. Static Configuration
์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค.
- static_resources
- listeners
- clusters
(a) static_resources
envoy์ ์์๊ณผ ํจ๊ป, ์ ์ ์ผ๋ก ์ค์ ๋๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๋ค๊ณ ํฉ๋๋ค.
์ค์ ๋ก envoy-demo.yaml ํ์ผ์ ์ด์ด๋ณด๋ฉด ์ต์๋จ์ static_resources์ด ์ ์ธ๋์ด ์์ต๋๋ค.
static_resources:
listeners:
(b) listeners
envoy-demo.yaml ํ์ผ ๊ธฐ์ค,
socket_address: ๋ฆฌ์ค๋๋ ํฌํธ 10000์์ ์์ ํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค.route_config: ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํดservice_envoyproxy_ioํด๋ฌ์คํฐ๋ก ๋ผ์ฐํ ํฉ๋๋ค.
# cat envoy-demo.yaml | grep -A 30 -B 2 listeners
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
access_log:
- name: envoy.access_loggers.stdout
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite_literal: www.envoyproxy.io
cluster: service_envoyproxy_io
(c) clusters
envoy-demo.yaml ํ์ผ ๊ธฐ์ค,
Kubernetes Service(4): envoy overview
- kkumtree
2024-10-15T10:16:38+09:00
๋ฐ๋ก ์ฅ ์ฐพ์๋ณด๋, envoy๋ Micro Service Architecture ๋ฑ ๊ตฌํ๋ ๋จ์ ๊ธฐ๋ฅ๊ฐ์ ํต์ ์ ์ํ L7 Proxy ๋ผ๊ณ ํฉ๋๋ค.
Docker Compose ์ ๋๋ ์ผ๋ฐ ์๋น์ค์์๋ ๊ตณ์ด ํ์ํ์ง๋ ์์ ๊ฒ ๊ฐ์ง๋ง, Service Mesh ํ๊ฒฝ์์๋ ์์๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ ํ์ด๋ด ๋๋ค.
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. Envoy Installation
- Docs: Installing Envoy
wget -O- https://apt.envoyproxy.io/signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/envoy-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/envoy-keyring.gpg] https://apt.envoyproxy.io jammy main" | sudo tee /etc/apt/sources.list.d/envoy.list
sudo apt-get update
sudo apt-get install envoy
envoy --version
ํ์ตํ๊ฒฝ์ root๋ก ์ ์๋์ด ์๊ธฐ์ sudo๋ ์ฐ์ง ์์์ต๋๋ค.
Kubernetes Service(3): Ingress(ingress-nginx) w/k3s
- kkumtree
2024-10-10T22:12:57+09:00
์ง๋ ํฌ์คํ , Kubernetes Service(2): LoadBalancer(MetalLB)์ ์ด์ด Ingress Type์ ๊ฐ๋ณ๊ฒ ์ดํด๋ณด๊ณ , Ingress-Nginx๋ฅผ ๊ฐ๋ณ๊ฒ ๋ถ์ฌ๋ณด๊ฒ ์ต๋๋ค.
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. Ingress Type
์ด์ , ์ ๊ท ๊ธฐ๋ฅ(New feature)์
Gateway API์ ์ถ๊ฐ๋๋ค๊ณ ํฉ๋๋ค.
์ฐ์ , Kubernetes๊ฐ ํท๊ฐ๋ฆฌ๋ ๊ฒ ์ค ํ๋๊ฐ,
Ingress Type ๊ณผ LoadBalancer Type์ ๋ช ํํ ์ฐจ์ด๊ฐ ๋ญ๊น...?
๋ผ๋ ์ ์ด๋ผ๊ณ ๋ด ๋๋ค.
๋ฌผ๋ก , ๊ทธ๊ฑฐ ์ธ์๋ k8s์๋ ์์ญ๋ฌ์ญํ ๊ฒ๋ค์ด ์-์ฃผ ๋ง์ง๋ง์.
์น์ ํ Docs์ ๋ฐ๋ฅด๋ฉด,
ํด๋ฌ์คํฐ ์ธ๋ถ๋ก ํด๋ฌ์คํฐ ๋ด๋ถ ์๋น์ค์ ๋ํ HTTP ๋ฐ HTTPS ๋ผ์ฐํ
์ ๋
ธ์ถํ๋ ๊ฒ์ด๋ผ๊ณ ํฉ๋๋ค.
Kubernetes Service(2): LoadBalancer(MetalLB)
- kkumtree
2024-10-02T12:54:17+09:00
์ง๋ ํฌ์คํ , Kubernetes Service(1): ClusterIP/NodePort์ ์ด์ด LoadBalancer Type์ ๊ฐ๋ณ๊ฒ ์ดํด๋ณด๊ณ , MetalLB๋ฅผ ๊ฐ๋ณ๊ฒ ๋ถ์ฌ๋ณด๊ฒ ์ต๋๋ค.
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. LoadBalancer Type
Service(1)์์ ์ธ๊ธ๋ ๋ถ๋ถ์ ๊ฑฐ๋์ ๋ฏธํ๊ณ , ์ถ๊ฐ๋ก ์ ์ ์ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด, ์๋ ํ ์ค์ด ์์ต๋๋ค.
You can define a LoadBalancer Service by disabling the load balancer NodePort allocation.
๊ธ์ ๊ทธ๋๋ก LB์ NodePort ํ ๋น์ ๋นํ์ฑํ์ฌ, LoadBalancer Service๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
Disabling load balancer NodePort allocation ๋ฌธ์๋ฅผ ์ดํด๋ณด๋,
v1.24๋ถํฐ Stable ์ํ๋ก ๋ณด์
๋๋ค.
iptables monitoring with Grafana (Not Completed)
- kkumtree
2024-09-29T13:35:13+09:00
iptables๋ฅผ ์์งํ์ฌ Grafana๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
0. ํ๊ฒฝ ๊ตฌ์ฑ (kind)
์์ฑ์๊ฐ ์ด์๋ก featureGates, ConfigPatches, networking ์ค์ ์ค๋ช ์ ์คํต…ํฉ๋๋ค.
a. 1 Master, 3 Slave ํ๊ฒฝ ๊ตฌ์ฑ
cat <<EOT> kind-svc-1w.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
featureGates:
"InPlacePodVerticalScaling": true
"MultiCIDRServiceAllocator": true
nodes:
- role: control-plane
labels:
mynode: control-plane
topology.kubernetes.io/zone: ap-northeast-2a
extraPortMappings:
- containerPort: 30000
hostPort: 30000
- containerPort: 30001
hostPort: 30001
- containerPort: 30002
hostPort: 30002
kubeadmConfigPatches:
- |
kind: ClusterConfiguration
apiServer:
extraArgs:
runtime-config: api/all=true
controllerManager:
extraArgs:
bind-address: 0.0.0.0
etcd:
local:
extraArgs:
listen-metrics-urls: http://0.0.0.0:2381
scheduler:
extraArgs:
bind-address: 0.0.0.0
- |
kind: KubeProxyConfiguration
metricsBindAddress: 0.0.0.0
- role: worker
labels:
mynode: worker1
topology.kubernetes.io/zone: ap-northeast-2a
- role: worker
labels:
mynode: worker2
topology.kubernetes.io/zone: ap-northeast-2b
- role: worker
labels:
mynode: worker3
topology.kubernetes.io/zone: ap-northeast-2c
networking:
podSubnet: 10.10.0.0/16
serviceSubnet: 10.200.1.0/24
EOT
kind create cluster --config kind-svc-1w.yaml --name myk8s --image kindest/node:v1.31.0
b. ๊ธฐ๋ณธ ํด ์ค์น
docker exec -it myk8s-control-plane sh -c 'apt update && apt install tree psmisc lsof wget bsdmainutils bridge-utils net-tools ipset ipvsadm nfacct tcpdump ngrep iputils-ping arping git vim arp-scan -y'
1. prometheus stack ์ค์น (helm)
a. repository ์ถ๊ฐ ๋ฐ ๊ตฌ์ฑ
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
cat <<EOT > monitor-values.yaml
prometheus:
prometheusSpec:
podMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
nodeSelector:
mynode: control-plane
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Equal"
effect: "NoSchedule"
grafana:
defaultDashboardsTimezone: Asia/Tokyo
adminPassword: kans7969
service:
type: NodePort
nodePort: 30002
nodeSelector:
mynode: control-plane
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Equal"
effect: "NoSchedule"
defaultRules:
create: false
alertmanager:
enabled: false
EOT
b. ์ค์น
kubectl create ns monitoring
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 62.3.0 -f monitor-values.yaml --namespace monitoring
c. prometheus ์ฝ์ ์ ์
์๋ก์ด ํฐ๋ฏธ๋์ ์ด์ด, port-forwarding์ ํตํด ์ ์ํฉ๋๋ค.
Kubernetes Service(1): ClusterIP/NodePort
- kkumtree
2024-09-27T21:28:17+09:00
Kubernetes์ (์ปจ์ , ํน์ ์ฝ์ ํธ๋ผ ๋ถ๋ฆฌ๋) Concepts ์ค์์ Service์ ์ฃผ์ ๋ฅผ ๋ค๋ค๋ด ๋๋ค.
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
Service Docs์ ๋ช
๋ฃํ๊ฒ ์ ํ์๊ธด ํ์ง๋ง,
๋จ์ ๊ธฐ๋ฅ์ผ๋ก ์๊ฒ ์ชผ๊ฐ Pod๋ ๊ฒฐ๊ตญ ๊ฐ๋ณ์ ์ธ IP๋ฅผ ๊ฐ๊ฒ๋๋๋ฐ, Blue/Green ์ด๋ฏธ์ง ์
๋ฐ์ดํธ๋ฅผ ๋น๋กฏํด์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ์๋ก์ด Pod์ IP๋ฅผ ๋ค๋ฅธ Pod๊ฐ IP์ฃผ์ ๊ทธ๋๋ก ์ ๊ทผํ๊ธฐ ์ด๋ ค์ ์ค๊ฐ์ ๋ ๊ฒ์ผ๋ก ์ดํด๋ฅผ ํด๋ณด์์ต๋๋ค.
์ง๊ธ ๋ ๋ฒจ์์๋ ๊ฐ์ ์ฉ ๊ณต์ ๊ธฐ์์ ๋์ IP ํ๊ฒฝ์ ๋์ํ๊ธฐ ์ํด, DDNS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ, MAC ADDR ๊ธฐ์ค์ผ๋ก Static IP(DHCP๋ชจ๋์ ํ์ฉ)๋ฅผ ์์ฝํ๋ ๊ฒ์ ์์ ๊ทธ ์ด๋๊ฐ๋ก ๋ฉ๋ํ๊ณ ๊ณ์ ์จ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Calico Installation in Operator Mode
- kkumtree
2024-09-18T20:52:16+09:00
CloudNet@์์ ์งํํ๊ณ ์๋ K8s Advanced Network Study(์ดํ, KANS)๋ฅผ ํตํด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
์คํฐ๋ ์งํ ์, Manifests๋ฅผ ์ฌ์ฉํ์ฌ Calico๋ฅผ ์ค์นํ์์ผ๋,
Operator๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
๊ณผ์ ๋ ์๋์์ง๋ง, ์์ ๋ค๋ค Operator Framework๋ฅผ ์ฌ์ฉํด์ ๋ง๋ผ์น๊ถ ๋ณถ๋ฏ์ด
Operator๋ฅผ ์ง์ง๊ณ ๋ณถ๋ ๊ฒ ๊ฐ์์ ํธ๊ธฐ์ฌ์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
์ฐธ๊ณ ๋ก Manifests๋ฅผ ์ฌ์ฉํ์ฌ ์ค์น ์, 50๊ฐ์ ๋ ธ๋[1]๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ Typha๋ฅผ ๊ตฌ์ฑํ์ฌ์ผ ํฉ๋๋ค.
Calico ์ค์น ํ๊ฒฝ : AWS EC2(No EKS), kubeadm[2], pod-network-cidr=172.16.0.0/16, IPIP Mode
1. Calico Routing Mode
์์ ์ธ๊ธ๋ IPIP Mode๋ฅผ ์ดํดํ๋ ค๋ฉด Calico์ Routing Mode๋ฅผ ํ์ ํ์์ฑ์ด ์์์ต๋๋ค.
ํ๋๊ฐ ํต์ ์ ๋
ธ๋ ๊ฐ์ encapsulation์ ์ ๋ต์ ๊ธฐ์ค์ผ๋ก ๋๋์ด ๋ณผ ์ ์๊ฒ ์ต๋๋ค.