Search

Service: 실습 준비

Tags
k8s
network
service
Created
2024/09/27 18:09
Created time
2024/09/27 09:09
category
kubernetes

개요

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
복사