Mascarpone-Cheese-Cake / NerdNode

✅ 다양한 작업을 공유하며 공부하는 스터디 모임
2 stars 0 forks source link

Kubernetes #12

Open minseok1994 opened 7 months ago

minseok1994 commented 7 months ago

kubernetes by kubeadm

참고 쿠버네티스 공식문서

minseok1994 commented 7 months ago

쿠버네티스란?

쿠버네티스 클러스터 구성 요소 설명

image

컨트롤 플레인 컴포넌트

노드 컴포넌트

minseok1994 commented 7 months ago

쿠버네티스 설치

설치 전에..

image

kubeadm, kubelet 및 kubectl 설치

  1. apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.

    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl
  2. 구글 클라우드의 공개 사이닝 키를 다운로드 한다.

    sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
  3. 쿠버네티스 apt 리포지터리를 추가한다.

    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  4. apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.

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

이때 4번 과정에서 아래와 같이 오류가 발생하는 것을 확인.

ubuntu@nerdeck:~$ sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package kubelet
E: Unable to locate package kubeadm
E: Unable to locate package kubectl
E: No packages found

이를 해결하기 위해 아래 명령어를 실행하였음.

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

그러자 이와 같은 결과를 확인할 수 있었다. 이 과정은 사이닝 키를 다시 추가하는 과정이다. 공식 문서에서는 keyring으로 관리하는 것을 추천하지만, 해당 방법이 잘 작동하지 않아 이전에 쓰던 방식으로 변경 하였다고 보면 됨.

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
OK 

다음으로 쿠버네티스 리포지토리에 https가 아닌 http도 추가하였음. 보안상 https가 권장되지만 설치가 되지 않아 http로 설치.

sudo vim /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main

최종적으로 다시 한번 설치 시도.

sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni
image

설치가 완료되었다.

minseok1994 commented 7 months ago

Initialize and run a Kubernetes cluster

클러스터 초기화

초기화 명령어 실행

ubuntu@nerdeck:~$ kubeadm init
[init] Using Kubernetes version: v1.29.3
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR IsPrivilegedUser]: user is not running as root
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

루트권한이 없다고 나와서 루트 권한으로 재실행

ubuntu@nerdeck:~$ sudo kubeadm init
[init] Using Kubernetes version: v1.29.3
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR CRI]: container runtime is not running: output: time="2024-03-30T09:08:38Z" level=fatal msg="validate service connection: validate CRI v1 runtime API for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

CRI (컨테이너 런타임 인터페이스) 호환 컨테이너 런타임이 실행되지 않아 오류가 발생하였음. 해결을 위해 CRI-O 설치.

CRI-O 설치 및 설정

쿠버네티스 때와 동일하게 cri-o도 리포지토리를 설정한 후 설치

ubuntu@nerdeck:~$ su -
root@nerdeck:~# 
curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/deb/ /" |
    tee /etc/apt/sources.list.d/cri-o.list

deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/deb/ /
apt-get update
apt-get install -y cri-o

설치 확인

