Kubespray로 Kubernetes 클러스터 생성하기
사전 작업
- 최소 필요 조건
- 2 CPU
- 2 GB memory
- 모든 노드에 대한 고유한 호스트 이름, MAC 주소, prodcut_uuid
ip link
sudo cat /sys/class/dmi/id/product_uuid
cat /proc/cgroups | column -t
모두 enabled 상태
프로젝트 생성
컨테이너 사용하기
kubespray의 기본 기능만 사용하면서 인벤토리만 관리하면 된다면 컨테이너를 활용하는 것이 편리합니다.
podman run --rm -it \
-v <path>:/mycluster \
quay.io/kubespray/kubespray:v2.24.0 \
cp -rfp /kubespray/inventory/sample /mycluster/inventory
./
└── inventory/
├── group_vars/
│ └── ...
├── hosts.yaml
└── patches/
└── ...
아래 명령어로 컨테이너 내에서 작업을 하면 됩니다.
podman run --rm -it \
-v $PWD/inventory:/kubespray/inventory \
-e ANSIBLE_STDOUT_CALLBACK=yaml \
quay.io/kubespray/kubespray:v2.24.0 \
bash
git submodule 사용하기
추가적인 플래이북을 만들어서 사용해야하는 경우 git submodule을 사용하는 것이 편리합니다.
git submodule add https://github.com/kubernetes-sigs/kubespray.git upstream \
&& pushd upstream \
&& git checkout v2.24.0 \
&& popd
cp -rfp upstream/inventory/sample inventory
cp upstream/ansible.cfg ansible.cfg \
&& sed -i \
-e 's/\(^stdout_callback = \).*$/\1yaml/g' \
-e 's/\(^library =.*\)/\1:upstream\/library/g' \
-e 's/\(^roles_path =.*\)/\1:upstream\/roles/g' ansible.cfg
for playbook in cluster.yml recover-control-plane.yml remove-node.yml reset.yml scale.yml upgrade-cluster.yml; do
cat <<EOF > $playbook
---
- name: Import upstream/$playbook
ansible.builtin.import_playbook: upstream/$playbook
EOF
done
./
├── ansible.cfg
├── cluster.yml
├── inventory/
│ ├── group_vars/
│ │ └── ...
│ ├── hosts.yaml
│ └── patches/
│ └── ...
├── recover-control-plane.yml
├── remove-node.yml
├── reset.yml
├── scale.yml
├── upgrade-cluster.yml
└── upstream/
└── ...
인벤토리 작성
- 인벤토리 작성은 Inventory를 참고하시면 됩니다.
inventory/hosts.yaml
all:
hosts:
<hostname>:
ansible_host: <host> # ansible이 접근 가능한 주소
ip: <ip> # Node IP
access_ip: <ip>
etcd:
hosts:
<hostname>:
kube_control_plane:
hosts:
<hostname>:
kube_node:
hosts:
<hostname>:
bastion:
hosts: {}
# Calico Route Reflector
calico_rr:
hosts: {}
k8s_cluster:
# 수정하지 마세요.
children:
kube_control_plane:
kube_node:
클러스터 생성
./
├── inventory/
│ ├── group_vars/
│ │ ├── all/
│ │ │ ├── all.yml
│ │ │ └── ...
│ │ ├── k8s_cluster/
│ │ │ ├── addons.yml
│ │ │ ├── k8s-cluster.yml
│ │ │ └── ...
│ │ └── etcd.yml
│ ├── hosts.yaml
│ └── patches/
│ └── ...
└── ...
- group_vars/
- k8s_cluster/
- k8s-cluster.yml: 클러스터의 기본 구성을 설정합니다.
kube_owner: root
: 일부 파일이나 디렉토리의 소유자를 설정합니다.kube_oidc_*
: kube-apiserver에 OIDC 관련 설정을 추가합니다.kube_network_plugin: <cni>
calico
: 기본값입니다.cni
: 기본적으로 필요한 cni 플러그인들만 설치합니다.
supplementary_addresses_in_ssl_keys: []
: api-server 인증서에 추가할 IP 또는 domain 목록입니다.
- addons.yml: metrics-server, metallb 등 클러스터에 추가할 애드온을 설정합니다.
- k8s-cluster.yml: 클러스터의 기본 구성을 설정합니다.
- k8s_cluster/
- HA
- 다운로드
- https://kubespray.io/#/docs/downloads?id=downloading-binaries-and-containers
download_run_once: <bool>
- 필요한 파일을 한 노드에서 다운로드 받은 후 다른 노드로 전달할지 여부를 설정합니다.
true
로 설정하면download_cache_dir
에 다운로드 받은 파일을 캐싱합니다.
download_localhost: <bool>
- Ansible control 노드에 다운로드 받을지 여부를 설정합니다.
true
로 설정한 경우- Ansibl control 노드에서 컨테이너 런타임 실행이 가능해야합니다.
container_manager_on_localhost: docker|nerdctl|crictl
image_command_tool_on_localhost: docker|nerdctl|crictl
- 컨테이너 런타임을 실행하기 위해 유저가 docker 그룹에 속해있거나 암호 없이 sudo를 실행할 수 있어야합니다.
- Ansibl control 노드에서 컨테이너 런타임 실행이 가능해야합니다.
false
로 설정하면kube_control_plane[0]
노드에 다운로드 받습니다.
retry_stagger: <seconds>
: 다운로드 실패 시 재시도 간격을 설정합니다.
- 기타
kubelet_fail_swap_on: <bool>
kubelet_swap_behavior: UnlimitedSwap|LimitedSwap
kubelet_feature_gates: ["<key>=<value>"]
node_labels: {"<key>": "<value>"}
node_taints: ["<key>=<value>:<effect>"]
ansible-playbook -i inventory -b cluster.yml \
-e kubeconfig_localhost=true
클러스터 삭제
ansible-playbook -i inventory -b reset.yml