본문 바로가기

가상화/Kubernetes

[kubernetes] 설치

반응형

개요

CentOS 7에서 kubernetes(k8s) 설치

구성환경

kubernetes v1.17.0, CentOS 7.6

 

설치

1. 사전 준비(control-plane node, worker node)

 1.1 Docker-ce 설치 

 1.2 의존성 패키지 설치

   - conntrack, socat

 1.3 브리지 된 IPv4 트래픽을 iptables 체인으로 전달하기 위해 커널 파라메터 수정

  /etc/sysctl.conf 파일에 아래 두라인 추가

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

shell> sysctl -p  => 추가된 커널파라메터 적용

 1.4 swap off

shell> swapoff -a

또는 /etc/fstab 파일에서 아래 라인 주석 처리

#/dev/mapper/centos-swap swap                    swap    defaults        0 0

 1.5 SELiux permissive mode로 변경

shell> setenforce 0
sehll> sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

 

2. 다운로드 및 설치(control-plane node, worker node)

 2.1 yum 설정

  /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

 2.2 설치

shell> yum install -y kubelet kubeadm kubectl --disablerepo=\* --enablerepo=kubernetes --disableexcludes=kubernetes

 2.3 서비스 시작

shell> systemctl enable --now kubelet

** kubelet은 이제 kubeadm이 수행할 작업을 알려 줄 때까지 크래시루프(crashloop) 상태로 기다려야 하므로 몇 초마다 다시 시작된다.

3. control-plane node 구성

 3.1 클러스터 생성

shell> kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.167
--- 생략 ---
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.0.167:6443 --token o317vi.ime49yqo8ap1enah \
    --discovery-token-ca-cert-hash sha256:bde992a31500ac874f721e357f08ae25aee812fdc831da15518eae89c159f0eb
shell>

kubeadmin join ... 명령어를 모든 슬레이브(worker) 노드에서 실행해 준다. 이명령어는 마스터노드에서 kubeadm token create --print-join-command 명령어로 추후 확인 가능하다.

** 초기화

shell> kubeadm reset

이 명령어는 kubeadm init, kubeadm join에 의해 변경된 파일을 원래의 상태로 되돌립니다.

** kubelet과 docker의 Cgroup Driver 일치

kubelet과 docker의 cgroupdriver가 다를 경우 kubelet이 실행되지 않은 경우가 있다. kubelet은 default로 croupdriver를 systemd를 사용하는 반면 docker는 cgroupfs를 사용한다. 아래는 docker의 cgroup driver를 변경하는 방법이다.

> docker info | grep "Cgroup Driver"
Cgroup Driver: cgroupfs
> vi /lib/systemd/system/docker.service
--exec-opt native.cgroupdriver=systemd 추가

> systemctl daemon-reload
> systemctl restart docker

- kubelet cgroup driver 설정 파일  : /var/lib/kubelet/config.yaml

 3.2 kubectl 명령어 사용을 위한 환경 설정

  - 클러스터에 대한 접근을 구성하는 데 사용되는 파일을 kubeconfig 파일 이라 한다

  3.2.1 root 사용자

shell> export KUBECONFIG=/etc/kubernetes/admin.conf

or .bash_profile 에 등록

  3.2.2 일반 사용자

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

  3.2.3 환경설정이 잘못된 경우 아래와 같은 오류 발생

The connection to the server localhost:8080 was refused - did you specify the right host or port?

3.3 Pod-network Addon(Cluster Network Interface : CNI) 설치

 - flannel 설치

 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

* flannel 설치후 cni0(brige),flannel.1,vethxxx 네트워크 인터페이스가 생성됨

 3.4 Control-plane 노드 격리 해제(옵션)

기본적으로 클러스터는 보안상의 이유로 control-plane 노드에서 포드를 예약하지 않습니다. 개발을 위해 단일 머신 Kubernetes 클러스터와 같이 control-plane 노드에서 포드를 예약하려면 다음을 실행하십시오. 

shell> kubectl taint nodes --all node-role.kubernetes.io/master-

반대로 control-lane 노드에서 포드를 예약하고자 할 경우

shell> kubectl taint nodes control-plain-nodeName node-role.kubernetes.io=master:NoSchedule 

 3.5 상태 체크

shell> kubectl get pod -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-8ssss          1/1     Running   0          4m4s
coredns-66bff467f8-ggmn7          1/1     Running   0          4m4s
etcd-testsvr                      1/1     Running   0          4m10s
kube-apiserver-testsvr            1/1     Running   0          4m10s
kube-controller-manager-testsvr   1/1     Running   0          4m10s
kube-flannel-ds-amd64-t9ldj       1/1     Running   0          2m56s
kube-proxy-9gpv5                  1/1     Running   0          4m4s
kube-scheduler-testsvr            1/1     Running   0          4m10s

 

4. worker node 구성

 4.1 클러스터에 가입(join)

kubeadm join 192.168.0.167:6443 --token o317vi.ime49yqo8ap1enah \ 
    --discovery-token-ca-cert-hash sha256:bde992a31500ac874f721e357f08ae25aee812fdc831da15518eae89c159f0eb

 4.2 상태 체크(control plane 노드상에서)

shell> kubectl get nodes

 4.3 worker node 제거(clean up)

  step 1) control plane 노드에서 worker node 제거

shell> kubectl drain <worker node> --delete-local-data --force --ignore-daemonsets 
shell> kubectl delete node <worker node>

 - 샘플 출력

shell> kubectl get nodes 
NAME        STATUS   ROLES    AGE    VERSION  
master1    Ready    master   5h2m   v1.17.4  
worker1   Ready    <none>      89s    v1.17.4  
shell> kubectl drain worker1 --delete-local-data --force --ignore-daemonsets 
node/worker1 cordoned  
node/worker1 drained 
shell> kubectl get nodes 
NAME        STATUS                     ROLES    AGE     VERSION  
master1    Ready                      master   5h3m    v1.17.4  
worker1   Ready,SchedulingDisabled      2m18s   v1.17.4 
shell> kubectl delete node worker1 
node "worker1" deleted 
shell> kubectl get nodes 
NAME        STATUS                     ROLES    AGE     VERSION  
master1    Ready                      master   5h3m    v1.17.4  
shell>

  step 2) worker node에서 kubernetes 설정 제거

shell> kubeadm reset

 

5. 삭제

 5.1 kubernetes 삭제

shell> kubeadm reset  # kubeadm init .. 에서 생성한 파일 삭제 
shell> rpm -e --nodeps kubeadm kubectl kubelet kubernetes-cni   # 의존성 무시하고 삭제하기 위해 --nodeps 사용
shell> rm -f /etc/systemd/system/kubelet.service.d/*
shell> rm -rf /etc/kubernetes
sgell> rm -rf $HOME/.kube

 5.2 CNI 삭제(여기서는 flannel)

shell> systemctl stop kubelet
shell> systemctl stop docker
shell> rm -rf /var/lib/cni/
shell> rm -rf /var/lib/kubelet/* (x)
shell> rm -rf /run/flannel
shell> rm -rf /etc/cni/
shell> ifconfig cni0 down
shell> brctl delbr cni0 or ip link delete cni0
shell> ip link delete flannel.1
shell> systemctl start docker

 

참고 문서 : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

반응형