온프레미스 환경에서의 Kubernetes 클러스터 구축

2023. 9. 4. 20:20DevOps/Kubernetes

 

  • 버전 정보
로컬 VM 기반 Kubernetes Cluster 구축
VMware 버전: 17
VM 버전: ubuntu 20.04
Kubernetes 버전: 1.20.0
 
  • VM 3대 준비
Master 1
Node 1
Node 2

1. 서버 공통 설정

스왑 해제

swapoff -a; sed -i '/swap/d' /etc/fstab
 

Kubernetes 네트워킹에서 sysctl을 사용하여 IPv4 및 IPv6의 브릿지 트래픽을 iptables 체인으로 허용

Kubernetes 클러스터에서 네트워킹을 관리하기 위한 것으로, IPv4 및 IPv6 네트워크 트래픽을 처리하는 방법을 설정하는 것입니다. 네트워킹은 컨테이너와 노드 간의 통신을 관리하는 중요한 측면 중 하나입니다.

 

여기서 sysctl은 Linux 커널 파라미터를 설정하고 제어하는 도구입니다. 이 설정을 통해 IPv4 및 IPv6 네트워크 트래픽이 네트워크 브릿지를 통해 정상적으로 처리되도록 도와줍니다.

cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
 

업데이트 & 기본 유틸 다운로드

 apt-get update && apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
 

docker 설치

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

apt update && apt install -y docker-ce containerd.io
 

signing key 추가 & K8S 레포지토리 추가

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
 

K8S 설치(1.20.0)

1.20.0 이후의 버전은 docker가 아닌 containerd로 구성해야 해서

익숙한 도커로 구성하기 위해 1.20.0버전으로 설치

apt update && apt install -y kubeadm=1.20.0-00 kubelet=1.20.0-00 kubectl=1.20.0-00
 

설치 확인

systemctl status kubelet
 

2. 마스터 서버 설정

쿠버네티스 클러스터 초기화

pod ip대역과 control-plane 노드(vm)의 ip를 설정

kubeadm init --control-plane-endpoint="10.0.1.77:6443" --upload-certs --apiserver-advertise-address=10.0.1.54 --pod-network-cidr=192.168.0.0/16
 

output 확인

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

...

// ********************* 아래 명령어를 입력하여 노드를 추가할 수 있음 *********************
kubeadm join 10.0.1.77:6443 --token pdrhap.w5ynabi9aa24l9cc
--discovery-token-ca-cert-hash sha256:ccdede9a044092b93b720f05b4172da8b10070f0fa4a56445b0a27bdc0d5eaba
 

Admin 유저로 접속

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config
 

CNI 설치

Pod간 통신을 위해서 CNI를 설치해주는데 / Calico를 설

kubectl create -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
 

Master Node 상태 확인

kubectl get nodes

* Master 서버(control-plane)가 Ready 상태이면 정상.
 

3. Worker Node 서버 설정

클러스터에 Node 추가

2번 마스터 설정에서 클러스터 초기화 시에 나온 Node 추가 명령어를 입력

kubeadm join 10.0.1.77:6443 --token pdrhap.w5ynabi9aa24l9cc
--discovery-token-ca-cert-hash sha256:ccdede9a044092b93b720f05b4172da8b10070f0fa4a56445b0a27bdc0d5eaba
 

Node 상태 확인

kubectl get nodes
 

4. Dashboard 추가

[Master 서버 설정]

Dashboard Manifest Code 다운로드

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
 

Manifest Code 수정

Dashboard의 type을 NodePort로 변경하여 클러스터 외부에서 접속 가능하도록 변경

vi recommended.yaml

39 spec:
40   ports:
41     - port: 443
42       targetPort: 8443
43   selector:
44     k8s-app: kubernetes-dashboard
45   type: NodePort 
 

Manifest Code 리소스 생성

kubectl apply -f recommended.yaml
 

Dashboard 포트 확인

kubectl get services -n kubernetes-dashboard
 
 
사진 삭제

output 예시

방화벽 해제 후 접속

[Master IP]:[NodePort]로 접속시 보안 경고가 발생하지만,

 
사진 삭제

사진 설명을 입력하세요.

해당 경고를 무시하고 고급 버튼을 눌러서 접속을 강제하거나

thisisunsafe <- 라고 입력하여 접속

 

Dashboard 접속 사용자 추가

새로운 Service Account를 생성하고

기존에 만들어진 Admin 권한이 있는 ClusterRole을 이어주는

ClusterRoleBinding을 생성해주는 아래 Manifest Code를 이용하여

계정 생성

cat <<EOF | kubectl create -f -
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: admin-user
   namespace: kube-system
EOF

cat <<EOF | kubectl create -f -
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
   name: admin-user
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
   name: cluster-admin
 subjects:
 - kind: ServiceAccount
   name: admin-user
   namespace: kube-system
EOF
 

토큰 확인

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
 

토큰 입력 후 Dashboard 접속

 
사진 삭제

사진 설명을 입력하세요.