티스토리 뷰
minikube설치하기
1 node에 k8s cluster를 설치하는 가이드입니다.
1) VM 준비하기
VM은 cloud에서 구매하거나 PC에 Oracle Virtulbox를 이용해서 만들 수 있습니다.
아래는 IBM cloud에서 VM을 생성하는 방법입니다.
https://happycloud-lee.tistory.com/239
아래는 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
4) kubectl 설치
kubectl은 kubernetes의 API Server에 수행을 요청하는 프로그램입니다.
아래 링크의 가이드를 참조하여 설치 하세요.
https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/
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/
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
- kubens 설치 : namespace 이동을 편하게 해주는 유틸리티
https://happycloud-lee.tistory.com/95
참고) 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
설치 후에는 아래 글을 참조하여 web dashboard도 구성하십시오.
https://happycloud-lee.tistory.com/36?category=832243
'Cloud > Kubernetes' 카테고리의 다른 글
4. K8s Resources > Pod 배포 Controller: Deployment, DaemonSet, Job, CronJob, StatefulSet (0) | 2019.09.12 |
---|---|
4. K8s Resources > 데이터 저장공간(Storage): Volume (0) | 2019.09.12 |
4. Kubernetes Resource 이해 > 개요 (0) | 2019.09.12 |
3. Getting Started (0) | 2019.09.12 |
1. What is Kubernetes ? (0) | 2019.09.12 |
- Total
- Today
- Yesterday
- 요즘남편 없던아빠
- 스포티파이
- 애자일
- 육각형인간
- API Composition
- 마이크로서비스 패턴
- 디토소비
- Event Sourcing
- 분초사회
- CQRS
- 마이크로서비스
- micro service
- 리퀴드폴리탄
- 스핀프로젝트
- spotify
- 돌봄경제
- AXON
- 도파밍
- agile
- 호모프롬프트
- 버라이어티가격
- SAGA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |