쿠버네티스란?
- 쿠버네티스(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
이제 쉘이 쿠버네티스 클러스터 정보를 확인할 수 있도록 변경됩니다.