본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

OpenStack에서 Calico 업그레이드

원문 보기 위키 갱신

OpenStack에 설치된 Calico Open Source를 업그레이드하는 방법을 안내해요. CentOS 또는 Ubuntu 기반의 컴퓨트 노드와 컨트롤 노드에서 시스템 패키지를 갱신하는 절차를 다뤄요. v3.32 이전 버전에서 올라올 때 필요한 정책 데이터 마이그레이션도 함께 설명해요.

출처: 문서

본문

Calico 패키지 업데이트

시작하기 전에 각 릴리스에서 주의해야 할 변경 사항을 업그레이드 노트에서 확인해요.

이 페이지는 이전 두 Calico 릴리스에서 v3.33으로 업그레이드하는 내용을 다뤄요.

절차는 Linux 배포판에 따라 달라요.

v3.32보다 이전 버전에서 업그레이드한다면 패키지 업그레이드 후에 정책 데이터 마이그레이션을 한 번 실행해야 해요. 아래의 정책 데이터 마이그레이션을 참고하세요.

SECONDARY: 업그레이드 후에는 구버전 calicoctl을 사용하지 마세요. 예상치 못한 동작과 데이터가 생길 수 있어요.

CentOS 기반 OpenStack 클러스터 업그레이드

  1. 모든 노드에서 Calico 패키지 위치가 v3.33 저장소를 가리키도록 바꿔요:

    sudo sed -i 's/calico-X.X/calico-Y.Y/g' /etc/yum.repos.d/calico.repo
    

    X.X는 업그레이드 전 버전으로, Y.Y는 업그레이드할 버전으로 바꾸세요. 둘 다 v 접두사 없이 주 버전과 부 버전 숫자만 적어요.

  2. 모든 컴퓨트 노드에서 패키지를 업데이트해요:

    sudo yum update
    

    여기서 보여주는 것처럼 배포판 전체를 업그레이드하는 것을 권장해요. 특정 패키지만 업그레이드하고 싶다면, Calico 컴퓨트 노드에 필요한 패키지는 다음과 같아요.

    • calico-common
    • calico-compute
    • calico-dhcp-agent
    • calico-felix
    • dnsmasq
    • networking-calico
    • openstack-neutron
    • openstack-nova-api
    • openstack-nova-compute
  3. 컴퓨트 노드에서 다음 명령으로 Felix가 v3.33으로 업그레이드됐는지 확인해요.

    calico-felix --version
    

    v3.33이 반환되어야 해요.

  4. 모든 컴퓨트 노드에서 /etc/calico/felix.cfg의 데이터스토어 타입이 etcdv3인지 확인해요:

    DatastoreType = etcdv3
    

    EtcdEndpoints 주소를 바꿔야 한다면(예: 기존 etcdv2 클러스터를 업그레이드하는 대신 새 etcdv3 클러스터를 설치한 경우) 이 시점에 /etcd/calico/felix.cfg의 EtcdEndpoints 주소를 업데이트해야 해요.

  5. 모든 컨트롤 노드에서 패키지를 업데이트해요:

    sudo yum update
    

    여기서 보여주는 것처럼 배포판 전체를 업그레이드하는 것을 권장해요. 특정 패키지만 업그레이드하고 싶다면, Calico 컨트롤 노드에 필요한 패키지는 다음과 같아요.

    • calico-common
    • calico-control
    • networking-calico
    • openstack-neutron
  6. 모든 컨트롤 노드에서 neutron-server를 재시작해요:

    sudo systemctl restart neutron-server
    
  7. 이전에 OpenStack 외부 데이터를 마이그레이션하려고 calico-upgrade를 실행했다면 컨트롤 노드에서 다음을 실행해요:

    calico-upgrade complete
    
  8. 기존 calicoctl 인스턴스를 모두 제거하고 새 calicoctl을 설치해요.

  9. v3.32 이전 버전에서 업그레이드한다면 정책 데이터 마이그레이션을 실행해요.

  10. 축하해요! Calico v3.33으로 업그레이드를 마쳤어요.

Ubuntu 기반 OpenStack 클러스터 업그레이드

  1. 모든 노드에서 Calico 패키지 위치가 v3.33 저장소를 가리키도록 바꿔요:

    sudo bash -c 'cat > /etc/apt/sources.list.d/project-calico-calico-X_X-trusty.list' << EOF
    deb http://ppa.launchpad.net/project-calico/calico-X.X/ubuntu trusty main
    # deb-src http://ppa.launchpad.net/project-calico/calico-X.X/ubuntu trusty main
    EOF
    

    X_X와 X.X는 업그레이드할 버전으로 바꾸세요. v 접두사 없이, 각각 밑줄과 점으로 적어요. 그리고 trusty도 사용 중인 Ubuntu 버전의 코드명으로 바꾸세요.

  2. 모든 컴퓨트 노드에서 패키지를 업데이트해요:

    sudo apt-get update
    sudo apt-get install calico-compute calico-felix calico-common \
                         networking-calico calico-dhcp-agent
    
    
  3. 컴퓨트 노드에서 다음 명령으로 Felix가 v3.33으로 업그레이드됐는지 확인해요.

    calico-felix --version
    

    v3.33이 반환되어야 해요.

  4. 모든 컴퓨트 노드에서 /etc/calico/felix.cfg의 데이터스토어 타입이 etcdv3인지 확인해요:

    DatastoreType = etcdv3
    

    EtcdEndpoints 주소를 바꿔야 한다면(예: 기존 etcdv2 클러스터를 업그레이드하는 대신 새 etcdv3 클러스터를 설치한 경우) 이 시점에 /etcd/calico/felix.cfg의 EtcdEndpoints 주소를 업데이트해야 해요.

  5. 모든 컨트롤 노드에서 패키지를 업데이트해요:

    sudo apt-get update
    sudo apt-get install calico-control calico-common networking-calico
    
  6. 모든 컨트롤 노드에서 neutron-server를 재시작해요:

    sudo service neutron-server restart
    
  7. 이전에 OpenStack 외부 데이터를 마이그레이션하려고 calico-upgrade를 실행했다면 컨트롤 노드에서 다음을 실행해요:

    calico-upgrade complete
    
  8. 기존 calicoctl 인스턴스를 모두 제거하고 새 calicoctl을 설치해요.

  9. v3.32 이전 버전에서 업그레이드한다면 정책 데이터 마이그레이션을 실행해요.

  10. 축하해요! Calico v3.33으로 업그레이드를 마쳤어요.

