Ssoon

[5주차] 실습기본환경구성 본문

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

[5주차] 실습기본환경구성

구구달스 2024. 10. 2. 20:12
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기

✅ 기본 환경

🧿 kind-svc-2w.yaml

  • podSubnet: 10.10.0.0/16
    • 파드 IP를 위한 CIDR 범위를 정의합니다. 파드는 이 범위에서 IP를 할당받습니다.
  • serviceSubnet: 10.200.1.0/24
    • 서비스 IP를 위한 CIDR 범위를 정의합니다. 서비스는 이 범위에서 IP를 할당받습니다.
(⎈|kind-myk8s:N/A) root@kind:~# cat <<EOT> kind-svc-2w.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
featureGates:
  "InPlacePodVerticalScaling": true	#실행 중인 파드의 리소스 요청 및 제한을 변경할 수 있게 합니다.
  "MultiCIDRServiceAllocator": true	#서비스에 대해 여러 CIDR 블록을 사용할 수 있게 합니다.
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
  - containerPort: 30003
    hostPort: 30003
  - containerPort: 30004
    hostPort: 30004
  kubeadmConfigPatches:
  - |
    kind: ClusterConfiguration
    apiServer:
      extraArgs:	#API 서버에 추가 인수를 제공합니다.
        runtime-config: api/all=true	#모든 API 버전을 활성화
    controllerManager:
      extraArgs:	#컨트롤러 매니저의 설정을 수정합니다.
        bind-address: 0.0.0.0	#모든 IP 주소에서 요청을 수락할 수 있도록 합니다.
    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	#파드 IP를 위한 CIDR 범위를 정의합니다. 파드는 이 범위에서 IP를 할당받습니다.
  serviceSubnet: 10.200.1.0/24	#서비스 IP를 위한 CIDR 범위를 정의합니다. 서비스는 이 범위에서 IP를 할당받습니다.
EOT

🧿 kind-svc-2w.yaml 파일에 정의된 설정을 기반으로 myk8s 라는 이름의 Kubernetes 클러스터를 생성합니다.

(⎈|N/A:N/A) root@kind:~# kind create cluster --config kind-svc-2w.yaml --name myk8s --image kindest/node:v1.31.0
Creating cluster "myk8s" ...
 ✓ Ensuring node image (kindest/node:v1.31.0) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-myk8s"
You can now use your cluster with:

kubectl cluster-info --context kind-myk8s

Have a nice day! 👋

🧿 Docker 에서 현재 실행 중인 컨테이너 목록을 확인합니다.

  • myk8s-control-plane 컨테이너
    • 0.0.0.0:30000-30004->30000-30004/tcp
      • 호스트의 포트 30000부터 30004까지의 요청이 컨테이너의 동일한 포트로 포워딩된다는 것을 나타냅니다. 즉, 외부에서 해당 포트에 접근하면 이 컨테이너의 포트로 연결됩니다.
    • 127.0.0.1:41827->6443/tcp
      • 호스트의 로컬 주소(127.0.0.1)의 포트 41827가 컨테이너의 6443 포트로 포워딩됩니다. 6443 포트는 Kubernetes API 서버에 일반적으로 사용되는 포트입니다. 따라서, 이 포트를 통해 Kubernetes 클러스터와 통신할 수 있습니다.
(⎈|kind-myk8s:N/A) root@kind:~# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED              STATUS              PORTS                                                             NAMES-plane
2534e251d141   kindest/node:v1.31.0   "/usr/local/bin/entr…"   About a minute ago   Up About a minute                                                                     myk8s-worker3
f0aff265f9d9   kindest/node:v1.31.0   "/usr/local/bin/entr…"   About a minute ago   Up About a minute                                                                     myk8s-worker
5e51504e9979   kindest/node:v1.31.0   "/usr/local/bin/entr…"   About a minute ago   Up About a minute   0.0.0.0:30000-30004->30000-30004/tcp, 127.0.0.1:41827->6443/tcp   myk8s-control-plane
99252d7caba7   kindest/node:v1.31.0   "/usr/local/bin/entr…"   About a minute ago   Up About a minute                                                                     myk8s-worker2

🧿 Kubernetes 클러스터의 제어 평면 노드와 세 개의 워커 노드에 필요한 패키지를 설치합니다.

  • tree: 디렉토리 구조를 트리 형태로 표시하는 도구
  • psmisc: 프로세스 관련 유틸리티 모음
  • lsof: 열린 파일 목록을 보여주는 도구
  • wget: 파일을 다운로드하는 명령줄 도구
  • bsdmainutils: 다양한 유틸리티 모음
  • bridge-utils: 네트워크 브리지 관리 도구
  • net-tools: 네트워크 관련 도구 모음
  • dnsutils: DNS 관련 유틸리티
  • ipset: IP 집합 관리 도구
  • ipvsadm: IP 가상 서버 관리 도구
  • nfacct: NetFlow 수집 도구
  • tcpdump: 패킷 캡처 및 분석 도구
  • ngrep: 네트워크 패킷에서 문자열을 검색하는 도구
  • iputils-ping: Ping 명령을 제공하는 패키지
  • arping: ARP 요청을 보내는 도구
  • git: 버전 관리 시스템
  • vim: 텍스트 편집기
  • arp-scan: ARP 요청을 보내어 네트워크 호스트를 검색하는 도구
docker exec -it myk8s-control-plane sh -c 'apt update && apt install tree psmisc lsof wget bsdmainutils bridge-utils net-tools dnsutils 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 dnsutils ipset ipvsadm nfacct tcpdump ngrep iputils-ping arping -y'; echo; done

🧿 Kubernetes 클러스터의 Pod와 Service에 대한 IP 주소 서브넷 설정을 조회합니다.

  • podSubnet: 10.10.0.0/16:
    • Kubernetes 클러스터 내에서 생성되는 Pod의 IP 주소 범위를 지정합니다. 
  • serviceSubnet: 10.200.1.0/24:
    • Kubernetes 클러스터 내에서 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

🧿 Kubernetes 클러스터의 네트워크 설정,  서비스와 Pod의 IP 주소 범위를 확인합니다.

  • --service-cluster-ip-range=10.200.1.0/24:
    • Kubernetes 클러스터 내에서 Service 객체에 할당되는 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",

🧿 Kubernetes 클러스터 내에서 서비스에 할당된 IP 주소 범위(서비스 CIDR)를 확인합니다.

  • CIDRS: 10.200.1.0/24
    • 이 필드는 서비스에 할당된 IP 주소 범위를 나타냅니다. 이 주소 범위는 클러스터 내에서 서비스가 접근할 수 있는 주소 공간을 정의합니다.
(⎈|kind-myk8s:N/A) root@kind:~# kubectl get servicecidr
NAME         CIDRS           AGE
kubernetes   10.200.1.0/24   5m4s

🧿 Kubernetes 클러스터 내 각 노드에 할당된 Pod IP 주소 범위를 확인합니다.

  • 10.10.0.0/24: 첫 번째 노드에 할당된 Pod IP 주소 범위입니다.  
  • 10.10.1.0/24: 두 번째 노드에 할당된 Pod IP 주소 범위입니다.
  • 10.10.2.0/24: 세 번째 노드에 할당된 Pod IP 주소 범위입니다.
  • 10.10.3.0/24: 네 번째 노드에 할당된 Pod IP 주소 범위입니다.
(⎈|kind-myk8s:N/A) root@kind:~# kubectl get nodes -o jsonpath="{.items[*].spec.podCIDR}"
10.10.0.0/24 10.10.1.0/24 10.10.2.0/24 10.10.3.0/24

🧿 kube-proxy의 ConfigMap을 조회하여 네트워크 프록시의 설정을 확인합니다.

  • localhostNodePorts: null:
    • 로컬 호스트에서 NodePort 서비스를 사용할지 여부를 설정합니다. null로 설정된 경우 기본값을 사용합니다.
  • masqueradeAll: false:
    • 모든 트래픽에 대해 masquerading(소스 IP를 클러스터 IP로 변경) 할지 여부를 설정합니다. 
  • masqueradeBit: null:
    • masquerading에 사용되는 비트 마스크를 설정합니다. null이면 기본값을 사용합니다.
  • minSyncPeriod: 1s:
    • kube-proxy가 iptables를 업데이트하기 전에 기다리는 최소 시간입니다.
  • syncPeriod: 0s:
    • iptables 규칙을 동기화하는 주기를 설정합니다. 0초로 설정된 경우 동기화 주기가 비활성화됩니다.
