들어가며
- 도커이미지는 빌드된 플랫폼과 동일한 아키텍처의 플랫폼에서 실행이 가능합니다.
- 컨테이너 생성시 지정된 이미지가 pull되는 과정을 확인할 수 있는데, 이때 레포지토리에서 자신의 아키텍처에 맞는 이미지를 가져오게됩니다.
ex) busybox:latest 이미지를 사용하는 컨테이너 생성시. docker hub에 등록된 busybox:latest 이미지중 사용 현재 아키텍처에 맞는 이미지를 pull.
- 이미지 레포지토리를 넥서스로 사용하는 스파클링소다3.0 설치시 서로 다른 아키텍처의 서버가 k8s 클러스터링 되어있는 경우 다음과 같은 문제가 발생합니다.
Nexus 레포지토리 kube-proxy 이미지의 태그 상이. - 스파클링소다 3.0 설치시 넥서스에는 x86 이미지와 ppc 이미지의 경로가 다릅니다.
kube-proxy-daemonset.yaml 을 생성할 경우 해당 데몬셋에 지정한 이미지를 사용. image: repo.sparklingsoda.io:12000/k8s/kube-proxy:v1.16.14 따라서 위의 예시에 노드1에 스케줄된 kube-proxy 파드는 정상적으로 실행되지만 노드2에 스케줄된 kube-proxy 파드는 아키텍처에 맞지 않는 이미지를 받아왔기 때문에 실행되지 못합니다.
- 서로 다른 아키텍처의 서버가 k8s 클러스터링 되어있는 경우 아키텍처별 이미지를 대표하는 이미지를 생성하여 이러한 문제를 해결할 수 있습니다. (multi manifest)
Multi Manifest 사용
docker manifest 기능은 실험적 기능이므로 도커 설정을 변경해주어야 사용가능한 옵션입니다.
/etc/docker/daemon.json
"experimental": "enabled"
- 대표이미지를 등록하려면 아키텍처별 이미지를 nexus의 같은 depth에 위치시켜야합니다. (tag로 분기)
도커 공식 사이트에서는 아래와 같이 가이드하고 있지만 depth가 다를 경우 manifest create시 에러발생
- 대표이미지를 생성합니다.
docker manifest create --insecure repo.sparklingsoda.io:12000/test/grafana:5.2.4 \ repo.sparklingsoda.io:12000/test/grafana:5.2.4-x86 \ repo.sparklingsoda.io:12000/test/grafana:5.2.4-ppc64le
- 생성된 대표이미지에 대한 상세 정보를 확인합니다.
docker manifest inspect repo.sparklingsoda.io:12000/test/grafana:5.2.4
{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 2419, "digest": "sha256:ebe3543213712c9cfa679189bc20e33c66ecbd6934e13b6a05d6e6e86ea1e09b", "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 2416, "digest": "sha256:e25227828920f83ddf5ff2ef948c6cfa3cb1aa2e414509c2487226a17b65715a", "platform": { "architecture": "ppc64le", "os": "linux" } } ] }
- 대표이미지를 푸쉬합니다.
docker manifest push --insecure repo.sparklingsoda.io:12000/test/grafana:5.2.4
- 파드 생성시 대표이미지의 태그를 사용하면 pull 받는 노드의 x86/ppc 아키텍처에 맞게 받을 수 있습니다.
마치며
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.