Linux / / 2024. 10. 30. 16:31

Kubernetes

 

쿠버네티스란?

- 쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을

  자동으로 배포, 확장 및 관리하는 오픈 소스 플랫폼입니다.

  구글에서 개발하였으며, 현재는 CNCF가 관리하고 있습니다.

  클라우드 환경에서 각 노드들의 애플리케이션을 관리하는데 유용하게 사용됩니다.

 

쿠버네티스의 주요 기능

- 애플리케이션 배포 자동화

- 로드 밸런싱 (트래픽 분산)

- 스케일링 (컨테이너 수 조정)

- 셀프힐링 (시스템 자동 복구)

- 보안성

 

쿠버네티스 실습 사전구성

사용 OS: Ubuntu 24.04.1

네트워크 인터페이스: NAT

 

UK1 - 192.168.150.100 (Master Node)

UK2 - 192.168.150.101 (Worker Node 1)
UK3 - 192.168.150.102 (Worker Node 2)
UK4 - 192.168.150.103 (Worker Node 3)
UK5 - 192.168.150.104 (Worker Node 4)

 

※ 마스터 노드도 장애가 발생할 수 있으므로

  실제로 쿠버네티스를 운용할 때에는 마스터 노드도 다중화를 해서 사용합니다.

 

▶ Master Node에서 작업)
sudo su -
passwd
apt update -y && apt upgrade -y
apt install -y gedit
apt install -y vim
apt install -y net-tools
apt install -y openssh-server
vim /etc/ssh/sshd_config
       33라인  PermitRootLogon yes로 수정
systemctl restart ssh
ssh localhost
      관리자계정으로 로그인 확인
ufw disable
hostnamectl set-hostname master
gedit /etc/hosts
     192.168.150.100 master master.orange.com
     192.168.150.101 worker1 worker1.orange.com
     192.168.150.102 worker2 worker2.orange.com
     192.168.150.103 worker3 worker3.orange.com
     192.168.150.104 worker4 worker4.orange.com
echo "user0 ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/user0

apt-get install -y open-vm-tools-desktop
init 0

# 현재 상태 BASIC으로 스냅샷
# 클론 4개 작업 -> UK2, UK3, UK4, UK5

▶ Worker Node1~4에서 추가 작업)

sudo hostnamectl set-hostname worker1~4

 

# 이후 아이피 설정

▶ Master Node에서 확인)

for i in {1..4}; do ping -c 2 worker$i; done
ssh-keygen
for i in {1..4}; do ssh-copy-id root@worker$i; done

ssh-copy-id master

ssh root@worker1  --> 암호없이 로그인 확인
ssh root@worker2  --> 암호없이 로그인 확인
ssh root@worker3  --> 암호없이 로그인 확인
ssh root@worker4  --> 암호없이 로그인 확인

 

쿠버네티스 설치

apt install -y git
git clone https://github.com/kubernetes-sigs/kubespray.git
cd /root/kubespray
apt update -y
apt install -y python3-pip

pip3 install -r requirements.txt --break-system-packages

 

# 만약 특정 패키지를 Uninstall 할수 없다는 메시지가 표시될 경우

apt remove python3-패키지이름

으로 삭제한 후 다시 pip3 install을 진행해 줍니다.


cp -rpf inventory/sample inventory/mycluster
cd inventory/mycluster/
vim inventory.ini

    [all] 전체 노드 등록
        master ansible_host=192.168.150.100  ip=192.168.150.100
        worker1 ansible_host=192.168.150.101  ip=192.168.150.101
        worker2 ansible_host=192.168.150.102  ip=192.168.150.102
        worker3 ansible_host=192.168.150.103  ip=192.168.150.103
        worker4 ansible_host=192.168.150.104  ip=192.168.150.104

    [kube_control_plane]   마스터 등록
        master

    [etcd]   마스터 등록
        master

    [kube_node]   워커노드 등록
        worker1
        worker2
        worker3
        worker4

 

cd /root/kubespray/
ansible all -m ping -i inventory/mycluster/inventory.ini 

# 결과 : 
   - 등록된 워커노드는 녹색으로 표시되어야 한다
   - 등록된 마스터노드는 녹색으로 표시되어야 한다

