티스토리 뷰

728x90
반응형

본 포스팅에서는 OpenStack VM기반 Kubernetes 설치하는 과정에 대해 살펴보겠습니다.

Kubespray는 Ansible을 기반으로 Kubernetes를 설치합니다. ansible-playbook을 활용한 Kubespray 설치 방식은 AWS, Azure, GCP 등의 CSP와 OpenStack등 External Vendor와 연동하기 위해 사용하는 방식으로 kops와 유사한 형태를 갖고 있습니다.

지난 포스팅에서는 KVM환경 기반 kubespray로 Kubernetes를 설치해 보았으며, 이에 대한 포스팅은 다음 URL을 참고하시기 바랍니다.

 

[Kubernetes] Kuberspray로 Kubernetes 구축하기

 

OpenStack은 IaaS Platform으로 VM 환경에 구성하는 방식과는 다르게 Kubernetes와 연동하기 위해서는 cloud_provider를 제공해야 합니다.

이를 적용하기 위한 과정은 다음과 같습니다.

Kubespray를 이용한 OpenStack 기반 Kubernetes 설치

1) 기본 설치 패키지 install

yum install -y python3, python3-pip

2) ssh key gen

ssh-keygen -t rsa

3) ssh public key 복사

ssh-copy-id root@ip

- masternode, workernode 모두 복사합니다.
4) git repository clone

[root@kubemaster git_repo]# git clone https://github.com/kubernetes-sigs/kubespray
Cloning into 'kubespray'...
remote: Enumerating objects: 38197, done.
remote: Total 38197 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (38197/38197), 11.54 MiB | 0 bytes/s, done.
Resolving deltas: 100% (21157/21157), done.
[root@kubemaster git_repo]#

5) ansible requirement install

[root@kubemaster kubespray]# cat requirements.txt
ansible==2.7.12
jinja2==2.10.1
netaddr==0.7.19
pbr==5.2.0
hvac==0.8.2
jmespath==0.9.4
ruamel.yaml==0.15.96
[root@kubemaster kubespray]#

- 인터넷 환경에서는 pip3 install -r requirements.txt로 위와같이 원하는 package 목록을 정의하면 손쉽게 설치가 가능하지만, 폐쇄망에서는 바이너리를 다운로드 받아 수동 설치해야 합니다.

python package를 설치하는 방법은 아래 포스팅을 참고합니다.

[python3] 폐쇄망 환경에서 python3를 이용한 ansible 설치

Kubespray Github Package Configuration

1) project 복사

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

[root@kubemaster kubespray]# cp -rf inventory/sample inventory/myinven
[root@kubemaster kubespray]#

- 기본 제공하는 sample project를 myinven으로 복사하여 해당 경로를 project 홈으로 사용합니다.

2) inventory.ini 파일 생성

[root@kubemaster myinven]# pwd
/root/git_repo/kubespray/inventory/myinven
[root@kubemaster myinven]# cat inventory.ini
kubemaster ansible_ssh_host=192.168.56.107 ip=192.168.56.107
kubeworker ansible_ssh_host=192.168.56.108 ip=192.168.56.108
[kube-master]
kubemaster
[etcd]
kubemaster
[kube-node]
kubeworker
[k8s-cluster:children]
kube-node
kube-master
[root@kubemaster myinven]#

- Kubernetes를 이루는 kube-master, kube-node(worker), etcd, kube-cluster에 대한 정보를 정의합니다.

이를 중복 지정하여 master node, worker node, etcd 등을 다중화 구성할 수 있습니다.

3) cloud provider 지정

[root@kubemaster all]# pwd
/root/git_repo/kubespray/inventory/myinven/group_vars/all
[root@kubemaster all]# vi all.yml
...
## There are some changes specific to the cloud providers
## for instance we need to encapsulate packets with some network plugins
## If set the possible values are either 'gce', 'aws', 'azure', 'openstack', 'vsphere', 'oci', or 'external'
## When openstack is used make sure to source in the openstack credentials
## like you would do when using openstack-client before starting the playbook.
## Note: The 'external' cloud provider is not supported.
## TODO(riverzhang): https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/#running-cloud-controller-manager
# cloud_provider:
cloud_provider: external
...

