반응형

 

쿠버네티스의 기본 중에서 쿠버네티스 아키텍처에 대한 간단한 설명과 함께 다양한 테스트를 해보려고 한다. 쿠버네티스 클러스터의 구성 요소는 큼직하게 컨트롤 플레인(Control Plane), 노드(Node), 애드온(Addons)이 있다.

 

컨트롤 플레인은 클러스터의 전체를 제어하고, 노드는 쿠버네티스의 컨테이너 런타임 환경을 제공하며 동작중인 파드를 유지하는 기능을 담당한다. 애드온은 쿠버네티스에 추가할 수 있는 확장 기능을 제공한다. 그래서 Ubuntu 18.04 LTS버전이 설치되어 있는 호스트에서 Vagrant를 이용하여 쿠버네티스 아키텍처를 설치하고, 패치/마이너 업그레이드와 노드 제거 및 추가까지 해볼 예정이다.

 

* 사전 준비사항 : Vagrant에 VM 3개 생성(kube-control1, kube-node1, kube-node2) 후 도커 설치되어 있는 환경

 

해당 준비내용은 이전 포스팅을 참고하면 된다.

 

<Vagrant 설치 및 VM 생성방법>

 

Ubuntu 18.04 Vagrant 설치 및 기본 사용법, 명령어

VMware나 VirtualBox처럼 가상머신에 가상 컴퓨터가 많이 올라가있으면 부팅이 안 되는 현상이 발생할 수 있다. 그렇기 때문에 안 쓰는 가상 컴퓨터는 싹 정리해주는 과정이 사전에 필요하다. Kubernete

simroot.tistory.com

 


설치하기 전에..

 

 

쿠버네티스를 설치하기 전에 kubeadm을 설치해야한다.  그 이후 kubelet과 kubectl을 설치한다. 이 세가지는 쿠버네티스를 시작하기 위해 중요한 설정이다.

 

* kubeadm : 클러스터를 부트스트랩(bootstrap)하는 명령어. 설치를 하는 명령어.  

bootstrap은 여성의 부츠에 있는 고리. 이 의미는 it의 많은 곳에서 사용된다. bootstrap이라 하는 것은 부츠의 끈을 손으로 들어 올려서 들어 올릴 수 있도록 만드는 것. 자기가 자기 발을 들어 올린다는 말인데, 모든 운영체제는 자기 혼자서 작동하지 못한다.

컴퓨터에 전원을 넣게 되면 boot loader가 실행이 된다. 이 bootstrap이라고 하는 프로그램이 운영체제를 띄운다. 자기가 자기 자신을 잡아당겨서 스스로 구출해낸다는 어원이 있다고 하는데, 그 특성에 맞게 자기 자신이 운영체제를 끌어올린다 해서 bootstrap이라 한다. 

-> 쿠버네티스를 끌어올린다. 설치한다는 의미! 

 
 

* kubelet : 하단의 kubernetes cluster 이미지 참고 

쿠버네티스가 설치되려면 Control Plane이 필요하다. 이런 요소도(api, c-m, c-c-m,,) 나중에 컨테이너로 실행된다. 엄밀히 이야기 하면 Control Plane도 worker node이다. 요즘에는 인종차별 논란도 있고 해서 worker라는 이름을 잘 안쓰려고 한다는데, 아무튼 node이다. 실행을 해야 하기 때문인데, 그래서 Control Plane에도 kubelet과 k-proxy가 들어있다. 꼭 기억해야 할 사항이다.

 

* kubectl : 쿠버네티스를 관리하기 위한 것. 

 

클라우드 컨트롤러 매니저 : kubernetes.io



쿠버네티스 공식 홈페이지에 보면 자세한 설명이 나와있는데, 리눅스 계열 별 설치방법이 각각 따로 존재한다. 호스트가 현재 Ubuntu이기 때문에 데비안 기반 배포판 내용을 참고하여 진행하였다.

 


설치 시작 (v1.18.18)

 

 

1. kube-control1 설치

 

