아래의 포스트들은 저 혼자 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에서 구동시키기
1,2편까지는 React, Node.js, mySQL을 도커 이미지로 빌드한 다음 컨테이너에서 할 수 있도록 하였고,
이제는 쿠버네티스 환경을 구축해야 합니다.
7. 가상머신을 통해 멀티 노드 환경 구성
우선 전체적인 구조는 다음과 같이
메인컴퓨터가 마스터 노드가 되고,
메인컴퓨터에 Virtual Box를 3개 설치해서 워커 노드를 구성
그리고 서브 컴퓨터에 Virtual Box를 4개 설치해서 워커 노드를 구성했습니다.
마스터 노드에서 모든 Virtual Box로 네트워크 통신이 가능하도록 해주어야 하고
메인 컴퓨터에서 Ansible을 통해서 한번의 명령어로 모든 노드에 쿠버네티스가 동시에 설치되도록 해주어야 합니다.
다음과 같이 메인 컴퓨터의 Virtual Box에는 워커 노드를 구성해 줄 3개의 컴퓨터가 설치되어 있습니다.
OS는 전부 centOS로 동일하게 진행하였습니다.
네트워크는 모든 가상머신에 브릿지 네트워크를 적용시켜주었습니다.
저희 회사는 공유기를 통해서 네트워크를 사용하기 때문에 브릿지 네트워크를 적용시킬 수 있었습니다.
다음과 같이 설정을 해주었고
메인 컴퓨터의 ip 주소는 192.168.100.41을 가지고 있고 서브 컴퓨터의 ip주소는 192.168.100.52을 가지고 있습니다.
그래서 전체적인 IP와 Host명, User명을 나열해 보았습니다.
구분 | Host | IP | User |
마스터 노드 | |||
1(메인컴퓨터) | k8s-master | 192.168.100.41 | user |
워커 노드 | |||
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 | user |
192.168.100.56 (워커 노드 2)에서
8.8.8.8(구글 DNS IP 주소) = 외부로의 연결
192.168.100.53 (워커 노드 4) = 다른 컴퓨터에서의 가상머신으로의 연결
192.168.100.52 (서브 컴퓨터) = 다른 컴퓨터로의 연결
192.168.100.41 (메인 컴퓨터) = 호스트와의 연결
전부 잘 작동하는 것을 알 수 있습니다.
이렇게 쿠버네티스 멀티 노드 구성을 위한 환경 설정이 끝났습니다.
이제 본격적으로 Ansible을 이용해서 쿠버네티스를 일괄적으로 설치하는 것을 해보겠습니다.
8. Ansible을 이용해서 Master와 Worker 연결
/etc/hosts
ssh-copy-id user명@IP
로 ssh key를 복사해서 마스터 노드에서 접근가능하게 설정을 해주어야 합니다.
그리고 ssh user@IP 로 접근이 가능합니다.
전부 위 그림과 같이 password를 입력을 안해도 접속이
가능하게 해야합니다.
sudo apt-get install ansible
로 ansible을 설치해줍니다.
ansible이 전부 설치되었으면
ansible --version
으로 정상적으로 설치가 되었는지 확인합니다.
/etc/ansible/hosts 파일에서
[all] 그룹과 [master] , [worker] 그룹을 생성 해 주었습니다.
그리고 ip주소를 적어주고, user의 이름도 적어줍니다.
저는 가상머신에서는 node 라는 이름의 user를 사용하였고
가상머신이 아닌 호스트에는 user의 이름을 그대로 사용하였습니다.
SSH KEY 관련 에러
host의 hostname을 바꾸고나서 작동을 시키려니 작동이 안되는 오류가 있었습니다.
그래서 ssh key를 다시 주고나서 해결이 되었습니다.
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub user@IP
명령어로 SSH KEY를 새로 할당을 해주었습니다.
저는 예전에 만들어놓은 id_rsa.pub 이라는 공개키를 만들어놓았기 때문에
-i 옵션을 통해서 직접 명시를 해주었습니다.
이렇게 나오던 오류들이
공개키를 다시 주고나니
asnible kube-worker -m ping
정상적으로 작동하는 것을 볼 수 있습니다.
보통 Permission Denied 오류는 권한과 관계가 많습니다.
그래서 /home/user/.ssh 폴더를 chmod 700으로 권한을 설정해주면 해결되는 경우가 다반사였습니다.
9. Ansible-playbook을 이용해서 한꺼번에 명령내리기
간단한 playbook.yaml 파일
ping 테스트를 하는 yaml파일입니다.
sshpass 관련 오류
이 오류가 뭐인고 하니
sshpass라는 프로그램을 host에 깔아야 한답니다. 그래서 설치를 해주었습니다.
설치 명령어는
apt-get install sshpass
입니다.
설치 후
정상적으로 잘 동작합니다.
sudo 권한 관련 오류
하지만 다음과 같이 sudo 의 권한이 필요한 명령어들은 권한 에러가 났습니다.
kubernetes를 설치하고 잘 작동되게 하려면 각 머신에서의 swap 메모리를 꺼주어야 합니다.
그래서 일일이 8대의 PC에 커맨드로 명령을 내리기 보다는
조금 더 깔끔하게 ansible로 명령을 내려서 한꺼번에 swapoff를 하는 것을 해보고 싶었습니다.
저희는 swapoff를 해야하는데
host에서 가상머신으로 접속을 하고 sudo 관련 명령어를 입력하려면
password 입력을 하지 않아도 sudo 명령어를 사용할 수 있게 해주어야합니다.
지금은 swapoff전 이라서 swap 메모리가 할당이 되어있는 것을 볼 수 있습니다.
swapoff를 적용하려는데 오류가 또 났습니다.
찾아보니 /etc/sudoers에 sudo 커맨드를 사용할 때
password를 요구하지않게 설정을 해주어야하는데
그 설정이 안되어있어서 오류가 나는 것으로 확인했습니다.
그래서 모든 가상머신의 설정을 ansible로 한꺼번에 할 수 없나? 라고 생각을 해보았는데
이 설정 자체가 sudo의 접근을 필요로해서 이 설정은 일일이 해주어야 하는 것 같습니다..
우선 각각의 node에 ssh로 접근해서
su
명령어를 통해서 root에 접근을 합니다.
그리고
visudo /etc/sudoers
sudoers 파일에 접근해서 수정을 해주어야합니다.
root밑에 적어도되고 아무곳이나 적어도 됩니다.
node(user명) ALL=(ALL) NOPASSWD:ALL
이것이 의미하는 것은 "node" 라는 user에게는 root의 권한이 필요할 때 패스워드를 요구하지 않는다.
라는 뜻이 됩니다.
모든 노드의 유저에 권한을 부여하고나서
ansible-playbook playbook.yaml -k -K
를 통해서 playbook을 실행시키면 전부 swapoff가 적용이 되었고
ansible all -m shell -a 'free -m'
메모리를 전부 확인해보면
Swap 메모리는 전부 할당이 안되어 있는 것을 볼 수 있습니다.
---
- hosts: worker
become: true
tasks:
- name: Disable swap
command: swapoff -a
when: ansible_swaptotal_mb > 0
사용했던 playbook.yaml 파일입니다.
이렇게 ansible을 이용해서 kubernetes를 한꺼번에 설치할 수 있는 여건이 충족 되었습니다.
다음에는 실제로 kubernetes를 설치를 해보겠습니다.
참고
https://cjwoov.tistory.com/11 : virtual box 네트워크 상세 분석
https://ossian.tistory.com/77 : Ansible 설치
https://freecatz.tistory.com/386 : ansible playbook sudo 명령어에 관하여
'Kubernetes & Docker' 카테고리의 다른 글
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 3편 (0) | 2020.07.31 |
---|---|
Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 2편 (0) | 2020.07.29 |
React와 Node.js 애플리케이션 Docker image build하기 (0) | 2020.07.24 |
Mysql Docker Image를 이용해서 React-Node.js-MySQL 애플리케이션 구현해보기 (2) | 2020.07.23 |
쿠버네티스 공식문서 파헤치기 : 레플리카셋(ReplicaSet) (0) | 2020.07.16 |