정현수
현수 세상
정현수
전체 방문자
오늘
어제
반응형
  • 분류 전체보기 (267)
    • NEXTSTEP 자바스크립트 클린코드 2기 (1)
    • 우테코 4기 (6)
    • 회고록 (5)
    • 개발지식 (6)
    • React (3)
      • React Clone Coding (3)
    • React Native (2)
    • Kubernetes & Docker (36)
      • 궁금한 것 (13)
    • Flutter (2)
    • 알고리즘 (168)
      • 프로그래머스 1단계 (27)
      • 프로그래머스 2단계 (37)
      • 백준 (98)
      • 이론 (6)
    • 자료구조 (3)
    • 유튜브 (1)
    • 책 읽자 (1)
    • 취업준비 (1)
    • 대내 활동 (31)
      • 2022년 겨울방학 알고리즘 특강 (0)
      • 2020년 여름방학 모각코 (13)
      • 2020년 겨울방학 모각코 (13)
      • 웹프로그래밍 상상튜터링 (5)

인기 글

최근 글

공지사항

  • 블로그 이동

태그

  • 공식문서
  • programmers
  • 알고리즘
  • replicaset
  • 쿠버네티스
  • 리액트
  • 노드
  • image run
  • NodePort
  • 이코테
  • 개발지식
  • 파이썬
  • 자바스크립트
  • 백준
  • mysql
  • 레플리카셋
  • Jenkins
  • 모각코
  • 우테코
  • docker
  • Kubernetes
  • kubelet
  • Deployment
  • image pull
  • 프로그래머스
  • javascript
  • flutter
  • 디플로이먼트
  • React
  • 그리디

최근 댓글

블로그 메뉴

  • 홈

티스토리

hELLO · Designed By 정상우.
정현수

현수 세상

Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 2편
Kubernetes & Docker

Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 2편

2020. 7. 29. 16:24
반응형

아래의 포스트들은 저 혼자 kubernetes에 대한 이해와 실습을 위해서

시행착오들을 적어놓은 포스트들입니다.

완벽하지 않고 순서가 뒤죽박죽임을 알아주시고

참고해주시면 감사하겠습니다!

 

Mysql Docker Image를 이용해서 React-Node.js-MySQL 애플리케이션 구현해보기

1. React 설치

2. Node.js 설치

3. React와 Node.js 동시 구동

4. mySQL image pull하기

5. mySQL, React, Node.js 연동하기

 

React와 Node.js 애플리케이션 Docker image build

6. React-Node.js image 생성하기

 

Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 1편 

7. 가상머신을 통해 멀티 노드 환경 구성

8. Ansible을 이용해서 Master와 Worker 연결

9. Ansible-playbook을 이용해서 한꺼번에 명령내리기

 

Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 2편 

10. Kuberspray를 이용해 kubernetes 설치하기

 

Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 3편 

10. Kuberspray를 이용해 kubernetes 설치하기(계속)

11. kubernetes 설치 성공

 

Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 4편 

12. dashboard 띄우기

13. docker image pull 받고 실행시키기

14. deployment 생성 후 pod관리

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에서 오류가 난다.

 

그 이유가 뭐인고 하고 찾아보니

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 폴더

현재 /etc/ansible 폴더에는 ansible.cfg ( ansible 구성에 관한 파일)

hosts ( hosts.ini 파일로써 host, group관리를 하는 인벤토리 입니다.)

playbook.yaml ( playbook을 명시해 둔 yaml 파일)

이렇게 존재하고, 거기에 roles 폴더를 생성해주었습니다.

 

playbook.yaml

ansible은 role을 playbook에 명시해주면 해당 폴더로 찾아가

main.yml 파일을 찾고 자동으로 실행을 시킵니다.

 

ansible roles 폴더 구조

 

위의 구조를 따라하지 않으면 어떻게 될까?

 

/roles/swapoff/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에만 공개 키를 넣어놓았기 때문에)

 

userworker 그룹에 become_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

 

 

새롭게 고쳐진 hosts.ini

 

새롭게 고쳐진 playbook.yaml
새롭게 고쳐진 hosts, playbook 가지고 실행

정상적으로 돌아갑니다. 이제 제대로 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까지 설치를 해줍니다.

 

https://waspro.tistory.com/558

다음은 ip_forward를 활성화 시켜줍니다.

 

kubespray 설치

 

 

sudo git clone github.com/kubernetes-sigs/kubespray

을 통해서 kubespray를 clone 해줍니다.

 

그 다음으로는 kubespray 공식 깃허브에 나와있는데로

 

https://github.com/kubernetes-sigs/kubespray

dependencies들을 설치해주기 위해

sudo pip3 install -r requirements.txt

커맨드를 입력해줍니다.

 

위에는 kubespray를 맨 처음 설치를 했을 때 설정 되어있는

sample/inventory.ini 파일입니다.

 

이 파일을 우리가 필요한 인벤토리 파일로 바꾸어 주어야합니다.

 

다음과 같이 바꿔주고

 

kubespray/inventory 폴더 구조

