티스토리 뷰

전제 조건

  1. AWS CLI 가 설치되어 있어야 합니다.
  2. Terraform 이 설치되어 있어야 합니다.

배포 워크플로

1. Kubespray 다운로드 및 설치

  1. 로컬 컴퓨터에 작업 공간 폴더를 만듭니다.#mkdir -p  ~/Projects/kubespray_workspace
  2. root@tommypagy-VirtualBox:/home# mkdir -p ~/Projects/kubespray_workspace root@tommypagy-VirtualBox:~/Projects/kubespray_workspace# cd ~/Projects/kubespray_workspace
  3. Kubespray의 안정적인 최신 릴리스 를 다운로드하십시오 .
    #wget https://github.com/kubernetes-sigs/kubespray/archive/refs/tags/v2.15.1.tar.gz
    
    #tar -zxvf  v2.15.1.tar.gz
  1. 큐브스프레이 추출
    root@tommypagy-VirtualBox:~/Projects/kubespray_workspace# tar -zxvf v2.18.0.tar.gz
    kubespray-2.18.0/
    kubespray-2.18.0/.ansible-lint
    kubespray-2.18.0/.editorconfig
    kubespray-2.18.0/.github/
    kubespray-2.18.0/.github/ISSUE_TEMPLATE/
    kubespray-2.18.0/.github/ISSUE_TEMPLATE/bug-report.md
    kubespray-2.18.0/.github/ISSUE_TEMPLATE/enhancement.md
    kubespray-2.18.0/.github/ISSUE_TEMPLATE/failing-test.md
    kubespray-2.18.0/.github/ISSUE_TEMPLATE/support.md
    kubespray-2.18.0/.github/PULL_REQUEST_TEMPLATE.md
    kubespray-2.18.0/.gitignore
    kubespray-2.18.0/.gitlab-ci.yml
    kubespray-2.18.0/.gitlab-ci/
    kubespray-2.18.0/.gitlab-ci/lint.yml
    kubespray-2.18.0/.gitlab-ci/packet.yml
    kubespray-2.18.0/.gitlab-ci/shellcheck.yml
  2. Kubespray 폴더로 이동하여 requirements.txt 파일을 찾으십시오. 이 파일은 모든 종속성을 나열합니다.
  3. 다음 명령을 실행하여 모든 종속성을 설치합니다.
  4. root@tommypagy-VirtualBox:~/Projects/kubespray_workspace# pip install -r requirements.txt
    
    Command 'pip' not found, but can be installed with:
    
    [파이썬이 없을경우 설치 하세요~]
    apt install python-pip
    
    root@tommypagy-VirtualBox:~/Projects/kubespray_workspace# apt install python-pip
    패키지 목록을 읽는 중입니다... 완료
    의존성 트리를 만드는 중입니다
    상태 정보를 읽는 중입니다... 완료
    다음 패키지가 자동으로 설치되었지만 더 이상 필요하지 않습니다:
      linux-hwe-5.4-headers-5.4.0-107 linux-hwe-5.4-headers-5.4.0-42 linux-hwe-5.4-heade
      ... 중략

 

 

2. 인프라 제공

앞서 언급한 바와 같이 원하는 환경과 인프라 프로비저닝 도구 조합을 선택할 수 있습니다. 인프라 토폴로지는 조직의 요구 사항(예: 마스터 또는 작업자 노드 수, 방화벽, 서브넷 CIDR 범위 등)을 기반으로 해야 합니다.

이 기사에서는 AWS EC2 VM을 인프라로 사용합니다. 로 이동하여 새로 추출한 Kubespray 폴더 내에서 샘플 Terraform 스크립트를 참조할 수 있습니다 ~/Projects/kubespray_workspace/kubespray-2.15.1/contrib/terraform/aws/.

  1. AWS 콘솔에 로그인
  2. 다음 AWS 자격 증명을 다운로드합니다.
    1. 액세스 키 ID
    2. SecretAccessKey
    3. EC2 키 페어
  3. 자격 증명.tfvars 업데이트 :
    cd ~/Projects/kubespray_workspace/kubespray-2.15.1/contrib/terraform/aws/ cp credentials.tfvars.example credentials.tfvars 
  4. 인프라 요구 사항에 따라 terraform.tfvars 를 업데이트 합니다.
  5. 다음 Terraform 스크립트를 실행하여 프로비저닝합니다.
    terraform init
    terraform plan -out kubesprayplan -var-file=credentials.tfvars
    terraform apply "kubesprayplan"
  6. 생성된 호스트 인벤토리 파일을 확인합니다.
    cat ~/Projects/kubespray_workspace/kubespray-2.15.1/inventory/hosts
  7. SSH 배스천 호스트 구성 파일을 확인합니다.
    ~/Projects/kubespray_workspace/kubespray-2.15.1/ssh-bastion.conf

