TACO All-In-One 설치

2018, Jan 31    

TACO All-In-One 설치

by 김시리 (siri.kim@sk.com)

Update on 2019.07.30 새로운 블로그로 이전하였습니다

이 블로그의 내용은 현재 버전 (2019.7.30)과 차이가 있습니다. 최신 설치 가이드를 보실 분은 다음 링크를 참조하시기 바랍니다.

Introduction

Sk Telecom Virtualization Software Lab에서 기술블로그를 시작합니다. 첫번째 주제로 TACO All-In-One 설치에 대해서 설명 드리겠습니다.

TACO란

TACO v2.0은 SK텔레콤 SW기술원 Virtualization Software Lab에서 개발한 최신의 OpenStack기반 클라우드 인프라 플랫폼입니다. OpenStack을 컨테이너화 하여 Kubernetes 상에 설치함으로써 기존의 OpenStack이 가진 복잡성을 탈피하고자 하였습니다. OpenStack Ocata 버전을 기반으로 하여 설정이나 소프트웨어상의 변경에 대한 자동 테스트 (기능 및 HA 안정성 테스트 자동화) 및 자동 패키징 기능을 통해 안정적인 OpenStack 패키지를 제공합니다. 또한 Kubernetes 를 통해 Simple Installation, 서비스무중단 업데이트/업그레이드, 장애 자동복구 (Self-Healing), 높은 가용성 보장, 모니터링 등의 OpenStack Control Plane 라이프사이클 관리 기능도 제공합니다.

배경/동기

“나는 OpenStack에 대해서 잘 모르지만, OpenStack을 한 번 설치해서 사용하고 싶다.”라고 생각하는 사람들에게 devstack이 있다면,
“나는 TACO는 잘 모르지만, TACO라는 것을 한 번 설치해서 사용해보고 싶다.”라고 생각하는 사람들을 위해 TACO AIO 설치 스크립트를 제공합니다.

복잡한 과정없이 CentOS나 Ubuntu 가상머신만 있다면 github에서 소스를 다운로드하여 순서대로 따라하면 VM을 만들 수 있는 환경을 설치하고 동작을 확인해 볼 수 있도록 만들어졌습니다.

사용되는 Open Source Software Project

TACO는 OpenStack을 포함한 다양한 오픈소스 소프트웨어 커뮤니티 버전의 소스코드를 기반으로 만들어졌습니다. 기본적으로 Kubespray를 통해 Kubernetes를 배포 및 설치하고 Armada를 통해 Openstack-Helm 프로젝트에 있는 OpenStack chart를 Kubernetes 위에 배포합니다.

OpenStack

IaaS 형태의 클라우드 컴퓨팅 오픈 소스 프로젝트로, 데이터센터의 인프라인 compute, storage, network 리소스들을 제공하고 제어하는 클라우드 오퍼레이팅 시스템입니다.

OpenStack

Openstack-Helm

Openstack-Helm은 OpenStack의 컨테이너 이미지들을 Helm을 사용하여 Kubernetes상에 구축하고, Self-Healing, Upgrade, 확장등의 라이프 사이클 관리를 할 수 있도록 하는 프로젝트입니다. Openstack-Helm을 통해 사용자나 운영자들은 서로 다른 다양한 환경들에 OpenStack을 구축, 업그레이드, 확장등의 관리를 손쉽게 할 수 있습니다. 2017년 4월에 OpenStack의 정식 프로젝트가 되었고 저희 랩에서도 많은 코드 기여와 참여를 하고 있습니다.

Openstack-Helm은 OpenStack 구축에 필요한 인프라인 mariadb, memcached, rabbitmq, Kubernetes에 필요한 etcd, 또 OpenStack의 project인 keystone, glance, nova, neutron, cinder 외의 여러가지 서비스 및 프로젝트를 Kubernetes 위에 구축할 수 있는 helm chart를 제공합니다.

OpeneStack-Helm

Kubernetes with Kubespray

Kubernetes

Kubernetes는 docker-swarm, marathon과 유사하게 컨테이너를 배포/관리하는 오픈 소스 container orchestration 플랫폼으로서, 클러스터링 된 호스트들에 애플리케이션 컨테이너의 배포, 확장 및 운영을 자동화하며, 멀티 테넌트(Multi-tenant)인프라를 제공합니다. Kubernetes는 서버 수준에서의 컴퓨팅, 네트워크 및 스토리지 인프라에 대한 부담을 줄이고 애플리케이션 운영자와 개발자가 서비스 운영을 위해 전적으로 container-centric에 초점을 맞출 수 있도록 하는 것을 목표로 합니다.

기존에 container를 사용하던 host 머신 한 대로 구성된 환경이라면, docker run 이나 docker-compose 등으로 container 를 실행해도 아무런 문제가 없지만, 사용자가 많아지면서 하나의 host 에서 모든 container 를 실행할 수 없는 경우가 생겨납니다. 여러 대의 host에 container를 실행하기 위해서는 inter-host container 네트워킹과 host machine 의 리소스에 따른 container 분배 등을 고려해야 합니다. 이를 위해 container orchestration 툴들이 개발되는데, 이 중 하나가 Kubernetes 입니다.

Kubernetes

대표적으로 Kubernetes가 하는 일은

  • 여러 host를 묶어 클러스터를 구성하고
  • container 를 적절한 위치에 배포하고 (auto-placement)
  • container 가 죽으면 자동으로 복구하며 (auto-restart)
  • 필요에 따라 container 를 매끄럽게 추가(scaling), 복제(replication), 업데이트(rolling update), 롤백(rollback)을 할 수 있습니다.

Kubespray

Kubespray는 Ansible 을 사용한 Kubernetes 설치 자동화 도구 입니다. 원격 머신이나 설치 대상노드가 되는 머신에서 배포가 가능하고 Kubernetes가 이미 설치되어 있는 경우에 설치를 수행하면 변동된 사항에 대해서만 업데이트를 실행합니다.

Kubernetes Master Node(etcd, kube-apiserver) 의 High Available(HA) 구성을 할 수 있도록 지원하고 리눅스 대부분 버전(CoreOS, Debian, Ubuntu, Fedora 및 CentOS / RHEL)에서의 설치가 가능합니다. 또한, AWS, GCE, Azure, OpenStack, Baremetal 에서 배포할 수 있습니다.

Helm

Helm는 Kubernetes 애플리케이션을 관리하는 도구로서, Kubernetes 애플리케이션을 정의, 설치 및 업그레이드 할 수 있는 chart를 만들고 관리하는 패키지 매니저입니다.

Armada

여러 개의 helm 차트를 배포하고 관리하기 위한 툴로, 하나의 Armada yaml 파일로 여러 차트와 관련된 설정들을 관리하며 모든 helm release를 위한 라이프 사이클 훅을 제공합니다. chart 작성 표준에 맞춰서 chart를 작성한 후 repository에 넣어서 관리하고 Kubernetes에 배포할 수 있습니다.

Armada는 서버와 클라이언트로 이루어져 있으며, 보통 Armada를 사용한다는 것은 Armada client를 사용하는 것을 의미합니다. Armada client를 이용하기 위해서는 먼저 python3가 필요합니다. Armada client는 grpc를 이용하여 tiller와 통신하며 이를 통해 helm과 관련된 기능을 수행합니다.

TACO AIO Step by Step 설치 가이드

참고 링크: https://github.com/sktelecom-oslab/taco-scripts

설치 전 준비사항

TACO설치를 위해 물리 서버나 VM이 필요합니다. 원활한 작동을 위해 최소한 아래의 요구사항으로 구성하는 것이 좋습니다.

  • OpenStack 설치: 4 CPU / 16G MEMORY / 100G DISK / 1 NIC
  • Ubuntu 16.04 LTS OR CentOS 7.4 OR RHEL 7.4

TACO Script 다운로드