ubuntu@nerdeck:~$ sudo systemctl status crio
○ crio.service - Container Runtime Interface for OCI (CRI-O)
     Loaded: loaded (/lib/systemd/system/crio.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: https://github.com/cri-o/cri-o

시작 및 부팅 시 자동 시작, 그리고 다시 상태 확인

sudo systemctl start crio
sudo systemctl enable crio
sudo systemctl status crio
ubuntu@nerdeck:~$ sudo systemctl start crio
ubuntu@nerdeck:~$ sudo systemctl enable crio
ubuntu@nerdeck:~$ sudo systemctl status crio
● crio.service - Container Runtime Interface for OCI (CRI-O)
     Loaded: loaded (/lib/systemd/system/crio.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-03-30 09:33:15 UTC; 6s ago
       Docs: https://github.com/cri-o/cri-o
   Main PID: 34780 (crio)
      Tasks: 7
     Memory: 9.0M
        CPU: 100ms
     CGroup: /system.slice/crio.service
             └─34780 /usr/bin/crio

참고 CRI-O 공식문서

클러스터 초기화 재진행

ubuntu@nerdeck:~$ sudo kubeadm init
Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/crio/crio.sock
To see the stack trace of this error execute with --v=5 or higher

크리오 설치 후 소켓 변경을 해주지 않아 오류가 생기는 모습이다. 공식 문서에서 참고한 cri-o 공식 소켓을 지정하여 init를 다시 시작한다.

sudo kubeadm init --cri-socket=unix:///var/run/crio/crio.sock
ubuntu@nerdeck:~$ sudo kubeadm init --cri-socket=unix:///var/run/crio/crio.sock
...
설치 완료 메세지
...
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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값]

Kubernetes 컨트롤 플레인이 성공적으로 초기화되었다. 이제 하나씩 살펴보며 사용을 위한 준비를 마치도록 하겠다.

클러스터 접근 설정

kubectl구성 설정. 결과 메세지에 나온 것처럼 아래 명령어를 실행하여 구성 파일을 복사하고 권한을 설정한다.

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

네트워크 플러그인 설치

파드 간 통신과 클러스터 네트워킹을 위해 필수적인 플러그인인 파드 네트워크를 클러스터에 배포해야 한다. 기존에 사용해봤던 Calico를 설치하기로 하였다.

ubuntu@nerdeck:~$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created

이제 워커 노드를 추가할 수 있으나 추후 적용하기로 하고, 현재는 마스터노드 단일로 구성하기로 하였다. 기존 토큰과 CA 인증서 해시는 따로 저장해 두었으나, 혹시라도 분실 시 아래와 같은 명령어를 통해 다시 토큰을 생성할 수 있다.

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

kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값]

설치 완료

ubuntu@nerdeck:~$ kubectl get nodes
NAME      STATUS   ROLES           AGE     VERSION
nerdeck   Ready    control-plane   8m56s   v1.29.3

설치를 완료하였다.

minseok1994 commented 7 months ago

Before add worker node to Kubernetes cluster

인스턴스 유형 변경

Setting up Security Group

쿠버네티스 공식 홈을 참고하여 포트와 프로토콜에 대해서 마스터노드와 워커노드 보안그룹에 추가하였다.

image

참고 쿠버네티스 포트와 프로토콜

kubeadm, kubelet 및 kubectl 설치

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
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
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni

참고 Install and Set Up kubectl on Linux

CRI-O 설치 및 설정

deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/deb/ /