3. Kubernetes 클러스터 배포

  1. AWS에서 얻은 ssh 프라이빗 키를 EC2 키 페어의 일부로 로드합니다.
    cp test_aws_instance.pem ~/.ssh/test_aws_instance.pem
    chmod 600 ~/.ssh/test_aws_instance.pem
    eval $(ssh-agent)
    ssh-add -D
    ssh-add ~/.ssh/test_aws_instance.pem 
    
  2. 추출된 Kubespray 루트 폴더로 이동합니다.
    ~/Projects/kubespray_workspace/kubespray-2.15.1
  3. 다음 Ansible 명령을 실행하여 인프라 위에 kubernetes 구성 요소를 설치합니다.
    ansible-playbook -i ./inventory/hosts ./cluster.yml -e ansible_user=ubuntu -b --become-user=root

4. Kubernetes 클러스터에 액세스

배스천 호스트를 통해

  1. 다음을 실행합니다.
    cd ~/Projects/kubespray_workspace/kubespray-2.15.1
    ssh -F ssh-bastion.conf ubuntu@ 
    sudo cat /etc/kubernetes/admin.conf
    mkdir ~/.kube/
    sudo cp -R /etc/kubernetes/admin.conf ~/.kube/config
    sudo chown ubuntu:ubuntu ~/.kube/config
    
  2. 다음을 사용하여 확인합니다.
    kubectl get nodes
    kubectl get ns

로컬 머신을 통해

  1. 다음을 실행합니다.
    mkdir ~/.kube/
  2. admin.conf 의 내용을 복사합니다 .
    /etc/kubernetes/admin.conf
  3. 다음 파일의 내용을 붙여넣습니다.
    ~/.kube/config
  4. 파일을 편집하고 server: https://127.0.0.1:6443다음으로 바꿉니다.
    server: https://<aws_elb_dns_name>:6443
  5. 다음을 사용하여 확인합니다.
    kubectl get nodes
    kubectl get ns

5가지 기본 클러스터 작업을 수행하는 방법

Kubernetes 노드 제거

ansible-playbook -i ./inventory/hosts ./remove-node.yml -e ansible_user=ubuntu -b --become-user=root --extra-vars "node=ip-10-250-212-108.ap-south-1.compute.internal"

동일한 Kubernetes 노드 다시 추가

ansible-playbook -i ./inventory/hosts ./scale.yml -e ansible_user=ubuntu -b --become-user=root

Kubernetes 버전 확인

kubectl version

Kubernetes 버전 업그레이드

ansible-playbook -i ./inventory/hosts ./upgrade-cluster.yml -e ansible_user=ubuntu -b --become-user=root -e kube_version=<replace_kubernetes_version_you_want_to_upgrade>

해체 또는 정리 인프라

cd ~/Projects/kubespray_workspace/kubespray-2.15.1/contrib/terraform/aws/
terraform destroy -var-file=credentials.tfvars

Kubespray 업그레이드

Kubespray는 업그레이드 시 릴리스 버전을 건너뛰는 것을 지원하거나 권장하지 않습니다. 예를 들어 버전 1.0.0을 사용 중이고 5.0.0으로 업그레이드하려면 모든 공식 Kubespray 릴리스에 대해 2.0.0, 3.0.0 등으로 업그레이드해야 합니다.

 

***************

 

[k8s] Kubespray로 Kubernetes 설치하기

DevTrading 2020. 8. 23. 18:37

Kubespray는 쿠버네티스를 쉽게 설치하는 자동화 도구입니다. Ansible의 playbook과 inventory 설정을 통해서
Kubernetes 클러스터를 설정해 보고자 합니다.
Kubernetes는 최소 1개의 Mater Node와 1개의 Worker Node 1개가 필요합니다.

하지만, 1개의 Master Node와 3개의 Worker Node 클러스터로 구성해 보고자 합니다.

 

Requirements (요구 사항)


  • Ansible Playbook을 실행하려면 Jinja 2.9 이상이 필요합니다.
  • Docker 이미지를 가져 오려면 대상 서버가 인터넷에 액세스 할 수 있어야합니다.
  • 인벤토리의 모든 서버 부분에 SSH 키를 복사해야합니다.
  • 배포 중 문제를 방지하려면 방화벽을 비활성화해야합니다.

Configuration (구성)


Node HostName IP DNS
Master Node controller 192.168.122.10 8.8.8.8
Worker Node node1 192.168.122.21 8.8.8.8
node2 192.168.122.22 8.8.8.8
node3 192.168.122.23 8.8.8.8

 

요구사항 해결하기


1. Ansible을 사용하기 위해 인벤토리의 모든 서버에 SSH 키를 복사해야합니다. Master Node에서 키를 생성하고
    각 노드에 복사해야합니다.

