아래의 포스트들은 저 혼자 kubernetes에 대한 이해와 실습을 위해서
시행착오들을 적어놓은 포스트들입니다.
완벽하지 않고 순서가 뒤죽박죽임을 알아주시고
참고해주시면 감사하겠습니다!
Mysql Docker Image를 이용해서 React-Node.js-MySQL 애플리케이션 구현해보기
React와 Node.js 애플리케이션 Docker image build
6. React-Node.js image 생성하기
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 1편
8. Ansible을 이용해서 Master와 Worker 연결
9. Ansible-playbook을 이용해서 한꺼번에 명령내리기
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 2편
10. Kuberspray를 이용해 kubernetes 설치하기
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 3편
10. Kuberspray를 이용해 kubernetes 설치하기(계속)
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 4편
13. docker image pull 받고 실행시키기
15. Database의 Volume설정(PersistentVolume, PersistentVolumeClaim)
16. Database의 초기화 설정(configMap 사용하기)
17. 현재 파일 구조와 오브젝트들 설명과 목표 짚고 가기.
18. DB와 Web-app을 같은 Pod에서 구동시키기
앞에 4편까지 다룬 내용은 mysql, react, nodejs의 이미지를 생성(도커)하고
여러 대의 서버를 구축한 후(가상머신)
그 여러 대의 서버에 메인 컴퓨터에서 ansible로 연결한 후
kubernetes를 설치하기를 하다가 오류가 나서 오류를 해결하는 과정까지 왔습니다.
10. Kuberspray를 이용해 kubernetes 설치하기(계속)
오류 해결 시도
해결 시도 7 : minikube 삭제해보기
제 사수님께서 이것저것 보시더니
journalctl -xe
명령어로 systemd의 내역을 보시더니 kubelet에서 node "master" not found 라는 내역을 찾아내셔서
kubelet과 kubeadm이 예전에 minikube를 사용하기전에 설치를 하고 조금 사용을 했었는데
그 때 생성되어 있던 것들과 충돌이 일어나는 것 같다고 하셔서
우선은 minikube를 삭제하였습니다.
그 다음에는
kubeadm reset 명령어를 통해서 kubeadm을 초기화 시켜주고
systemctl restart kubelet 명령어를 통해서 kubelet을 다시 시동시켜 주었습니다.
그리고 경건한 마음으로 다시
ansible-playbook -i /inventory/mycluster/inventory.ini -b cluster.yml를 실행시켜주었습니다.
원래 있던 오류는 해결되었는데
새로 오류가 생겼습니다..
이거는 안되겠다 싶어서
# docker 초기화 $ docker rm -f `docker ps -aq` $ docker volume rm `docker volume ls -q` $ umount /var/lib/docker/volumes $ rm -rf /var/lib/docker/
$ systemctl restart docker
# k8s 초기화 $ kubeadm reset $ systemctl restart kublet
# iptables에 있는 데이터를 청소하기 위해 $ reboot |
그냥 위와 같은 명령어로 도커와 k8s를 초기화시켜주었습니다.
(mysql을 그냥 image pull 받으면되고, react-nodejs는 새로 build를 해주면 됩니다.)
해결 시도 8 : Gen_certs | Gather node certs 오류
그러고 다시 실행해보았더니
이번에도 진전이 조금 있었지만
오류가 났습니다.
no_log를 false로 바꾸고 다시 진행을 해보았습니다.
그래도 안되서.. python 버전이 달라서 그런가해서 node들에 python3.8.2 버전을 새로 설치 해주었습니다.
위의 모든 명령어들을 서버에 하나하나 입력하지말고
ansible을 이용하시면 됩니다.
ansible <그룹> -i <인벤토리 파일 위치> -m shell -a "<쉘 명령어>" -b
예를들어 ansible kube-node -i inventory.ini -m shell -a "python --version" -b
이라는 명령어는 ansible로 kube-node 그룹에게 명령을 내릴건데 kube-node 그룹에 대한 정보는
inventory.ini 파일에 있고 shell 모듈을 통해서 "python --version" 이라는 쉘 명령어를
-b(become) root의 권한으로 실행을 한다 라는 뜻이 됩니다.
그런데 python3.8 버전을 다운 받으니까
또 안된다해서.. 싹 다 갈아엎어야 할 것 같습니다.
그래서 virtual box를 아예 새로 설치를 했습니다 눈물을 머금고..
그리고 다시 설치를 한 결과
해결 시도 9 : Kubeadm | Create kubeadm config 오류 1
master node의 permission deined 인 것 같은데
/etc/ansible/kubespray/inventory/mycluster 폴더에 credentials 이라는 폴더를 만들지 못한다.
라는뜻 같습니다.
그래서 제가 직접 만들어 주었습니다.
해결 시도 10 : Kubeadm | Create kubeadm config 오류 2
그랬더니 똑같은 tasks에 다른 문제가 생겼는데 이건 뭐인고 보니
또 똑같은 permission denied 문제입니다.
해주었는데도 동일한 문제가 생겨나길래 kubeadm을
다시 reset시켜주고 실행해보았습니다.
해결 시도 11 : kubeadm | Initialize first master 오류
다음에는 Initialize first master 문제가 일어나길래
firewall관련 오류들이 떠있어서 모든 firewall 포트를 없앴습니다.
그런데 아까전에도 firewall 은 실행은 안되고있었는데.. 우선은 삭제를 해보고 재시작해보았습니다.
해결 시도 12 : Create Kubeadm token 오류
그랬더니 이번엔 kubeadm token 문제가 생겼습니다.
찾아보니 reset.yml 파일을 실행시키고 다시 cluster.yml 파일을 실행시켜보래서
그렇게 해봤습니다.
근데 문제가 처음으로 돌아가서.. 실패해서 겨우 다시 돌아왔습니다.
무언가 config와 문제가 있는것 같습니다.
토큰문제에 대한 해답으로
위와 같은 해결방법이 있다고 나와있지만
저는 해결이 되지 않았습니다. (똑같은 오류가 뜸)
7월 31일 오류 일지
kubelet, kubeadm 초기화 -> 안됨 -> python version 문제 발생 -> worker에 python3 설치 ->
worker에는 python2가 있어야함 -> VB 재설치 -> master의 python3 interpreter 문제 ->
tasks 파일에 직접 interpreter 설정으로 해결 -> /etc/ansible/kubespray/inventory/mycluster 폴더에
permission denied 문제 -> 직접 폴더를 만듦으로써 문제 해결 -> kubeadm 권한 문제 > 폴더에 권한을 777로 주면서 해결 ->
Initialize first master 문제 -> 해결 -> Check if apiserver.crt contains all needed SANs 문제 발생.. -> reset.yml 실행 후
다시 cluster.yml 실행 -> 문제가 처음으로 돌아가서 예전에 있던 문제가 생김 -> 겨우 다시 돌리고 다시 찾는중
8월 3일 오류 일지
kubespray 자체 삭제 후 다시 시도 -> git proxy error -> https 가 아닌 git:// 을 통해서 clone ->
워커노드들의 python interpreter 에러 발생 ->
8월 4일 오류 일지와 처음부터..
kubespray를 사용하지 않고 kubernetes를 설치하기 시도 ->
kubeadm init 시 많이 일어나는 오류인 kubelet-check 문제 발생 ->
방화벽 문제? (firewalld, shelinux 등) 혹은 메모리 스왑문제 -> 그래도 계속 같은 문제 발생
kubelet container runtime network not ready 문제 ->
main 컴퓨터에 너무 많은 설정들과, 수많은 실패로 인해서 프로그램들이 충돌이 일어날 수 있다고 생각을 했습니다.
그래서 아예 백지 상태로 돌아가서 처음부터 시작해보자! 해서
main 가상 머신을 하나 더 생성을 한 다음 거기에 새롭게 설치를 해주었습니다.
새로운 master node 설정 해주기
master node 환경설정
yum install -y python3, python3-pip
마스터 노드에 python3와 python3-pip를 설치함으로써
kubespray로 kubernetes를 설치를 할 수 있게 환경설정을 해줍니다.
master node 공개 key 생성
ssh-keygen -t rsa
마스터노드에서 워커노드로의 통신을 위해 (명령을 내릴 수 있게 하기 위해)
공개키를 생성한 다음 워커노드들로 공개키를 복사를 합니다.
master node에서 worker node로 공개키 복사
ssh-copy-id root@ip
ssh-copy-id node@192.168.100.61 ~ 67 까지 key copy 를 해주어서
마스터 노드에서 워커노드로 명령을 내릴 수 있게 해줍니다.
master에도 ssh-copy-id 작업을 해주어야합니다.
kubespray git clone
yum install git 을 통해서 git을 다운받고 kubespray를 clone해줍니다.
git_repo 라는 폴더를 생성해주고 거기에 clone해주었습니다.
sudo git clone https://github.com/kubernetes-sigs/kubespray
cd kubespray
필요한 package 설치
clone 한 폴더로 들어가 준 다음에
sudo pip3 install -r requirements.txt
위 명령어로 필요한 package 목록들을 설치해줍니다.
playbook 실행 전 환경설정
- /proc/sys/net/ipv4/ip_forward 활성화 (Master Node & Worker Node)
echo > 1 /proc/sys/net/ipv4/ip_forward enable
- firewalld 중지 및 disable (Master Node & Worker Node)
systemctl stop firewalld && systemctl disable firewall
inventory.ini 파일 정의
- kubespray/inventory/sample/inventory.ini 파일 정의
addons.yml 파일 수정
- kubespray/inventory/sample/group_vars/k8s-cluster/addons.yml 파일
helm repo, metrics_server, ingress_controller true로 바꿔주기
cluster.yml 파일 수정
- kubespray/inventory/sample/group_vars/k8s-cluster/cluster.yml 파일
ipvs => iptables 로 바꿔주기
ansible-playbook 실행
- kubespray 폴더(cluster.yml 파일이 존재하는 곳)
ansible-playbook --flush-cashe -K -b -i inventory/sample/inventory.ini cluster.yml -v 실행
새로운 오류들
해결 시도 13 : root 권한 오류
각 노드에 su 입력 후 root로 접속하고
visudo -f /etc/sudoers 에서 master ALL=(ALL) NOPASSWD:ALL 추가해주기
해결 시도 14 : 인벤토리에 ansible_user 이름 추가해주기
(특정 user이름으로 실행을 시키고 싶다면 정의를 해주어야합니다. 혹은 playbook 실행할 때 적어주어야 합니다.)
해결 시도 15 : Create kubeadm config 오류
permission denied 문제.
root 권한으로 credentials 폴더를 생성하고, chmod 777로 폴더에 권한을 풀어주었더니 해결되었습니다.
위에 적힌 경로에 생성을 해주었습니다. (저는 /etc/git_repo/kubespray/inventory/sample/credentials에 생성)
해결 시도 16 : Join to cluster with ignores 오류
node 4,5,6,7에서 오류가 났습니다.
4,5,6,7은 오류가 나고, 1,2,3은 오류가 안났는데
그 뒤로는 4,5,6,7은 아예 배제되었고, 1,2,3에서만 설치가 되어서 끝까지 진행이 되었습니다.
해결 방안 1
firewall이 워커노드들이 안꺼져있는 상태였습니다.
그리고 끄고 다시 시도해보았습니다.
- 방화벽 해제
systemctl stop firewalld
- 리부팅시 방화벽 실행 하지 않게 하기
systemctl disable firewalld
이 명령어들을 ansible로 실행을 해주었습니다. (여러 대에 한꺼번에)
(해결안됨)
해결 방안 2
그러고도 똑같아서 방식을 바꿔봤습니다.
그리고 권한문제가 계속 일어나는 것 같아서 전부 root로 실행을 시키기로 했습니다.
그래서 master node에서 key를 새로 생성해주고, worker node의 root로 key를 다시 copy 해주었습니다.
ansible-playbook -K -i inventory/sample/inventory.ini --become --become-user=root --flush-cache cluster.yml -v
(해결안됨)
해결 방안3
node1,2,3은 정상설치가 되었고, node4,5,6,7은 설치가 안되어서 차이점을 보니
kubelet.conf가 없는 것을 볼 수 있습니다.
kubelet에 문제가 있다는 것을 알 수 있었습니다.
그 다음에는 reset.yml 파일을 이용해서 playbook 실행을 한 다음에 확인을 해보았습니다.
둘 다 폴더가 없다고 뜹니다. 그럼 playbook을 실행할 때 무언가 문제가 된다는 것인데
인터넷에 똑같은 오류를 겪은 사람이 해결한 방법을 보니
[all:vars]
kubelet_cgroup_driver="systemd"
를 inventory.ini 파일에 추가해주면 해결이 되었다고 합니다.
그래서 저도 추가를 해주었습니다.
그리고 다시 실행한 결과
master에 kubeadm | Initialize first master오류가 떠서
[all:vars] => [kube-node:vars] 로 바꾼 다음 다시 실행을 했습니다.
(master에는 적용을 시키지 않고, kube-node에만 적용을 시켰습니다.)
그랬더니 나머지 node들도 전부 안되길래 다시 돌렸습니다.
(reset.yml파일을 통해서)
(결국 해결안됨)
11. kubernetes 설치 성공
다음날 출근해서 그냥 바로 설치를 시도했는데
성공했습니다...
어제 firewall 방화벽 설정이나 이것저것 설정을 해준 다음 재부팅을 안해줘서 그런 것 같습니다.
왜 node1,2,3과 node4,5,6,7을 똑같이 설정해주었는데 node1,2,3은 되고 나머지는 안됐던 것 보면
어떤 설정이 달라졌던 것 같습니다. 그래도 설치가 되어서 다행이네요
총 8개의 node가 돌아가고있고, 마스터는 하나, 워커노드는 7개가 돌아가고 있습니다.
각종 서비스 시스템들이 돌아가고 있습니다.
참고
https://nirsa.tistory.com/112 : python3.8 설치 가이드
https://github.com/kubernetes-sigs/kubespray/issues/4606
https://github.com/kubernetes/kubeadm/issues/1447#issuecomment-490494999
https://waspro.tistory.com/562
'Kubernetes & Docker' 카테고리의 다른 글
[O'REILLY] 쿠버네티스 패턴 (Kuerbernetes Patterns) (0) | 2020.08.10 |
---|---|
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 4편 (2) | 2020.08.05 |
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 2편 (0) | 2020.07.29 |
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 1편 (2) | 2020.07.28 |
React와 Node.js 애플리케이션 Docker image build하기 (0) | 2020.07.24 |