Ssoon

[4주차] 기본 구성 정보 본문

쿠버네티스 네트워크 스터디 3기

[4주차] 기본 구성 정보

구구달스 2024. 9. 23. 18:51
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 주소 범위입니다.
(⎈|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 주소의 범위를 나타냅니다.
(⎈|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를 중단하지 않고 리소스를 조정할 수 있습니다.
(⎈|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가 적용되지 않도록 되어 있습니다.
(⎈|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와 네트워크를 직접 연결해주는 역할을 합니다. 주로 기본적인 네트워크 연결에 사용됩니다.
(⎈|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 주소를 나타냅니다.
(⎈|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

 

 

 

Comments