클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

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에 수행을 요청하는 프로그램입니다.

아래 링크의 가이드를 참조하여 설치 하세요.  

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

우리는 minikube 1.25.2를 설치하니, 이 버전에 맞는 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 변경

최신버전(Docker 1.40대 이상 인듯)에서는 아래 설정 하지 마세요. 

 

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 사용 설정: CentOS Only

쿠버네티스에서 네트워크 모드의 하나인 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) 네트워크 툴 설치 

ubuntu: sudo apt-get install -y net-tools
CentOS: sudo 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

 

아래 명령으로 minikube를 시작 합니다.  driver=none은 host에 직접 설치한다는 의미입니다.  

디폴트는 docker인데 Docker 컨테이너 안에 minikube를 실행하는 방식입니다. 

minikube start --driver=none

 

k8s in Container 형태일 때는 데이터 유실 방지를 위해 아래와 같이 마운트 하십시오. 

minikube정지 시 데이터 유실 방지를 위해 host에 마우트할 디렉토리를 생성합니다.  

그리고 아래 예와 같이 minikube를 시작합니다.  

 

예시)

minikube start --driver=none \
--mount --mount-string="/data/minikube:/mnt/data"

 

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

 

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림