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 권한을 주고 싶다면 다음과 같이 하면 된다.
1 |
]# usermod -aG wheel systemv |
CentOS 7 에는 wheel 라고 하는 특수한 그룹이 존재하는데, sudo 설정에는 이 그룹에 한해 sudo 사용 권한을 부여하고 있어 일반계정 systemv 에 sudo 를 사용하게하고 싶다면 wheel 그룹에 포함시키면 된다.
Ubuntu 18.04 에서는 다음과 같이 일반계정을 sudo 권한을 줄 수 있다.
1 |
]# usermode -aG sudo systemv |
br_netfilter 모듈 로딩
br_netfilter 커널 모듈을 로딩해 줘야 한다. 기존에는 modprobe 설정으로 했지만 이제는 systemd 를 활용하면 되는데 ubuntu 18.04, CentOS 7 이 모두 이를 사용하고 있어서 적용 가능하다.
다음과 같이 모듈이름으로 conf 파일을 생성해 준다.
1 2 3 4 |
]$ sudo vim /etc/modules-load.d/br_netfilter.conf # Load br_netfilter.ko at boot br_netfilter ]$ sudo systemctl restart systemd-modules-load.service |
물론 이렇게 하면 시스템을 재부팅을 하더라도 자동으로 모듈이 로딩 된다.
커널 네트워크 파라메터
다음과 같이 커널 파라메터를 수정해 줘야 한다.
1 2 3 4 5 6 7 |
]# 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 파일에 각 서버 정보를 다음과 같이 입력해준다.
1 2 3 |
]# vim /etc/hosts 192.168.96.14 kmaster 192.168.96.15 knode |
swap off 설정
양쪽 모두 swap 을 off 해준다.
1 |
]# swapoff -a |
그리고 반드시 /etc/fstab 에서 swap 관련 마운트 설정을 주석처리 해준다.
CentOS 7 에서 설정
SELinux off
CentOS 7 에서 설정은 SELinux 설정이다. 다음과 같이 해준다.
1 2 |
]# setenforce 0 ]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config |
firewalld 비활성화
이것은 systemctl 로 다음과 같이 가능하다.
1 2 |
]# systemctl stop firewalld ]# systemctl disable firewalld |
패키지 설치
1 2 3 |
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 |
Ubuntu 에서 설정
패키지 설치
1 2 3 4 5 6 |
]$ 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 을 추가 가능하다. 예를 들면 다음과 같다.
1 2 3 4 5 |
]#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" |
하지만 파일을 추가하는 방법으로 가능하다.
1 2 3 4 5 |
]# 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 패키지에 포함되어 있어 설치하면 사용할 수 있다.
1 2 3 |
]$ 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 로 교체해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 |
]# 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 |
다음과 같이 확인 가능하다.
1 2 3 4 |
]$ docker info Logging Driver: json-file Cgroup Driver: systemd Plugins: |
Kubernetes 설치
Ubuntu 18.04
Ubuntu 18.04 에서는 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.
1 2 3 4 5 6 7 8 9 |
]# 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 을 설치해 준다.
1 |
]# apt install -y kubelet kubeadm kubectl |
CentOS 7
CentOS 7 에서는 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.
1 2 3 4 5 6 7 8 9 10 11 |
]# 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 을 이용한다. 일반 계정으로 실행 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
]$ 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 명령은 전부 일반계정으로 하도록 되어 있는데, 위 출력에 나온대로 설정을 해준다.
1 2 3 |
]$ mkdir -p $HOME/.kube ]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config |
하지만 문제가 있다. 다음을 보자
1 2 3 4 5 6 7 8 9 10 11 12 |
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 로그를 보자.
1 2 3 |
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 을 이용하려고 한다. 다음과 같이 설치를 해준다.
1 |
]$ sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
설치를 하고 기다리면 다음과 같이 오류가 발생한다.
1 2 3 4 5 6 7 8 9 10 |
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 을 재시작 해준다.
1 |
]$ sudo systemctl restart kubelet.service |
Kubelet cgroup driver 교체
혹시나 kubelet 의 cgroup driver 를 교체 해줘야 한다면 다음의 파일을 열어서 드라이버를 교체 해주면 된다.
1 2 |
]# vim /var/lib/kubelet/kubeadm-flags.env KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd |