안녕하세요!
그동안 Minikube를 활용해서 쉽게 쿠버플로를 구축하고 잘 사용하고 있었는데..
프로젝트 특성 상 실제 프로덕션을 진행해야하기 때문에 Minikube를 버려야 할 상황입니다.
Minikube는 기본적으로 로컬에서 쿠버네티스를 쉽게 구축하고 연습, 연구 등을 진행할 수 있습니다. 다만 실제로 구축한 서비스를 외부로 노출하고 프로덕션 하는데는 적합하지 않습니다.
다중 노드나, 로드밸런서 서비스를 받쳐주기 위한 metallb addons, minikube start 시 listion_address 조정 등 다양한 시도를 해보았지만 서비스를 외부로 노출하는 것이 쉽지 않았습니다.
또한 프로덕션 환경은 들어오는 트래픽에 따라 리소스를 유연하게 증설하는 등의 가용성이 필요하고, 보안 역시 놓칠 수 없다.
프로덕션 환경에서 고려할 다양한 요소에 대해서는 링크를 참고해서 읽어보시면 좋겠습니다.
이러한 이유 때문에 kubespray를 이용해서 kubenetes와 kubeflow를 한 단계씩 구축해겠습니다!
저는 Kubespray를 활용해서 쿠버네티스를 배포해보고자 합니다.
이유는 kubespray가 kubeadm을 기반하여 만들어진 툴이기도 하고,
kubeadm에서 일일이 해줘야하는 다양한 설정을 kubespray에서는 스크립트로 자동화시켜주는 것 같아서입니다.
저는 kubespray 공식 github에 따라 클러스터 배포를 해보겠습니다.
구글링을 몇 시간 해보았는데, 다들 vagrant 등의 VM 머신을 이용해서 리눅스 서버를(컨트롤 플레인, 워커 노드) 4~5개 구성하여 사용하더라고요.
하지만 온프레미스 서버(ubuntu 18.04)가 이미 있는데, 왜 또 그 안에 VM을 여러개 두어야하는지, 자동으로 가상머신을 생성해주지 않을지 하는 마음에 일단 quick start 방식을 따라해봤습니다.(특히 kubespray가 사용하는 Ansible이 프로비저닝, 자동화 도구이니까요)
CLI 사용시 자동으로 conda가 활성화 될 때 비활성화 하는 법
- conda config --set auto_activate_base false
쿠버네티스 공식 홈페이지 kubespray를 이용한 클러스터 배포 요구사항
언더레이(underlay) 요건을 만족하는 프로비전 한다.
Ansible의 명령어를 실행하기 위해 Ansible v 2.9와 Python netaddr 라이브러리가 머신에 설치되어 있어야 한다
Ansible 플레이북을 실행하기 위해 2.11 (혹은 그 이상) 버전의 Jinja가 필요하다
타겟 서버들은 docker 이미지를 풀(pull) 하기 위해 반드시 인터넷에 접속할 수 있어야 한다. 아니라면, 추가적인 설정을 해야 한다 (오프라인 환경 확인하기)
타겟 서버들의 IPv4 포워딩이 활성화되어야 한다
SSH 키가 인벤토리의 모든 서버들에 복사되어야 한다
방화벽은 관리되지 않는다. 사용자가 예전 방식대로 고유한 규칙을 구현해야 한다. 디플로이먼트 과정에서의 문제를 방지하려면 방화벽을 비활성화해야 한다
만약 kubespray가 루트가 아닌 사용자 계정에서 실행되었다면, 타겟 서버에서 알맞은 권한 확대 방법이 설정되어야 한다. 그 뒤 ansible_become 플래그나 커맨드 파라미터들, --become 또는 -b 가 명시되어야 한다
cd Desktop
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
python --version
update-alternatives
명령어를 활용해서 기본 버전을 변경할 수 있습니다.sudo update-alternatives --config python
update-alternatives --install [symbolic link path] python [real path] number
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
update-alternatives --config python
sudo apt install python3-pip
vim ~/.bashrc
alias pip=pip3
등록source ~/.bashrc
cd Desktop/kubespray
sudo pip3 install -r requirements.txt
inventory/sample
을 inventory/mycluster
로 복사합니다.cp -rfp inventory/sample inventory/mycluster
# declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)
declare -a IPS=(192.168.25.41 192.168.25.42 192.168.25.43 192.168.25.44 192.168.25.45)
CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
inventory/mycluster/group_vars
에서 매개변수 검토 및 변경cat inventory/mycluster/group_vars/all/all.yml
cat inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
---
## Directory where etcd data stored
etcd_data_dir: /var/lib/etcd
## Experimental kubeadm etcd deployment mode. Available only for new deployment
etcd_kubeadm_enabled: false
## Directory where the binaries will be installed
bin_dir: /usr/local/bin
## The access_ip variable is used to define how other nodes should access
## the node. This is used in flannel to allow other flannel nodes to see
## this node for example. The access_ip is really useful AWS and Google
## environments where the nodes are accessed remotely by the "public" ip,
## but don't know about that address themselves.
# access_ip: 1.1.1.1
## External LB example config
## apiserver_loadbalancer_domain_name: "elb.some.domain"
# loadbalancer_apiserver:
# address: 1.2.3.4
# port: 1234
## Internal loadbalancers for apiservers
# loadbalancer_apiserver_localhost: true
# valid options are "nginx" or "haproxy"
# loadbalancer_apiserver_type: nginx # valid values "nginx" or "haproxy"
## If the cilium is going to be used in strict mode, we can use the
## localhost connection and not use the external LB. If this parameter is
## not specified, the first node to connect to kubeapi will be used.
# use_localhost_as_kubeapi_loadbalancer: true
## Local loadbalancer should use this port
## And must be set port 6443
loadbalancer_apiserver_port: 6443
## If loadbalancer_apiserver_healthcheck_port variable defined, enables proxy liveness check for nginx.
loadbalancer_apiserver_healthcheck_port: 8081
### OTHER OPTIONAL VARIABLES
## Upstream dns servers
# upstream_dns_servers:
# - 8.8.8.8
# - 8.8.4.4
## 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.
# cloud_provider:
## When cloud_provider is set to 'external', you can set the cloud controller to deploy
## Supported cloud controllers are: 'openstack' and 'vsphere'
## When openstack or vsphere are used make sure to source in the required fields
# external_cloud_provider:
## Set these proxy values in order to update package manager and docker daemon to use proxies
# http_proxy: ""
# https_proxy: ""
## Refer to roles/kubespray-defaults/defaults/main.yml before modifying no_proxy
# no_proxy: ""
## Some problems may occur when downloading files over https proxy due to ansible bug
## https://github.com/ansible/ansible/issues/32750. Set this variable to False to disable
## SSL validation of get_url module. Note that kubespray will still be performing checksum validation.
# download_validate_certs: False
## If you need exclude all cluster nodes from proxy and other resources, add other resources here.
# additional_no_proxy: ""
## If you need to disable proxying of os package repositories but are still behind an http_proxy set
## skip_http_proxy_on_os_packages to true
## This will cause kubespray not to set proxy environment in /etc/yum.conf for centos and in /etc/apt/apt.conf for debian/ubuntu
## Special information for debian/ubuntu - you have to set the no_proxy variable, then apt package will install from your source of wish
# skip_http_proxy_on_os_packages: false
## Since workers are included in the no_proxy variable by default, docker engine will be restarted on all nodes (all
## pods will restart) when adding or removing workers. To override this behaviour by only including master nodes in the
## no_proxy variable, set below to true:
no_proxy_exclude_workers: false
## Certificate Management
## This setting determines whether certs are generated via scripts.
## Chose 'none' if you provide your own certificates.
## Option is "script", "none"
# cert_management: script
## Set to true to allow pre-checks to fail and continue deployment
# ignore_assert_errors: false
## The read-only port for the Kubelet to serve on with no authentication/authorization. Uncomment to enable.
# kube_read_only_port: 10255
## Set true to download and cache container
# download_container: true
## Deploy container engine
# Set false if you want to deploy container engine manually.
# deploy_container_engine: true
## Red Hat Enterprise Linux subscription registration
## Add either RHEL subscription Username/Password or Organization ID/Activation Key combination
## Update RHEL subscription purpose usage, role and SLA if necessary
# rh_subscription_username: ""
# rh_subscription_password: ""
# rh_subscription_org_id: ""
# rh_subscription_activation_key: ""
# rh_subscription_usage: "Development"
# rh_subscription_role: "Red Hat Enterprise Server"
# rh_subscription_sla: "Self-Support"
## Check if access_ip responds to ping. Set false if your firewall blocks ICMP.
# ping_access_ip: true
--become
옵션이 필요합니다.--become
가 없으면 플레이북이 실행되지 않습니다!ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
해당 오류는 아래의 명령어를 통해 해결할 수 있을겁니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
저는 여기서 멈추고, Vagrant를 활용한 설치가 훨씬 간편하여 해당 방법을 이용하였습니다. 다음 포스팅을 참고해주세요!