[시스템 구성]
1. 방화벽 해제 + swapoff (모든 Node에서 수행)
systemctl stop firewalld
systemctl disable firewalld
swapoff -a
2. SSH Key 생성 및 복사
- ssh 생성 ( ※ Master Node 에서만 root 계정으로 진행 ! )
ssh-keygen -t rsa
- Master Node 에서 생성된 public key 를 Master Node 와 Worker Node 의 ~/.ssh/authorized_keys 에 복사
# Master Node 의 pub key 확인
cat ~/.ssh/id_rsa.pub
# .ssh 폴더 생성 (Master Node 는 이미 있음)
mkdir ~/.ssh
# 위에서 생성한 Makster ssh public key 를 복사
echo {Your Master SSH Pub Key} > ~/.ssh/authorized_keys
# key 확인
cat ~/.ssh/authorized_keys
3. kubespray 설치
※ 이 아래의 모든 내용은 Master Node 에서만 root 계정으로 진행 !
- git 설치
yum install -y git
- python 설치
yum install -y python3-pip
- kubespray git clone (아래 github 링크에서 최신 버전 확인 후 git clone)
( https://github.com/kubernetes-sigs/kubespray )
git clone -b v2.20.0 https://github.com/kubernetes-sigs/kubespray.git
- Ansible 외 필수 Package 설치
# git clone 으로 생성된 kubespray 경로
cd kubespray
# pip install
pip install -r requirements.txt
- 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/
위의 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 Hub가 아닌 사설 docker registry 구축을 진행해야한다. (구축 방법은 여기서 기술하지 않는다.)
그 이후 kubesprary/roles/download/defaults/main.yml 파일에서 image pull에 실패하는 녀석을 찾아서 수정하면 된다.
필자의 경우 nginx image pull 이 자꾸 실패해서 nginx_image_repo를 내부망의 docker registry 로 변경하였다.
그 이후 다시 ansible playbook 을 수행하면 잘 수행된다.
'Kubernetes > 실습' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 구축 총 정리 (containerd) (2) | 2024.11.02 |
---|---|
[Kubernetes] Worker (slave) node upgrade (0) | 2024.03.22 |
[Kubernetes] Control plane (master) node upgrade (0) | 2024.03.14 |
[kubernetes] control-plane(master) node 설치 과정(cri-o) (0) | 2024.03.13 |