소소한개발팁
article thumbnail
반응형

AWS ( Optional )

Ubuntu 환경의 가상머신 3개를 이용하여 마스터 노드와 워커 노드 2개로 Kubernates 환경을 구축하는 과정입니다.

AWS가 아닌 가상환경에서 테스트 할 예정이므로 아래와 같은 방화벽 설정 및 보안그룹은 별도로 설정하지 않겠습니다.

 

방화벽 설정

sudo ufw disable

 

 

가상 머신 환경 사용

GUI 사용 시 

 

Vmware에서 복사 및 붙여 넣기 활성화하기

해당 명령어 입력 sudo apt-get update sudo apt-get install open-vm-tools-desktop Setting 설정 공유 폴더를 허용해줍니다.

devlopjeong12.tistory.com

 

Shell 사용 시

# ip addr 명령어로 SSH 연결하여 사용
ssh [user]@[ip]

 

Control-Plane ( Master Node )

sudo ufw enable
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10251/tcp
sudo ufw allow 10252/tcp
sudo ufw status verbose

 

 

6443/tcp: Kubernetes API 서버 포트입니다. 마스터 노드와 클라이언트(사용자 또는 다른 마스터/워커 노드) 사이의 통신에 사용됩니다. 이 포트는 쿠버네티스 클러스터의 중심이며, 클러스터의 모든 작업은 API 서버를 통해 수행됩니다.

2379:2380/tcp: etcd 클러스터의 통신을 위한 포트 범위입니다. etcd는 쿠버네티스의 데이터베이스로서, 클러스터의 상태 및 구성 정보를 저장합니다. 이 포트 범위는 etcd 클러스터 간의 통신 및 마스터 노드와 etcd 간의 통신에 사용됩니다.

10250/tcp: Kubelet API 서버 포트입니다. Kubelet은 각 노드에서 실행되는 쿠버네티스 에이전트로서, 마스터 노드가 노드를 관리하고 제어하기 위해 사용됩니다. 이 포트는 마스터 노드에서 Kubelet과 통신하기 위해 필요합니다.

10251/tcp: Kube-Scheduler API 서버 포트입니다. Kube-Scheduler는 쿠버네티스에서 새로운 파드를 어느 노드에 배포할지 결정하는 역할을 합니다. 이 포트는 마스터 노드에서 Kube-Scheduler와 통신하기 위해 필요합니다.

10252/tcp: Kube-Controller-Manager API 서버 포트입니다. Kube-Controller-Manager는 쿠버네티스의 다양한 컨트롤러들을 실행하고 관리합니다. 이 포트는 마스터 노드에서 Kube-Controller-Manager와 통신하기 위해 필요합니다.

 

Worker Node

sudo ufw enable
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp
sudo ufw status

 

sudo ufw allow 30000:32767/tcp: 포트 범위 30000부터 32767까지를 허용합니다. 이 포트 범위는 Kubernetes의 NodePort 서비스가 사용할 포트 범위입니다. 서비스를 NodePort로 접근할 경우에만 필요하니 Ingress를 사용할 경우에는 열어줄 필요가 없습니다.

 

Swap off

# Swap off
sudo swapoff -a # 현재 시스템에 적용(리부팅하면 재설정 필요)
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 리부팅 필수

 

Weave Net은 Kubernetes 클러스터 내에서 컨테이너를 네트워크로 연결하는 솔루션입니다. 이는 컨테이너 간의 통신을 관리하고 보안을 제공하기 위해 사용됩니다.

Weave Net은 SDN(소프트웨어 정의 네트워크)을 구현하여 컨테이너 간의 통신을 효율적으로 라우팅하고 관리합니다. 이는 컨테이너 간의 네트워킹을 담당하며, 서로 다른 호스트에 있는 컨테이너 간의 통신을 가능하게 합니다.

 

Kubernetes 및 컨테이너 환경에서의 권장 사항: Kubernetes와 같은 컨테이너 오케스트레이션 플랫폼에서는 스왑을 사용하지 않는 것이 권장됩니다. 이는 스왑이 컨테이너와 관련된 문제를 일으킬 수 있기 때문입니다. 예를 들어, 컨테이너가 메모리를 사용하는 방식과 스왑 동작 사이에 발생하는 상호작용은 예측하기 어려울 수 있습니다.

 

컨테이너 런타임 