(⎈|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
  masqueradeBit: null
  minSyncPeriod: 1s
  syncPeriod: 0s
...

🧿 Kubernetes 클러스터의 각 노드에서 CNI 설정 파일을 출력하여 네트워크 구성 정보를 확인합니다.

  • 첫 번째 플러그인 (ptp):
    • type: "ptp"`: "point-to-point" 플러그인으로, 노드 간의 연결을 위한 것입니다.
    • ipMasq: false: 소스 IP 주소 마스커레이드를 사용하지 않겠다는 설정입니다.
    • ipam: IP 주소 관리 설정입니다.
      • type: "host-local"`: 호스트 로컬 IP 주소 할당 방식입니다.
      • dataDir: "/run/cni-ipam-state"`: IP 주소 관리 상태가 저장될 디렉토리입니다.
      • routes: 네트워크 라우팅 설정입니다. 여기서는 모든 트래픽(0.0.0.0/0)이 이 네트워크로 라우팅됩니다.
      • ranges: IP 주소 범위 설정입니다. 여기서는 10.10.0.0/24 범위가 할당되어 있습니다.
    • mtu: 1500: 최대 전송 단위(MTU)를 설정합니다.
  • 두 번째 플러그인 (portmap):
    • type: "portmap"`: 포트 매핑 기능을 제공하는 플러그인입니다.
    • capabilities: 해당 플러그인의 기능을 설명합니다. 여기서는 포트 매핑을 지원합니다.
(⎈|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",
        "plugins": [
        {
                "type": "ptp",
                "ipMasq": false,
                "ipam": {
                        "type": "host-local",
                        "dataDir": "/run/cni-ipam-state",
                        "routes": [


                                { "dst": "0.0.0.0/0" }
                        ],
                        "ranges": [


                                [ { "subnet": "10.10.0.0/24" } ]
                        ]
                }
                ,
                "mtu": 1500

        },
        {
                "type": "portmap",
                "capabilities": {
                        "portMappings": true
                }
        }
        ]
}
...

🧿 Kubernetes 클러스터의 각 노드에서 현재 네트워크 라우팅 정보를 확인합니다.

  • default via 172.18.0.1 dev eth0:
    • 기본 게이트웨이로 172.18.0.1을 사용하며, eth0 인터페이스를 통해 연결됩니다.
  • 10.10.0.2 dev vethd5b4dee6 scope host:
    • 10.10.0.2는 vethd5b4dee6라는 가상 인터페이스를 통해 연결됩니다. 
  • 10.10.1.0/24 via 172.18.0.2 dev eth0:
    • 10.10.1.0/24 서브넷으로의 트래픽은 172.18.0.2를 통해 전달됩니다.
  • 172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.4:
    • 172.18.0.0/16 서브넷은 eth0 인터페이스를 통해 연결되며, 소스 IP는 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 route; echo; done
>> node myk8s-control-plane <<
default via 172.18.0.1 dev eth0
10.10.0.2 dev vethd5b4dee6 scope host
10.10.0.3 dev veth9d45ccdf scope host
10.10.0.4 dev veth477e65a2 scope host
10.10.1.0/24 via 172.18.0.2 dev eth0
10.10.2.0/24 via 172.18.0.3 dev eth0
10.10.3.0/24 via 172.18.0.5 dev eth0
172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.4
...

🧿 Kubernetes 클러스터의 각 노드에서 네트워크 인터페이스 주소 정보를 확인합니다.

  • 각 노드는 루프백 인터페이스(lo)와 Pod 간의 통신을 위한 가상 인터페이스(veth{ }), 그리고 클러스터와 외부와의 통신을 위한 주 네트워크 인터페이스(eth{})를 가지고 있습니다.
(⎈|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 <<
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: vethd5b4dee6@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 06:19:e0:9d:25:00 brd ff:ff:ff:ff:ff:ff link-netns cni-5cc2c860-e11c-6cb2-4f39-e0e1951c3233
    inet 10.10.0.1/32 scope global vethd5b4dee6
       valid_lft forever preferred_lft forever
    inet6 fe80::419:e0ff:fe9d:2500/64 scope link
       valid_lft forever preferred_lft forever
3: veth477e65a2@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 3e:36:e2:75:9a:f5 brd ff:ff:ff:ff:ff:ff link-netns cni-bbdd57af-4fbf-9b42-fcb8-8da58fc35795
    inet 10.10.0.1/32 scope global veth477e65a2
       valid_lft forever preferred_lft forever
    inet6 fe80::3c36:e2ff:fe75:9af5/64 scope link
       valid_lft forever preferred_lft forever
4: veth9d45ccdf@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether de:1b:da:89:f3:fe brd ff:ff:ff:ff:ff:ff link-netns cni-fecf1ae6-1e11-6a79-1d17-84e519c561e1
    inet 10.10.0.1/32 scope global veth9d45ccdf
       valid_lft forever preferred_lft forever
    inet6 fe80::dc1b:daff:fe89:f3fe/64 scope link
       valid_lft forever preferred_lft forever
18: eth0@if19: <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, Kubernetes IN Docker (kind)에서 사용되는 네트워크입니다. 이 네트워크를 통해 클러스터 내의 Pod와 서비스 간의 통신이 이루어집니다.
(⎈|kind-myk8s:N/A) root@kind:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
34bcc1cda1f4   bridge    bridge    local
1b6d727c2af7   host      host      local
44d7a2bc9676   kind      bridge    local
3107e80bc7b6   none      null      local

🧿 Docker의 kind 네트워크에 대한 상세 정보를 확인합니다.

  • "Internal": false
    • false 값: 이 설정이 false로 되어 있다는 것은 해당 네트워크가 외부와의 통신을 허용한다는 의미입니다. 즉, 네트워크에 연결된 컨테이너는 외부 인터넷과 통신할 수 있습니다.
(⎈|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": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                },
                {
                    "Subnet": "fc00:f853:ccd:e793::/64",
                    "Gateway": "fc00:f853:ccd:e793::1"
                }
            ]
        },
        "Internal": false,	#이 네트워크가 외부와의 통신이 가능한지 여부.
        "Attachable": false,	#네트워크에 다른 컨테이너가 동적으로 연결될 수 있는지 여부.
        "Ingress": false,	#이 네트워크가 Ingress 네트워크인지 여부.
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {	#이 네트워크에 연결된 컨테이너 목록입니다
            "2534e251d141d7b2decbdc8c92b9ba7485158e7bc3372f64c62992ab8343c0f5": {
                "Name": "myk8s-worker3",
                "EndpointID": "b1f6ce9a02db986f11cb426460dd23acbd7e55e2d49fc8793ef10fb68c19b498",
                "MacAddress": "02:42:ac:12:00:05",
                "IPv4Address": "172.18.0.5/16",	#컨테이너의 IPv4 주소
                "IPv6Address": "fc00:f853:ccd:e793::5/64"
            },
            "5e51504e9979ea75283b076f462b741af0ad204e98ead415c73c1c03d63e0aae": {
                "Name": "myk8s-control-plane",
                "EndpointID": "51a44c6eeafa147b5ee095374b8081e3a334032b2c6d0bfccdc5e53a88904ebe",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",	#컨테이너의 IPv4 주소
                "IPv6Address": "fc00:f853:ccd:e793::4/64"
            },
            "99252d7caba7dc8ea5b1d103b68924cdcf0c2c7ccec58536816253bc7ad5657a": {
                "Name": "myk8s-worker2",
                "EndpointID": "770c96b9fbd2030481c0bd8fb7ccac059c0829d3e724df83006ac9fbd9e29d25",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",	#컨테이너의 IPv4 주소
                "IPv6Address": "fc00:f853:ccd:e793::3/64"
            },
            "f0aff265f9d92a074a38fc69d4d90291ede7b5a5c3885c7b9a496648e40d9a0f": {
                "Name": "myk8s-worker",
                "EndpointID": "3959f8037807817fdf5dfdc4f9a01b732f2547ce36e2a80067dae0259fd3184d",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",	#컨테이너의 IPv4 주소
                "IPv6Address": "fc00:f853:ccd:e793::2/64"
            }
        },
        "Options": {
            "com.docker.network.bridge.enable_ip_masquerade": "true",	#IP 마스커레이드를 활성화합니다.
            "com.docker.network.driver.mtu": "1500"	#최대 전송 단위(MTU) 설정.

        },
        "Labels": {}
    }
]

