Ssoon
[4주차] 기본 구성 정보 본문
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기
✅ 기본 구성 정보 확인
- 현재 k8s 클러스터에서 레이블에 mynode 가 포함된 노드 정보를 확인합니다.
(⎈|kind-myk8s:N/A) root@kind:~# kubectl get nodes -o jsonpath="{.items[*].metadata.labels}" | jq | grep mynode
"mynode": "control-plane",
"mynode": "worker1"
"mynode": "worker2"
"mynode": "worker3"
- 현재 실행 중인 Docker 컨테이너들의 이름과 IP 주소를 확인합니다.
(⎈|kind-myk8s:N/A) root@kind:~# docker ps -q | xargs docker inspect --format '{{.Name}} {{.NetworkSettings.Networks.kind.IPAddress}}'
/myk8s-worker2 172.18.0.5
/myk8s-control-plane 172.18.0.2
/myk8s-worker 172.18.0.3
/myk8s-worker3 172.18.0.4
- Pod와 Service에 할당된 서브넷(Subnet) 정보를 확인합니다.
- podSubnet: 10.10.0.0/16:
- 이는 Kubernetes 클러스터에서 Pod들이 사용할 IP 주소 범위(서브넷)를 나타냅니다.
- serviceSubnet: 10.200.1.0/24:
- 이는 클러스터 내 서비스(Service)들이 사용할 IP 주소 범위입니다.
- podSubnet: 10.10.0.0/16:
(⎈|kind-myk8s:N/A) root@kind:~# kubectl get cm -n kube-system kubeadm-config -oyaml | grep -i subnet
podSubnet: 10.10.0.0/16
serviceSubnet: 10.200.1.0/24
- service-cluster-ip-range와 cluster-cidr 값을 검색하여 서비스 IP 범위와 클러스터의 Pod IP 범위를 확인합니다.
- --service-cluster-ip-range=10.200.1.0/24:
- 클러스터 내에서 서비스에 할당될 IP 주소의 범위를 나타냅니다.
- --cluster-cidr=10.10.0.0/16:
- Pod들에게 할당되는 IP 주소의 범위를 나타냅니다.
- --service-cluster-ip-range=10.200.1.0/24:
(⎈|kind-myk8s:N/A) root@kind:~# kubectl cluster-info dump | grep -m 2 -E "cluster-cidr|service-cluster-ip-range"
"--service-cluster-ip-range=10.200.1.0/24",
"--cluster-cidr=10.10.0.0/16",
- InPlacePodVerticalScaling이라는 기능이 활성화되어 있는지 확인합니다.
- InPlacePodVerticalScaling=true
- Pod가 삭제되지 않고도 CPU 및 메모리 리소스를 동적으로 변경할 수 있는 기능입니다. 보통 Kubernetes에서는 리소스 변경 시 Pod가 재시작되는 경우가 있지만, 이 기능이 활성화되면 Pod를 중단하지 않고 리소스를 조정할 수 있습니다.
- InPlacePodVerticalScaling=true
(⎈|kind-myk8s:N/A) root@kind:~# kubectl describe pod -n kube-system | grep feature-gates
--feature-gates=InPlacePodVerticalScaling=true
--feature-gates=InPlacePodVerticalScaling=true
--feature-gates=InPlacePodVerticalScaling=true
- 각 노드에 할당된 Pod CIDR(서브넷) 범위를 확인합니다.
(⎈|kind-myk8s:N/A) root@kind:~# kubectl get nodes -o jsonpath="{.items[*].spec.podCIDR}"
10.10.0.0/24 10.10.3.0/24 10.10.1.0/24 10.10.2.0/24
- ConfigMap에 저장된 kube-proxy의 설정을 kubectl describe 명령어로 확인합니다.
- kube-proxy가 네트워크 트래픽을 어떻게 처리하는지를 보여줍니다.
- iptables::
- kube-proxy가 iptables 모드를 사용해 트래픽을 처리하고 있다는 것을 나타냅니다.
- localhostNodePorts: null:
- 이 설정은 로컬호스트에서 NodePort에 접근할 수 있는지를 설정하는 부분입니다. 현재 null로 설정되어 있으므로, 기본 설정에 따라 동작합니다.
- masqueradeAll: false:
- **masqueradeAll**은 모든 트래픽에 대해 NAT(Network Address Translation)를 적용할지를 설정하는 옵션입니다.
- false로 설정되어 있으므로, 필요할 때만 NAT가 적용됩니다. 이는 클러스터 외부로 나가는 트래픽에만 IP 주소를 변환하도록 설정된 것입니다. 기본적으로는 내부 트래픽에 대해서는 NAT가 적용되지 않도록 되어 있습니다.
- iptables::
(⎈|kind-myk8s:N/A) root@kind:~# kubectl describe cm -n kube-system kube-proxy
Name: kube-proxy
Namespace: kube-system
Labels: app=kube-proxy
Annotations: <none>
Data
====
config.conf:
...
iptables:
localhostNodePorts: null
masqueradeAll: false
- 각 노드에서 CNI(Container Network Interface) 플러그인들이 설치된 디렉토리(/opt/cni/bin/)를 확인합니다.
- host-local:
- 로컬 IP 주소 할당을 관리하는 플러그인으로, Pod에게 IP 주소를 할당하고 이 정보를 노드 로컬에서 유지합니다.
- loopback:
- 루프백 인터페이스를 위한 플러그인입니다. 이는 네트워크 테스트 및 서비스 확인을 위한 기본적인 설정입니다.
- portmap:
- Pod에 할당된 포트를 외부로 노출할 때 사용하는 플러그인입니다. 주로 NodePort나 HostPort 기능을 지원하는데 사용됩니다.
- ptp (Point-to-Point):
- 두 네트워크 인터페이스를 직접 연결하는 플러그인으로, Pod와 네트워크를 직접 연결해주는 역할을 합니다. 주로 기본적인 네트워크 연결에 사용됩니다.
- host-local:
(⎈|kind-myk8s:N/A) root@kind:~# for i in control-plane worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i ls /opt/cni/bin/; echo; done
>> node myk8s-control-plane <<
host-local loopback portmap ptp
>> node myk8s-worker <<
host-local loopback portmap ptp
>> node myk8s-worker2 <<
host-local loopback portmap ptp
>> node myk8s-worker3 <<
host-local loopback portmap ptp
- CNI(Container Network Interface) 설정 파일인 10-kindnet.conflist의 내용을 확인합니다.
- kindnet.conflis : Kubernetes IN Docker (kind)에서 사용하는 CNI (Container Network Interface) 설정 파일입니다.
- 각 노드의 CNI 네트워크 설정이 어떻게 구성되어 있는지를 확인합니다.
- Pod 간 통신을 위해 ptp 플러그인을 사용하고, IP 주소는 호스트 로컬 방식으로 할당됩니다.
- portmap 플러그인을 통해 Pod의 포트를 외부에 노출할 수 있습니다
(⎈|kind-myk8s:N/A) root@kind:~# for i in control-plane worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i cat /etc/cni/net.d/10-kindnet.conflist; echo; done
>> node myk8s-control-plane <<
{
"cniVersion": "0.3.1",
"name": "kindnet", #Kubernetes IN Docker에서 사용하는 기본 네트워크
"plugins": [
{
"type": "ptp", #첫 번째 플러그인
"ipMasq": false, #NAT를 사용하지 않도록 설정합니다.
"ipam": { #IP 주소 할당 및 관리에 대한 설정입니다.
"type": "host-local", #호스트 로컬 IP 관리 플러그인을 사용하여 IP 주소를 할당합니다.
"dataDir": "/run/cni-ipam-state", #IP 주소 상태 데이터를 저장할 디렉토리입니다.
"routes": [ #네트워크 경로를 정의합니다.
{ "dst": "0.0.0.0/0" } #모든 트래픽이 이 네트워크를 통해 흐르도록 설정합니다.
],
"ranges": [ #IP 주소 범위를 정의합니다.
[ { "subnet": "10.10.0.0/24" } ]
]
}
,
"mtu": 1500
},
{
"type": "portmap", #두 번째 플러그인
"capabilities": {
"portMappings": true #이 플러그인이 포트 매핑 기능을 지원함을 나타냅니다. 이는 Pod의 포트를 외부에 노출하는 데 사용됩니다.
}
}
]
}
...
- 각 노드에서 네트워크 라우팅 테이블을 확인합니다.
- default via 172.18.0.1 dev eth0:
- 기본 게이트웨이는 172.18.0.1이며, eth0 인터페이스를 통해 접근합니다. 이 경로는 외부로 나가는 모든 트래픽에 대한 기본 경로입니다.
- 10.10.0.2 dev veth61443610 scope host:
- 10.10.0.2는 veth (virtual Ethernet) 장치를 통해 연결된 호스트 내의 IP입니다. scope host는 이 IP가 호스트 네트워크에 국한되어 있음을 나타냅니다.
- 10.10.0.3 dev vethd3d282f0 scope host:
- 10.10.0.3 역시 veth 장치를 통해 연결된 다른 호스트 내의 IP입니다.
- 10.10.0.4 dev vethbf75ae2f scope host:
- 10.10.0.4도 마찬가지로 다른 veth 장치에 연결된 IP입니다.
- 10.10.1.0/24 via 172.18.0.5 dev eth0:
- 10.10.1.0/24 네트워크는 172.18.0.5를 통해 접근합니다. Pod 네트워크의 일부입니다.
- 10.10.2.0/24 via 172.18.0.4 dev eth0:
- 10.10.2.0/24 네트워크는 172.18.0.4를 통해 접근합니다. Pod 네트워크의 일부입니다.
- 10.10.3.0/24 via 172.18.0.3 dev eth0:
- 10.10.3.0/24 네트워크는 172.18.0.3를 통해 접근합니다. Pod 네트워크의 일부입니다.
- 172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.2:
- 이 항목은 eth0 인터페이스를 통해 172.18.0.0/16 네트워크에 접근하는 경로를 보여줍니다. 이 네트워크는 Docker 브릿지 네트워크의 일부로, 클러스터 내의 컨테이너 간 통신에 사용됩니다. src 172.18.0.2는 이 노드의 IP 주소를 나타냅니다.
- default via 172.18.0.1 dev eth0:
(⎈|kind-myk8s:N/A) root@kind:~# for i in control-plane worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i ip -c route; echo; done
>> node myk8s-control-plane <<
default via 172.18.0.1 dev eth0
10.10.0.2 dev veth61443610 scope host
10.10.0.3 dev vethd3d282f0 scope host
10.10.0.4 dev vethbf75ae2f scope host
10.10.1.0/24 via 172.18.0.5 dev eth0
10.10.2.0/24 via 172.18.0.4 dev eth0
10.10.3.0/24 via 172.18.0.3 dev eth0
172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.2
>> node myk8s-worker <<
default via 172.18.0.1 dev eth0
10.10.0.0/24 via 172.18.0.2 dev eth0
10.10.1.0/24 via 172.18.0.5 dev eth0
10.10.2.0/24 via 172.18.0.4 dev eth0
172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.3
>> node myk8s-worker2 <<
default via 172.18.0.1 dev eth0
10.10.0.0/24 via 172.18.0.2 dev eth0
10.10.2.0/24 via 172.18.0.4 dev eth0
10.10.3.0/24 via 172.18.0.3 dev eth0
172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.5
>> node myk8s-worker3 <<
default via 172.18.0.1 dev eth0
10.10.0.0/24 via 172.18.0.2 dev eth0
10.10.1.0/24 via 172.18.0.5 dev eth0
10.10.3.0/24 via 172.18.0.3 dev eth0
172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.4
- 각 노드에서 네트워크 인터페이스의 IP 주소를 확인합니다.
- myk8s-control-plane => veth:10.10.0.1 / eth:172.18.0.2
- myk8s-worker => eth:172.18.0.3
- myk8s-worker2 => eth:172.18.0.5
- myk8s-worker3 => eth:172.18.0.4
(⎈|kind-myk8s:N/A) root@kind:~# for i in control-plane worker worker2 worker3; do echo ">> node myk8s-$i <<"; docker exec -it myk8s-$i ip -c addr; echo; done
>> node myk8s-control-plane <<
...
2: veth61443610@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 2e:90:bd:04:74:33 brd ff:ff:ff:ff:ff:ff link-netns cni-309a28c0-5e88-c222-4cc9-94471957f719
inet 10.10.0.1/32 scope global veth61443610
valid_lft forever preferred_lft forever
inet6 fe80::2c90:bdff:fe04:7433/64 scope link
valid_lft forever preferred_lft forever
3: vethd3d282f0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether fa:44:d9:5d:2a:88 brd ff:ff:ff:ff:ff:ff link-netns cni-6e09db34-05fb-9b5d-d636-48280cf35ac5
inet 10.10.0.1/32 scope global vethd3d282f0
valid_lft forever preferred_lft forever
inet6 fe80::f844:d9ff:fe5d:2a88/64 scope link
valid_lft forever preferred_lft forever
4: vethbf75ae2f@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether ee:1b:8d:47:90:db brd ff:ff:ff:ff:ff:ff link-netns cni-0e0af510-95d7-f1cd-cffa-9d95767c7ed0
inet 10.10.0.1/32 scope global vethbf75ae2f
valid_lft forever preferred_lft forever
inet6 fe80::ec1b:8dff:fe47:90db/64 scope link
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fc00:f853:ccd:e793::2/64 scope global nodad
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe12:2/64 scope link
valid_lft forever preferred_lft forever
>> node myk8s-worker <<
...
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fc00:f853:ccd:e793::3/64 scope global nodad
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe12:3/64 scope link
valid_lft forever preferred_lft forever
>> node myk8s-worker2 <<
...
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.5/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fc00:f853:ccd:e793::5/64 scope global nodad
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe12:5/64 scope link
valid_lft forever preferred_lft forever
>> node myk8s-worker3 <<
...
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.4/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fc00:f853:ccd:e793::4/64 scope global nodad
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe12:4/64 scope link
valid_lft forever preferred_lft forever
- 현재 Docker 호스트에 설정된 네트워크 목록을 확인합니다.
- bridge: 기본적으로 사용되는 브리지 네트워크로, 컨테이너 간의 통신을 가능하게 합니다.
- host: 호스트와 네트워크 스택을 공유하는 네트워크로, 별도의 IP 없이 호스트의 IP를 사용합니다.
- kind: Kubernetes kind 클러스터를 위한 네트워크로, 노드와 Pod 간의 통신을 지원합니다.
- none: 네트워크 인터페이스가 없는 상태로, 완전히 격리된 환경을 제공합니다.
(⎈|kind-myk8s:N/A) root@kind:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
c05b1310b573 bridge bridge local
1b6d727c2af7 host host local
44d7a2bc9676 kind bridge local
3107e80bc7b6 none null local
- kind Docker 브리지 네트워크에 대한 구성 정보 를 확인합니다.
- 이 Docker 네트워크 kind는 Kubernetes 클러스터의 노드들이 서로 통신하기 위해 사용됩니다.
- 각 컨테이너는 이 네트워크 내에서 고유한 IP 주소를 가지며, 이를 통해 서로 간의 통신이 가능합니다.
- IP 마스커레이드가 활성화되어 있어 외부와의 통신 시 호스트의 IP를 사용하여 보다 안전하게 통신할 수 있습니다.
(⎈|kind-myk8s:N/A) root@kind:~# docker inspect kind
[
{
"Name": "kind",
"Id": "44d7a2bc967672c4fcc7ebb54ccddd560c964083c8357bb9f7e48610ac821e07",
"Created": "2024-09-23T19:21:05.816081563+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": true,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "fc00:f853:ccd:e793::/64"
},
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0456c6e89ae6e07ef29b3697fdb1167383200600c5e646362539980e4ca036c3": {
"Name": "myk8s-worker",
"EndpointID": "7865de04cdc839c12cfe63497ca6f41f3c31a73ea1870bdcc1454caa2c3c655d",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": "fc00:f853:ccd:e793::3/64"
},
"22b6e1cfb90dea8810ea942e7d44706880d09435bcf9cc7ab9cb658673cf207d": {
"Name": "myk8s-worker3",
"EndpointID": "8ed4fddbaeef96420f029ba6ac17345988df9d0824da589302b6e401e0b1c955",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": "fc00:f853:ccd:e793::4/64"
},
"c71cbc7fa8cb052de6fbc2c625b557b2c929ba3cac6bf53e355bc71a0275646d": {
"Name": "myk8s-control-plane",
"EndpointID": "06e29d2e90ced7e9f1aedd8d909fb670e0d4552035c66621ed7169da6074c4d7",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": "fc00:f853:ccd:e793::2/64"
},
"ec5e26ef4525dd60ffd8e47ec1aac7839de53ddf57d206a6997f58606f3c226b": {
"Name": "myk8s-worker2",
"EndpointID": "d10be58bada6bef32e7363b195df655657113c8fc68810c6cf12e40fb95eebac",
"MacAddress": "02:42:ac:12:00:05",
"IPv4Address": "172.18.0.5/16",
"IPv6Address": "fc00:f853:ccd:e793::5/64"
}
},
"Options": {
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
- Docker 컨테이너 내에서 ARP(주소 결정 프로토콜) 스캔을 수행하여 같은 네트워크에 있는 장치들의 IP와 MAC 주소를 확인합니다.
(⎈|kind-myk8s:N/A) root@kind:~# docker exec -it myk8s-control-plane arp-scan --interfac=eth0 --localnet
Interface: eth0, type: EN10MB, MAC: 02:42:ac:12:00:02, IPv4: 172.18.0.2
Starting arp-scan 1.10.0 with 65536 hosts (https://github.com/royhills/arp-scan)
172.18.0.1 02:42:e7:e0:4c:c9 (Unknown: locally administered)
172.18.0.3 02:42:ac:12:00:03 (Unknown: locally administered)
172.18.0.4 02:42:ac:12:00:04 (Unknown: locally administered)
172.18.0.5 02:42:ac:12:00:05 (Unknown: locally administered)
4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 65536 hosts scanned in 263.223 seconds (248.98 hosts/sec). 4 responded
- nicolaka/netshoot 이미지를 사용하여 kind 네트워크에 연결된 mypc라는 이름의 컨테이너를 백그라운드에서 실행하며, 종료 시 자동으로 삭제되는 컨테이너를 생성합니다.
(⎈|kind-myk8s:N/A) root@kind:~# docker run -d --rm --name mypc --network kind nicolaka/netshoot sleep infinity
bc4fbbeb38ef0260085dc919fc9c770dabb6259c02f66091389da09a51b5352c
(⎈|kind-myk8s:N/A) root@kind:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc4fbbeb38ef nicolaka/netshoot "sleep infinity" 7 seconds ago Up 6 seconds mypc
'쿠버네티스 네트워크 스터디 3기' 카테고리의 다른 글
[4주차] NodePort (0) | 2024.09.24 |
---|---|
[4주차] ClusterIP (0) | 2024.09.23 |
[3주차] Calico Mode : Direct 모드 / CrossSubnet 모드 (0) | 2024.09.13 |
[3주차] 다른 Node 에서 Pod ↔ Pod 간 통신 (0) | 2024.09.13 |
[3주차] Pod ↔ 외부(인터넷) 통신 (0) | 2024.09.13 |
Comments