이번 파이프라인 작업과 무관하게 작업 트리에 남아 있던 것을 그대로 올린다. 사용자가 「전부 커밋」으로 정했고, 이번 작업과 섞이지 않게 커밋만 나눴다. 대부분은 clean-architecture-backend-template 의 그림 정본 재배치다 — final/assets/diagrams/<이름>/ 에 있던 것이 CLAUDE.md 가 적은 배치인 final/assets/<이름>/ 로 옮겨졌고 .techviz/<이름>/ 이 함께 들어왔다. 삽입 줄의 대부분(3.15M)이 그 .techviz context.json 이다. 그 밖에 ca-tmpl·document-haness 의 정리, .claude/agents/ 열한 개, writing-practitioner-guides 스킬, .playwright-mcp 세션 산출물, scripts/check-ssot-facts.py 와 그 시험이 들어 있다. 이 커밋의 내용은 내가 만든 것이 아니라 이전 세션이 남긴 것이고 검증하지 않았다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
73 lines
2.6 KiB
Markdown
73 lines
2.6 KiB
Markdown
# Kubernetes — what to reach for first
|
|
|
|
Order matters. Widen first, then narrow.
|
|
|
|
## 무엇이 있나
|
|
```bash
|
|
kubectl get pods # 이름 · 상태 · 재시작 횟수
|
|
kubectl get pods -o wide # + 노드 · 파드 IP
|
|
kubectl get all # 워크로드 계열만. Secret·PVC·Ingress 는 안 나온다
|
|
kubectl get secret,configmap,pvc,ingress
|
|
```
|
|
|
|
## 왜 이 파드가 이런가
|
|
```bash
|
|
kubectl describe pod <pod> # 이벤트가 여기 붙는다 — 로그보다 먼저 본다
|
|
kubectl logs <pod>
|
|
kubectl logs <pod> --previous # CrashLoop 이면 죽은 이유는 여기 있다
|
|
kubectl logs <pod> -c <container> # 컨테이너가 여럿일 때
|
|
kubectl events --for pod/<pod>
|
|
kubectl get events --sort-by=.lastTimestamp | tail -20
|
|
```
|
|
|
|
## 사슬을 따라간다
|
|
```bash
|
|
kubectl get deploy,rs,pod -l app=<label>
|
|
```
|
|
Deployment 는 파드를 직접 만들지 않는다. ReplicaSet 을 만들고 그것이 파드를
|
|
만든다. RS 가 여러 개 남아 있는 것은 정상이며(배포 이력) 활성인 것만 0 이 아니다.
|
|
|
|
StatefulSet 은 RS 를 쓰지 않고 파드를 직접 만든다 — 이름이 고정이라
|
|
`Terminating` 이 안 풀리면 대체 파드가 생기지 않는다.
|
|
|
|
## Service 가 파드를 잡고 있나
|
|
```bash
|
|
kubectl describe svc <svc> | grep -i endpoints
|
|
kubectl get endpointslice -l kubernetes.io/service-name=<svc>
|
|
```
|
|
`kubectl get endpoints` 는 v1.33+ 에서 deprecated 다.
|
|
|
|
비어 있으면 셀렉터와 라벨이 안 맞거나 readiness 미통과다.
|
|
```bash
|
|
kubectl get svc <svc> -o jsonpath='{.spec.selector}'
|
|
kubectl get pods --show-labels
|
|
```
|
|
|
|
## Secret 이 실제로 들어갔나 — 값은 찍지 않는다
|
|
```bash
|
|
kubectl get secret <s> -o jsonpath='{.data}' | tr ',' '\n' | grep -o '"[A-Z_]*"' # 키 이름만
|
|
kubectl get secret <s> -o jsonpath='{.data.<KEY>}' | base64 -d | wc -c # 길이만
|
|
kubectl exec <pod> -- sh -c 'echo ${#MY_ENV}' # 파드 안 주입 확인
|
|
```
|
|
|
|
## 적용과 대기
|
|
```bash
|
|
kubectl apply -f <file>
|
|
kubectl rollout status deploy/<name> --timeout=180s # 끝날 때까지 블록한다
|
|
kubectl rollout undo deploy/<name>
|
|
```
|
|
|
|
## 안에서 볼 때
|
|
```bash
|
|
kubectl exec -it <pod> -- sh
|
|
kubectl port-forward svc/<svc> 8080:80
|
|
kubectl debug -it <pod> --image=busybox --target=<container> # 최소 이미지에 도구가 없을 때
|
|
```
|
|
|
|
**최소 이미지에는 `curl` 도 `wget` 도 없다.** Keycloak 공식 이미지가 그렇다
|
|
(`exit 127`). 밖에서 물어보거나 임시 파드를 띄운다.
|
|
```bash
|
|
kubectl run tmp --rm -it --restart=Never --image=curlimages/curl:8.11.1 -- \
|
|
curl -s http://<podIP>:9000/metrics
|
|
```
|