🧿 Docker를 사용하여 kind 네트워크에 연결된 새로운 컨테이너를 생성합니다.

  • docker run: 새로운 컨테이너를 실행하는 명령어입니다.
  • -d: 컨테이너를 백그라운드에서 실행합니다.
  • --rm: 컨테이너가 종료되면 자동으로 삭제됩니다.
  • --name mypc: 생성할 컨테이너의 이름을 mypc로 지정합니다.
  • --network kind: kind 네트워크에 컨테이너를 연결합니다.
  • --ip 172.18.0.100: 컨테이너에 특정 IP 주소를 할당합니다.
  • nicolaka/netshoot: 실행할 이미지 이름입니다. 이 이미지는 네트워크 진단 도구를 포함하고 있습니다.
  • sleep infinity: 컨테이너가 무한히 대기하도록 합니다. 이를 통해 컨테이너가 종료되지 않고 유지됩니다.
(⎈|kind-myk8s:N/A) root@kind:~docker run -d --rm --name mypc --network kind --ip 172.18.0.100 nicolaka/netshoot sleep infinityty
a5c3fa4fc5deb3d7c3bbd23a3e23f766ff3ba35052278e2689395ba4aa2bf78f

(⎈|kind-myk8s:N/A) root@kind:~# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                                             NAMES
a5c3fa4fc5de   nicolaka/netshoot      "sleep infinity"         21 seconds ago   Up 21 seconds                                                                     mypc
2534e251d141   kindest/node:v1.31.0   "/usr/local/bin/entr…"   12 minutes ago   Up 12 minutes                                                                     myk8s-worker3
f0aff265f9d9   kindest/node:v1.31.0   "/usr/local/bin/entr…"   12 minutes ago   Up 12 minutes                                                                     myk8s-worker
5e51504e9979   kindest/node:v1.31.0   "/usr/local/bin/entr…"   12 minutes ago   Up 12 minutes   0.0.0.0:30000-30004->30000-30004/tcp, 127.0.0.1:41827->6443/tcp   myk8s-control-plane
99252d7caba7   kindest/node:v1.31.0   "/usr/local/bin/entr…"   12 minutes ago   Up 12 minutes                                                                     myk8s-worker2

