전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

Cloud/Kubernetes

2. k8s 설치하기

Happy@Cloud 2019. 9. 12. 12:37

minikube설치하기

1 node에 k8s cluster를 설치하는 가이드입니다.

1) VM 준비하기 

VM은 cloud에서 구매하거나 PC에 Oracle Virtulbox를 이용해서 만들 수 있습니다.

아래는 IBM cloud에서 VM을 생성하는 방법입니다. 

https://happycloud-lee.tistory.com/239

 

IBM Cloud VM 신청하기

IBM Cloud Virtual Box 신청 가이드 https://cloud.ibm.com IBM 계정 작성 IBM계정이 없는 경우 IBM 계정 작성 버튼을 클릭 하여 회원 가입을 합니다. 입력한 메일 계정으로 들어가, 수신된 확인 메일에서 [Conf..

happycloud-lee.tistory.com

 

아래는 PC에 VM을 만드는 가이드입니다.  

Centos나 중Ubuntu중 선택하여 구성 하십시오.

- Centos VM만들기: https://happycloud-lee.tistory.com/233

- Ubuntu VM 만들기: https://happycloud-lee.tistory.com/12

System requirements

Node 대수 OS CPU Memory Storage
VM 1 CentOS/Ubuntu cloud: 2 core
PC VM: 4core
4G 100GB

2) OS upgrade

centos: sudo yum upgrade

ubuntu: 

# apt-get update
# apt-get upgrade

3) docker 설치

https://happycloud-lee.tistory.com/14?category=830565 

 

2. Docker 설치하기

온라인에서 설치할 때의 가이드입니다. 오프라인에서 설치할 때는 아래 글을 참고하세요. happycloud-lee.tistory.com/179?category=830565 docker 오프라인(offline) 설치 for centos, redhat(RHEL) centos7.x과..

happycloud-lee.tistory.com

4) kubectl 설치

kubectl은 kubernetes의 API Server에 수행을 요청하는 프로그램입니다.

OS별 설치 가이드 최신본은 아래 링크를 참조하세요.

https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/

우리는 minikube 1.25.2를 설치하니, 이 버전에 맞는 kubectl 1.23.3을 설치 합니다. 
 

ubuntu

apt 패키지 색인을 업데이트하고 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지들을 설치 합니다.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

구글 클라우드 공개 사이닝 키를 다운로드 합니다.

 

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

 

쿠버네티스 apt 리포지터리를 추가 합니다.

 

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

 

새 리포지터리의 apt 패키지 색인을 업데이트하고 kubectl을 설치 합니다.

 

sudo apt-get update
sudo apt-get install -y kubectl-1.23.3

 

 

centos, RHEL

$ 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 kubectl-1.23.3

 

5) conntrack설치

docker 1.20이상부터는 아래 명령으로 conntrack이라는걸 설치해야 합니다.

ubuntu: sudo apt-get install -y conntrack

centos: sudo yum install -y conntrack

6) docker의 cgroup driver 변경

cgroup는 container의 리소스를 관리해 주는 기능입니다.

docker의 기본 cgroup driver는 'cgroupfs'이고, kubernetes의 kubelet은 'systemd'이기 때문에, 이를 맞춰주지 않으면 k8s가 불안정하게 동작할 수 있습니다. 

자세한 내용은 아래 글을 참조하십시오. 

https://tech.kakao.com/2020/06/29/cgroup-driver/

아래와 같이 daemon.json파일에 셋팅하고, docker를 재시작합니다. 

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

docker 재시작

$ systemctl daemon-reload
$ systemctl restart docker

 

7) selinux mode변경: centos만 수행

centos에서는 SELinux(Secure Enhanced Linux)의 보안정책 위배 시 처리 방법을 변경해 줘야 합니다. 아래와 같이 enforcing, permissive, disabled가 있습니다.

아래와 같이 permissive mode로 변경합니다. 두번째 명령은 /etc/selinux/config파일을 sed명령으로 고치는 겁니다. 직접 그 파일을 열어 SELINUX의 값을 permissive로 변경해도 됩니다.

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

 

8) iptables 사용 설정

쿠버네티스에서 네트워크 모드의 하나인 iptables를 사용하도록 설정 합니다. 

[root@master ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

[root@master ~]# sysctl --system
 


9) SWAP 비활성화

