파드의 /etc/hosts 는 kubelet 이 파드를 만들 때 새로 생성한다. 파드 IP 와 호스트명, 로컬호스트 항목이 들어간다. 노드의 /etc/hosts 를 고치고 파드를 재시작해도 반영되지 않는다.
컨테이너 안에 들어가 손으로 고치는 것도 답이 아니다. 파드가 재생성되면 사라지고, 같은 Deployment 의 다른 파드에는 적용되지 않는다.
파드 사양에 hostAliases 를 쓴다. kubelet 이 기본 항목 뒤에 이 내용을 덧붙인다.
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
hostAliases:
- ip: "10.10.0.21"
hostnames:
- "legacy-db.internal"
- "legacy-db"
- ip: "10.10.0.22"
hostnames:
- "reporting.internal"
containers:
- name: app
image: nginx
Deployment · StatefulSet 에서는 spec.template.spec 아래에 같은 형태로 넣는다.
기존 항목을 덧붙이는 것이지 덮어쓰는 것이 아니다. 파드 자신의 IP·호스트명 항목은 그대로 남는다. 반대로 말하면, kubelet 이 넣은 항목을 hostAliases 로 바꿀 수는 없다.
hostNetwork: true 인 파드에는 hostAliases 가 적용되지 않는다. 그 파드는 노드의 /etc/hosts 를 그대로 쓴다.
가능은 하지만 권하지 않는다.
volumeMounts:
- name: hosts
mountPath: /etc/hosts
subPath: hosts
subPath 로 마운트한 파일은 ConfigMap 을 고쳐도 자동으로 갱신되지 않는다. 파드를 다시 만들어야 한다. 그리고 파드 자신의 IP 항목이 사라지므로 자기 호스트명을 못 푸는 애플리케이션이 생긴다. hostAliases 로 해결되는 상황이라면 그쪽을 쓴다.
hostAliases 는 매니페스트마다 중복되고, 대상 IP 가 바뀌면 전부 고쳐야 한다. 항목이 몇 개를 넘어가면 다른 방법을 본다.
ExternalName Service 또는 엔드포인트를 직접 지정한 Service 를 만든다.hosts 플러그인이나 스텁 도메인을 설정한다. 한 곳만 고치면 클러스터 전체에 적용된다.# CoreDNS ConfigMap 일부
hosts /etc/coredns/customhosts internal {
10.10.0.21 legacy-db.internal
fallthrough
}
네임스페이스 전체를 재시작하려고 아래를 실행하는 경우가 있다.
kubectl delete all --all -n <namespace>
all 은 "그 네임스페이스의 모든 것" 이 아니라 일부 리소스 종류의 별칭이다. Pod · Service · Deployment · StatefulSet · DaemonSet · ReplicaSet · Job · CronJob 등이 들어간다.
문제는 두 가지다.
파드만 다시 띄우고 싶었다면 이렇게 한다.
# 컨트롤러는 그대로 두고 파드만 교체 — 권장
kubectl -n <namespace> rollout restart deployment --all
kubectl -n <namespace> rollout restart statefulset --all
# 파드만 지운다. 컨트롤러가 다시 만든다
kubectl -n <namespace> delete pod --all
rollout restart 는 순차 교체라 무중단에 가깝고, delete pod --all 은 전부 동시에 내려간다.
복구 경로는 배포 방식에 달렸다.
# Helm 으로 배포했다면
helm -n <namespace> list -a
helm -n <namespace> get manifest <release>
helm -n <namespace> rollback <release> <revision>
# Operator 가 관리한다면 CR 이 남아 있는지 본다
kubectl -n <namespace> get <crd-kind>
Operator 기반 배포(Cloudera CDP 등)는 CR 이 살아 있으면 Operator 가 하위 리소스를 다시 만든다. 이 경우 delete all 의 피해가 제한적이다.
매니페스트도 Helm 릴리스도 없다면 벤더 지원 절차를 따르는 수밖에 없다. 정기적으로 매니페스트를 백업해 둔다.
kubectl -n <namespace> get all -o yaml > backup-all.yaml
kubectl -n <namespace> get cm,secret,pvc,ingress -o yaml > backup-rest.yaml