Server / Client
레거시 시스템 - 물리적인 시스템에 운영체제+어플리케이션 구성
가상 머신 - 물리적인 시스템 + 하이퍼바이저 + 가상머신(운영체제+어플리케이션)
컨테이너 - 물리적인 시스템 + 컨테이너 런타임 + 컨테이너(어플리케이션)
플랫폼 - 서비스를 제공하기 위해 구성하는 시스템 환경
DevOps = 개발자 + 운영자 + 관리자
개발자 - 어플리케이션을 개발
운영자 - 플랫폼을 구성/관리
관리자 - 인프라(물리적인 구성) 환경을 구성/관리
On-premise : 물리적인 시스템에 구성하는 방식
Cloud : 가상화 기술을 바탕으로 해서 사용자의 요청에 따라 서비스를 제공하는 환경
Kubernetes: 플랫폼(서버(서비스를 제공함)를 구성할 환경)을 관리해주는 도구
어플리케이션 방식
모놀로식 아키텍쳐 - 통째로 하나의 어플레케이션으로 구성
( 장점: 구성이 간단 , 단점: 업데이트 문제)
마이크로 서비스 아키텍처 - 기능 별로 분리한 어플리케이션 구성 (장점: 특정 컴포넌트 별 관리/ 업데이트 가능, 단점: 개발이 어려울 수 있다.)
설치 도구 - minikube , kops , kubeadm , kubespray
minikube : 간단한 텍스트 환경 구성에 사용
kops : 클라우드 환경에서 쿠버네티스 구성 시 사용하는 도구
kubeadm : 쿠버네티스 설치(배포)에 사용하는 명령어 도구
kubespray : kubeadm 과 ansible 을 이용한 배포도구
-> 물리적인 시스템 / 가상머신 / 클라우드
vagrant - 특정 하이퍼 기반의 가상머신 배포를 자동화해주는 도구
kubespray 배포 시 사전 설정
ansible 실행
-> ansible.cfg / inventory / playbook
전 게시물에서 다루었던 vagrantfile 에서 생성된 Controll-plane 과 node 를 ansible을 사용해 Kubespray를 수행해보겠습니다.
먼저, vagrant up 명령어를 통해 controll-plane 과 node를 생성합니다.
vagrant up
controll-plane 과 node를 생성했으므로 이제
vagrant ssh controll-plane
명령을 통해 접속하고,
sudo vim /etc/hosts
controll-plane에서 node1,2,3 에 최초 인증 후 비밀번호 없이 접속하기 위해 관리자 권한으로
/etc/hosts 파일을 다음과 같이 수정합니다.
ssh-copy-id localhost
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
위 명령을 차례대로 실행합니다. ssh 키를 node1,2,3 과 localhost에 복사하는 과정입니다.
sudo apt update
sudo apt upgrade -y
sudo apt install python3 python3-pip git -y
위 명령어로 apt를 업그레이트 하고, 파이썬을 설치합니다.
git clone --single-branch --branch release-2.14 https://github.com/kubernetes-sigs/kubespray.git
위 명령을 통해 github에 있는 kubespray 를 branch 명령을 통해 현재 접속되어있는 서버로 복사하는 것입니다.
설치가 다 되면 /kubespray 디렉토리가 생성되었을 것입니다. 다음과 같이 requirements.txt에는 필요한 패키지들이 있고,
sudo pip3 install -r requirements.txt
위 명령을 통해 설치합니다.
kubespray안에 있는 inventory/sample/가 손상될 수 있는 위험을 피하기 위해 다음과 같이 복사하여 디렉토리를 만듭니다.
vim inventory/mycluster/inventory.ini
복사해놓은 디렉터리에 있는 inventory.ini 를 수정합니다.
ip에는 우리가 vagrantfile 에서 할당했던 controll-plane과 node1,2,3의 ip를 적어주면 됩니다.
# ## Configure 'ip' variable to bind kubernetes services on a
# ## different ip than the default iface
# ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.
[all]
node1 ansible_host= ip=
node2 ansible_host= ip=
node3 ansible_host= ip=
controll-plane ansible_host= ip=
# node5 ansible_host= # ip= etcd_member_name=etcd5
# node6 ansible_host= # ip= etcd_member_name=etcd6
# ## configure a bastion host if your nodes are not directly reachable
# bastion ansible_host=x.x.x.x ansible_user=some_user
[all:vars]
ansible_python_interpreter=/usr/bin/python3
[kube-master]
controll-plane
# node1
# node2
[etcd]
controll-plane
# node1
# node2
# node3
[kube-node]
node1
node2
node3
# node5
# node6
[calico-rr]
[k8s-cluster:children]
kube-master
kube-node
calico-rr
다음은 addons.yml을 수정해보겠습니다.
vim inventory/mycluster/group_vars/k8s-cluster/addons.yml
항목에 해당하는 부분을 아래처럼 바꾸어줍니다. 주석이 있는부분은 주석만 풀어줍니다.
metrics_server_enabled: true
ingress_nginx_enabled: true
metallb_enabled: true
metalib_speaker_enabled: true # 윗 줄 밑에 추가
metallb_ip_range:
- "xxx.xxx.xx.50-xxx.xxx.xx.99" # x표시 ip는 위에 node ip의 앞부분을 적습니다.
metallb_protocol: "layer2"
다음은 k8s-cluster.yml를 수정하겠습니다.
vim inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
kube_proxy_strict_arp: true
vagrant halt node1
vagrant halt node2
vagrant halt node3
를 통해 node1,2,3을 재부팅 하고
ansible-playbook -i inventory/mycluster/inventory.ini -v -b cluster.yml
명령을 통해 플레이북을 실행시켜 마무리합니다.
수정한 파일
inventory/mycluster/inventory.ini
inventory/mycluster/group_vars/k8s-cluster/addons.yml
inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml