Ssoon
[5주차] 실습기본환경구성 본문
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 클러스터와 통신할 수 있습니다.
- 0.0.0.0:30000-30004->30000-30004/tcp
(⎈|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가 이 노드에서 실행될 수 있게 됩니다.
- key: "node-role.kubernetes.io/control-plane":
(⎈|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