본문 바로가기
K8s/K8S Flannel CNI & PAUSE

Kind 소개 및 설치

by 식사법 2024. 9. 8.

kind 소개 및 설치

1. kind 란?

  • kind는 Kubernetes IN Docker의 약자로, 로컬 환경에서 Kubernetes 클러스터를 Docker 컨테이너로 실행할 수 있도록 해주는 도구입니다. 개발자들이 Kubernetes 클러스터를 손쉽게 로컬 머신에서 시뮬레이션할 수 있게 하며, 각 Kubernetes “노드”는 Docker 컨테이너로 구성됩니다.

1. kind 주요 특징

  • kind는 로컬 Kubernetes 클러스터를 제공하며, 각 “노드”가 Docker 컨테이너로 실행됩니다. 이를 통해 가볍고 쉽게 관리할 수 있습니다.
  • kind는 주로 Kubernetes 환경의 테스트에 적합합니다. 개발자들은 로컬 환경에서 다중 노드 클러스터나 고가용성(HA) 설정을 쉽게 테스트할 수 있습니다.
  • kind의 큰 장점 중 하나는 동일한 클러스터 내에서 여러 노드를 Docker 컨테이너로 실행할 수 있다는 것입니다. 이를 통해 복잡한 구성 환경에서 테스트가 가능합니다.
  • kind는 Kubernetes 클러스터 노드를 구성하기 위해 kubeadm을 사용합니다. kubeadm은 Kubernetes 클러스터를 설정하는 공식 도구로, kind의 설정 방식은 실제 Kubernetes 배포 환경과 유사합니다.

2. kind 및 툴 설치 및 삭제 간단 실습

# Install Kind
brew install kind
kind --version

# Install kubectl
brew install kubernetes-cli
kubectl version --client=true

# Install Helm
brew install helm
helm version

# Install Wireshark : 캡처된 패킷 확인
brew install --cask wireshark

# 유용한 툴 설치
brew install krew
brew install kube-ps1
brew install kubecolor
brew install kubectx
# Create a cluster with kind
kind create cluster

# 클러스터 배포 확인
kind get clusters
kind get nodes
kubectl cluster-info

# 파드 정보 확인
kubectl get pod -A
kubectl get componentstatuses

 # 컨트롤플레인 (컨테이너) 노드 1대가 실행
 docker ps
 docker images

# 노드에 Taints 정보 확인
kubectl describe node | grep Taints
Taints:             <none>

9.png

# 클러스터 삭제
kind delete cluster

10.png

2. kind 동작 원리

image.png

1. Docker 와 kind의 기본 상태 확인

2-3.png2-1.png2-2.png
 
2. 클러스터 생성
# Create a cluster with kind
cat << EOT > kind-2node.yaml 
# two node (one workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
EOT
kind create cluster --config kind-2node.yaml --name myk8s

# 확인
kind get nodes --name myk8s
2-4.png2-5.png
 
3. API 서버 확인 및 클러스터 정보
# k8s api 주소 확인 : 어떻게 로컬에서 접속이 되는 걸까?
kubectl cluster-info
docker ps # 포트 포워딩 정보 확인
docker exec -it myk8s-control-plane ss -tnlp | grep 6443
kubectl get pod -n kube-system -l component=kube-apiserver -owide # 파드 IP 확인
kubectl describe  pod -n kube-system -l component=kube-apiserver
docker exec -it myk8s-control-plane curl -k https://localhost:6443/livez ;echo
docker exec -it myk8s-control-plane curl -k https://localhost:6443/readyz ;echo

2-12.png
 
4. 노드 및 파드 정보 확인
# 노드 정보 확인 : CRI 는 containerd 사용
kubectl get node -o wide

# 파드 정보 확인 : CNI 는 kindnet 사용
kubectl get pod -A -owide

# 네임스페이스 확인 >> 도커 컨테이너에서 배운 네임스페이스와 다릅니다!
kubectl get namespaces

# 컨트롤플레인, 워커 컨테이너 각각 1대씩 실행 : 도커 컨테이너 이름은 myk8s-control-plane , myk8s-worker 임을 확인
docker ps
docker images

# 디버그용 내용 출력에 ~/.kube/config 권한 인증 로드
kubectl get pod -v6

image.pngimage.png
 
5. 스토리지 및 툴 설치
# local-path 라는 StorageClass 가 설치, local-path 는 노드의 로컬 저장소를 활용함
# 로컬 호스트의 path 를 지정할 필요 없이 local-path provisioner 이 볼륨을 관리
kubectl get sc
kubectl get deploy -n local-path-storage

# 툴 설치
docker exec -it myk8s-control-plane sh -c 'apt update && apt install tree jq psmisc lsof wget bridge-utils tcpdump htop git nano -y'
docker exec -it myk8s-worker sh -c 'apt update && apt install tree jq psmisc lsof wget bridge-utils tcpdump htop git nano -y'

 