만약 등록된 노드에서 에러가 발생한 경우
  ssh-copy-id  노드   명령이 올바르게 실행되지 않음

 

▶ 추가 환경설정

cd inventory/mycluster/group_vars/k8s_cluster

vim k8s-cluster.yml

    129라인 구문수정
        kube_proxy_strict_arp: true
    229라인 구문확인
        container_manager: containerd
    240라인 구문수정
        kubernetes_audit: true

 

▶ kubectl 설치 / kubeadm / kubespray
ansible-playbook -i inventory/mycluster/inventory.ini --become --become-user=root -v cluster.yml

 

snap install kubectl --classic


kubectl version --client
kubectl get node -o wide

 

 

 

 Kubectl 자동완성 & Alias 환경설정

vim ~/.bashrc

        # 마지막 줄에 추가

        source <(kubectl completion bash)
        alias k=kubectl
        complete -F __start_kubectl k

        alias ka='kubectl apply --recursive -f'
        alias kgp='kubectl get pods -o wide'
        alias kgd='kubectl get deploy -o wide'
        alias kgs='kubectl get service -o wide'
        alias kgn='kubectl get nodes -o wide'
        alias kge='kubectl get events -w --field-selector type=Warning'
        alias kgv='kubectl get pvc -o wide'
        alias kgpa='kubectl get pods -o wide -A'
        alias kgpw='kubectl get pods -o wide -w'
        alias kgpaw='kubectl get pods -o wide -A -w'
        alias krn='kubectl run nginx --image=nginx --restart=Never'
        alias kcn='kubectl create deployment nginx --image=nginx'
        alias krb='kubectl run busybox --image=busybox --restart=Never -- sleep 1d'


# 쉘 재시작시 적용

# 앞으로 k라는 명령어는 kubectl을 줄인 것임에 유의

 

krew를 이용한 Plugin 관리

 - krew는 kubectl을 관리하는 매니저

 - 플러그인 : 기존의 소프트웨어에 특정한 기능을 추가해주는 옵션

 - kubectl CLI 환경에서 다양한 플러그인을 설치, 삭제, 조회할 수 있음

 

▶ krew 설치 (쉘에 입력)

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

 

vim ~/.bashrc

        # 마지막 구문 추가 (환경변수)

        export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

 

# 쉘 재시작

k krew

k krew 입력 시 도움말이 표시되면 설치 및 환경변수 설정이 완료된 것입니다.

 

# 사용가능한 플러그인 목록 확인

k krew search

혹은

https://krew.sigs.k8s.io/plugins/

 

kube-ctx / kube-ns / kube-ps1 설치 & 활용

☞ kube-ctx (context) : 여러 클러스터 중에서 원하는 클러스터를 선택할 수 있다
☞ kube-ns : 단일 클러스터내의 자원별 격리할때 구분하는 네임스페이스 지원
☞ kube-ps1 :프롬프트에 컨택스트와 네임스페이스 정보 표시

 

(1) kube-ctx 설치

k krew install ctx

 

# 등록된 클러스터 목록 확인

k ctx

 

# 해당 클러스터 선택

k ctx kubernetes-admin@cluster.local

 

k get pod -n kube-system

 

(2) kube-ns 설치

k krew install ns

 

# 현재 네임스페이스 목록 출력

k ns

 

 

# 네임 스페이스 사용하기 (default)

k ns default

k get pod

 

# 네임 스페이스 사용 (kube-system)

k ns kube-system

k get pod

 

(3) kube-ps1 설치

git clone https://github.com/jonmosco/kube-ps1.git

 

# 받은 파일 확인

ls -l kube-ps1

 

# 실행권한 부여

chmod +x ./kube-ps1/kube-ps1.sh

 

# 권한 부여 확인

ls -l kube-ps1

 

# 환경변수 등록

vim ~/.bashrc

    # 마지막라인 구문 추가

    source $HOME/kube-ps1/kube-ps1.sh
    PS1='[\u@\h \W $(kube_ps1)]\$'
    KUBE_PS1_SYMBOL_ENABLE=false

 

# 적용

source ~/.bashrc

이제 쉘이 쿠버네티스 클러스터 정보를 확인할 수 있도록 변경됩니다.

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유