- cloud provider로 openstack을 선택해야 하나, openstack 지원이 deprecated 되어 external로 적용해야 합니다.
4) CNI overay network module & persistent volume 지정

[root@kubemaster k8s-cluster]# pwd
/root/git_repo/kubespray/inventory/myinven/group_vars/k8s-cluster
[root@kubemaster k8s-cluster]# vi k8s-cluster.yml
...
# Choose network plugin (cilium, calico, contiv, weave or flannel. Use cni for generic cni plugin)
# Can also be set to 'cloud', which lets the cloud provider setup appropriate routing
kube_network_plugin: calico
...
# Add Persistent Volumes Storage Class for corresponding cloud provider ( OpenStack is only supported now )
persistent_volumes_enabled: true
...

- CNI 모듈로는 calico를 default로 사용하며, 대표적인 cilium, weave 등을 적용할 수 있습니다.
5) openstack-rc 파일 생성

[root@kubemaster kubespray]# pwd
/root/git_repo/kubespray
[root@kubemaster kubespray]# cat openstack-rc
export OS_AUTH_URL=http://openstack_director_ip:5000/v3
export OS_PROJECT_ID="ictd_webp"
export OS_PROJECT_NAME="ictd_webp"
export OS_PROJECT_DOMAIN_ID="Default"
export OS_USERNAME="admin"
export OS_PASSWORD="cloud01"
export OS_REGION_NAME="RegionOne"
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3
export OS_USER_DOMAIN_NAME="Default"
[root@kubemaster kubespray]#
[root@kubemaster kubespray]# source openstack-rc
[root@kubemaster kubespray]#

오픈스택에 kubernetes를 배치하기 위한 profile을 생성하고 적용하기 위해 위와 같은 설정을 반영합니다.

source openstack-rc를 적용하면, 이 설정을 기반으로 /etc/kubernetes 하위에 cloud_config라는 파일을 생성하여 OpenStack 기반 VM에 Kubernetes를 배치합니다.

Kubespray Configuration File Modify

로컬 repo에서 이미지 파일을 다운로드 받기 위한 설정을 적용해야 합니다.

주요 설정파일을 살펴보자면 다음과 같습니다.

다음은 kubespray default file과 kubespray를 이용한 kuberntes 기동에 성공한 설정 파일을 비교하여 어떠한 정보가 변경되었는지 확인합니다.

a. kubespray/roles/container-engine/docker/default/main.yml

[root@kubemaster defaults]# pwd
/root/git_repo/kubespray/roles/container-engine/docker/default
[root@kubemaster defaults]# diff main.yml ~/git_repo/kubespray_success/roles/container-engine/docker/defaults/main.yml
33,34c33,34
< docker_rh_repo_base_url: 'https://download.docker.com/linux/centos/7/$basearch/stable'
< docker_rh_repo_gpgkey: 'https://download.docker.com/linux/centos/gpg'
---
> docker_rh_repo_base_url: 'http://192.168.56.107/docker-ce/linux/centos/7/x86_64/stable'
> docker_rh_repo_gpgkey: 'http://192.168.56.107/docker-ce/linux/gpg'
42,43c42,43
< dockerproject_rh_repo_base_url: 'https://yum.dockerproject.org/repo/main/centos/7'
< dockerproject_rh_repo_gpgkey: 'https://yum.dockerproject.org/gpg'
---
> dockerproject_rh_repo_base_url: 'http://192.168.56.107/docker-engine/repo/main/centos/7'
> dockerproject_rh_repo_gpgkey: 'http://192.168.56.107/docker-engine/repo/gpg'
[root@kubemaster defaults]#

- docker repository 경로를 내부망 경로로 변경 합니다.

b. kubespray/roles/container-engine/docker/tasks/main.yml

