kubespray로 k8s설치

2024. 11. 21. 10:34쿠버네티스/쿠버네티스

728x90
반응형

https://www.linuxtechi.com/install-kubernetes-using-kubespray/

 

How to Install Kubernetes Cluster Using Kubespray

In this post, we will cover how to install Kubernetes cluster using kubespray. It is a free and open-source tool used to deploy and manage Kubernetes clusters.

www.linuxtechi.com

환경

inventory.py는 의존성 문제와 동작의 불안정성 때문에 제거.
대신, 정적 인벤토리 파일 기반 접근법이 도입되어 더 직관적이고 안정적인 설치 프로세스를 제공.
사용자는 샘플 인벤토리를 수정하거나 다른 자동화 도구(Terraform 등)를 활용하여 클러스터 설정을 진행 가능
  • installer : ubuntu 24 LTS / 192.168.111.101 (인스토럴 노드는 rocky로 할려했으나 오류가 많아 우분투로 진행)
  • master : rocky 9 / 192.168.111.201
  • node1 : rocky 9 / 192.168.111.202
  • node2 : rocky 9 / 192.168.111.203
  • node33 : rocky 9 / 192.168.111.204
# 1. 필요한 패키지 설치
sudo apt-get update
sudo apt-get install -y ansible git python3 python3-pip

# 2. SSH 키 생성 및 각 노드에 키 복사
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""
ssh-copy-id sysops@192.168.111.201
ssh-copy-id sysops@192.168.111.202
ssh-copy-id sysops@192.168.111.203
ssh-copy-id sysops@192.168.111.204

# 3. 각 노드에 대해 sudo 권한 설정
echo "master ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops
echo "node1 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops
echo "node2 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops
echo "node3 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops

# 4. 방화벽 비활성화 및 IPV4 포워딩 활성화
ansible all -i inventory/mycluster/hosts.yaml -m shell -a "sudo systemctl stop firewalld && sudo systemctl disable firewalld"
ansible all -i inventory/mycluster/hosts.yaml -m shell -a "echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf"
ansible all -i inventory/mycluster/hosts.yaml -m shell -a "sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab && sudo swapoff -a"

# 5. Kubespray 클론
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray

# 6. 필수 의존성 설치
pip install -r requirements.txt

# 7. 인벤토리 파일 준비 (필요한 경우 IP 주소 수정)
cp -r inventory/sample inventory/mycluster
# (여기서 `inventory/mycluster/hosts.yaml` 파일을 편집하여 각 노드 IP와 역할을 설정)

# 8. Kubernetes 클러스터 설치
ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml

# 9. 클러스터 상태 확인
kubectl get nodes

 

 

현재아래는 잘 안되 수정-기록용으로만 놓음

----------------------

installer

$ sudo apt update
$ sudo apt install git python3 python3-pip -y
$ git clone https://github.com/kubernetes-incubator/kubespray.git
$ cd kubespray
$ pip install -r requirements.txt --break-system-packages

 

아래 에러 발생 시 : 

ERROR: Cannot uninstall jsonschema 4.10.3, RECORD file not found. Hint: The package was installed by debian.

1. 패키지가 apt로 설치되었는지 확인

dpkg -l | grep jsonschema

출력에 jsonschema 관련 항목이 나타난다면, 이 패키지는 apt를 통해 설치된 것입니다.


2. apt로 패키지 제거

apt를 사용해 제거합니다:

sudo apt remove python3-jsonschema

제거된 후, pip로 다시 설치하려면 아래 명령어를 사용하세요:

pip install jsonschema


3. pip로 다시 설치된 패키지 확인

만약 이후에도 동일한 오류가 발생하면, pip를 통해 설치된 패키지를 강제로 제거하고 새로 설치할 수 있습니다:

pip install --force-reinstall jsonschema

 

ModuleNotFoundError: No module named 'ruamel' 오류

pip install ruamel.yaml --break-system-packages로 설치


앤서블 사용을 위해 클러스트 파일 만들기

$ cp -rfp inventory/sample inventory/mycluster
$ declare -a IPS=(192.168.111.201 192.168.111.202 192.168.111.203 192.168.111.204)
$ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
vi inventory/mycluster/hosts.yaml

 

아래와 같이 수정 (현재 환경에 맞게 수정한거므로 상황이 다르면 다르게 수정)

 

Kubernetes 대시보드 및 Ingress 컨트롤러와 같은 애드온을 활성화하려면, inventory/mycluster/group_vars/k8s_cluster/addons.yml 파일에서 해당 매개변수를 활성화 상태로 설정.

$ vi inventory/mycluster/group_vars/k8s_cluster/addons.yml
-----------
dashboard_enabled: true
ingress_nginx_enabled: true
ingress_nginx_host_network: true
-----------

 

install node에서

ssh-keygen
$ ssh-copy-id sysops@192.168.111.201
$ ssh-copy-id sysops@192.168.111.202
$ ssh-copy-id sysops@192.168.111.203
$ ssh-copy-id sysops@192.168.111.204

 

각 노드마다 아래 실행

echo "master ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops
echo "node1 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops
echo "node2 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops
echo "node3 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops

Disable Firewall and Enable IPV4 forwarding

ansible all -i inventory/mycluster/hosts.yaml -m shell -a "sudo systemctl stop firewalld && sudo systemctl disable firewalld"
ansible all -i inventory/mycluster/hosts.yaml -m shell -a "echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf"
ansible all -i inventory/mycluster/hosts.yaml -m shell -a "sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab && sudo swapoff -a"

Start Kubernetes deployment

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

 

몇가지 경고문들 챗gpt검색

[WARNING]: While constructing a mapping from /root/kubespray/roles/bootstrap-os/tasks/main.yml, line 29, column 7, found a duplicate dict key (paths). Using last defined value only.
 

이 경고 메시지는 Ansible에서 발생하는 것으로, main.yml 파일 내에서 동일한 키(예: paths)가 여러 번 정의되었음을 의미합니다. Ansible은 중복된 키 중 마지막으로 정의된 값을 사용합니다. 이는 일반적으로 무시할 수 있는 경고지만, 잘못된 동작을 유발할 수 있으므로 확인 및 수정하는 것이 좋습니다.


문제 원인

  • main.yml 파일의 특정 위치(예: 29번째 줄)에서 paths라는 키가 중복으로 정의되었습니다.
  • YAML 파일에서 동일한 키를 여러 번 정의하면, 마지막 값만 유효하게 적용됩니다.

해결 방법

  1. 문제 발생 위치 확인
    경고 메시지에 따라 /root/kubespray/roles/bootstrap-os/tasks/main.yml 파일의 29번째 줄을 열어 확인하세요:
  2. bash
    코드 복사
    nano /root/kubespray/roles/bootstrap-os/tasks/main.yml
  3. 중복된 키 확인 및 수정
    예를 들어, 파일에서 아래와 같은 내용이 있다면:위와 같은 중복 정의를 하나로 합치세요:
  4. yaml
    코드 복사
    paths: - /some/path/1 - /some/path/2
  5. yaml
    코드 복사
    paths: - /some/path/1 paths: - /some/path/2
  6. 파일 저장 및 테스트
    파일을 저장한 후 Ansible 작업을 다시 실행하여 경고가 제거되었는지 확인합니다.

추가 팁

  • YAML 유효성 검사
    수정한 파일이 올바른 YAML 형식인지 확인하려면 다음 명령어를 사용하세요:
  • bash
    코드 복사
    yamllint /root/kubespray/roles/bootstrap-os/tasks/main.yml
  • 경고 무시
    위 경고는 심각한 오류가 아니므로 무시해도 됩니다. 하지만 같은 키의 중복이 의도된 것인지 확인하는 것이 중요합니다.

 

설치완료


잘 설치 됬는지 아래 명령어로 확인

kubectl get nodes
kubectl get pods -A

 

kubeadmin으로하면 정말 힘들엏던거같은데 ㅋㅋㅋㅋㅋ


kubectl create deployment demo-nginx-kubespray --image=nginx --replicas=2
kubectl expose deployment demo-nginx-kubespray --type NodePort --port=80
kubectl get  deployments.apps
kubectl get pods
kubectl get svc demo-nginx-kubespray

쿠버네티스 대시보드

vi dashboard-adminuser.yml
##########
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
##########

kubectl apply -f dashboard-adminuser.yml


vi admin-role-binding.yml
######
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
###########


kubectl apply -f admin-role-binding.yml

kubectl -n kube-system  create token admin-user

##터널링
ssh -L8001:localhost:8001 master@192.168.111.201
kubectl proxy

 

터널링 통해 접근 성공

반응형