🧿 모든 Docker 컨테이너의 이름과 각 컨테이너의 kind 네트워크 내 IP 주소를 확인합니다.

(⎈|kind-myk8s:N/A) root@kind:~# docker ps -q | xargs docker inspect --format '{{.Name}} {{.NetworkSettings.Networks.kind.IPAddress}}'
/mypc 172.18.0.100
/myk8s-worker3 172.18.0.5
/myk8s-worker 172.18.0.2
/myk8s-control-plane 172.18.0.4
/myk8s-worker2 172.18.0.3

🧿 Helm을 사용하여 Kubernetes 클러스터에 kube-ops-view라는 애플리케이션을 설치합니다.

  • geek-cookbook이라는 이름으로 https://geek-cookbook.github.io/charts/ 저장소를 추가합니다.
  • Helm을 사용하여 kube-ops-view 애플리케이션을 설치합니다.
    • kube-ops-view: 설치할 릴리스의 이름입니다.
    • geek-cookbook/kube-ops-view: 설치할 차트의 경로입니다.
    • --version 1.2.2: 설치할 차트의 버전을 지정합니다.
    • --set service.main.type=NodePort: 서비스 타입을 NodePort로 설정합니다.
    • --set service.main.ports.http.nodePort=30000: HTTP 포트를 30000으로 설정합니다.
    • --set env.TZ="Asia/Seoul": 컨테이너의 시간대를 "Asia/Seoul"로 설정합니다.
    • --namespace kube-system: kube-system 네임스페이스에 설치합니다.
