Information Security Study

240329 실습 환경 설정(쿠버네티스 설치, 노드 생성과 네트워크 설정), 노드 확장 본문

네트워크 캠퍼스/쿠버네티스

240329 실습 환경 설정(쿠버네티스 설치, 노드 생성과 네트워크 설정), 노드 확장

gayeon_ 2024. 3. 29. 17:34

쿠버네티스 설치

 

master에서 설치한다.

$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

$ sudo apt update

$ sudo apt-cache policy kubeadm

$ sudo apt -y install kubelet kubeadm kubectl

 

위 명령어를 차례대로 실행한 뒤

kubeamd version

으로 쿠버네티스 버전을 확인할 수 있다.

 

버전을 고정하기 위해

sudo apt-mark hold kubelet kubeadm kubectl

명령어를 사용한다.

 

그러고 나서 sudo systemctl deamon-reload로 데몬을 재시작한다.

 

sudo systemctl enable --now kubelet.service

: 재부팅 시에도 kubelet 자동 실행

 

이렇게 하면 쿠버네티스 설치가 된 것이다.

 

 

그리고 여러 노드에서 통신이 가능하게 하기 위해

/etc/hosts를 수정한다.

 

통신할 ip host명

을 적어준 뒤 저장한다.

 

sudo shutdown -h now

명령으로 master 인스턴스 셧다운 한 뒤

k8s-master를 복제해 k8s-01, k8s-02, k8s-03을 생성한다.

 

생성 시 주의사항

: MAC 주소 정책은 '모든 네트워크 어댑터의 새 MAC 주소 생성'으로 지정하고 완전한 복제를 선택한다.

 

 

각 인스턴스에서 진행할 것

1) hostname 변경

$ sudo hostnamectl set-hostname k8s-01

 

 

2) /etc/hosts 수정

$ sudo nano /etc/hosts

 

 

3) ping test

$ sudo systemctl restart network
$ sudo ifconfig
$ sudo ping ip
$ sudo ping dns's ip
$ sudo reboot

 

 

4) 가상머신 실행 후 네트워크 설정

/etc/hosts에 작성한 주소로 각 인스턴스의 ip를 변경한다.

 

 

5) 인스턴스 간 접속 확인

ssh k8s-user@k8s-01

과 같은 형식으로 

각 인스턴스 간 접속이 되는지 확인한다.

 


VM 인스턴스에 쿠버네티스 초기화

 

쿠버네티스가 설치된 인스턴스 3대가 있는 상황이고

이제는 이 노드들끼리 연동을 할 것이다.

 

puTTY에 각 ip를 입력해 저장한다.

하나는 마스터노드(컨트롤 담당) 나머지는 워커노드(컨트롤받는 입장)이다.

 

 

각 노드에 접속해 스왑 메모리를 꺼준다.

$ free -h
$ sudo swapoff -a
$ free -h

 

swap 영역의 total이 0이 아니면 켜져있는 것이다.

 

 

그리고 마스터 노드에 대해 아래와 같이 설정한다.

$ sudo kubeadm init --pod-network-cidr=10.96.0.0/12 --apiserver-advertise-address=master'sip

 

10.96.0.0 대역에서 앞 12비트만 고정이므로 대충 100만 개 정도의 아이피를 유동적으로 쓸 수 있다.

쿠버네티스의 내부 요소들도 모두 컨테이너이기 때문에 당연히 이미지를 먼저 받아서 컨테이너를 띄우는 수순으로 진행된다. 그래서 이미지를 받고있다.

 

 

이렇게 나오면 마스터노드의 설정은 완료된 것이다.

위 세 구문을 순차적으로 실행해야 한다.

 

그 아래에는 노드 간 연결을 위해서(마치 젠킨스에서 활용하던 공개키-비공개키 관계와 비슷)

위에 적힌 토큰을 각 노드별로 등록하라고 뜬다.

 

 

아래는 쿠버네티스 명령어를 자동완성해 주는 기능이다.

# bash-completion 설치
$ sudo apt install bash-completion -y
# kubectl에 대한 자동완성을 bash에서 쓸 수 있도록(일시적)
$ source <(kubectl completion bash) 
# 위의 옵션을 ~/.bashrc에 등록해서 해당 사용자는 영구히 쓸 수 있도록
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
# k alias를 등록하기 위해 자동완성 명령어 등록
$ complete -F __start_kubectl k
# alias 등록하러 이동
$ sudo nano .bashrc

 

 

.bashrc 파일을 열어서 아래와 같이 작성한다.

alias k=kubectl # k라고 치면 kubectl로 간주
alias kg='kubectl get'
alias kc='kubectl create'
alias ka='kubectl apply'
alias kr='kubectl run'
alias kd='kubectl delete'
complete -F __start_kubectl k

 

 

