Kubernetes/실습

[Kubernetes] kubespray 를 사용한 k8s 설치

아무일도없었다 2023. 5. 15. 18:20

[시스템 구성]

Master 1 , Worker 3 의 k8s 구성

 

1. 방화벽 해제 + swapoff (모든 Node에서 수행)

systemctl stop firewalld
systemctl disable firewalld
swapoff -a

 

2. SSH Key 생성 및 복사

  • ssh 생성 ( Master Node 에서만 root 계정으로 진행 ! )
ssh-keygen -t rsa

ssh 생성 (기본 경로는 /root/.ssh )

 

  • Master Node 에서 생성된 public key 를 Master Node 와 Worker Node 의 ~/.ssh/authorized_keys 에 복사
# Master Node 의 pub key 확인
cat ~/.ssh/id_rsa.pub

cat 으로 key 값 확인 후 복사

# .ssh 폴더 생성 (Master Node 는 이미 있음)
mkdir ~/.ssh

# 위에서 생성한 Makster ssh public key 를 복사
echo {Your Master SSH Pub Key} > ~/.ssh/authorized_keys

# key 확인
cat ~/.ssh/authorized_keys

Master Node SSH public Key 를 모든 Node 에 복사

 

3. kubespray 설치

이 아래의 모든 내용은 Master Node 에서만 root 계정으로 진행 ! 

 

  • git 설치
yum install -y git

 

  • python 설치
yum install -y python3-pip

 

2022-12-29 기준 최신 버전 : v2.20.0
tag 확인

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

 

kubespray 폴더 확인

 

  • Ansible 외 필수 Package 설치
# git clone 으로 생성된 kubespray 경로
cd kubespray

# pip install
pip install -r requirements.txt

ansible, jinja ... package 설치

 

  • inventory 설정
# Copy ``inventory/sample`` as ``inventory/mycluster``
cp -rfp inventory/sample inventory/mycluster

# inventory.ini 설정
vi inventory/mycluster/inventory.ini
# ## Configure 'ip' variable to bind kubernetes services on a
# ## different ip than the default iface
# ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.
[all]
node1 ansible_host=10.10.36.103 ip=10.10.36.103 # etcd_member_name=etcd1
node2 ansible_host=10.10.36.104 ip=10.10.36.104
node3 ansible_host=10.10.36.105 ip=10.10.36.105
node4 ansible_host=10.10.36.106 ip=10.10.36.106

# ## configure a bastion host if your nodes are not directly reachable
# [bastion]
# bastion ansible_host=x.x.x.x ansible_user=some_user

[kube_control_plane]
node1

[etcd]
node1

[kube_node]
node2
node3
node4

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

(node1 을 control_plane 으로만 사용하며, [kube_node] 에 node1 을 추가하면 Master Node 겸 Worker Node 로 사용이 가능하다.)

 

  • ansible playbook 을 통한 kubernetes 설치
ansible-playbook -i inventory/mycluster/inventory.ini -become --become-user=root cluster.yml

 

 

4. kubernetes 설치 확인

 이 아래의 모든 내용은 Master Node 에서만 root 계정으로 진행 ! 

 

# API Server 통신을 위한 인증파일 복사
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# k8s node 확인
kubectl get nodes

정상적으로 동작 확인

 


 

[ 2023-05-15 내용 추가 ]

ansible playbook 을 사용하여 kubernetes 설치하는 과정에서 nginx 또는 다른 image pull 이 실패하는 경우가 발생하였다.

 

TASK [download : download_container | Download image if required] ********************************
fatal: [node2]: FAILED! => {"attempts": 4, "changed": true, "cmd": ["/usr/local/bin/nerdctl", "-n", "k8s.io", "pull", "--quiet", "--insecure-registry", "docker.io/library/nginx:1.23.0-alpine"], "delta": "0:00:05.686363", "end": "2023-05-14 23:45:11.437687", "msg": "non-zero return code", "rc": 1, "start": "2023-05-14 23:45:05.751324", "stderr": "time=\"2023-05-14T23:45:05-04:00\" level=warning msg=\"skipping verifying HTTPS certs for \\\"docker.io\\\"\"\ntime=\"2023-05-14T23:45:11-04:00\" level=fatal msg=\"failed to copy: httpReadSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/library/nginx/manifests/sha256:4a846cc240449c53c8ae24269ba6bcaee5167d8ad75cd2a8d8ba422b7c726979: 429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit\"", "stderr_lines": ["time=\"2023-05-14T23:45:05-04:00\" level=warning msg=\"skipping verifying HTTPS certs for \\\"docker.io\\\"\"", "time=\"2023-05-14T23:45:11-04:00\" level=fatal msg=\"failed to copy: httpReadSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/library/nginx/manifests/sha256:4a846cc240449c53c8ae24269ba6bcaee5167d8ad75cd2a8d8ba422b7c726979: 429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit\""], "stdout": "", "stdout_lines": []}

 

원인을 찾아보니 Docker Hub의 Pull Limit 정책으로 인해 실패하는 것이었다.

https://docs.docker.com/docker-hub/download-rate-limit/

 

Download rate limit

 

docs.docker.com

 

위의 Error 로그를 참고해서 직접 터미널로 명령어를 날려보면 동일한 에러가 나온다.

[root@node1 kubersprary] /usr/local/bin/nerdctl -n "k8s.io" pull --insecure-registry "docker.io/library/nginx:1.23.0-alpine"
WARN[0000] skipping verifying HTTPS certs for "docker.io" 
docker.io/library/nginx:1.23.0-alpine:                                         resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:4a846cc240449c53c8ae24269ba6bcaee5167d8ad75cd2a8d8ba422b7c726979: downloading    |--------------------------------------|    0.0 B/1.6 KiB 
elapsed: 5.3 s                                                                 total:   0.0 B (0.0 B/s)                                         
FATA[0005] failed to copy: httpReadSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/library/nginx/manifests/sha256:4a846cc240449c53c8ae24269ba6bcaee5167d8ad75cd2a8d8ba422b7c726979: 429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

 

kubespray github을 참고해도 마땅한 답이 나오지 않아서 엄청난 삽질을 했는데 해결방안은 생각보다 간단했다.

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

 

Docker Rate limit on docker.io/library/nginx:1.23.0-alpine imagepull · Issue #9548 · kubernetes-sigs/kubespray

OS (printf "$(uname -srm)\n$(cat /etc/os-release)\n"): Linux 3.10.0-1160.80.1.el7.x86_64 x86_64 NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="...

github.com

 

우선 Docker Hub가 아닌 사설 docker registry 구축을 진행해야한다. (구축 방법은 여기서 기술하지 않는다.)

 

그 이후 kubesprary/roles/download/defaults/main.yml 파일에서 image pull에 실패하는 녀석을 찾아서 수정하면 된다.

image pull에 실패하는 repo를 변경

필자의 경우 nginx image pull 이 자꾸 실패해서 nginx_image_repo를 내부망의 docker registry 로 변경하였다.

 

그 이후 다시 ansible playbook 을 수행하면 잘 수행된다.

반응형