Open minseok1994 opened 7 months ago
컨트롤 플레인은 클러스터의 상태와 구성을 관리한다.
kube-apiserver: 쿠버네티스 API를 제공하는 컴포넌트. 이 API를 통해 컨트롤 플레인의 다른 컴포넌트들이 통신하며, 사용자의 명령어를 받아들인다.
etcd: 모든 클러스터 데이터를 저장하는 쿠버네티스의 백엔드 데이터베이스. 클러스터의 상태, 구성, 메타데이터 등을 저장.
kube-scheduler: 새로 생성된 파드를 어떤 노드에 배치할지 결정하는 컴포넌트. 리소스 요구 사항, 하드웨어/소프트웨어/정책 제한, 친밀도 및 배제성 등을 고려한다.
kube-controller-manager: 클러스터의 상태를 관리하는 컨트롤러를 실행하며, 노드 컨트롤러, 엔드포인트 컨트롤러, 네임스페이스 컨트롤러 등 다양한 컨트롤러가 포함된다.
cloud-controller-manager: 클라우드 특정 로직을 처리합니다. 클라우드 제공 업체의 API와 상호작용하여 클라우드 리소스(예: 스토리지, 로드 밸런서)를 관리합니다.
노드는 쿠버네티스의 작업을 실행하는 물리적 또는 가상의 장치.
kubelet: 각 노드에서 실행되며, 파드가 노드에서 정상적으로 실행되도록 관리. kube-apiserver와 통신하며 파드의 생성, 시작, 모니터링, 중단 등을 담당.
kube-proxy: 각 노드에서 실행되며, 쿠버네티스의 서비스 개념을 구현하는 네트워크 프록시. 네트워크 규칙을 관리하고, 연결된 파드 간의 네트워크 통신기능 담당.
컨테이너 런타임: 컨테이너를 실행하는 소프트웨어. Docker, containerd, CRI-O 등을 말한다.
apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
구글 클라우드의 공개 사이닝 키를 다운로드 한다.
sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
쿠버네티스 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
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
설치가 완료되었다.
초기화 명령어 실행
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도 리포지토리를 설정한 후 설치
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
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
설치를 완료하였다.
쿠버네티스 공식 홈을 참고하여 포트와 프로토콜에 대해서 마스터노드와 워커노드 보안그룹에 추가하였다.
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
ubuntu@worker:~$ su -
root@worker:~#
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/ /
```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
기본적으로 우분투는 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과 맞춘다는 뜻이다.
서버 주소 | 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
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
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시간)이 만료되었기 때문으로 추측되어, 마스터 노드에서 토큰을 다시 생성하기로 하였다.
마스터 노드에서 토큰을 재생성하고, 클러스터에 조인하기 위한 명령어를 출력하도록 하였다.
ubuntu@master:~$ kubeadm token create --print-join-command
kubeadm join 172.31.8.31:6443 --token [토큰값] --discovery-token-ca-cert-hash sha256:[해시값]
워커 노드에서 위 명령어를 다시 수행하였다. 기존과 마찬가지로 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.
워커 노드가 클러스터에 정상적으로 들어갔다.
마지막으로 마스터 노드에서 노드 상태를 확인해보았다.
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
클러스터 구축이 완료되었다!
서버 내에 컨테이너 런타임으로 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
기존 마스터노드의 이름은 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
쿠버네티스 클러스터 구축 완료
sudo apt install wget
k9s relases 페이지 위 페이지에서 Ubuntu 서버 내에 설치할 다운로드 링크를 복사한다.
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
kubernetes by kubeadm
참고 쿠버네티스 공식문서