[root@kubemaster tasks]# pwd
/root/git_repo/kubespray/roles/container-engine/docker/tasks
[root@kubemaster tasks]# diff main.yml ~/git_repo/kubespray_success/roles/container-engine/docker/tasks/main.yml
126c126
< gpgcheck: yes
---
> gpgcheck: no
[root@kubemaster tasks]#

- docker file에 대한 gpg check 여부를 결정 합니다.

c. kubespray/roles/download/defaults/main.yml

[root@kubemaster defaults]# pwd
/root/git_repo/kubespray/roles/download/defaults
[root@kubemaster defaults]# diff main.yml ~/git_repo/kubespray_success/roles/download/defaults/main.yml
57c57
< gcr_image_repo: "gcr.io"
---
> gcr_image_repo: "192.168.56.107:13000"
61c61
< docker_image_repo: "docker.io"
---
> docker_image_repo: "192.168.56.107:13000"
64c64
< quay_image_repo: "quay.io"
---
> quay_image_repo: "192.168.56.107:13000"
91,96c91,102
< kubeadm_download_url: "https://storage.googleapis.com/kubernetes-release/release/{{ kubeadm_version }}/bin/linux/{{ image_arch }}/kubeadm"
< hyperkube_download_url: "https://storage.googleapis.com/kubernetes-release/release/{{ kube_version }}/bin/linux/{{ image_arch }}/hyperkube"
< etcd_download_url: "https://github.com/coreos/etcd/releases/download/{{ etcd_version }}/etcd-{{ etcd_version }}-linux-{{ image_arch }}.tar.gz"
< cni_download_url: "https://github.com/containernetworking/plugins/releases/download/{{ cni_version }}/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz"
< calicoctl_download_url: "https://github.com/projectcalico/calicoctl/releases/download/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
< crictl_download_url: "https://github.com/kubernetes-sigs/cri-tools/releases/download/{{ crictl_version }}/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
---
> #kubeadm_download_url: "https://storage.googleapis.com/kubernetes-release/release/{{ kubeadm_version }}/bin/linux/{{ image_arch }}/kubeadm"
> kubeadm_download_url: "http://192.168.56.107/kubernetes-release/release/kubeadm"
> #hyperkube_download_url: "https://storage.googleapis.com/kubernetes-release/release/{{ kube_version }}/bin/linux/{{ image_arch }}/hyperkube"
> hyperkube_download_url: "http://192.168.56.107/kubernetes-release/release/hyperkube"
> #etcd_download_url: "https://github.com/coreos/etcd/releases/download/{{ etcd_version }}/etcd-{{ etcd_version }}-linux-{{ image_arch }}.tar.gz"
> etcd_download_url: "http://192.168.56.107/kubernetes-release/etcd/releases/etcd-{{ etcd_version }}-linux-{{ image_arch }}.tar.gz"
> #cni_download_url: "https://github.com/containernetworking/plugins/releases/download/{{ cni_version }}/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz"
> cni_download_url: "http://192.168.56.107/kubernetes-release/plugins/releases/{{ cni_version }}/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz"
> #calicoctl_download_url: "https://github.com/projectcalico/calicoctl/releases/download/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
> calicoctl_download_url: "http://192.168.56.107/kubernetes-release/calicoctl/releases/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
> #crictl_download_url: "https://github.com/kubernetes-sigs/cri-tools/releases/download/{{ crictl_version }}/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
> crictl_download_url: "http://192.168.56.107/kubernetes-release/cri-tools/releases/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
[root@kubemaster defaults]#

- Kubernetes module에 대한 다운로드 URL을 내부망으로 변경하고, 주요 Docker File URL을 내부망으로 변경 합니다.

d. kubespray/roles/bootstrap-os/defaults/main.yml

[root@kubemaster defaults]# pwd
/root/git_repo/kubespray/roles/bootstrap-os/defaults
[root@kubemaster defaults]# diff main.yml ~/git_repo/kubespray_success/roles/bootstrap-os/defaults/main.yml
14c14
< override_system_hostname: true
---
> override_system_hostname: false
[root@kubemaster defaults]#