image.png
image.png
 
6. Static Pod Manifest 위치 및 확인
# static pod manifest 위치 찾기
docker exec -it myk8s-control-plane grep staticPodPath /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests

# static pod 정보 확인 : kubectl 및 control plane 에서 관리되지 않고 kubelet 을 통해 지정한 컨테이너를 배포
docker exec -it myk8s-control-plane tree /etc/kubernetes/manifests/
	/etc/kubernetes/manifests/
	├── etcd.yaml
	├── kube-apiserver.yaml
	├── kube-controller-manager.yaml
	└── kube-scheduler.yaml

docker exec -it myk8s-worker tree /etc/kubernetes/manifests/
...

  • Static Pod는 Kubernetes에서 kubelet에 의해 직접 관리되는 포드입니다. 해당 명령어는 static pod manifest 파일의 경로를 확인하는 데 사용되며, 기본적으로 /etc/kubernetes/manifests 경로에 위치합니다. 이 디렉토리 내의 YAML 파일들이 static pod 설정을 담고 있습니다.
  • static pod로 배포된 컴포넌트들(예: etcd, kube-apiserver, kube-controller-manager, kube-scheduler)의 정보를 확인할 수 있습니다.

 

7. Worker Node에서 Kubelet 및 컨테이너 상태 확인

# 워커 노드(컨테이너) bash 진입
docker exec -it myk8s-worker bash
---------------------------------
whoami

# kubelet 상태 확인
systemctl status kubelet

# 빠져나오기
exit

  • 워커 노드 컨테이너 내부로 진입하여 상태를 확인할 수 있습니다.
    • whoami 명령어로 기본 사용자가 root임을 확인할 수 있습니다.
    • systemctl status kubelet을 통해 Kubelet의 상태를 확인하여 Kubernetes가 정상적으로 작동 중인지 파악합니다.

8. 파드 생성 및 네트워크 테스트

# 파드 생성
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: netpod
spec:
  containers:
  - name: netshoot-pod
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx-pod
    image: nginx:alpine
  terminationGracePeriodSeconds: 0
EOF

# 파드 확인
kubectl get pod -owide

# netpod 파드에서 nginx 웹 접속
kubectl exec -it netpod -- curl -s $(kubectl get pod nginx -o jsonpath={.status.podIP}) | grep -o "<title>.*</title>"
<title>Welcome to nginx!</title>

 

  • nginx 파드에 접속하여이라는 응답을 확인할 수 있습니다.

9. 컨테이너 및 런타임 정보 확인

# 컨트롤플레인 컨테이너 bash 접속 후 확인
docker exec -it myk8s-control-plane bash
-------------------------------------------
# CPU 정보 확인
arch
aarch64  # mac m1~m3
혹은
x86_64   # intel/호환 cpu

# 기본 사용자 확인
whoami
root

# 네트워크 정보 확인
ip -br -c -4 addr
ip -c route
cat /etc/resolv.conf

# Entrypoint 정보 확인
cat /usr/local/bin/entrypoint

# 프로세스 확인 : PID 1 은 /sbin/init
ps -ef

 

 

# 컨테이터 런타임 정보 확인
systemctl status containerd

 

 

# DinD 컨테이너 확인 : crictl 사용
crictl version
crictl info
crictl ps -o json | jq -r '.containers[] | {NAME: .metadata.name, POD: .labels["io.kubernetes.pod.name"]}'
crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID              POD
ff3d3a53905fd       9d6767b714bf1       12 minutes ago      Running             nginx-pod                 0                   20328fe63d512       nginx
bebe6b14d1ab3       eead9e442471d       13 minutes ago      Running             netshoot-pod              0                   28cd918f0561a       netpod
...

# 파드 이미지 확인
crictl images
IMAGE                                           TAG                  IMAGE ID            SIZE
docker.io/library/nginx                         alpine               9d6767b714bf1       20.2MB
docker.io/nicolaka/netshoot                     latest               eead9e442471d       178MB
...

# kubectl 확인
kubectl get node -v6
cat /etc/kubernetes/admin.conf

exit

 

  • crictl ps 및 crictl ps -o json | jq 명령어를 통해 클러스터 내에서 실행 중인 모든 컨테이너를 자세히 확인할 수 있습니다. 컨테이너가 어떤 파드에 속해 있는지, 현재 상태가 어떤지 등을 파악할 수 있습니다image.png

10. 클러스터 삭제

# 클러스터 삭제
kind delete cluster --name myk8s
docker ps

 