kube-control1이 control plane이기 때문에 먼저 설치를 한다. enp0s8에 보면 ip 주소는 192.168.100.11이다.

enp0s8 ip 주소 확인

 

공식 홈페이지에 데비안 기반 배포판을 순차적으로 설치한다.

kubeadm 설치 - 데비안 기반 배포판

 

설치 내용을 순서대로 살펴보자면 apt update -> 패키지 설치 -> GPG key -> repository 추가 -> 다시 apt update…  가 된다.

* 처음보는 부분) hold라고 하는 것은 apt를 update를 하지 않게 만드는 패키지이다.

왜 업데이트를 하지 않는지? 여러 컴포넌트들이 서로 유기적으로 작용하는데, 각각의 버전이라는 것이 존재한다. 서로 상호 관계가 있기 때문에 잘못 설치하면 쿠버네티스가 죽어버린다. 쿠버네티스 버전을 업데이트 할 때에는 절차라는 것이 존재하는데, 단순하게 패키지를 업데이트 해버리면 안 된다. 그래서 hold를 걸어놓는 것. hold의 반대는 unhold해주면 풀어준다.

 

vagrant@kube-control1:~$ sudo apt-get update
vagrant@kube-control1:~$ sudo apt-get install -y apt-transport-https ca-certificates curl

vagrant@kube-control1:~$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

vagrant@kube-control1:~$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

vagrant@kube-control1:~$ sudo apt-get update
vagrant@kube-control1:~$ sudo apt install -y kubelet=1.18.18-00 kubeadm=1.18.18-00 kubectl=1.18.18-00
vagrant@kube-control1:~$ sudo apt-mark hold kubelet kubeadm kubectl
kubelet set on hold. 
kubeadm set on hold. 
kubectl set on hold. 

위와같이 설치하기 전, 버전을 확인하는 방법은 다음과 같다.

vagrant@kube-control1:~$ apt info kubeadm
Package: kubeadm  
Version: 1.21.1-00  

vagrant@kube-control1:~$ apt-cache madison kubeadm  

info는 최신버전을 확인하는 명령어이며, 후자는 설치 가능한 버전을 확인할 수 있도록 출력해주는 명령어이다. kubelet, kubectl도 마찬가지. 

apt-cache madison 명령어를 입력하면 kubeadm설치할 수 있는 목록 리스트업이 쫙 나온다.  kubeadm 홈페이지 설치 순서 4번의 update까지만 설치를 완료해서 해당 명령어로 확인해보면 버전을 확인할 수 있다. 테스트를 위해 1.18.18-00 설치하기로 한다. 그래서 install 부분의 버전들을 1.18.18--00으로 설치하였다. 이후 버전을 업데이트 할 예정이다.


next..

 

- Creating a cluster with kubeadm

control-plane node에서는 최초 1회에 한해서 이니셜라이징 작업이 필요하다. control-plane(master구성) 네트워크 구성 및 환경구성을 진행한다.

sudo kubeadm init --control-plane-endpoint 192.168.100.11 --pod-network-cidr 192.168.0.0/16 --apiserver-advertise-address 192.168.100.11 

서브넷은 /24 보다도 /16으로 잡아주는 게 컨테이너를 많이 생성할 수 있다. 많이 사용하기 위해 /16, /12정도로도 만든다.

kubeadm init –control-plane-endpoint : ip a s했을 때 알수있는 ip주소. endpoint. 그래서 control-plane인 kube-control1 사용자의 사설ip 주소를 적어주었다. VM을 생성할 때 이 ip대역으로 생성하기도 하였다.

--apiserver-advertise-address : worker node에게 알려 줄 주소

만들고 나서 나오는 To start~로 시작하는 장문의 글을 따로 복사해둔다. 그 순서대로 node join까지 진행할 수 있다. 아래 더보기를 참고하면 된다.

더보기

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 
//자격증명 구성. master에 kubernetes 컴포넌트들이 생성되는 것인데 출력 결과에서 mkdir, cp, chown 명령을 kubernetes 관리자 계정에서 실행한다. 나오는 내용을 복사 붙여넣기해서 사용하면 편하다.

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/ 
// addon 구성 