쿠버네티스는 SWAP공간을 사용하지 않습니다. 아래와 같이 비활성화 하십시오. 

[root@master ~]# swapoff -a
 

 또한 리부팅 시에도 SWAP 비활성화가 되도록 /etc/fstab 파일도 수정 합니다. 

fstab파일이 열리면 커서를 ' LABEL=SWAP-xvdb1'로 옮기고 'i'를 누른 후 '#'을 앞에 붙입니다. 그리고 'ESC'키를 누른 후 ':'을 입력하고 콜론 뒤에 'wq'를 눌러 저장하고 닫으면 됩니다. 

[root@master ~]# vi /etc/fstab
UUID=2d00ecfc-6476-4e54-8066-19863783ee5a / ext4 defaults,noatime 0 0
UUID=0af0758b-9892-4acc-8037-a30111f1e4f0 /boot ext4 defaults,noatime 0 0
#LABEL=SWAP-xvdb1       swap    swap    defaults,nofail,x-systemd.device-timeout=500ms  0       0

[root@master ~]# mount -a
 


10) 네트워크 툴 설치 

[root@master ~]# dnf install -y net-tools

 

11) minikube 설치

- minikube설치: 1.25.2 설치 

minikube 최신 버전에서는 container runtime으로 docker를 사용 못하므로 이전 버전을 설치 합니다. 

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.25.2/minikube-linux-amd64 && chmod +x minikube

- minikube 실행파일 만들기

$ install ./minikube /usr/bin

- minikube 시작

실행전에 docker daemon이 실행중인지 확인합니다.

# docker version

만약, docker daemon연결이 안되면 재시작 합니다.

# systemctl stop docker

# systemctl start docker

 

아래 명령중 IP주소를 본인 VM public IP로 변경하여 실행합니다.

$ ip a

$ minikube start --vm-driver=none \
--docker-env http_proxy=http://{VM IP}:8080\
--docker-env https_proxy=http://{VM IP}:8080\
--docker-env no_proxy=localhost,127.0.0.1,::1,{VM IP}

예시)

minikube start --vm-driver=none \
--docker-env http_proxy=http://165.192.77.184:8080 \
--docker-env https_proxy=http://165.192.77.184:8080 \
--docker-env no_proxy=localhost,127.0.0.1,::1,165.192.77.184

 

12) 설치 확인

아래와 같은 메시지가 나오면 성공적으로 시작된겁니다.

😄  Centos 8.5.2111 의 minikube v1.24.0
✨  유저 환경 설정 정보에 기반하여 none 드라이버를 사용하는 중
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🤹  Running on localhost (CPUs=2, Memory=3736MB, Disk=241546MB) ...
ℹ️  OS release is CentOS Linux 8
🐳  쿠버네티스 v1.22.3 을 Docker 20.10.11 런타임으로 설치하는 중
    ▪ env http_proxy=http://192.168.56.2:8080
    ▪ env https_proxy=http://192.168.56.2:8080
    ▪ env no_proxy=localhost,127.0.0.1,::1,192.168.56.2
    > kubeadm.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubelet.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubelet: 718.80 KiB / 115.57 MiB [>_______________________] 0.61% ? p/s ?❗  This bare metal machine is having trouble accessing https://k8s.gcr.io
💡  To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
    > kubectl: 44.73 MiB / 44.73 MiB [---------------] 100.00% 3.17 MiB p/s 14s
    > kubeadm: 43.71 MiB / 43.71 MiB [---------------] 100.00% 2.41 MiB p/s 18s
    > kubelet: 115.57 MiB / 115.57 MiB [-------------] 100.00% 4.15 MiB p/s 28s
    ▪ 인증서 및 키를 생성하는 중 ...
    ▪ 컨트롤 플레인이 부팅...
    ▪ RBAC 규칙을 구성하는 중 ...
🤹  로컬 환경 변수를 구성하는 중 ...
{중략}
🔎  Kubernetes 구성 요소를 확인...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  애드온 활성화 : storage-provisioner, default-storageclass
🏄  끝났습니다! kubectl이 "minikube" 클러스터와 "default" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.

아래 'kubectl get nodes'명령을 실행 했을때, 한 node에 kubernetes가 설치된것으로 나오면 성공입니다.  