TACO Installation Scripts를 다운 받습니다. (현재 버전의 TACO AIO script에서는 설치의 간편성을 위하여 “root” 로 스트립들을 실행시키도록 되어 있습니다.)

$ git clone https://github.com/sktelecom-oslab/taco-scripts.git
$ cd taco-scripts

TACO Installation Script를 순서대로 실행

01-init-env.sh

  • TACO AIO를 설치하려는 운영체제에 맞게, TACO에 필요한 모든 package들을 설치하고, 환경변수들을 설정합니다.

02-install-k8s.sh

Kubespray(tag v2.3.0)을 사용해 Kubernetes를 설치할 차례입니다. 우선 Kubespray를 다운로드 받고 Kubespray를 실행하는데 필요한 패키지들을 설치합니다. 필요한 패키지는 requirements.txt에 기술되어 있습니다.

cd ~/apps
git clone https://github.com/kubernetes-incubator/kubespray.git upstream-kubespray && cd upstream-kubespray
git checkout -b v2.3.0 tags/v2.3.0
pip install -r requirements.txt

TACO에서 권장하는 Kubernetes 설정을 사용하여 Kubernetes를 설치하기 위해 Upstream Kubespray 디렉토리를 TACO Kubespray로 덮어씁니다. TACO Kubespray에는 Helm client 설치, Ceph 툴 설치 및 설정 등 TACO에 설치에 추가로 필요한 작업을 자동화 해 주는 기능이 추가되어 있습니다.

cd ~/apps
git clone https://github.com/sktelecom-oslab/taco-kubespray.git && cd taco-kubespray
git checkout -b v2.3.0 tags/v2.3.0

