개요
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 |
* 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/
'가상화 > Kubernetes' 카테고리의 다른 글
[kubernetes] 웹 UI(대시보드) (0) | 2020.03.23 |
---|---|
[kubernetes] kubeadm을 사용하여 고 가용성(HA) 클러스터 만들기 (0) | 2020.03.22 |
[Docker] swarm 모드에서 컨테이너 rebalance (0) | 2020.01.15 |
[Docker] docker service create --mode 옵션 (0) | 2020.01.15 |
[Docker] Volume 관리 (0) | 2020.01.14 |