- Key 기반 인증을 사용할 수 있도록 SSH

 

ssh-keygen
... 기본값으로 설정하여 skygen을 생성합니다.

- Master Node와 Worker Node에 모두 키를 복사합니다.

 

ssh-copy-id 192.168.122.10
ssh-copy-id 192.168.122.21
ssh-copy-id 192.168.122.22
ssh-copy-id 192.168.122.23

 

2. 배포 중 문제를 방지하려면 방화벽을 비활성화하거나 정책에 맞게 설정해야합니다.

배포 중 문제를 방지하려면 방화벽을 비활성화해야합니다.

Control-node

TCP Inbound 6443* Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10251 kube-scheduler Self
TCP Inbound 10252 kube-controller-manager Self

Worker node

TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 30000-32767 NodePort Services† All

 

case 1) 방화벽을 끄는방법

sudo systemctl stop firewalled
sudo systemctl disabled firewalled

 

case 2) 노드의 정책에 맞는 포트를 추가 하는방법

참고 : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

 

 

Control-node

sudo firewall-cmd --add-port=6443/tcp --permanent 
sudo firewall-cmd --add-port=2379-2380/tcp --permanent 
sudo firewall-cmd --add-port=10250/tcp --permanent 
sudo firewall-cmd --add-port=10251/tcp --permanent 
sudo firewall-cmd --add-port=10252/tcp --permanent 
sudo firewall-cmd --reload  

 

 worker node 

sudo firewall-cmd --add-port=10250/tcp --permanent 
sudo firewall-cmd --add-port=30000-32767/tcp --permanent 
sudo firewall-cmd --reload 

 

3. 루트가 아닌 사용자 계정에서 kubespray를 실행하는 경우 대상 서버에서 올바른 권한방법을 구성해야합니다.

각 노드들에게 패스워드 없이 sudo를 사용하도록 설정해 줍니다.

echo 'kim ALL=NOPASSWD: ALL' >> /etc/sudoers

deployment (배포하기)


배포는 kubespray git 저장소 사이트를 참조해서 설치해 보겠습니다. 아래 패키지를 먼저 설치해 주세요. 참고: https://github.com/kubernetes-sigs/kubespray

 

kubernetes-sigs/kubespray

Deploy a Production Ready Kubernetes Cluster. Contribute to kubernetes-sigs/kubespray development by creating an account on GitHub.

github.com

0. 설치에 필요한 패키지들을 설치해 줍니다.

sudo yum install -y git 
sudo yum install -y python3

 

1. git clone 를 통해 코드를 가져옵니다.

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

2. requirements.txt 의 종속파일을 설치합니다.

sudo pip3 install -r requirements.txt

3. sample 파일을 mycluster 폴더에 복사하여 이용해 보겠습니다.

cp -rfp inventory/sample inventory/mycluster

4. inventory 파일을 통해 배포하기 위해 inventory/mycluster/inventory.ini 의 내용을 적절히 수정해 줍니다.

 

인벤토리 파일 작성

# inventory/mycluster/inventory.ini 
[all]
master ansible_host=192.168.122.10 ip=192.168.122.10 etcd_member_name=etcd1
node1 ansible_host=192.168.122.21  ip=192.168.122.21
node2 ansible_host=192.168.122.22  ip=192.168.122.22
node3 ansible_host=192.168.122.23  ip=192.168.122.23
# node4 ansible_host=95.54.0.15  # ip=10.3.0.4 etcd_member_name=etcd4
# node5 ansible_host=95.54.0.16  # ip=10.3.0.5 etcd_member_name=etcd5
# node6 ansible_host=95.54.0.17  # ip=10.3.0.6 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

[kube-master]
master
# node1
# node2

[etcd]
master
# node2
# node3

[kube-node]
node1
node2
node3
# node4
# node5
# node6

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

 

5. ping 모듈을 통해서 노드간 통신이 이루어 지는지 확인합니다.

 ansible all -i inventory/mycluster/inventory.ini -m ping

 

6. cluster.yaml 파일을 통해 배포해 보겠습니다

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

 

배포 완료 후의 이미지

 

7. kubectl 명령어를 일반계정에서 사용하기 위해 config파일을 복사했습니다.

sudo cp -r /root/.kube ~/.kube
sudo chown -R $USER:$USER ~/.kube

kubectl 명령어를 통해 설치된 노드들을 확인할 수 있습니다.

$ kubectl get no
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   42h     v1.18.8
node1    Ready    <none>   6h8m    v1.18.8
node2    Ready    <none>   4h46m   v1.18.8
node3    Ready    <none>   4h46m   v1.18.8

 

참고자료


- https://kubernetes.io/docs/setup/production-environment/tools/kubespray/

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

- https://kubespray.io/

댓글