You can now join any number of control-plane nodes by copying certificate authorities 
and service account keys on each node and then running the following as root: 

kubeadm join 192.168.100.11:6443 --token k~~~@#~~~xr8tz7 \ 
--discovery-token-ca-cert-hash sha256:6bd28~~b8dcf90a43~~~~~~~72101cb65a15819f351fa \ 
--control-plane 
// control-plane node를 추가하는 값. kubeadm join <token> 은 worker node가 master에 연결될때 필요하다. 별도로 저장해두도록 한다.

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

 

이미지는 미리 받아놓기(pulling 시간 오래걸림)

vagrant@kube-control1:~$ kubeadm config images pull

vagrant@kube-control1:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE 
wordpress 5.7 c2dd1984ad5b 11 days ago 551MB 
k8s.gcr.io/kube-proxy v1.18.19 a5cae4db9292 4 weeks ago 117MB 
k8s.gcr.io/kube-apiserver v1.18.19 d26f380d3e93 4 weeks ago 173MB 
k8s.gcr.io/kube-controller-manager v1.18.19 4b0bf89255ad 4 weeks ago 162MB 
k8s.gcr.io/kube-scheduler v1.18.19 916efc2e1cec 4 weeks ago 96.1MB 
mysql 5.7 2c9028880e58 4 weeks ago 447MB 
k8s.gcr.io/pause 3.2 80d28bedfe5d 16 months ago 683kB 
k8s.gcr.io/coredns 1.6.7 67da37a9a360 16 months ago 43.8MB 
k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 19 months ago 288MB 

 


이후 진행할 명령어

mkdir ~/.kube 
sudo ls /etc/kubernetes/admin.conf 
sudo cp /etc/kubernetes/admin.conf ~/.kube/config 
sudo chown vagrant:vagrant ~/.kube/config 

ls -l ~/.kube/config 
kubectl get nodes 
cat ~/.kube/config 

kubectl get nodes를 통해서 kube-control1이 master노드임을 확인할 수 있다. STATUS가 아직 NotReady로 되어있는데, 일정 시간이 지나면 곧 Ready로 바뀐다.

 

추가로 network 설정을 도와주는 addon을 설치한다. network addon의 종류는 많이 있는데, 가장 많이 쓰이는 것이 Calico이다. Calico에 관련된 명령어 및 설명은 참고링크를 아래 달아두었다.

curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml

curl~파일 받아서 저장 후 ls하면 calico.yaml파일이 다운로드 된다. vim같은 편집기로 calico.yaml파일에 들어와보면 ip address가 설정되어 있는데, 이 부분을 적절하게 바꿔준다. 192.168.0.0 로 다운로드가 받아져서 따로 바꾸지 않았다.

그 다음 명령어 실행하면 쿠버네티스 사용의 전제조건인 Objectives부분을 만족하게 된다.

 

 

2. kube-node1 추가(worker node 구성)

 

master node(control-plane)을 셋팅하는 데만 꽤나 복잡하고 오래 걸렸지만, 이 셋팅을 최초 1회만 해주면 이제 node를 붙였다 떼는 건 쉽게 진행할 수 있다. 이 작업은 각 노드에서 진행하기 때문에 ssh 원격접속으로 kube-node1에서 작업한다.

vagrant@kube-control1:~$ ssh vagrant@kube-node1

kube-control1 안에서 ssh 원격접속하는 명령어는 호스트에서 접속할 때와 다른 점을 주의하자. 이렇게 이중으로 접속하게 되면 비밀번호를 물어보는데, 기본 셋팅되어 있는 비밀번호는 vagrant이다.

 

* Add Worker (node1/node2) WorkFlow

1. Docker 설치(사전에 완료해놓았음)

2. kubeadm, kubectl, kubelet=1.18.18-00 설치

3. 설치 후에 join만 해주면 됨. (아까 더보기에 있던 내용의 마지막 부분을 참고하여 token을 포함한 join명령을 실행해야 한다)

 