[root@osboxes ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE    VERSION
osboxes   Ready    control-plane,master   101s   v1.22.3

13) Web dashboard 시작 

Terminal이 아닌 web ui를 통해 k8s리소스를 조회하고 관리하려면 dashboard를 설치 하십시오. 

k8s web console(=Web dashboard)을 아래와 같이 시작하십시오. 

- dashboard 시작 

$ minikube dashboard --url

주소가 나오면 CTRL-C를 눌러 prompt상태로 돌아 가십시오.

* --url은 브라우저를 바로 실행하지 말라는 옵션임

- 외부 접근을 위한 k8s service 'kubernetes-dashboard' 설정 변경

- Service type을 NodePort로 변경

'minikube dashboard'를 최초 실행할때 'kubernetes-dashboard' namespace에 dashboard를 위한 deployment, service, pod가 생성됩니다.

그런데, 아래와 같이 Service 'kubernetes-dashboard'가 외부에 노출된 포트가 없어 접근할 수가 없습니다.

$ kubectl get svc -n kubernetes-dashboard

Service 'kubernetes-dashboard'를 아래와 같이 바로 수정하여 외부에 port를 오픈합니다. 그리고 type을 ClusterIP에서 NodePort로 변경하고 저장합니다.

$ kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

 

 

아래와 같이 NodePort로 바꾸고 ESC키를 누른 후 'wq'를 입력하여 저장후 닫습니다.

 

- web브라우저에서 접근

외부에 노출된 service 'kubernetes-dashboard'의 포트를 확인합니다.

$ kubectl get svc -n kubernetes-dashboard

예를 들면 위와 같이 외부에 31397포트로 오픈이 된 것을 확인할 수 있습니다.  이 포트 번호는 다를 수 있습니다.

이제 Host PC에서 브라우저를 열고 http://{VM IP}:{Service PORT}로 접근하십시오.

ex) http://169.56.76.90:31397

아래와 같이 웹콘솔이 나오면 성공입니다. 

 

14) ingress 활성화

minikube의 add on프로그램에서 ingress를 활성화 함

$ minikube addons list 
$ minikube addons enable ingress

 ingress-nginx 네임스페이스에 Pod가 정상적으로 실행되는지 확인

[root@kbbootcamp-docker test]# k get po -n ingress-nginx
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-5n4pc       0/1     Completed   0          15m
ingress-nginx-admission-patch-2zbwx        0/1     Completed   0          15m
ingress-nginx-controller-cc8496874-9bllz   1/1     Running     0          15m

 

ingress가 정상 동작하는지 테스트 하려면 아래 글 참조하세요. 

https://kubernetes.io/ko/docs/tasks/access-application-cluster/ingress-minikube/

 

NGINX 인그레스(Ingress) 컨트롤러로 Minikube에서 인그레스 설정하기

인그레스는 클러스터의 서비스에 대한 외부 액세스를 허용하는 규칙을 정의하는 API 객체이다. 인그레스 컨트롤러는 인그레스에 설정된 규칙을 이행한다. 이 페이지에서는 HTTP URI에 따라 요청을

kubernetes.io

 

15) Metric Server 활성화

리소스 사용량 모니터링을 위한 메트릭 서버를 활성화 합니다. 

$ minikube addons list 
$ minikube addons enable metrics-server

 

수 분 후에 아래 명령으로 메트릭 서버가 잘 동작하는지 확인합니다. 

[root@kbbootcamp-docker ~]# kubectl top nodes
NAME                                            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
kbbootcamp-docker.hee-soo-kim-s-account.cloud   505m         6%     2894Mi          18%       
[root@kbbootcamp-docker ~]# kubectl top po -n kube-system
NAME                                                                    CPU(cores)   MEMORY(bytes)   
coredns-64897985d-2tkkn                                                 0m           20Mi            
etcd-kbbootcamp-docker.hee-soo-kim-s-account.cloud                      0m           48Mi            
kube-apiserver-kbbootcamp-docker.hee-soo-kim-s-account.cloud            0m           246Mi           
kube-controller-manager-kbbootcamp-docker.hee-soo-kim-s-account.cloud   0m           48Mi            
kube-proxy-62hmf                                                        0m           19Mi            
kube-scheduler-kbbootcamp-docker.hee-soo-kim-s-account.cloud            0m           18Mi            
metrics-server-6b76bd68b6-qcfzt                                         0m           18Mi            
storage-provisioner                                                     0m           14Mi            
[root@kbbootcamp-docker ~]#

 

