개요
ClusterIP 및 NodePort에 대한 실습을 위한 환경울 구성하고, 관련 정보들을 확인
실습 환경 준비
k8s 클러스터 설치
# k8s 클러스터 구성 파일
cat <<EOT > kind-svc.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
Shell
복사
# k8s 클러스터 설치
kind create cluster --config kind-svc.yaml --name myk8s --image kindest/node:v1.31.0
Shell
복사
패키지 설치
# 구성된 k8s 클러스터의 각 노드에 패키지 설치
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'
for i in worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i sh -c 'apt update && apt install tree psmisc lsof wget bsdmainutils bridge-utils net-tools ipset ipvsadm nfacct tcpdump ngrep iputils-ping arping -y'; echo; done
Shell
복사
•
tree: 파일 시스템 디렉토리 구조를 트리 형태로 시각화
•
psmisc: killall, fuser, pstree 같은 프로세스 관련 프로그램
•
lsof: 열려 있는 파일과 해당 파일을 연 프로세스를 확인 가능
•
wget: 네트워크에서 파일 다운로드를 돕는 프로그램
•
bridge-utils: 리눅스의 브릿지 인터페이스 관리를 위한 프로그램으로 브릿지 상태 확인 및 설정 가능
•
net-tools: ifconfig, netstat, route 등 네트워크 관리 및 모니터링을 위한 프로그램
•
ipset: IP 주소들을 관리하기 위한 프로그램으로 방화벽에서 트래픽 필터링에 사용
•
ipvsadm: ipvs에서 트래픽을 부하 분산하기 위한 프로그램
•
nfacct: 네트워크 패킷의 계정 정보 수집을 위한 프로그램으로 트래픽 모니터링과 분석에 사용
•
tcpdump: 네트워크 인터페이스에서 패킷을 캡쳐하고 분석하는데 사용
•
ngrep: 네트워크 패킷을 정규 표현식으로 검색하기 위한 프로그램으로 패킷 내에서 특정 패턴을 찾을 때 사용
•
iputils-ping: 네트워크 연결 상태 확인을 위한 ping 명령어를 제공하는 프로그램
•
arping: ARP를 이용하여 특정 호스트에 도달할 수 있는지 판단하기 위한 프로그램
•
arp-scan: 네트워크에 연결된 모든 장치를 스캔하여 ARP로 해당 장치들의 IP와 MAC 주소를 확인하기 위한 프로그램
kube-ops-view 설치
# 설치
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm repo update
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set service.main.type=NodePort,service.main.ports.http.nodePort=30000 --set env.TZ="Asia/Seoul" --namespace kube-system
# tolerations 설정
# spec:
# ...
# template:
# ...
# spec:
# nodeSelector:
# mynode: control-plane
# tolerations:
# - key: "node-role.kubernetes.io/control-plane"
# operator: "Equal"
# effect: "NoSchedule"
kubectl -n kube-system edit deploy kube-ops-view
# 확인
kubectl -n kube-system get po -o wide -l app.kubernetes.io/instance=kube-ops-view
Shell
복사
ARP Scan
# ARP 정보를 캐싱해두기 위해 ARP Scan을 수행
docker exec -it myk8s-control-plane arp-scan --interfac=eth0 --localnet
Shell
복사
실습 환경 확인
노드 및 레이블 확인
# 노드 및 레이블 확인
# control plane : ap-northeast-2a
# worker1 : ap-northeast-2a
# worker2 : ap-northeast-2b
# worker3 : ap-northeast-2c
kubectl get no
kubectl get no -o jsonpath="{.items[*].metadata.labels}" | jq | grep mynode
kubectl get no -o jsonpath="{.items[*].metadata.labels}" | jq | grep topology.kubernetes.io/zone
Shell
복사
노드 별 IP 대역 확인
# 노드 별 IP 대역 확인
docker ps -q | xargs docker inspect --format '{{.Name}} {{.NetworkSettings.Networks.kind.IPAddress}}'
# kind로 클러스터 구성 시 kind 브릿지가 생성
docker network ls
# kind 브릿지의 노드 IP 대역 확인
docker inspect kind | grep kind -A 20
Shell
복사
podCIDR 및 Service 대역 확인
# ConfigMap과 클러스터 설정으로 podCIDR과 Service의 대역을 확인
kubectl get cm -n kube-system kubeadm-config -oyaml | grep -i subnet
kubectl cluster-info dump | grep -m 2 -E "cluster-cidr|service-cluster-ip-range"
# 노드 별 podCIDR 확인
kubectl get no -o jsonpath="{.items[*].spec.podCIDR}"
# Service 대역 확인
kubectl get servicecidr
Shell
복사
Feature Gate 설정 확인
# feature gate 및 API 확성화 확인
# https://www.jseo.cc/31b53c01-e933-4b81-97c1-6c1f0e3f7973
kubectl describe po -n kube-system | grep feature-gates
kubectl describe po -n kube-system | grep runtime-config
Shell
복사
kube-proxy mode 확인
# kube-proxy mode 확인
kubectl describe cm -n kube-system kube-proxy | grep iptables -A 3
Shell
복사
노드 별 네트워크 정보 확인
# 라우팅 테이블 확인
for i in control-plane worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i ip -c route; echo; done
# IP 주소 확인
for i in control-plane worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i ip -c addr; echo; done
# eth0 인터페이스 확인
for i in control-plane worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i ip -c -4 addr show dev eth0; echo; done
Shell
복사
노드 별 iptables 확인
# control plane
for i in filter nat mangle raw ; do echo ">> IPTables Type : $i <<"; docker exec -it myk8s-control-plane iptables -t $i -S ; echo; done
# worker1
for i in filter nat mangle raw ; do echo ">> IPTables Type : $i <<"; docker exec -it myk8s-worker iptables -t $i -S ; echo; done
# worker2
for i in filter nat mangle raw ; do echo ">> IPTables Type : $i <<"; docker exec -it myk8s-worker2 iptables -t $i -S ; echo; done
# worker3
for i in filter nat mangle raw ; do echo ">> IPTables Type : $i <<"; docker exec -it myk8s-worker3 iptables -t $i -S ; echo; done
Shell
복사
외부 접속 용도의 노드 생성
외부 노드로 가정할 인스턴스는 k8s 클러스터 상의 노드가 아닌 별도의 도커 컨테이너로 생성
docker run -d --rm --name mypc --network kind nicolaka/netshoot sleep infinity
Shell
복사
실습 환경 제거
kind delete cluster --name myk8s
Shell
복사