# Kubernetes 저장소의 공개키를 다운로드하고 trusted.gpg.d 디렉토리에 키링 파일로 추가합니다.
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

# 패키지 목록을 다시 업데이트하고 containerd.io를 설치합니다. 
sudo apt install -y containerd
# 패키지 목록을 업데이트하고 필요한 패키지를 설치합니다.
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release 

# containerd의 설정 파일에 systemd cgroup을 사용하도록 구성합니다.
cat <<EOF | sudo tee -a /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
EOF

# containerd의 설정 파일에서 disabled_plugins 옵션을 활성화합니다.
sudo sed -i 's/^disabled_plugins = \["cri"\]/# disabled_plugins = \["cri"\]/g' /etc/containerd/config.toml

# containerd 서비스를 재시작합니다.
sudo systemctl restart containerd

# containerd의 소켓 파일을 확인합니다.
ls /var/run/containerd/containerd.sock

 

Master Node의 /etc/containerd/config.toml 경로에서 disabled_plugins비 활성화 되어있는지 확인

 

Kubernates 설치하기

Net Filter Setting

cat <<EOF > netFilter.sh
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
exit
EOF
sudo bash netFilter.sh

 

1. 관리자(root) 권한으로 셸을 시작합니다.
2. Linux 커널 모듈인 br_netfilter를 로드합니다. 
3. IP 포워딩을 활성화합니다. 이 설정은 Linux 시스템이 라우팅된 패킷을 전달할 수 있도록 합니다.
4. iptables가 브리지 트래픽을 처리하도록 설정합니다. 이 설정은 Linux 브리지 네트워크가 iptables를 통해 네트워크 트래픽을 필터링하도록 합니다.
5. 관리자 권한 셸을 종료하고 일반 사용자 권한으로 돌아갑니다.

 

kubelet, kubeadm, kubectl을 설치

cat <<EOF > kube_init.sh
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
EOF
sudo bash kube_init.sh

 

1. 패키지 관리자를 업데이트하고 Kubernetes를 설치하기 위해 필요한 패키지를 설치합니다.
2. Kubernetes 패키지의 공식 GPG 키를 다운로드하고 추가합니다.
3. Kubernetes를 설치하기 위한 저장소를 설정합니다.
4. 저장소를 업데이트하고 kubelet, kubeadm, kubectl을 설치합니다.
5. 설치된 Kubernetes 패키지의 업그레이드를 방지하기 위해 해당 패키지를 hold 상태로 설정합니다.

 

Master Node에서 설정

# Kubernetes 마스터 노드를 초기화합니다. 이 명령은 새로운 클러스터를 시작할 때에만 필요합니다.
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --ignore-preflight-errors=all

# 재설정
# sudo kubeadm reset
# Kubernetes 클라이언트 구성 파일을 저장할 디렉토리를 생성합니다.
# Kubernetes 클라이언트 구성 파일을 복사하여 사용자의 홈 디렉토리에 저장합니다.
# 클라이언트 구성 파일의 소유자를 현재 사용자로 변경합니다.

#일반 사용자
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#루트 사용자
export KUBECONFIG=/etc/kubernetes/admin.conf

 

Worker Node에서 설정

Master Node에서 kubeadm init으로 생성된 명령어 입력 (각자 명령어 실행 시 나오는 정보로 입력해주세요. )

sudo kubeadm join [ip:port] --token qxhvlc.b7nirwv017xkeyeu --discovery-token-ca-cert-hash sha256:e882ebe8901b22718e46a73cfe0086cfe75e02550ba8d7608d8813efb0e07b28

 

Cailco 설치하기

#연산자
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml

#리소스
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml

#실행 확인
watch kubectl get pods -n calico-system

#스케줄링을 위한 control-plane의 taints 제거
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-

# 확인
kubectl get nodes -o wide

 

calicoctl 설치하기

curl -L https://github.com/projectcalico/calico/releases/download/v3.27.0/calicoctl-linux-amd64 -o kubectl-calico
#권한
chmod +x ./kubectl-calico

 

 

오류 발생 

TLS 오류 발생 시 대응

unset KUBECONFIG
echo $KUBECONFIG
KUBECONFIG=$HOME/.kube/config

 

반응형

'DevOps > K8S(Kubernates)' 카테고리의 다른 글

K8S 해부학: 핵심 개념 살펴보기  (0) 2024.01.10
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!