v3.32 이전에서 업그레이드할 때 정책 데이터 마이그레이션

Calico v3.32에서는 etcd 데이터스토어에 저장되는 정책 이름 규칙이 바뀌었어요. 기본 티어의 정책은 이제 순수 이름(접두사 없는 이름)으로 저장되지만, Calico v3.29.4부터 v3.31.x까지는 default.my-policy처럼 티어 접두사가 붙은 이름으로 저장했어요. Kubernetes 클러스터에서는 이 데이터가 kube-controllers에 의해 자동으로 마이그레이션돼요. OpenStack 클러스터는 kube-controllers를 서비스로 실행하지 않기 때문에, 같은 마이그레이션을 업그레이드 후에 직접 한 번 실행해야 해요.

이 단계를 건너뛰면, 업그레이드 전에 만들어진 정책들이 각각 마이그레이션되거나 다시 만들어지기 전까지 아래와 같이 잘못 동작해요:

  • calicoctl get, calicoctl delete 같은 명령은 그런 정책을 저장된 이름으로만 찾아요. 예를 들어 calicoctl get globalnetworkpolicy default.my-policy처럼요. 순수 이름으로 조회하면 리소스가 존재하지 않는다고 나와요.

  • 순수 이름으로 그런 정책을 다시 적용하면 기존 정책을 업데이트하는 게 아니라 별개의 두 번째 정책 객체가 만들어져요. 그래서 둘 중 하나를 삭제하기 전까지 두 객체가 모두 살아 있는 정책으로 동작해요.

  • Felix의 LogPrefix 구성에 있는 %n, %p 지정자는 저장된 이름으로 확장되기 때문에, 업그레이드 전 정책의 로그 항목에는 default. 접두사가 붙고 새로 작성된 정책의 항목에는 붙지 않아요.

시작하기 전에

  • 먼저 모든 노드를 업그레이드하세요. 마이그레이션을 실행하기 전에 모든 Felix 인스턴스(컴퓨트 노드)와 모든 neutron-server 인스턴스(컨트롤 노드)가 Calico v3.32 이상으로 동작하고 있어야 해요. Kubernetes 클러스터에서는 이 순서가 자동으로 검증되지만, OpenStack에서는 여러분이 직접 챙겨야 해요.

  • calicoctl을 설치하고 구성하세요. 최소 한 개 이상의 클러스터 노드에서 calicoctl을 성공적으로 실행할 수 있어야 해요.

  • 중복 정책을 정리하세요. 업그레이드 이후에 정책을 이미 다시 적용했다면 중복 쌍이 생겼을 수 있어요. calicoctl get globalnetworkpolicy 목록에 같은 정책 이름이 두 번 나오고, 하나는 티어가 default로, 다른 하나는 티어 열이 비어 있는 경우죠. 각 쌍에 대해 두 객체를 비교해 보세요:

    calicoctl get globalnetworkpolicy default.my-policy -o yaml
    calicoctl get globalnetworkpolicy my-policy -o yaml
    

    순수 이름 객체가 원하는 spec을 담고 있는지 확인했다면, 레거시 객체를 삭제해요:

    calicoctl delete globalnetworkpolicy default.my-policy
    

    중복 쌍을 직접 정리하지 않으면, 마이그레이션이 순수 이름 객체를 남기고 레거시 객체를 삭제해요.

마이그레이션 실행

calicoctl이 설치되어 있고 etcd 데이터스토어에 접근하도록 구성된 아무 머신에서 다음을 실행해요:

calicoctl datastore migrate-policy-names

검증

업그레이드 전에 만들어진 정책을 하나 골라서, 이제 순수 이름으로 접근할 수 있는지 확인해요:

calicoctl get globalnetworkpolicy my-policy

그리고 레거시 이름이 사라졌는지도 확인해요:

calicoctl get globalnetworkpolicy default.my-policy

두 번째 명령은 리소스가 존재하지 않는다고 알려 주면 돼요.

더 알아보기 (Learn more)

OpenStack에서의 Calico 업그레이드는 배포판별 패키지 저장소를 바꾸는 방식으로 진행해요. v3.32 이전에서 올라올 때는 정책 이름 규칙 변경 때문에 수동 마이그레이션이 꼭 필요해요. 업그레이드 전에 릴리스별 업그레이드 노트를 꼭 읽어 보세요.