1) kubeadm 설치

vagrant@kube-node1:~$ sudo apt-get update
sudo apt-get node1:~$ sudo apt-get install-y apt-transport-https ca-certificates curl

2줄은 마스터노드를 구성한 뒤 생략 가능하다.

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

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

sudo apt-get update
sudo apt install kubectl=1.18.18-00 kubeadm=1.18.18-00 kubelet=1.18.18-00
sudo apt-mark hold kubelet kubeadm kubectl

마스터노드 때와 마찬가지로 kubeadm을 설치한다.

 

* kube-control1에서 했던 아래 명령은 node에서 진행 XX -> master node에서만 1회 진행하면 된다.

kubeadm config images pull
sudo kubeadm init --control-plane-endpoint 192.168.100.11 --pod-network-cidr 192.168.0.0/16 --apiserver-advertise-address 192.168.100.11

이 명령어는 참고만 하며, node1node2는 아래 토큰과 해시값을 추가하여 join만 해주면 된다. 이전에 master node를 생성할 때 나왔던(더보기 참고) 맨 마지막줄의 token, hash값을 참고한다. 혹시 그 값을 잊어버리면 아래 명령어를 통해서 확인해볼 수 있다. master node인 kube-control1에서 아래 명령어를 입력해주면 된다.

 

vagrant@kube-control1:~$ kubeadm token list
vagrant@kube-control1:~$ kubeadm token create

token list는 토큰값을 출력해주는 명령어이다. token은 24시간 뒤면 만료가 되어 사라지는데 그럴 땐 당황하지 않고 create를 해주면 생성된다.

 

vagrant@kube-control1:~$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

hash값을 구하는 명령어

 

hash값 구하기

 

 

2) join

따라서 node1에 아래와 같은 문법을 입력할 수 있다.

sudo kubeadm join 192.168.100.11:6443 --token <token값> --discovery-token-ca-cert-hash sha256:<hash값>

sudo kubeadm join 192.168.100.11:6443 --token k457sc.6daeqo~~~~r8tz7 --discovery-token-ca-cert-hash sha256:6bd28d05b8~~~~ae172101cb65a15819f351fa

 

 

3. kube-node2 추가

위와같은 작업을 node2에도 반복한다.

 

4. Control-plane에서 확인

vagrant@kube-control1:~$ kubectl get nodes

kubectl get nodes 하면 node1, node2가 보여야 함.

 

<결과화면>

NAME            STATUS   ROLES    AGE     VERSION
kube-control1   Ready    master   2d20h    v1.18.18
kube-node1      Ready    <none>   2d20h   v1.18.18
kube-node2      Ready    <none>   2d19h   v1.18.18

 

 


 

 

원래는 패치 업그레이드, 마이너 업그레이드, 노드 제거, 노드 추가까지 하려고 했는데 내용이 길어져서 다음 포스팅에 이어서 작성을 해볼 예정이다. 위에 설명했던 내용에서 참조했던 링크를 아래 올려두었으니 참고하면 된다.

 

 

* 참고자료 *

 

 

<kubeadm 설치>

 

 

kubeadm 설치하기

이 페이지에서는 kubeadm 툴박스를 설치하는 방법을 보여준다. 이 설치 프로세스를 수행한 후 kubeadm으로 클러스터를 만드는 방법에 대한 자세한 내용은 kubeadm을 사용하여 클러스터 생성하기 페이

kubernetes.io

 

<Creating a cluster with kubeadm 참고>

 

Creating a cluster with kubeadm

Using kubeadm, you can create a minimum viable Kubernetes cluster that conforms to best practices. In fact, you can use kubeadm to set up a cluster that will pass the Kubernetes Conformance tests. kubeadm also supports other cluster lifecycle functions, su

kubernetes.io

 

<Calico>

 

Install Calico networking and network policy for on-premises deployments

Install Calico networking and network policy for on-premises deployments.

docs.projectcalico.org

 

반응형

+ Recent posts