cd ~/apps
cp -R upstream-kubespray kubespray && cp -R taco-kubespray/* kubespray/. && cd kubespray

Kubernetes 클러스터의 정보가 담긴 inventory 파일을 만듭니다. TACO AIO는 하나의 노드에 올인원으로 설치하는 과정이므로 아래와 같이 설정 파일을 만들면 됩니다.

echo """taco-aio ansible_connection=local local_release_dir=/releases
[kube-master]
taco-aio
[etcd]
taco-aio
[kube-node]
taco-aio
[k8s-cluster:children]
kube-node
kube-master""" > inventory/taco-aio.cfg

이제 ansible playbook 명령을 통해 Kubernetes를 설치합니다.

ansible-playbook -u root -b -i ~/apps/kubespray/inventory/taco-aio.cfg ~/apps/kubespray/cluster.yml

Kubernetes 설치가 끝나면 TACO AIO에 필요한 Kubernetes 설정인 node label을 지정하고, OpenStack namespace, clusterrolebinding, ceph user 를 생성합니다.

kubectl label nodes openstack-control-plane=enabled --all --namespace=openstack --overwrite
kubectl label nodes openvswitch=enabled --all --namespace=openstack --overwrite
kubectl label nodes openstack-compute-node=enabled --all --namespace=openstack --overwrite
kubectl label nodes kubernetes-control-plane=enabled --all --overwrite
kubectl label nodes ceph-mds=enabled --all --overwrite
kubectl label nodes ceph-mon=enabled --all --overwrite
kubectl label nodes ceph-osd=enabled --all --overwrite
kubectl label nodes ceph-rgw=enabled --all --overwrite

kubectl create clusterrolebinding openstack \
--clusterrole=cluster-admin \
--serviceaccount=openstack:default

kubectl create clusterrolebinding ceph \
--clusterrole=cluster-admin \
--serviceaccount=ceph:default

/etc/resolv.conf 파일에 nameserver 정보를 입력하여 DNS를 설정합니다.

echo """nameserver 10.96.0.10
nameserver 8.8.8.8
nameserver 8.8.4.4
search openstack.svc.cluster.local svc.cluster.local cluster.local
options ndots:5""" > /etc/resolv.conf

03-init-armada.sh

Armada를 설치하기 위해 Armada의 소스코드를 다운로드 받습니다.

cd ~/apps
git clone http://github.com/att-comdev/armada.git && cd armada

TACO AIO 설치가 가능한 운영체제인지 확인하여, Armada에 필요한 모든 python3 패키지를 설치합니다.

OS_DISTRO=$(cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}')
if [ $OS_DISTRO == Red ]; then
    yum -y install https://rhel7.iuscommunity.org/ius-release.rpm
    yum -y install python36u python36u-devel
    yum install -y python36u-pip
    pip3.6 install .
elif [ $OS_DISTRO == CentOS ]; then
    yum -y install https://centos7.iuscommunity.org/ius-release.rpm
    yum -y install python36u python36u-devel
    yum install -y python36u-pip
    pip3.6 install .
elif [ $OS_DISTRO == Ubuntu ]; then
    apt-get install -y python3-pip
    pip3 install --upgrade pip
    pip3 install .
else
    echo "This Linux Distribution is NOT supported"
fi

04-deploy-openstack.sh

Armada를 이용하여 TACO의 OpenStack 요소들을 Kubernetes에 배포하기 위해 Armada manifests 파일을 다운로드 받습니다.

cd ~/apps
git clone https://github.com/sktelecom-oslab/armada-manifests.git

다운로드 받은 ~/apps/armada-manifests/taco-aio-manifest.yaml 파일을 이용하여

  • Openstack에 필요한 인프라인 ceph, ceph-openstack-config, ingress, etcd, rabbitmq, memcached, mariadb, libvirt, openvswitch 차트와
  • OpenStack 서비스인 keystone, glance, nova, neutron, cinder, horizon 차트를 배포합니다.

ceph와 neutron의 value 중에 override가 필요한 값은 –set 옵션으로 추가할 수 있습니다.

armada apply ~/apps/armada-manifests/taco-aio-manifest.yaml \
    --set chart:ceph:values.network.public=$CIDR \
    --set chart:ceph:values.network.cluster=$CIDR \
    --set chart:neutron:values.network.interface.tunnel=$EXNIC

OpenStack 차트가 모두 배포 되었는지 확인하려면 00-watch-pods-openstack.sh 을 이용하시면 됩니다. 모든 pod가 Running 상태이고, Ready가 되면 OpenStack 차트가 정상적으로 배포 완료된 상태입니다.

05-init-openstack.sh

admin의 프로젝트와 사용자에 대한 클라이언트 환경 변수를 설정합니다. 또한 VM을 만들고 접속하는데 필요한 모든 리소스를 생성한 후 VM을 생성합니다.

Horizon, Weave Scope에 접근하기

먼저 horizon의 경우, 웹 브라우저에서 테스트 서버의 IP로 접속하여 horizon에 접속할 수 있습니다. VM을 사용하는 경우에는 접속환경의 /etc/hosts 파일에 <테스트서버IP> horizon, horizon.openstack 을 추가하면, 브라우저에서 http://horizon, http://horizon.openstack 으로 접속할 수 있습니다.

  • 기본 유저 정보: admin / password

openstack dashboard

Weave Scope는 설치된 TACO 노드의 30162 포트로 접속할 수 있습니다. Weave Scope UI를 통해서 Node, Pod, Container 정보와 서로간의 연결 현황을 확인할 수 있습니다. 브라우저에서 http://localhost:30162 또는 http://<테스트서버아이피>:30162로 접속할 수 있습니다.

  • 기본 유저 정보: admin / password

weavescope ui

위와 같이 OpenStack을 Container화하여 Kubernetes상에서 배포/운영하기 위한 기본적인 내용들과 저희 Lab에서 만든 간단한 설치 Script에 대해서 설명하였습니다. 이 블로그를 통해서 누구든지 쉽게 Kubernetes를 설치하고 컨테이너화된 OpenStack을 직접 설치해서 사용해 볼 수 있게 되기를 바랍니다.

앞으로 Kubernetes, Container, OpenStack과 관련된 주제로 계속해서 기술 블로그를 작성해 나갈 예정입니다. 많은 관심 부탁드리겠습니다.