아래의 포스트들은 저 혼자 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에서 구동시키기
지금까지 간단한 웹 애플리케이션 생성 후
가상머신들로 여러 서버를 구축하고
ansible로 조작을 할 수 있게까지 해놓았습니다.
이제 쿠버네티스를 설치를 하면됩니다.
그 전에 궁금한 것이 있어서 해결을 해보겠습니다.
Ansible playbook에 대한 궁금증
Become
ansible playbook을 작성할 때 become에 대한 의문이 들었습니다.
become은 각 node에 접근할 때 접근하는 유저에 대해서 권한을 확대한다 라는 뜻입니다. (root의 권한)
우리는 전에 각 node에 대해서 공개 키를 복사를 해놓았고, 일반 user에도 root의 권한을 부여해주었습니다.
그래서 become: no 라고 설정해놓아도 정상적으로 동작합니다.
만약에 become에 yes라고 해놓으면 root의 권한으로 확대를 한다는 뜻인데,
이렇게 해놓으면 오류가 나는 node가 있습니다.
그 이유가 뭐인고 하고 찾아보니
worker7의 username이 user로 되어있고, 나머지 worker-node의 username은 전부 node 로 되어있습니다.
그래서 오류가 나는 것 같아서 username별로 그룹을 또 따로 생성해주었습니다.
nodeworker = username이 node로 되어있는 그룹
userworker = username이 user로 되어있는 그룹
띄어쓰기나 특수문자를 사용하면 경고창이 떠서 저렇게 지어주었습니다.
그리고 두 개의 그룹에 대해서 똑같은 tasks를 실행을 해야하는데
중복을 피하기위해 role에 대해서 공부를 했습니다.
Role
Role 은 여러개의 연관된 Task 를 체계화 하고, 그에 쓰이는 데이터를 묶는데 좋습니다.
저희가 kubernetes를 설치를 할 때 여러 모듈을 설치하고, 여러 tasks들이 필요할텐데
그러면 playbook이 점점 늘어나기 때문에 관리가 어려운데 그것을 Role이 도와줍니다.
저는 현재 /etc/ansible 폴더에서 작업을 하고있습니다.
이 폴더에서 roles 라는 폴더를 새로 생성해주어 role에 대한 명세를 이 폴더에서 했습니다.
roles라는 이름은 ansible에서 지정해준 이름이라서 똑같이 지어야합니다.
현재 /etc/ansible 폴더에는 ansible.cfg ( ansible 구성에 관한 파일)
hosts ( hosts.ini 파일로써 host, group관리를 하는 인벤토리 입니다.)
playbook.yaml ( playbook을 명시해 둔 yaml 파일)
이렇게 존재하고, 거기에 roles 폴더를 생성해주었습니다.
ansible은 role을 playbook에 명시해주면 해당 폴더로 찾아가
main.yml 파일을 찾고 자동으로 실행을 시킵니다.
roles 폴더에 swapoff 이라는 role을 생성해주었습니다.
- tasks : playbook에 작성 했던 tasks와 동일합니다..
- handlers : linux service를 처리하기 위해 사용합니다.
- defaults : 기본 변수를 설정합니다.
- vars : 작업 수행 시 사용할 변수를 정의합니다.
- files : 각 managed 서버에 배포할 파일의 위치입니다.
- templates : managed 서버에 배포할 템플릿 파일 위치입니다.
- meta : roles에 대한 정보, 호환 버전 등 메타 데이터를 정의합니다.
각각의 폴더에 대한 설명입니다. 이것 또한 ansible에서 이렇게 구조화해놓았고
ping 테스트를 할 때에는 tasks만 필요해서 나머지는 사용하지 않았습니다. 그리고 테스트를 한번 해보았습니다.
그리고 playbook.yaml에 잘 보시면 become : yes로 해두고(root의 권한을 사용가능하게 한다)
그리고 그 become의 권한을 받을 user는 become_user로 따로따로 설정을 해주었습니다.
저희는 이미 각각의 노드에 user(worker1~6 = node, worker7 = user)들에게 root의 권한을 패스워드 없이 설정을 해주었습니다.
3편에서 su 접근 후 visudo -f /etc/sudoers 파일에 NOPASSWD:ALL 추가
그렇기 때문에 user만 저렇게 따로 명시를 해주고
ansible-playbook playbook.yaml
ansible에서 적어놓은 roles 폴더 구조처럼 사용하지 않으면 위와 같이 Swap Off Task를 수행을 안하는 것을 볼 수 있습니다.
become, become_user 관련 오류
그래서 다시 폴더 구조를 변경하고 playbook을 실행을 해보면
master node가 말을 안듣는 것을 볼 수 있는데 Not superuser 라고 뜬걸보면
root의 명령어가 먹히지 않는다는 것 같습니다.
그래서 playbook.yaml에서
userworker에서 become_user를 지워봤습니다.
왜냐하면 master node는 host이고
라고 명시되어있는데
worker7 은 root가 아닌 user에서 실행을 해야하고
master node는 root가 user입니다.
아래 사진을 보면 worker node 7과 master node 둘 다 su 로 root에 접근해서
who 명령어를 통해서 username들을 보면
worker node 7은 root와 user가 분리되어 있고, master node는 user가 곧 root이다.
그래서 위와 같이 become_user는 없을 때 기본값이 root 이기 때문에
master node에서 작동하고, worker node는 "user"라는 user로 접근해야 되기 때문에 에러가 난다.
(왜냐하면 worker node 7 에는 user에만 공개 키를 넣어놓았기 때문에)
그래서 그냥 worker node 7에 새로운 node user를 생성해서 다른 worker node와 동일하게 해주었습니다.
구분 | Host | IP | User |
마스터 노드 | |||
1(메인컴퓨터) | k8s-master | 192.168.100.41 | user(=root) |
워커 노드 | |||
2(centos7-1) | k8s-node1 | 192.168.100.55 | node |
3(centos7-2) | k8s-node2 | 192.168.100.56 | node |
4(centos7-3) | k8s-node3 | 192.168.100.54 | node |
5(centos7-4) | k8s-node4 | 192.168.100.53 | node |
6(centos7-5) | k8s-node5 | 192.168.100.57 | node |
7(centos7-6) | k8s-node6 | 192.168.100.58 | node |
8(서브컴퓨터) | k8s-node7 | 192.168.100.52 | node |
정상적으로 돌아갑니다. 이제 제대로 kubernetes를 설치할 수 있을 것 같습니다.
10. Kubespray를 이용해 kubernetes 설치하기
kubespray 설치 이전 설정
kuberspray를 설치하기 전에 필요한 것들을 설치를 해야합니다.
이건 master node들에만 해당됩니다.
sudo apt-get install wget
sudo apt-get install python3-pip
python3-pip도 설치를 해줍니다.
pip3 install netaddr
netaddr을 설치합니다.
pip3 install jinja2
jinja2
pip3 install ansible
ansible까지 설치를 해줍니다.
다음은 ip_forward를 활성화 시켜줍니다.
kubespray 설치
sudo git clone github.com/kubernetes-sigs/kubespray
을 통해서 kubespray를 clone 해줍니다.
그 다음으로는 kubespray 공식 깃허브에 나와있는데로
dependencies들을 설치해주기 위해
sudo pip3 install -r requirements.txt
커맨드를 입력해줍니다.
위에는 kubespray를 맨 처음 설치를 했을 때 설정 되어있는
sample/inventory.ini 파일입니다.
이 파일을 우리가 필요한 인벤토리 파일로 바꾸어 주어야합니다.
다음과 같이 바꿔주고
kubenetes를 설치하기 전에 각종 addon들을 설치하기 위해서 설정 파일을 바꿔주어야 합니다.
addons.yml 파일에서 바꿔주어야 하는 addon들은 아래와 같습니다.
helm repo, metrics_server, ingress_controller
기본이 false로 되어있는데 true로 바꿔줍니다.
그리고 저희는 proxy mode를 iptables 모드로 사용할 것이기 때문에
k8s-cluster.yml 파일을 바꿔줍니다.
103번째 줄입니다.
그리고 inventory에서 sample로 되어있던 것을
mycluster 라고 이름을 바꿔주었습니다.
이제 본격적인 쿠버네티스 설치입니다.
ansible-playbook을 이용하는데
/kubespray 폴더에서 진행해야 합니다.
ansible-playbook -i inventory/mycluster/inventory.ini --become cluster.yml
잘 진행이 되다가 이런 오류가 떴습니다..
해결 시도 1
나는 firewall을 전부 중지시키니까 해결이 되었어!
중지시켜보았습니다.
실패
해결 시도 2
해결이 안됨..
해결 시도 3
나는 access_ip를 없애니까 해결이 돼!
access_ip를 없애 보았지만 해결이 안되었습니다..
상태 점검 endpoint와 etcd에 대한 주소 구성간에 불일치가 있을 수 있다고 합니다..
해결 시도 4
etcd_peer_client_auth 를 false로 바꿔봐!
안됨..
해결 시도 5
retries를 늘려보자 (아마 타이밍과 관련되어 있지 않을까?..)
해결 시도 6
프록시 환경 변수를 설정해봐!!
이 마저도 실패
오류가 해결이 안되서 오류만 열심히 찾았습니다..
kubelet과 kubeadm이 예전에 minikube 사용할 때 설치가 되어있었는데
그게 충돌이 일어나는 것 같아서
내일 다시 kubelet, kubeadm을 싹 다 삭제하고 다시 kubespray를 이용해서 설치를 해보겠습니다.
참고
https://jhnyang.tistory.com/10 : 리눅스 사용자 추가 참고
https://waspro.tistory.com/558: kubespray 이용해서 kubernetes 설치
'Kubernetes & Docker' 카테고리의 다른 글
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 4편 (2) | 2020.08.05 |
---|---|
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 3편 (0) | 2020.07.31 |
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 1편 (2) | 2020.07.28 |
React와 Node.js 애플리케이션 Docker image build하기 (0) | 2020.07.24 |
Mysql Docker Image를 이용해서 React-Node.js-MySQL 애플리케이션 구현해보기 (2) | 2020.07.23 |