설치 시점에 특정 버전 지정하기

197

Notes

이 문서는 Ubuntu 에 Kubernetes 를 설치할 때 특정 버전의 바이너리를 지정해서 처리하는 방법을 설명하는 것이기 때문에 전체 설치 과정을 다루고 있지 않습니다.

설치에 관련된 문서는 iamartin 님 블로그에 kubeadm을 이용해서 아주 쉽게 Kubernetes 설치하기 에 상세하게 기술되어 있으므로 이 부분을 참고하시면 됩니다. (향후 변경된 사항이나 요청이 있다면 정리된 버전을 추가로 올릴 수도 있습니다)

참고로 Kubernetes 를 설치하는 도구들은 상당히 많이 존재하며 향후 kubeadm 으로 통합될 것으로 개인적인 예상을 하고 있기 때문에 다른 설치 도구에 대한 부분은 따로 정리하지 않고 있습니다.

Kubernetes 특정 버전으로 구성하기

이 문서를 정리한 이유는 Kubernetes가 버전 향상 작업을 수시로 진행하고 있고, 각 종 설치 도구는 latest 버전을 대상으로 운영되고 있기 때문에 솔루션 개발 중이거나 또는 다른 이유로 버전을 고정해야 할 경우가 있을 수 있기 때문입니다.

기본 설치 관련 정보

ubuntu 에서 설치는 초기에 아래와 같이 4 단계의 작업을 거치게 됩니다. 물론 kubeadm을 사용하는 경우는 다른 환경에서도 거의 유사하게 사용됩니다.

  1. Apt Key 생성

    1
    $ curl http://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
  2. Kubernetes Source Repository 생성 (데비안 패키지)

    1
    2
    3
    cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
    deb http://apt.kubernetes.io/ kubernetes-xenial main
    EOF
  3. Apt Repository 갱신

    1
    apt-get update
  4. 필수 프로그램 설치

    1
    2
    apt-get install -y docker.io
    apt-get install -y kubelet kubeadm kubectl kubernetes-cni

위의 단계를 거치고 나면 Kubernetes 설치에 필요한 기본 패키지들이 준비된 것입니다.

Notes 다운로드한 바이너리들에 대한 특정 버전을 지정하는 방법은 아래의 예와 같이 각 Component 별로 버전 식별 정보를 지정하면 됩니다.

1
$ sudo apt-get -y install kubectl=1.5.3-00 kubelet=1.5.3-00 kubernetes-cni=0.3.0.1-07a8a2-00

버전 정보 확인하기

재미있는 부분은 위의 설치 2번째 작업에서 처리한 데비안 패키지의 내용을 아래의 경로에서 확인을 해 보면 최근에 릴리즈된 정보가 다 구성되어 있다는 것으로 위의 소스 리파지토리 설정 정보를 이용해서 아래와 같은 URL 로 패키지 정보 검증이 가능합니다.

Notes 지금까지 발표된 모든 Release가 아니고 최근에 발표된 버전이 기준입니다. 따라서 1.5 이전 버전을 사용해야 하는 상황이라면 이 문서에 정리된 내용은 맞지 않습니다.

1
$ https://packages.cloud.google.com/apt/dists/kubernetes-xenial/main/binary-amd64/Packages

아래의 그림은 위의 경로에서 확인한 패키지 정보를 일부 발췌한 내용입니다.

Kubernetes xenial main 패키지 일부

위의 그림에서 박스로 표시한 것처럼 kubelet 이 1.5.1 ~ 1.6.1 까지 구성 (위의 빨간 박스) 되어 있는 것을 볼 수 있으며, 각 구성 요소에 의존적인 다른 패키지의 버전과 관련된 Depends (위의 파란 박스) 정보가 구성된 것을 볼 수 있습니다.