(⎈|kind-myk8s:N/A) root@kind:~# helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
"geek-cookbook" already exists with the same configuration, skipping

(⎈|kind-myk8s:N/A) root@kind:~# 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
NAME: kube-ops-view
LAST DEPLOYED: Wed Oct  2 18:29:50 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace kube-system -o jsonpath="{.spec.ports[0].nodePort}" services kube-ops-view)
  export NODE_IP=$(kubectl get nodes --namespace kube-system -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

🧿 kube-ops-view 애플리케이션의 배포 설정을 수정하여, 해당 애플리케이션이 특정 노드에서만 실행되도록 하고, control-plane 노드에 대해 스케줄 허용합니다.

  • nodeSelector: mynode: control-plane:
    • 이 설정은 kube-ops-view 애플리케이션이 mynode: control-plane 레이블을 가진 노드에서만 실행되도록 지정합니다.
    • 노드에 특정 레이블을 부여하고, 해당 레이블에 맞는 노드에서만 파드가 스케줄되도록 합니다.
  • tolerations:
    • key: "node-role.kubernetes.io/control-plane":
      • 이 필드는 노드의 taint 키를 지정합니다.
      • node-role.kubernetes.io/control-plane는 Kubernetes에서 control-plane 노드에 자동으로 부여되는 taint입니다. 이 taint는 control-plane 노드가 일반적으로 사용자 파드를 실행하지 않도록 하기 위해 존재합니다.
    • operator: "Equal":
      • 이 필드는 toleration이 어떤 방식으로 평가되는지를 정의합니다.
      • "Equal"은 toleration의 key가 노드의 taint key와 동일해야 함을 의미합니다.
    • effect: "NoSchedule":
      • 이 필드는 노드의 taint가 어떤 영향을 미치는지를 정의합니다.
      • NoSchedule 효과는 노드에 taint가 적용된 경우, 해당 taint와 일치하는 toleration이 없는 파드는 해당 노드에 스케줄되지 않음을 의미합니다.즉, NoSchedule taint가 있는 노드에 toleration을 설정하면, 해당 파드는 그 노드에서 실행될 수 있습니다.
    • kube-ops-view 파드는 control-plane 노드에서 실행될 수 있도록 허용됩니다. 기본적으로 control-plane 노드는 일반 파드가 스케줄되지 않도록 설정되어 있으나, 이 toleration을 추가함으로써 kube-ops-view가 이 노드에서 실행될 수 있게 됩니다.
(⎈|kind-myk8s:N/A) root@kind:~# kubectl -n kube-system edit deploy kube-ops-view
deployment.apps/kube-ops-view edited

spec:
...
  template:
  ...
    spec:
      nodeSelector:
        mynode: control-plane
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Equal"
        effect: "NoSchedule"

🧿 Kubernetes 클러스터에서 kube-ops-view 애플리케이션의 파드 상태를 확인합니다.

(⎈|kind-myk8s:N/A) root@kind:~# kubectl -n kube-system get pod -o wide -l app.kubernetes.io/instance=kube-ops-view
NAME                             READY   STATUS    RESTARTS   AGE   IP          NODE                  NOMINATED NODE   READINESS GATES
kube-ops-view-58f96c464d-nv654   1/1     Running   0          40s   10.10.0.5   myk8s-control-plane   <none>           <none>

🧿 URL을 사용하여 웹 브라우저에서 kube-ops-view 대시보드에 접속합니다.

(⎈|kind-myk8s:N/A) root@kind:~# echo -e "KUBE-OPS-VIEW URL = http://192.168.50.10:30000/#scale=2"
KUBE-OPS-VIEW URL = http://192.168.50.10:30000/#scale=2

'쿠버네티스 네트워크 스터디 3기' 카테고리의 다른 글

[5주차] IPVS  (0) 2024.10.03
[5주차] LoadBalancer - MetalLB  (16) 2024.10.02
[4주차] NodePort  (0) 2024.09.24
[4주차] ClusterIP  (0) 2024.09.23
[4주차] 기본 구성 정보  (0) 2024.09.23
Comments