kubenetes를 설치하기 전에 각종 addon들을 설치하기 위해서 설정 파일을 바꿔주어야 합니다.

 

 

addons.yml 파일에서 바꿔주어야 하는 addon들은 아래와 같습니다. 

helm repo, metrics_server, ingress_controller

기본이 false로 되어있는데 true로 바꿔줍니다.

 

helm, metrics_server

 

ingress-controller

그리고 저희는 proxy mode를 iptables 모드로 사용할 것이기 때문에

k8s-cluster.yml 파일을 바꿔줍니다.

 

k8s-cluster.yml

 

iptables로 바꿔준다.

103번째 줄입니다.

 

 

 

그리고 inventory에서 sample로 되어있던 것을

mycluster 라고 이름을 바꿔주었습니다.

 

이제 본격적인 쿠버네티스 설치입니다.

ansible-playbook을 이용하는데

/kubespray 폴더에서 진행해야 합니다.

ansible-playbook -i inventory/mycluster/inventory.ini --become cluster.yml

 

잘 진행이 되다가 이런 오류가 떴습니다..

 

 

해결 시도 1

https://github.com/kubernetes-sigs/kubespray/issues/5550

 

나는 firewall을 전부 중지시키니까 해결이 되었어!

 

중지시켜보았습니다.

실패

 

해결 시도 2

 

https://github.com/bagbag/kubespray/commit/209eb8a5118bd61a178cd08b7d802100dfd4e32e

 

  roles/etcd/handlers/main.yml  
roles/etcd/templates/etcd-events.env.j2
  roles/etcd/templates/etcd.env.j2  

 

해결이 안됨..

 

해결 시도 3

 

https://github.com/kubernetes-sigs/kubespray/issues/5303

나는 access_ip를 없애니까 해결이 돼!

 

inventory.ini

access_ip를 없애 보았지만 해결이 안되었습니다..

 

상태 점검 endpoint와 etcd에 대한 주소 구성간에 불일치가 있을 수 있다고 합니다..

 

해결 시도 4

 

https://github.com/kubernetes-sigs/kubespray/issues/5303

etcd_peer_client_auth 를 false로 바꿔봐! 

 

/etc/ansible/kubespray/roles/etcd/defaults/main.yml

 

안됨..

 

해결 시도 5

 

https://github.com/kubernetes-sigs/kubespray/issues/5550

retries를 늘려보자 (아마 타이밍과 관련되어 있지 않을까?..)

 

/etc/ansible/kubespray/roles/etcd/tasks/configure.yml
처참한 기록

 

해결 시도 6

 

https://github.com/kubernetes-sigs/kubespray/issues/5550

 

프록시 환경 변수를 설정해봐!!

 

https://github.com/kubernetes-sigs/kubespray/issues/5550

 

sudo vi /etc/environment

 

이 마저도 실패

 


오류가 해결이 안되서 오류만 열심히 찾았습니다..

kubelet과 kubeadm이 예전에 minikube 사용할 때 설치가 되어있었는데

그게 충돌이 일어나는 것 같아서

내일 다시 kubelet, kubeadm을 싹 다 삭제하고 다시 kubespray를 이용해서 설치를 해보겠습니다.

 

 

참고

https://medium.com/@jyson88/ansible-role-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95-1793da8a452e : ansible role 참고

 

Ansible Role 사용 방법

Ansible을 처음 입문 하였을 때, playbook 만드는 거에 대해 흥미를 느낍니다. 상당히 재밌습니다.

medium.com

https://velog.io/@hanblueblue/%EB%B2%88%EC%97%AD-Ansible2-%ED%94%8C%EB%A0%88%EC%9D%B4%EB%B6%81 : ansible playbook 참고

 

[번역] Ansible(2) inventory, Playbooks, Roles

ansible 도큐먼트 해석

velog.io

https://jhnyang.tistory.com/10 : 리눅스 사용자 추가 참고

 

[리눅스 / 유닉스]사용자 관리(사용자 추가 useradd, passwd파일, 시스템계정 )

리눅스 완전 정복 : 리눅스 목차 오늘도 제 블로그를 클릭해주시고 방문해주신 방문자님들 반갑습니다. 오늘은 관리자 역할 중 빼놓을 수 없는 사용자관리에 대해서 알아보는 시간을 가질거예�

jhnyang.tistory.com

https://waspro.tistory.com/558: kubespray 이용해서 kubernetes 설치

 

Kubernetes - Kuberspray로 Kubernetes 구축하기

본 포스팅에서는 Kubespray를 사용하여 Kubernetes 설치 자동화 구성에 대해 실습해 보도록 하겠습니다. Kubernetes를 구성하기 위해서는 Native Kubernetes를 직접 다운로드 받아 구성할 수도 있지만, Kubernete

waspro.tistory.com

 

반응형

'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
    정현수
    정현수
    깃허브 : https://github.com/junghyeonsu 개인 블로그 : https://junghyeonsu.com/ (양질의 글을 올리려고 항상 노력합니다.)

    티스토리툴바