저장 후 아래와 같이 반영하면

설정한 자동완성 명령어가 잘 실행된다.

 

 

kubectl get po -A

: coredns(네트워크 역할) 등 중요 요소들을 확인할 수 있다.

 

 

워커 노드들과 마스터노드를 연결하기 위해

위에서 받은 토큰 값을 k8s-01, k8s-02에 

sudo를 붙인 채로 입력한다.

 

그러고 나서 master에서 kubectl get nodes를 해보면

01, 02가 추가된 것을 확인할 수 있다.

 

kubectl get po -A

를 입력해 보면 kube-proxy가 3개로 늘어나 있다.

 

 

CNI 설정

CNI는 Container Network Interface로 컨테이너 간 네트워킹을 위한 표준이다.

 

k8s에서는 pod 간 통신을 위해 CNI를 사용한다.

 

기본적으로 kubenet이라는 플러그인이 있지만 네트워크 기능이 제한적이어서

이를 보완하기 위해 서드파티로 다른 플러그인을 많이 사용한다.

 

Flannel, Calico, Weavenet 등의 다양한 종류가 있다.

 

Calico를 이용해서 네트워크 설정을 할 것이다.

 

 

먼저 calico에서 공식으로 제공하는 yaml파일을 받아서 설정한다.

$ curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

 

 

아래 명령어로 적용한다.

 $ kubectl apply -f calico.yaml

 

현재 연결된 3개 노드 간 통신망을 구축하는 작업이다.

 

kubectl get po -A로 확인해 보면 calico가 추가되었다.

 

kubeadm config print init-defaults로 기타 정보를 확인할 수 있다.

 


쿠버네티스의 노드 확장

01, 02, 03의 프로세서를 2개로 수정한다.

 

가상머신 여러 개를 켜고 사용하는 게 불편해서 mobaxterm을 설치했다.

mobaxterm은 하나의 창에서 탭으로 여러 터미널을 제어할 수 있다.

 

지금까지는 01, 02번만 마스터에 연결되었기 때문에

03번을 기존 그룹에 추가로 등록할 것이다.

 

 

쿠버네티스는 개별 인스턴스를 “노드”라는 단위로 분류해서 관리한다.

 

노드는 하위에 pod(파드)를 가질 수 있고, 파드 내에 컨테이너를 가질 수 있다.

  • 정확히는 파드는 쿠버네티스의 최소 배포단위이고 파드 내부에 컨테이너가 배치된다.

 

컨테이너를 실행하는 모든 워커노드(01, 02)에는 kubelet, kube-proxy, container runtime이 실행된다.

 

kubelet은 컨테이너 실행 요청을 받아 리소스를 관리하고 헬스체크, 모니터링하고

kube-proxy는 네트워크에 container를 노출하기 위한 연결 관리 규칙을 생성 및 관리한다.

 

 

 

puTTY에서 등록했던 인스턴스들이 보인다.

 

 

 

03번을 추가하기 전 먼저 위 명령어로 쿠버네티스가 잘 동작하고 있는지 확인했다.

 

 

03번 추가 시 확인할 사항

  1. 아이피 주소 대역 변경
  2. 스왑메모리 사용 끄기
  3. /etc/hosts 수정
  4. hostname이 k8s-03인지 확인
  5. containerd 및 kubelet 서비스 재기동
    • $ sudo systemctl status containerd.service
    k8s-user@k8s-03:~$ sudo systemctl status containerd.service
    ● containerd.service - containerd container runtime
         Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
         Active: active (running) since Wed 2024-03-20 23:50:01 KST; 4min 31s ago
    .........................
    
  6. cat /proc/sys/net/ipv4/ip_forward의 호출 결과가 1인지 확인
k8s-user@k8s-03:~$ sudo cat /proc/sys/net/ipv4/ip_forward
[sudo] password for k8s-user:
1
k8s-user@k8s-03:~$

 

 

그러고 나서 마스터 노드와 연결하기 위해 토큰이 필요하다.

위에서 발급받은 토큰의 유효기간이 지나지 않아 사용해도 되지만

현업에서는 그때그때 쓰고 파기하고 필요시 새로 발급할 수 있을 것 같아 새로 발급해 봤다.

 

master에서 아래 명령어로 토큰을 생성한다.

$ kubeadm token create --print-join-command

 

토큰이 발급되면 03에서 

sudo 토큰

을 입력해 master와 03을 연결한다.

 

 

 

마스터노드에서 조회를 해보면 03번이 추가되었고 

kube-proxy, calico-node도 4개로 늘어났다.

 

 

calico-node-sxw4v와 같이 특정 요소를 조회하려면 아래와 같이 입력하면 된다.

$ kubectl describe -n kube-system po calico-node-sxw4v