Information Security Study
240329 실습 환경 설정(쿠버네티스 설치, 노드 생성과 네트워크 설정), 노드 확장 본문
쿠버네티스 설치
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번 추가 시 확인할 사항
- 아이피 주소 대역 변경
- 스왑메모리 사용 끄기
- /etc/hosts 수정
- hostname이 k8s-03인지 확인
- 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 .........................
- 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
'네트워크 캠퍼스 > 쿠버네티스' 카테고리의 다른 글
240411 Kubernetes CNI와 어플리케이션 배포 과정 체험, pod 수명주기 (0) | 2024.04.11 |
---|---|
240405 k9s로 리소스 관리, Kubernetes 엔진 구조, Kubernetes CNI (0) | 2024.04.05 |
240405 프로메테우스와 그라파나로 모니터링 환경 구성하기, Portainer를 활용한 쿠버네티스 클러스터 관리 (0) | 2024.04.05 |
240404 쿠버네티스 대시보드로 모니터링하기 (0) | 2024.04.04 |
240328 쿠버네티스와 컨테이너 개념, 실습 환경 설정 (가상머신 설정, 쿠버네티스 설치 전 필요 도구 세팅) (0) | 2024.03.29 |