삽질특기생

다음에 삽질 덜하려고 만든 블로그

0%

k8s 설치 방법

k8s의 pod에 대해 조사를 해야하는 일이 생겨서 개인 컴퓨터에 k8s를 설치해보았다.
원래 k8s는 세 대 이상의 클러스터에 구성할 것을 권장하는 것으로 알고 있지만 나는 테스트용이므로 한 대로만 구성하였다.
k8s가 무엇인지 간략하게 알아보고, 설치 과정에 대해 기술하도록 하겠다.

kubernetes란

kubernete(k8s)는 docker orchetration tool로, application container의 deploy, scaling, operating 자동화를 위한 플랫폼이다.
쉽게 설명하자면 k8s는 사용자가 기대하는 상태로 동작하도록 application을 생성하고 실행 상태를 유지하는 것이 목적이라고 할 수 있다.
k8s는 여러 노드를 하나의 클러스터로 관리하는데, 하나의 master node와 그 외 여러 일반 node로 구성된다. 일반 node는 minions라고도 불리는 모양이다.(미니언즈라니…귀여워…)
master node에는 클러스터를 관리하는 목적의 controller pod들이 실행되어야 한다.
일반 node들은 kubelet 데몬과 docker 데몬이 실행되고 있어야 하며, container의 묶음인 pod들이 실행되는 형태이다.

20/04/06 수정
minion이라고 불렸던 것은 아주 오래전의 얘기인 것 같다. 이 github issue에서 minion이라는 용어가 헷갈리므로 변경하자는 의견이 오고 갔다.

k8s 설치 방법

docker 설치

우선 k8s가 docker 기반의 container를 관리하므로, docker를 설치해야한다.
나는 이미 설치되어있어서 해당 과정을 생략했는데, docker 공식 홈페이지의 설치 방법을 참고하여 설치하면 된다.

k8s 설치

1
2
3
4
5
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add
$ vi /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
$ apt-get update
$ apt-get install --no-install-recommends kubelet kubeadm kubernetes-cni

패키지 설치 시 –no-install-recommends 옵션은 해당 패지키가 실행되는 데 필요한 패키지만을 설치하겠다는 옵션이다.
잡다한 패키지까지 설치하는 게 싫어서 나는 항상 이 옵션을 주고 설치하는데, 저 옵션 없이 설치해도 무방하다.

kubelet 설정

swap 설정을 해주어야 한다.

1
2
3
$ sed -i '9s/^/Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"\n/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
$ systemctl daemon-reload
$ systemctl restart kubelet

master init

kubeadm init

kubeadm을 init해야한다.

1
$ kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors Swap

–pod-network-cidr=10.244.0.0/16은 flannel을 사용하기 위한 옵션이고, –ignore-preflight-errors Swap은 swap 에러를 무시하기 위한 옵션이다.
위 커맨드를 실행하면 To start using your cluster라며 아래와 같은 커맨드가 나열될 것이다.
하라는 대로 따라 치면 되겠다.

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

flannel 적용

보통 pod의 network로 flannel을 많이 사용한다.

1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

master node에 schedule 가능하도록 설정

원래 master node에는 schedule하지 않는 것이 default 설정이다. 즉 master node에는 별도의 설정이 없으면 pod이 뜨지 않는다.
현재 나의 테스트 환경은 single-node cluster이므로, master에 schedule이 가능하도록 설정을 바꿔야 한다.

1
$ kubectl taint nodes --all node-role.kubernetes.io/master-

결과로 node ‘<hostname>‘ untainted가 나오면 성공이다.

trouble shooting

reboot시 node not ready 에러 발생

reboot 시 node not ready 에러가 발생했다.
에러는 다음과 같은 커맨드로 node 정보를 조회하여 확인하였고, 여기서 dev는 node 이름이다.

1
$ kubectl describe node dev

Ready False Tue, 15 May 2018 10:35:18 +0900 Tue, 15 May 2018 10:26:25 +0900 KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

/etc/systemd/system/10-kubeadm.conf에서 KUBELET_NETWORK_ARGS line을 삭제했더니 정상 동작하였다.
해당 과정은 kubernetes github을 참고하였다.

swap 에러 발생

master init 과정에서 다음 커맨드를 실행했을 때 swap을 disable하지 않았다며 에러가 발생했다.

1
$ kubeadm init

[ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors=...

위의 kubelet 설정 방법대로 따라하고, kubeadm init시 swap error를 ignore하는 설정을 잊지 않도록 한다.

마무리

이 포스팅에서는 k8s를 설치하는 방법에 대해서 알아보았다.
시작이 반이라지만 k8s를 설치한 것만으로 반을 했다고 볼 수는 없다ㅋㅋㅋ
k8s를 제대로 사용하려면 pod도 알아야하고 service와 deployment 등등 알아야할 것이 산더미이다.
시간이 되는 대로 내가 조사한 것에 대해 포스팅을 해야겠다.