```console
apt-get update
apt-get install -y cri-o
ubuntu@worker:~$ sudo systemctl start crio
ubuntu@worker:~$ sudo systemctl enable crio
ubuntu@worker:~$ sudo systemctl status crio
● crio.service - Container Runtime Interface for OCI (CRI-O)
     Loaded: loaded (/lib/systemd/system/crio.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-03-30 09:33:15 UTC; 6s ago
       Docs: https://github.com/cri-o/cri-o
   Main PID: 34780 (crio)
      Tasks: 7
     Memory: 9.0M
        CPU: 100ms
     CGroup: /system.slice/crio.service
             └─34780 /usr/bin/crio

참고 CRI-O 공식문서

노드 간 서버 시간 동기화

기본적으로 우분투는 timedatectl 패키지가 설치되어 있으며, 이것이 서버의 시간을 관리한다.

ubuntu@master:~$ timedatectl
               Local time: Fri 2024-04-05 02:49:50 UTC
           Universal time: Fri 2024-04-05 02:49:50 UTC
                 RTC time: Fri 2024-04-05 02:49:50
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

이것을 NTP를 통해 다른 서버의 시간과 맞춰, 결과적으로 쿠버네티스 클러스터의 노드간 시간을 동기화할 수 있다. 먼저 NTP를 설치하고, 설정 파일에 들어간다.

sudo apt-get install -y ntp
sudo vim /etc/ntp.conf

설정 파일에서 아래 부분을 주석처리 하고 한 줄을 추가한다.

...
pool 0.ubuntu.pool.ntp.org iburst 
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst
...
pool time.bora.net

pool time.bora.net 서버의 시간을 time.bora.net과 맞춘다는 뜻이다.

<참고 국내 및 기타 NTP서버 리스트>

서버 주소 PING 응답 여부 ip 제공
time.bora.net O 203.248.240.140 LG유플러스
time.nuri.net O 211.115.194.21 아이네트호스팅
time2.kriss.re.kr O 210.98.16.101 한국표준과학연구원
time.google.com O 210.98.16.101 구글
ntp2.kornet.net O 210.98.16.101 KT

이후 ntp를 재실행하고 상태를 확인해보자.

sudo systemctl restart ntp
sudo systemctl status ntp
ubuntu@master:~$ sudo systemctl restart ntp
ubuntu@master:~$ sudo systemctl status ntp
● ntp.service - Network Time Service
     Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-04-05 16:14:02 KST; 1min 56s ago
       Docs: man:ntpd(8)
    Process: 1725 ExecStart=/usr/lib/ntp/ntp-systemd-wrapper (code=exited, status=0/SUCCESS)
   Main PID: 1732 (ntpd)
      Tasks: 2 (limit: 4666)
     Memory: 1.3M
        CPU: 31ms
     CGroup: /system.slice/ntp.service
             └─1732 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 115:122

Apr 05 16:14:02 master ntpd[1732]: kernel reports TIME_ERROR: 0x2041: Clock Unsynchronized
Apr 05 16:14:02 master ntpd[1732]: kernel reports TIME_ERROR: 0x2041: Clock Unsynchronized
Apr 05 16:14:02 master systemd[1]: Started Network Time Service.
Apr 05 16:14:03 master ntpd[1732]: Soliciting pool server "203.248.240.140" 여기서 동기화한 서버의 ip를 확인할 수 있다.

동기화 상태를 확인할 수 있다.

ntpq -p
ubuntu@master:~$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 time.bora.net   .POOL.          16 p    -   64    0    0.000   +0.000   0.001
 ntp.ubuntu.com  .POOL.          16 p    -   64    0    0.000   +0.000   0.001
 time.bora.net   123.140.16.100   2 u   74   64   12    3.315  +300.25  61.048
+185.125.190.56  201.68.88.106    2 u   11   64   17  245.894   -4.582   0.319
 185.125.190.57  201.68.88.106    2 u    6   64   17  247.353   -0.883   1.759
*185.125.190.58  79.243.60.50     2 u    6   64   17  241.742   +2.080   1.759
+alphyn.canonica 132.163.96.1     2 u    7   64   17  215.223   +2.634   1.890

마지막으로 타임존을 Asia/Seoul로 바꿔준다.

sudo timedatectl set-timezone Asia/Seoul
timedatectl
ubuntu@master:~$ sudo timedatectl set-timezone Asia/Seoul
ubuntu@master:~$ timedatectl
               Local time: Fri 2024-04-05 16:17:55 KST
           Universal time: Fri 2024-04-05 07:17:55 UTC
                 RTC time: Fri 2024-04-05 07:17:55
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: no
              NTP service: n/a
          RTC in local TZ: no

IPv4를 포워딩하여 iptables가 브리지된 트래픽을 보게 하기

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# 명시적으로 로드하기 위해
sudo modprobe overlay
sudo modprobe br_netfilter

# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system

메모리 스왑 비활성화

sudo swapoff -a
minseok1994 commented 7 months ago

Add worker node to Kubernetes cluster

Join to MasterNode

ubuntu@worker:~$ kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값]
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR IsPrivilegedUser]: user is not running as root
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

관리자 권한이 없다고 하여 sudo로 재실행하였다.

ubuntu@worker:~$ sudo kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값]
Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/crio/crio.sock
To see the stack trace of this error execute with --v=5 or higher

이번에는 런타임 선택을 하라고 나와서 cri-o를 지정하여 다시 시작하였다. --v=5 명령어는 상세한 로그를 받기 위해 추가하였다.

ubuntu@worker:~$ sudo kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값] --cri-socket=unix:///var/run/crio/crio.sock --v=5

...
I0405 17:09:16.470782    4923 token.go:223] [discovery] The cluster-info ConfigMap does not yet contain a JWS signature for token ID "y8z12r", will try again
...

그러자 토큰의 내용이 유효하지 않다는 로그가 반복되었다. 토큰의 유효 시간(기본적으로 24시간)이 만료되었기 때문으로 추측되어, 마스터 노드에서 토큰을 다시 생성하기로 하였다.

Recreating kubeadm token

마스터 노드에서 토큰을 재생성하고, 클러스터에 조인하기 위한 명령어를 출력하도록 하였다.

ubuntu@master:~$ kubeadm token create --print-join-command
kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값]

Join to MasterNode again

워커 노드에서 위 명령어를 다시 수행하였다. 기존과 마찬가지로 sudo로 실행하고, cri-o 런타임 설정을 하였다.

ubuntu@worker:~$sudo kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값] --cri-socket=unix:///var/run/crio/crio.sockk
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

워커 노드가 클러스터에 정상적으로 들어갔다.

Check the Kubernetes cluster

마지막으로 마스터 노드에서 노드 상태를 확인해보았다.

ubuntu@master:~$ kubectl get nodes
NAME      STATUS     ROLES           AGE     VERSION
nerdeck   NotReady   control-plane   5d22h   v1.29.3
worker    Ready      <none>          2m1s    v1.29.3

클러스터 구축이 완료되었다!

minseok1994 commented 7 months ago

After setting

Found multiple CRI endpoints on the host 에러 해결

서버 내에 컨테이너 런타임으로 containerd와 CRI-O가 두개 설치되어 있어 생기는 오류이다. CRI-O를 사용 예정이므로 containerd는 삭제하였다.

sudo systemctl stop containerd
sudo apt-get purge containerd
sudo apt-get autoremove

또한 containerd.sock을 찾아 제거해 주었다.

ubuntu@master:~$ sudo find / -name "*containerd.sock"
/run/containerd/containerd.sock
ubuntu@master:~$ sudo rm /run/containerd/containerd.sock

Change nodes name

기존 마스터노드의 이름은 eck 클러스터 구축을 위한 것으로 nerdeck를 사용하고 있었다. 그리고 현재 worker node를 추가하며 아래와 같은 상태로 이름이 설정되어 있다.

ubuntu@master:~$ kubectl get nodes
NAME      STATUS     ROLES           AGE     VERSION
nerdeck   NotReady   control-plane   5d22h   v1.29.3
worker    Ready      <none>          2m1s    v1.29.3

이것에는 아래와 같은 문제가 있다.

따라서 nodename의 변경을 하려고 하려고 찾아 보니, 쿠버네티스는 nodename의 변경을 지원하지 않았다. 대신 서버의 hostname을 변경한 후, 다시 클러스터에 join 하도록 권장하고 있다.

ubuntu@master:~$ kubectl delete node nerdeck
node "nerdeck" deleted
ubuntu@master:~$ kubectl delete node worker
node "worker" deleted
ubuntu@master:~$ sudo kubeadm reset --cri-socket=unix:///var/run/crio/crio.sockk
[reset] Reading configuration from the cluster...
[reset] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0405 17:21:36.280168    2095 reset.go:124] [reset] Unable to fetch the kubeadm-config ConfigMap from cluster: failed to get node registration: failed to get corresponding node: nodes "nerdeck" not found
W0405 17:21:36.280313    2095 preflight.go:56] [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
W0405 17:21:37.445354    2095 removeetcdmember.go:106] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] Deleted contents of the etcd data directory: /var/lib/etcd
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
W0405 17:21:37.914175    2095 cleanupnode.go:99] [reset] Failed to remove containers: output: time="2024-04-05T17:21:37+09:00" level=fatal msg="validate service connection: validate CRI v1 runtime API for endpoint \"unix:///var/run/crio/crio.sockk\": rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial unix /var/run/crio/crio.sockk: connect: no such file or directory\""
, error: exit status 1
[reset] Deleting contents of directories: [/etc/kubernetes/manifests /var/lib/kubelet /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/super-admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]

The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d

The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.

If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.

worker노드에서도 reset을 진행하였다.

클러스터 재구축

마스터 노드에서

sudo kubeadm init --cri-socket=unix:///var/run/crio/crio.sock
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

워커 노드에서

sudo kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값] --cri-socket=unix:///var/run/crio/crio.sock

다시 마스터노드에서

ubuntu@master:~$ kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
master    Ready    control-plane   80s   v1.29.3
worker1   Ready    <none>          10s   v1.29.3

초기화하면서 calico도 삭제되었기 때문에 다시 설치하였다.

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl get all -A
ubuntu@master:~$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created

ubuntu@master:~$ kubectl get all -A
NAMESPACE     NAME                                           READY   STATUS              RESTARTS   AGE
kube-system   pod/calico-kube-controllers-658d97c59c-6jxwq   0/1     ContainerCreating   0          5s
kube-system   pod/calico-node-mqxpb                          0/1     Init:1/3            0          5s
kube-system   pod/calico-node-tq4n7                          0/1     Init:1/3            0          5s
kube-system   pod/coredns-76f75df574-nt27d                   0/1     ContainerCreating   0          175m
kube-system   pod/coredns-76f75df574-pfz2r                   0/1     ContainerCreating   0          175m
kube-system   pod/etcd-master                                1/1     Running             1          175m
kube-system   pod/kube-apiserver-master                      1/1     Running             4          175m
kube-system   pod/kube-controller-manager-master             1/1     Running             4          175m
kube-system   pod/kube-proxy-dcgl2                           1/1     Running             1          175m
kube-system   pod/kube-proxy-zjxqs                           1/1     Running             1          174m
kube-system   pod/kube-scheduler-master                      1/1     Running             4          175m

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  175m
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   175m

NAMESPACE     NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/calico-node   2         2         0       2            0           kubernetes.io/os=linux   5s
kube-system   daemonset.apps/kube-proxy    2         2         2       2            2           kubernetes.io/os=linux   175m

NAMESPACE     NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/calico-kube-controllers   0/1     1            0           5s
kube-system   deployment.apps/coredns                   0/2     2            0           175m

NAMESPACE     NAME                                                 DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/calico-kube-controllers-658d97c59c   1         1         0       5s
kube-system   replicaset.apps/coredns-76f75df574                   2         2         0       175m

쿠버네티스 클러스터 구축 완료

minseok1994 commented 7 months ago

k9s 터미널 기반 GUI 설치하기

wget 설치

sudo apt install wget

k9s relases 페이지 위 페이지에서 Ubuntu 서버 내에 설치할 다운로드 링크를 복사한다.

Release을 파일 다운로드 및 압축 해제

wget [복사한 링크 주소]
tar -zxvf ./k9s_Linux_amd64.tar.gz
ubuntu@master:~$ ll
total 171884
drwxr-x---  8 ubuntu ubuntu     4096 Apr  8 14:22 ./
drwxr-xr-x  4 root   root       4096 Mar 30 17:42 ../
-rw-r--r--  1 ubuntu ubuntu    10174 Mar 22  2021 LICENSE
-rw-r--r--  1 ubuntu ubuntu    40905 Mar 21 04:01 README.md
-rwxr-xr-x  1 ubuntu ubuntu 93368472 Mar 21 04:17 k9s*
-rw-rw-r--  1 ubuntu ubuntu 29936617 Mar 21 04:22 k9s_Linux_amd64.tar.gz

디렉토리 생성 및 실행 권한 부여

sudo mkdir -p /usr/local/share/k9s
sudo mv ./k9s /usr/local/share/k9s
sudo chmod +x /usr/local/share/k9s/k9s

환경 변수 등록

echo "export PATH=\$PATH:/usr/local/share/k9s" >> ~/.bashrc
source ~/.bashrc

실행 확인

ubuntu@master:~$ k9s

image

참고 k9s 공식 홈페이지