k8s 대시보드를 열어보면 리소스 사용량이 그래프로 나오는 걸 볼 수 있습니다. 

 

16) 작업 편의를 위한 추가 작업들 

- kubectl의 Alais만들기 

$ alias k=kubectl
$ k get nodes
[root@kbbootcamp-docker test]# k get nodes
NAME           STATUS   ROLES                  AGE   VERSION
bootcamp-...   Ready    control-plane,master   38m   v1.23.3

 

'.bashrc'파일에 추가하여 다음 접근 시에도 alias가 유지되도록 합니다. 

$ vi ~/.bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias k=kubectl

 

Alias를 만드는 다른 방법은 아래 글 참조

https://happycloud-lee.tistory.com/88

 

kubectl명령에 Alias부여하기

kubectl 명령은 매우 많이 사용하는데, 매번 전체 명령을 치는데 불편하게 느껴질겁니다. 줄인 명령어를 만드는 방법에는 symbolic link와 alias가 있습니다. 1) symbolic link 먼저, kubectl이 어디에 있는지

happycloud-lee.tistory.com

 

- kubens 설치 : namespace 이동을 편하게 해주는 유틸리티

https://happycloud-lee.tistory.com/95

 

kubectx, kubens

kubectx cluster 전환을 쉽게 해주는 툴-helps you switch between clusters back and forth: kubens namespace 전환을 쉽게 해주는 툴-helps you switch between Kubernetes namespaces smoothly: 아래 github들어가서 자세한 설명을 참조

happycloud-lee.tistory.com

 

참고) minikube 재시작

아래와 같이 중단 후 재시작하면 됩니다. 재시작할때는 기존 설정을 이용하기 때문에 start명령으로 시작하면 됩니다. 

[root@osboxes ~]# minikube stop
✋  Stopping node "minikube"  ...
🛑  1 node stopped.
[root@osboxes ~]# minikube start

주의) VM을 재시작했을때 자동으로 kubernetes 리소스가 올라오지 않습니다. 재시작 후에는 minikube start명령으로 다시 kubernetes리소스를 설치해야 합니다. 

주의) nfs dynamic provisioning을 했고 minikube를 재시작 후 한 경우, kube-apiserver.yaml 변경이 필요 합니다.

nfs dynamic provisioning을 한 후 /etc/kubernetes/manifests/kube-apiserver.yaml에 아래 설정을 추가해야 합니다. 

- --feature-gates=RemoveSelfLink=false

그런데, minikube를 재시작하면 kube-apiserver.yaml파일이 초기화됩니다. 

minikube를 실행한 후 다시 kube-apiserver.yaml을 열어 위 설정을 추가하십시오. 

 

참고) minikube 삭제 

설치 중 실패하였거나, 더 이상 필요 없어 삭제하는 경우는 아래와 같은 순서로 완전 삭제할 수 있습니다. 

$ minikube stop
$ minikube delete
$ rm -rf ~/.kube ~/.minikube
$ systemctl stop '*kubelet*.mount'
$ rm -rf /etc/kubernetes
$ docker system prune -af --volumes
$ rm -f /usr/bin/minikube

 

 


 

Multi-node에 k8s cluster 설치

여러개의 node에 vanilla k8s를 설치하는 가이드입니다.

https://happycloud-lee.tistory.com/35?category=832243

 

k8s Multi node에 설치하기

1. ubuntu에 설치하기 ubuntu에 kubeadm을 이용하여 kubernetes설치하기 2. centos7에 설치하기 참조: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ * 만약 외장 Di..

happycloud-lee.tistory.com

설치 후에는 아래 글을 참조하여 web dashboard도 구성하십시오.

https://happycloud-lee.tistory.com/36?category=832243

 

k8s Multi node 설치 후 web dashboard 설정

https://hiondal.blog.me/221624274450 k8s Multi node 설치 후 web dashboard 설정 web dashboard를 설치하면, CLI로 할 수 있는 대부분을 할 수 있을 뿐 아니라 디버깅을 하는데 매우 편... blog.naver.com

happycloud-lee.tistory.com

 

댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]