Kubernetes 설치

Kubernetes 설치에 대해서 다룬다. 설치를 위한 환경은 다음과 같다.

  • Master
    • Distribution: Ubuntu 18.04
    • IP: 192.168.96.14
    • hostname: kmaster
    • account: systemv
  • Worker Node
    • Distribution: CentOS 7
    • IP: 192.168.96.15
    • hostname: knode
    • account: systemv
  • CNI: Flannel

공통 설정 부분

sudo 권한 추가

Master, Node 두 서버 모두 Static IP 주소를 가지고 있어야 한다. 그리고 모두 일반 계정을 가지고 있어야 하며 이 일반 계정은 sudo 사용 권한을 가지고 있어야 한다.

CentOS 7 의 경우에 일반 계정을 생성한 후에 sudo 권한을 주고 싶다면 다음과 같이 하면 된다.

]# usermod -aG wheel systemv

CentOS 7 에는 wheel 라고 하는 특수한 그룹이 존재하는데, sudo 설정에는 이 그룹에 한해 sudo 사용 권한을 부여하고 있어 일반계정 systemv 에 sudo 를 사용하게하고 싶다면 wheel 그룹에 포함시키면 된다.

Ubuntu 18.04 에서는 다음과 같이 일반계정을 sudo 권한을 줄 수 있다.

]# usermode -aG sudo systemv

br_netfilter 모듈 로딩

br_netfilter 커널 모듈을 로딩해 줘야 한다. 기존에는 modprobe 설정으로 했지만 이제는 systemd 를 활용하면 되는데 ubuntu 18.04, CentOS 7 이 모두 이를 사용하고 있어서 적용 가능하다.

다음과 같이 모듈이름으로 conf 파일을 생성해 준다.

]$ sudo vim /etc/modules-load.d/br_netfilter.conf
# Load br_netfilter.ko at boot
br_netfilter
]$ sudo systemctl restart  systemd-modules-load.service

물론 이렇게 하면 시스템을 재부팅을 하더라도 자동으로 모듈이 로딩 된다.

커널 네트워크 파라메터

다음과 같이 커널 파라메터를 수정해 줘야 한다.

]# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1
EOF
]# sysctl --system

/etc/hosts 파일 편집

Master, Node 서버 양쪽 모두에 /etc/hosts 파일에 각 서버 정보를 다음과 같이 입력해준다.

]# vim /etc/hosts
192.168.96.14  kmaster
192.168.96.15  knode

swap off 설정

양쪽 모두 swap 을 off 해준다.

]# swapoff -a

그리고 반드시 /etc/fstab 에서 swap 관련 마운트 설정을 주석처리 해준다.

CentOS 7 에서 설정

SELinux off

CentOS 7 에서 설정은 SELinux 설정이다. 다음과 같이 해준다.

]# setenforce 0
]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

firewalld 비활성화

이것은 systemctl 로 다음과 같이 가능하다.

]# systemctl stop firewalld
]# systemctl disable firewalld

패키지 설치

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

Ubuntu 에서 설정

패키지 설치

]$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

Docker 설치 및 설정

Kubernetes 는 Docker 를 기반으로하는 서비스다. 당연히 설치를 해줘야 하는데, 설치 관련 내용은 다음에 링크에서 각 배포판마다 잘 설명되어 있다.

한가지, Docker 설치를 위한 패키지 저장소는 명령어와 파일을 생성하는 방법 두가지가 있다.

ubuntu 18.04

ubuntu 에서는 add-apt-repository 명령어로 저장소 URL 을 추가 가능하다. 예를 들면 다음과 같다.

]#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
]# sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

하지만 파일을 추가하는 방법으로 가능하다.

]# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
]# cat <<EOF >/etc/apt/sources.list.d/docker.list
deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
EOF
]# apt update

CentOS 7

CentOS 7 에서는 yum-config-manager 명령어를 이용해서 추가할 수 있다. 이 명령어는 yum-utils 패키지에 포함되어 있어 설치하면 사용할 수 있다.

]$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

다음과 같이 파일을 추가하는 방법도 있다.

Cgroup driver 설정

Kubernetes 를 설치할때에 Cgroup driver 를 systemd 로 추천하고 있다. 그래서 Kubernetes 만 systemd 로 드라이버를 교체하면 docker 와 통신이 되지 않는다. 이것을 위해서 Docker 에서도 드라이버를 systemd 로 교체해 준다.

]# cat > /etc/docker/daemon.json <<EOF	 
{
 "exec-opts": ["native.cgroupdriver=systemd"],
 "log-driver": "json-file",
 "log-opts": {
 "max-size": "100m"
 },
 "storage-driver": "overlay2"
}
EOF
]# systemctl daemon-reload
]# systemctl restart docker

다음과 같이 확인 가능하다.

]$ docker info	 	 
Logging Driver: json-file	 	 
 Cgroup Driver: systemd	 	 
 Plugins:

Kubernetes 설치

Ubuntu 18.04

Ubuntu 18.04 에서는 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.

]# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
]# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

]# #혹은 다음과 같이 해도 된다.

]# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
]# apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

다음과 같이 kubeadm, kubelet, kubectl 을 설치해 준다.

]# apt install -y kubelet kubeadm kubectl 

CentOS 7

CentOS 7 에서는 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.

]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
]# systemctl enable --now kubelet

Master 설정

Master 를 만드는 것은 kubeadm 을 이용한다. 일반 계정으로 실행 한다.

]$ sudo kubeadm init --apiserver-advertise-address=192.168.96.14 --pod-network-cidr=172.16.0.0/16
....
....
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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

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 192.168.96.14:6443 --token 8mqysq.yb19ta1xl8ir9dkp \
    --discovery-token-ca-cert-hash sha256:03d65b22ec96af5a71801d923bc878b449bb3d8d10d632bced5d35878a9e02c3

Kubernetes Master 명령은 전부 일반계정으로 하도록 되어 있는데, 위 출력에 나온대로 설정을 해준다.

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

하지만 문제가 있다. 다음을 보자

systemv@kmaster:~$ kubectl get nodes
NAME      STATUS     ROLES    AGE     VERSION
kmaster   NotReady   master   3m53s   v1.15.3
systemv@kmaster:~$ kubectl get pods -o wide --all-namespaces
NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE     IP              NODE      NOMINATED NODE   READINESS GATES
kube-system   coredns-5c98db65d4-54qmn          0/1     Pending   0          3m51s   <none>          <none>    <none>           <none>
kube-system   coredns-5c98db65d4-sms7m          0/1     Pending   0          3m51s   <none>          <none>    <none>           <none>
kube-system   etcd-kmaster                      1/1     Running   0          2m44s   192.168.96.14   kmaster   <none>           <none>
kube-system   kube-apiserver-kmaster            1/1     Running   0          3m1s    192.168.96.14   kmaster   <none>           <none>
kube-system   kube-controller-manager-kmaster   1/1     Running   0          2m43s   192.168.96.14   kmaster   <none>           <none>
kube-system   kube-proxy-vtwbg                  1/1     Running   0          3m52s   192.168.96.14   kmaster   <none>           <none>
kube-system   kube-scheduler-kmaster            1/1     Running   0          2m53s   192.168.96.14   kmaster   <none>           <none>

kmaster 가 ‘NotReady’ 로 나오고 coredns 상태가 ‘Pending’ 이다. kubelet 로그를 보자.

Aug 30 00:29:03 kmaster kubelet[9751]: W0830 00:29:03.096595    9751 cni.go:213] Unable to update cni config: No networks found in /etc/cni/net.d
Aug 30 00:29:05 kmaster kubelet[9751]: E0830 00:29:05.155336    9751 kubelet.go:2169] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not read
Aug 30 00:29:08 kmaster kubelet[9751]: W0830 00:29:08.096862    9751 cni.go:213] Unable to update cni config: No networks found in /etc/cni/net.d

NetworkPlugin 이 없어 오류가 나오는 것으로 이는 CNI(Container Network Interface) 를 필요로 한다.

Flannel 설치

CNI 중에 Flannel 을 이용하려고 한다. 다음과 같이 설치를 해준다.

]$ sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

설치를 하고 기다리면 다음과 같이 오류가 발생한다.

systemv@kmaster:~$ kubectl get pods --all-namespaces
NAMESPACE     NAME                              READY   STATUS              RESTARTS   AGE
kube-system   coredns-5c98db65d4-54qmn          0/1     Pending             0          13m
kube-system   coredns-5c98db65d4-sms7m          0/1     Pending             0          13m
kube-system   etcd-kmaster                      1/1     Running             0          12m
kube-system   kube-apiserver-kmaster            1/1     Running             0          12m
kube-system   kube-controller-manager-kmaster   1/1     Running             0          12m
kube-system   kube-flannel-ds-amd64-fhxzj       0/1     Init:ErrImagePull   0          67s
kube-system   kube-proxy-vtwbg                  1/1     Running             0          13m
kube-system   kube-scheduler-kmaster            1/1     Running             0          12m

잠깐 시간을 주고 기달리면 모두 Running 상태가 된다. 만일 오랜 시간이 지나도 Running 이 아니라면 kubelet 을 재시작 해준다.

]$ sudo systemctl restart kubelet.service

Kubelet cgroup driver 교체

혹시나 kubelet 의 cgroup driver 를 교체 해줘야 한다면 다음의 파일을 열어서 드라이버를 교체 해주면 된다.

]# vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다