클러스터 생성

2023. 10. 25. 11:25k8s

ubuntu 20.04

master node 1개 : 메모리 4G :cpu 2/1, nat 100G (single)

work node 2개 : 메모리 4G :cpu 2/1, nat 100G (single)

 

user01/test1234

 

master 192.168.2.10 [8.8.8.8/192.168.2.2]

work1 192.168.2.11  [8.8.8.8/192.168.2.2]

work2 192.168.2.12  [8.8.8.8/192.168.2.2]

 

apt update

apt install -y net-tools

apt install -y curl

dpkg -l | grep ssh

 

hostnamectl set-hostname [master | work1 | work2]

 

nano /etc/hosts

192.168.2.10 master

192.168.2.11 work1

192.168.2.12 work2

 

 

win10

win10에서 winSCP, superputty 설치

win10에서 ssh 접속 확인 superputty

superputty 접속 화면

 

 

swap 공간 비활성화

모든 노드에서 아래와 같이 명령어 실시

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

 

 

컨테이너 런타임 구성

모든 노드에 다음 명령으로 구성을 수행한다.

# Using Docker Repository
apt update
apt install -y ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list


# containerd 설치
sudo apt update
sudo apt -y install containerd.io

systemctl status containerd


# Containerd configuration for Kubernetes
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

sed -i 's/^disabled_plugins \=/\#disabled_plugins \=/g' /etc/containerd/config.toml
systemctl restart containerd

ls /var/run/containerd/containerd.sock

containerd socket 확인

 

 

containerd 설치 참고 사이트

https://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/install-containerd-on-ubuntu-22-04.html

 

How to Install Containerd on Ubuntu 22.04 / Ubuntu 20.04 | ITzGeek

containerd is an industry-standard container runtime that manages the complete container lifecycle of its host system. It handles image

www.itzgeek.com

 

 

kubeadm, kubelet 및 kubectl 설치

모든 머신에 다음 패키지들을 설치한다.

 

- kubeadm : 클러스터를 부트스트랩하는 명령이다. 클러스터를 초기화하고 관리하는 기능을 갖는다.

- kubelet : 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트다. 데몬으로 동작하며 컨테이너를 관리한다.

- kubectl : 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다. 클라이언트 전용 프로그램이다.

 

모든 노드에서 다음 명령을 실행한다.

apt-get update
apt-get install -y apt-transport-https ca-certificates curl

sudo mkdir -p /etc/apt/keyrings

echo "deb [signed-by=/etc/apt/keyrings/kubernetes.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes.gpg

apt-get update

apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

 

버전 확인하기

kubeadm version
kubectl version
kubelet --version

버전 확인 결과

 

 

kubeadm, kubelet 및 kubectl 설치 참고 사이트

Ubuntu kubernetes-xenial public key is not available: NO_PUBKEY B53DC80D13EDEF05 · Issue #2862 · kubernetes/release · GitHub

 

Ubuntu kubernetes-xenial public key is not available: NO_PUBKEY B53DC80D13EDEF05 · Issue #2862 · kubernetes/release

What happened: $ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - % Total % Received % Xferd Average Speed Time Time Ti...

github.com

 

 

넷필터 브릿지 설정

모든 노드에 다음 명령으로 넷필터 브릿지 설정

modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

 

 

마스터 노드 초기화
kubeadm init

'kubeadm token list' 을 통해 token 값 확인 가능

'kubeadm token create --print-join-command'을 통해 token 재생성 가능

 

아래 명령어를 통해 해시값 확인도 가능하다.

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

 

 

유저 설정

다음 명령을 실행하면 .kube/config 파일이 설정되면서 사용이 가능해진다. 이 실습은 master 노드에서만 진행한다.

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

master node 등록 확인

 

 

work 노드 조인하기

본인의 콘솔에 출력된 토큰과 hash 값을 사용해 조인을 수행해야 한다. 다음 명령은 work 노드에서 실습을 진행한다.

kubeadm join <master node ip:6443> --token <Token 값> --discovery-token-ca-cert-hash sha256:<Hash 값>​

