볼륨이 제대로 붙는지, 서비스 이름이 풀리는지, 다른 파드로 연결이 되는지 확인할 때 쓰는 임시 파드다. 애플리케이션을 올리기 전에 이것으로 환경을 먼저 검증하면 원인 범위를 좁힐 수 있다.
가장 간단한 방법이다. 셸을 빠져나오면 파드가 사라진다.
kubectl run -it --rm nettest --image=busybox:1.36 --restart=Never -n test -- sh
네트워크를 볼 때는 도구가 더 많이 든 이미지가 편하다. nslookup · dig · curl · tcpdump 가 모두 들어 있다.
kubectl run -it --rm nettest --image=nicolaka/netshoot --restart=Never -- bash
PVC 가 실제로 붙는지, 쓰기가 되는지 보려면 파드를 하나 띄워 마운트한다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
namespace: test
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: busybox-test
namespace: test
labels:
app: busybox-test
spec:
containers:
- name: busybox
image: busybox:1.36
command: ["sh", "-c", "sleep infinity"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: test-pvc
kubectl -n test exec -it busybox-test -- sh -c 'id; ls -ln /data; touch /data/ok && echo write-ok'
ls -ln 으로 숫자 UID 를 본다. 쓰기가 막히면 볼륨 권한 — fsGroup 과 UID 매핑 으로 간다.
이미 만들어 둔 PV 를 지정해 쓰고 싶으면 PVC 에 volumeName 을 적는다.
spec:
volumeName: mypv
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
BusyBox 이미지에는 bash 가 없다. busybox:glibc 도 마찬가지로 glibc 로 빌드된 것일 뿐 bash 를 담고 있지 않다. command 에 /bin/bash 를 적으면 컨테이너가 바로 죽고 CrashLoopBackOff 가 된다. sh 를 쓰거나, bash 가 필요하면 alpine 에 bash 를 설치한 이미지나 다른 베이스를 쓴다.
컨테이너를 살려 두는 명령은 sleep infinity 가 무난하다. sleep 3600 은 한 시간 뒤 종료되고 재시작이 반복된다.
BusyBox 는 포트를 듣지 않으므로 Service 를 붙여도 접속되지 않는다. HTTP 응답이 필요하면 httpd 를 띄운다.
command: ["sh", "-c", "echo hello > /www/index.html && httpd -f -p 8080 -h /www"]
파드가 어디에 스케줄되는지가 중요한 확인(노드별 NFS 마운트 상태 등)이라면 nodeName 이나 nodeSelector 로 노드를 지정한다.
확인이 끝나면 지운다. 테스트 파드가 남아 자원을 잡고 있는 경우가 흔하다.
kubectl -n test delete pod busybox-test
kubectl -n test delete pvc test-pvc