따라서 처음에는 특정 릴리즈 버전의 정보만을 가져오는 것에 대해 검토를 했지만, 위의 정보를 확인하고 나서는 다운로드된 바이너리들을 어떻게 버전을 지정해서 처리하는지에 대한 것만 결정하고 설정하면 됩니다.

kubeadm 초기화할 때 버전 지정

Kubernetes Master Node 의 초기화는 아래와 같은 명령을 기본으로 사용합니다.

1
kubeadm init

위의 초기화 명령에 사용할 수 있는 다양한 옵션들 중에 Kuberenetes 의 바이너리 구성 버전을 지정할 수 있습니다.

  • --kubernetes-version: 기본 값은 lastest 로 설정되어 있으며 원하는 Kubernetes 버전을 지정하면 됩니다. 단, 이때 지정할 버전은 릴리즈 페이지 를 참고하면 됩니다.

Kubeadm 자체 버전 문제

위의 Kubernetes 패키지 (xenial main) 에는 kubeadm 1.6.1 만 존재하기 때문에 Kubernetes 1.6 버전만 처리가 가능합니다. 정확하게는 Depends 로 kubelet >= 1.6.0, kubectl >= 1.6.0 제한이 걸려 있기 때문에 1.6.0 또는 1.6.1 로만 구성이 가능합니다.

따라서 현재 상황에서 1.5.1 ~ 1.5.6 까지의 Kubernetes 버전을 구성할 수 없는 상태입니다.

Kubeadm 특정 버전 처리하기

위에서 Kubernetes의 버전 문제라기 보다는 Kubeadm 버전 문제 떄문에 Kubernetes 1.6.0 이전 설정이 안되는 문제를 확인했기 때문에 이번에는 Kubeadm 의 버전을 처리하는 방법으로 설정해야 합니다.

Notes Kubernetest 1.6.0 을 설정하는 경우는 이 부분을 처리하지 않아도 처리가 가능합니다. Kubernetes 버전 지정으로 진행하시면 됩니다.

아래의 스크립트는 현재 버전 1.6.1 기준으로 특정한 버전 (ex. 1.5.3) 을 설정하기 위해서 kubeadm 을 재 설정하는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ apt-get update && apt-get install -y apt-transport-https
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
$ apt-get update

# 위의 처리까지는 기존과 크게 다르지 않습니다. 아래부터는 Kubernetes 의 특정한 버전을 지정하는 부분입니다.
$ sudo apt-get -y install kubectl=1.5.3-00 kubelet=1.5.3-00 kubernetes-cni=0.3.0.1-07a8a2-00

# 아래는 Kubernetes 1.5 버전을 처리하기 위해서 kubeadm 을 설정하는 부분입니다.
$ curl -Lo /tmp/old-kubeadm.deb https://apt.k8s.io/pool/kubeadm_1.6.0-alpha.0.2074-a092d8e0f95f52-00_amd64_0206dba536f698b5777c7d210444a8ace18f48e045ab78687327631c6c694f42.deb
$ sudo dpkg -i /tmp/old-kubeadm.deb
$ sudo apt-get install -f

# 아래는 업그레이드되는 것을 방지하기 위해서 버전을 유지하기 위한 것입니다.
sudo apt-mark hold kubeadm kubectl kubelet kubernetes-cni

위의 같이 기본적인 설정 및 바이너리 다운로드는 동일하지만 kubeadm 을 이전 버전으로 다운로드하여 설정하고 버전을 고정하는 방식으로 처리하면 됩니다.

Important 현재 프로젝트를 마무리하고 나온 상태라서 위의 정리된 내용을 실제 검증한 것은 아니기 때문에 다소 내용과 실제가 맞지 않을 수 있습니다. 따라서 환경이 구성된 후에 위의 정리된 내용과 다른 부분은 갱신을 할 예정입니다.


References

  • https://gist.github.com/jbeda/5e8a4ce0a23711da146e51900859c037

Written by Morris (ccambo@gmail.com - MSFL)


공유하기