- Kubernetes hostname을 system hostname으로 적용하지 않도록 설정합니다.

e. kubespray/roles/etcd/tasks/check_certs.yml

[root@kubemaster tasks]# pwd
/root/git_repo/kubespray/roles/etcd/tasks
[root@kubemaster tasks]# diff check_certs.yml ~/git_repo/kubespray_success/roles/etcd/tasks/check_certs.yml
59c59
< sync_certs: true
---
> sync_certs: false
[root@kubemaster tasks]#

f. kubespray/inventory/myinven/myinven/group_vars/all/docker.yml

[root@kubemaster kubespray]# diff ./inventory/myinven/group_vars/all/docker.yml ../kubespray_success/inventory/myinven/group_vars/all/docker.yml
36c36
< # docker_insecure_registries:
---
> docker_insecure_registries:
38a39
> - 192.168.56.107:13000
[root@kubemaster kubespray]#

- docker repository에 대한 insecure registries를 추가합니다.

g. kubespray/inventory/myinven/group_vars/k8s-cluster/k8s-cluster.yml

[root@kubemaster kubespray]# diff ./inventory/myinven/group_vars/k8s-cluster/k8s-cluster.yml ../kubespray_success/./inventory/myinven/group_vars/k8s-cluster/k8s-cluster.yml
26c26
< kube_image_repo: "gcr.io/google-containers"
---
> kube_image_repo: "192.168.56.107:13000/google-containers"
[root@kubemaster kubespray]#

위와 같이 총 7개의 설정 파일을 수정한 후 openstack을 기동합니다.

기동에 앞서 주의 사항으로는 cloud_provider로 제공되던 OpenStack이 Deprecated되었다는 점입니다.

이로 인해 cloud_provider를 external로 변경하였지만, 기동 시 cloud_provider가 제공되지 않아 기동 실패가 발생할 것이고, 이로 인해 아래와 같이 cloud_config 파일을 /etc/kubernetes 경로에 복사한 후 기동을 시도해야 합니다.

- /etc/kubernetes/cloud_config 파일 복사

[root@kubemaster kubespray]# cat cloud_config
[Global]
auth-url="http://192.168.56.109:5000/v3"
username="admin"
password="cloud01"
region="RegionOne"
tenant-id="ictd_webp"
domain-name="Default"

[BlockStorage]

[root@kubemaster kubespray]# mkdir /etc/kubernetes
[root@kubemaster kubespray]# cp cloud_config /etc/kubernetes/
[root@kubemaster kubespray]#

Kubernetes 기동 및 리셋

ansible-playbook을 이용한 kubernetes 구성 시작

ansible-playbook -i inventory/myinven/inventory.ini --become --become-user=root cluster.yml -v

ansible-playbook을 이용한 kubernetes reset

ansible-playbook -i inventory/myinven/inventory.ini --become --become-user=root reset.yml -v

위와 같이 기동을 시도하면 Kuberntes는 inventory.ini에 설계한대로 master, worker, etcd를 ansible script에 따라 자동으로 배치합니다.

기동 시점에 발생 가능한 다양한 error들은 다음 포스팅을 참고하도록 합니다.

 

이번 포스팅에서는 OpenStack 기반 Kubernetes를 구성하는 방법에 대해 알아봤습니다.

KVM 환경 대비 다소 변경해야 할 부분들이 많이 있지만, OpenStack으로 구성된 환경에서 container platform을 배치하는 것은 일반환경과 다른 Network 환경으로 인해 여러 문제를 야기할 수 있습니다. 이에 단순히 PaaS에 대한 이해뿐 아니라, IaaS에 대한 이해도 높아야 하기 때문에 단순히 구성에 그치지 않기 위해서는 지속적인 Kubernetes & OpenStack에 대해 학습해야 할 것입니다.

[Openon3] 폐쇄망 환경에서 python3를 이용한 ansible 설치
[root@kubemaster kubespray]# cp -rf inventory/sample inventory/myinven
[root@kubemaster kubespray]#
728x90
반응형