블로그 불러오는 중...
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml 안에 보면 로컬 설치 폴더가 /tmp/release 로 되어 있고, 해당 폴더에 실제로 다운이 되었는지 확인 해 본다.

root@k8s-ctr:~/kubespray# cat inventory/mycluster/group_vars/all/all.yml | grep 'bin_dir' bin_dir: /usr/local/bin

root@k8s-ctr:~/kubespray# cat inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml | grep kube_owner
kube_owner: kube
해당 유저가 소유자인 파일 검색해 본다.
find / -user kube 2>/dev/null

실제로 해당 유저로 생성 된 것이 있는데 이것때문에 cilium 의 경우 이슈가 있을 수 있다고 한다. 링크


이번 실습을 하면서 timer 라는 게 있는지 처음 알았다. 마지막에 보면 타이머가 등록 되어 있는 것을 볼 수 있다.
내용을 확인 해 보자
root@k8s-ctr:~/kubespray# cat /etc/systemd/system/k8s-certs-renew.timer
[Unit]
Description=Timer to renew K8S control plane certificates
[Timer]
OnCalendar=Mon *-*-1,2,3,4,5,6,7 03:00:00
RandomizedDelaySec=10min
FixedRandomDelay=yes
Persistent=yes
[Install]
WantedBy=multi-user.targetroot@k8s-ctr:~/kubespray# cat /etc/systemd/system/k8s-certs-renew.service
[Unit]
Description=Renew K8S control plane certificates
[Service]
Type=oneshot
ExecStart=/usr/local/bin/k8s-certs-renew.sh안에 있는 shell 파일을 확인해 본다.,
중간에 보면 인증서를 갱신하고 /usr/local/bin/crictl pods --namespace kube-system --name 'kube-scheduler-*|kube-controller-manager-*|kube-apiserver-*|etcd-*' -q | /usr/bin/xargs /usr/local/bin/crictl rmp -f
명령어를 통해 삭제 하고 다시 올리는 코드가 있는데, 우리가 기존에 실습했었을 때 manifest 파일을 삭제했다가 복구하는 식으로 했는데, 더 좋은 방식이라고 생각 된다.
etcd 설치 전 유저를 만든다.

실제로 유저와 그룹이 만들어 진 것을 알 수 있다.
os 에 kubelet 기동을 위한 설정들이 모여 있다
tree roles/container-engine/ -L 2
입력 시 컨테이너 관련 폴더들이 보인다.
graph TD
A[Start: Container Engine Role] --> B[OS 호환성 확인 및 패키지 설치]
B --> C[커널 모듈 로드<br/>overlay, br_netfilter]
subgraph "Binary Installation"
C --> D[runc 설치]
D --> E[CNI Plugins 설치]
E --> F[Containerd 바이너리 배치]
end
subgraph "Configuration"
F --> G[config.toml 생성<br/>SystemdCgroup 설정]
G --> H[Registry Mirror 설정<br/>certs.d 구성]
end
H --> I[Systemd 서비스 등록 및 실행]
I --> J[crictl / nerdctl 도구 설정]
J --> End[Finish: Container Engine 준비 완료]
style F fill:#e3f2fd,stroke:#2196f3
style G fill:#fff3e0,stroke:#ff9800
style I fill:#c8e6c9,stroke:#2e7d32
kubespray 는 패키지 형태로 설치하는게 아닌 특정 버전을 고정해서 설치한다.
containerd 는 roles/container-engine/containerd/ 설정이 있다.
설치된 값을 하나 확인 해 본다.

TASK [network_plugin/cni : CNI | make sure /opt/cni/bin exists] ****************
ok: [k8s-ctr] => {"changed": false, "gid": 0, "group": "root", "mode": "0755", "owner": "kube", "path": "/opt/cni/bi
n", "secontext": "unconfined_u:object_r:usr_t:s0", "size": 6, "state": "directory", "uid": 990}
TASK [network_plugin/cni : CNI | Copy cni plugins] *****************************
changed: [k8s-ctr] => {"changed": true, "dest": "/opt/cni/bin", "extract_results": {"cmd": ["/usr/bin/gtar", "--extr
act", "-C", "/opt/cni/bin", "-z", "--owner=kube", "-f", "/tmp/releases/cni-plugins-linux-arm64-1.8.0.tgz"], ...
TASK [network_plugin/cni : CNI | make sure /opt/cni/bin exists] ****************
...
TASK [network_plugin/cni : CNI | Copy cni plugins] *****************************
ok: [k8s-ctr] => {"changed": false, "dest": "/opt/cni/bin", "gid": 0, "group": "root", "handler": "TgzArchive", "mod
e": "0755", "owner": "kube", "secontext": "unconfined_u:object_r:usr_t:s0", "size": 4096, "src": "/tmp/releases/cni-plugin
s-linux-arm64-1.8.0.tgz", "state": "directory", "uid": 990}
cat roles/network_plugin/cni/defaults/main.yml
---
cni_bin_owner: "{{ kube_owner }}"
cat roles/network_plugin/cni/tasks/main.yml
---
- name: CNI | make sure /opt/cni/bin exists
file:
path: /opt/cni/bin
state: directory
mode: "0755"
owner: "{{ cni_bin_owner }}"
recurse: true
- name: CNI | Copy cni plugins
unarchive:
src: "{{ downloads.cni.dest }}"
dest: "/opt/cni/bin"
mode: "0755"
owner: "{{ cni_bin_owner }}"
remote_src: true
tree -ug /opt/cni/bin
[kube root ] /opt/cni/bin
├── [kube root ] bandwidth
├── [kube root ] bridge
├── [kube root ] dhcp
├── [kube root ] dummy
├── [kube root ] firewall
├── [root root ] flannel
├── [kube root ] host-device
├── [kube root ] host-local
├── [kube root ] ipvlan
├── [kube root ] LICENSE
├── [kube root ] loopback
├── [kube root ] macvlan
├── [kube root ] portmap
├── [kube root ] ptp
├── [kube root ] README.md
├── [kube root ] sbr
├── [kube root ] static
├── [kube root ] tap
├── [kube root ] tuning
├── [kube root ] vlan
└── [kube root ] vrf해당 CNI 가 생성 된 것을 확인할 수 있다.
위에 kube owner 로 설치되어 있는데, kube 로 설치했던 그대로 설정된 것을 확인 할 수 있다.
그리고 copy cni plugin 롤을 보면 /opt/cni.bin 에 설치하는 것을 볼 수 있고, 그 부분을 확인 해 본다.

helm, metric server 등 설치를 확인해 본다. helm
아까 설정에서, metrics_server 설치한 내용이 있는 것을 확인 할 수 있다.

root@k8s-ctr:~# helm version
version.BuildInfo{Version:"v3.18.4", GitCommit:"d80839cf37d860c8aa9a0503fe463278f26cd5e2", GitTreeState:"clean", GoVersion:"go1.24.4"}
...4주차 실습의 경우도 많은 내용이 있었다. 아직도 ansible 문법을 제대로 아는 건 아니지만 보다 보니, 좀 익숙해 진 것 같다.
실무에서 써본 적이 없어 깊은 내용은 없지만, 실습을 해보면서 마법같은 kubespray 의 내용을 조금이나마 알 수 있었다.