3.  Multi-Node Kubernetes Cluster와 kube-ops-view 설정 및 포트 매핑

  • kind(Kubernetes in Docker)를 사용하여 로컬 환경에서 다중 노드 Kubernetes 클러스터를 설정하고, 포트 매핑을 통해 외부에서 접근 가능하도록 설정을 통해 확인합니다.

1. Multi-Node 클러스터 생성

# '컨트롤플레인, 워커 노드 1대' 클러스터 배포 : 파드에 접속하기 위한 포트 맵핑 설정
cat <<EOT> kind-2node.yaml
# two node (one workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  extraPortMappings:
  - containerPort: 31000
    hostPort: 31000
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: tcp # Optional, defaults to tcp
  - containerPort: 31001
    hostPort: 31001
EOT

 

  • 여기서 중요한 점은 포트 매핑 설정을 통해 클러스터 내에서 특정 포트로 제공되는 서비스를 호스트 머신의 포트로 노출시키는 것입니다.
  • 31000과 31001 포트가 각각 호스트 머신과 컨테이너 내부의 포트에 매핑되어 있습니다. 이를 통해 로컬 PC에서 이 포트들로 접근하면 Kubernetes 클러스터 내 서비스에 접근할 수 있습니다.
CLUSTERNAME=myk8s
kind create cluster --config kind-2node.yaml --name $CLUSTERNAME

 

 

 

2. 노드 및 Taints 확인

# 배포 확인
kind get clusters
kind get nodes --name $CLUSTERNAME

# 노드 확인
kubectl get nodes -o wide

# 노드에 Taints 정보 확인
kubectl describe node $CLUSTERNAME-control-plane | grep Taints
Taints:             node-role.kubernetes.io/control-plane:NoSchedule

kubectl describe node $CLUSTERNAME-worker | grep Taints
Taints:             <none>

 

  • Control Plane 노드에는 기본적으로 Taints 설정이 있어 워커 노드에서만 파드가 스케줄링됩니다.

 

3. 포트 매핑 정보 확인

# 컨테이너 확인 : 컨테이너 갯수, 컨테이너 이름 확인
# kind yaml 에 포트 맵핑 정보 처럼, 자신의 PC 호스트에 31000 포트 접속 시, 워커노드(실제로는 컨테이너)에 TCP 31000 포트로 연결
# 즉, 워커노드에 NodePort TCP 31000 설정 시 자신의 PC 호스트에서 접속 가능!
docker ps
docker port $CLUSTERNAME-worker
31000/tcp -> 0.0.0.0:31000
31001/tcp -> 0.0.0.0:31001

# 컨테이너 내부 정보 확인 : 필요 시 각각의 노드(?)들에 bash로 접속하여 사용 가능
docker exec -it $CLUSTERNAME-control-plane ip -br -c -4 addr
docker exec -it $CLUSTERNAME-worker  ip -br -c -4 addr

  • Docker 컨테이너 상태를 확인합니다. 컨테이너가 실행 중인 상태와 함께, 설정한 포트 매핑 정보도 확인할 수 있습니다.
  • 워커 노드에 설정된 포트 매핑 정보를 확인합니다. 31000과 31001이 호스트와 컨테이너 간에 올바르게 연결되었는지 확인할 수 있습니다.

 

4. kube-ops-view 설치 및 포트 설정

    • kube-ops-view는 Kubernetes 클러스터의 상태를 실시간으로 시각적으로 보여주는 도구입니다. 이를 Helm을 통해 설치합니다.
  1.  image.png
    • kube-ops-view를 NodePort 방식으로 31000번 포트에 노출시킵니다.
    • 설치가 완료되면 localhost:31000에서 접속할 수 있는 URL을 통해 확인이 가능합니다.

5. Nginx 웹 서버 배포 및 노출

# 디플로이먼트와 서비스 배포
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-websrv
spec:
  replicas: 2
  selector:
    matchLabels:
      app: deploy-websrv
  template:
    metadata:
      labels:
        app: deploy-websrv
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: deploy-websrv
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: deploy-websrv
spec:
  ports:
    - name: svc-webport
      port: 80
      targetPort: 80
      nodePort: 31001
  selector:
    app: deploy-websrv
  type: NodePort
EOF
  • Nginx를 배포하는 Deployment와 이를 외부로 노출하는 NodePort 서비스를 생성합니다.
  • replicas는 Nginx 파드를 2개로 설정하였으며, NodePort는 31001번 포트를 사용합니다.

image.pngimage.png
  • http://localhost:31001 명령어를 통해 웹 브라우저에서 Nginx 서버가 정상적으로 동작하는지 확인할 수 있습니다.

'K8s > K8S Flannel CNI & PAUSE' 카테고리의 다른 글

Flannel CNI  (0) 2024.09.08
Pod & PAUSE 컨테이너  (0) 2024.09.08