kubeadm join 192.168.2.10:6443 --token vnnmtv.h7ufyc4qg1hx1myl --discovery-token-ca-cert-hash sha256:d0a27403d9b6bbff25d242bfd8a1477a6f920ad775c5b7d796bb6869ecf9d52b

 

master node에서 확인

 

 

pod 네트워크 배포

master 노드에서 다음 명령을 실행하면 앞서 구성한 유저 설정을 통해 클러스터에 cilium을 설치한다.

curl -LO https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz
cilium install

설치 후 약 5분 정도 후에 정상 상태로 출력

'cilium status --wait'을 통해 완료 시 바로 확인 가능

 

각 노드가 모두 ready 상태로 변경됨

 

 

pod 네트워크 배포 참고 사이트

https://kubernetes.io/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy/

 

Use Cilium for NetworkPolicy

This page shows how to use Cilium for NetworkPolicy. For background on Cilium, read the Introduction to Cilium. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. I

kubernetes.io

 

 

Cilium

Cilium은 대규모 컨테이너화된 환경에서 네트워크 보안 및 연결을 제공하는 오픈 소스 프로젝트 및 솔루션이다. Cilium은 기존의 L3/L4 네트워크 시스템보다 더 높은 수준의 보안 및 성능을 제공하며, 이를 위해 eBPF (Extended Berkeley Packet Filter)라고 하는 리눅스 커널 기반 기술을 사용한다.

 

Cilium은 클라우드 네이티브 환경과 마이크로서비스 아키텍처에서 네트워크 보안과 성능을 향상시키는 데 사용되며, Kubernetes와 통합되어 클러스터의 네트워크 관리를 간단하게 만든다.

 

 

Cilium의 주요 특징과 역할
  • eBPF 기반 네트워크 보안 : Cilium은 컨테이너 및 마이크로서비스 간의 통신을 감시하고 보호하는 데 eBPF를 사용한다. eBPF는 커널 내에서 실행되는 프로그램을 사용하여 네트워크 패킷을 필터링하고 분석할 수 있는 강력한 도구다.
  • Layer 7 (애플리케이션 레이어) 보안 : Cilium은 Layer 7 (HTTP, gRPC, Kafka 등)에서의 보안을 제공하며, 애플리케이션 레벨에서의 접근 제어와 정책 적용을 가능하게 한다.
  • Kubernetes와의 통합 : Cilium은 Kubernetes와 긴밀하게 통합되어 Kubernetes 환경에서 네트워크 보안을 제공하고, Kubernetes 서비스 디스커버리 및 로드 밸런싱을 강화한다.
  • Distributed Firewall : Cilium은 분산 방화벽을 제공하여 애플리케이션 및 서비스 간의 통신을 정교하게 제어한다. 보안 정책을 정의하여 허용되는 통신만 가능하게 한다.
  • BPF로 데이터 수집 및 분석 : eBPF를 활용하여 네트워크 트래픽을 모니터링하고 이를 분석할 수 있다. 이것은 네트워크 문제 해결 및 보안 사고 탐지에 도움이 된다.

 

 

트러블 슈팅

노드 조인 시 10250 port가 사용 중이기 때문에 조인이 안 된다는 메시지를 얻을 때가 있다.

 

이때 'netstat -tupln | grep 10250'을 통해 10250 포트를 사용 중인 프로세스의 PID를 확인한다.

'kill -9 <PID>'을 통해 프로세스를 중지시키고 다시 조인을 시도해서 문제를 해결했다.

 

 

그 밖의 join 실패 시 master node에서 다음과 같은 조치가 가능

1. apt -y remove kubeadm

apt -y install kubeadm

넷필터 재설치

 

2. rm /etc/containerd/config.toml

systemctl restart containerd

kubeadm init

 

3. rm -r $HOME/.kube

kubeadm init

mkdir -p $HOME/.kube

'k8s' 카테고리의 다른 글

배포명세서 실습  (0) 2023.10.26
클러스터에 tomcat 배포  (0) 2023.10.26
probe  (0) 2023.10.25
docker와 kubernetes의 차이점  (0) 2023.10.24
Ingress  (0) 2023.10.24