Kubernetes 의 CNI 플러그인은 가상의 네트워크 환경을 구현하여 클러스터 내부에서 파드 간의 통신이 가능하게 해준다. 공통의 CNI 인터페이스에 맞춰 여러 플러그인이 존재하며 각각의 장단점을 가지고 있다. 그렇기에 클러스터를 운영하다보면 요건에 따라 CNI 플러그인을 변경해야 하는 경우도 발생한다. 이번에는 이런 CNI 플러그인의 마이그레이션을 진행해보자.
Kubernetes 클러스터의 CNI 플러그인 변경(여기서는 제목과 동일하게 Weave에서 Calico 로 변경하는 과정을 예로든다)은 아래와 같은 과정으로 나눌 수 있다.
- 기존 네트워크 설정이 올바르게 작동되어 있는지 확인하기
- Weave 삭제
- Calico 설치
CNI 를 변경하는 과정에서 파드 간의 네트워크 통신이 단절될 수도 있으며, Node 의 상태가 NotReady 로 변경되는 시간이 발생할 수 있다. 운영 중인 클러스터의 경우 네트워크 단절 상황을 고려하고 진행하도록 하자. 특정 플러그인의 경우 상호 협력을 통해 live-migration 을 지원하는 경우도 있다. Flannel과 Calico 의 CNI migration 이 이와 같은 경우에 해당하며 여기에서 그 내용을 확인할 수 있다. (명시적으로 migration-job.yaml 형태로 지원한다)
1. 기존 네트워크 설정 확인
하단의 명령어로 클러스터의 service, pod cidr 을 확인할 수 있다.
### Service IPs Range
kubectl cluster-info dump | grep -m 1 service-cluster-ip-range
### POD IPs Range
kubectl cluster-info dump | grep -m 1 cluster-cidr
위 명령어를 통하여 'kube-apiserver 의 --service-cluster-ip-range CIDR' 값과 'kube-proxy 의 --cluster-cidr 값' 이 중복되지 않는지 확인한다. 기존 클러스터가 정상적으로 동작하고 있었을 경우 문제가 되지 않는 부분이므로 생략하고 넘어가자.
2. 기존 CNI 삭제
클러스터의 기존 설정이 정상적으로 동작하는 것을 확인하였을 경우, 이제 기존 CNI를 삭제한다. 기존에 설치했던 yaml script 를 가지고 있는 경우 이 파일을 그대로 이용하여 삭제할 수 있으며, 동적으로 구성되있는 k8s 객체를 각각 삭제할 수도 있다. CNI 변경의 경우 클러스터 전체의 네트워크 통신에 큰 영향을 미칠 수 있으므로, 반드시 기존 CNI 의 설정값을 백업해둔 뒤에 삭제를 진행한다. 백업을 포함한 삭제 명령어는 아래와 같으며 step 2번의 경우 3개 중 1가지 방법으로 삭제를 진행하면 된다.
### Step 1. 기존 CNI 설정 백업
kubectl get -o yaml --export -n kube-system daemonset weave-net > weave-net-ds.yaml
kubectl get -o yaml --export -n kube-system rolebinding weave-net > weave-net-rb.yaml
kubectl get -o yaml --export -n kube-system role weave-net > weave-net-role.yaml
kubectl get -o yaml --export -n kube-system clusterrolebinding weave-net > weave-net-crb.yaml
kubectl get -o yaml --export -n kube-system clusterrole weave-net > weave-net-crole.yaml
kubectl get -o yaml --export -n kube-system serviceaccount weave-net > weave-net-sa.yaml
### Step 2-1. 기존 설치 파일을 통해 삭제
kubectl delete -f weave-net.yaml
### Step 2-2. URL로 설치 파일을 획득하여 삭제
kubectl delete -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
### Step 2-3. 동적 객체 자체를 개별적으로 삭제
kubectl delete -n kube-system daemonset weave-net
kubectl delete -n kube-system rolebinding weave-net
kubectl delete -n kube-system role weave-net
kubectl delete -n kube-system clusterrolebinding weave-net
kubectl delete -n kube-system clusterrole weave-net
kubectl delete -n kube-system serviceaccount weave-net
이와 같이 기존 Kubernetes에서 Weave CNI 를 제거한 후에는 각 노드에 남아있는 CNI의 실행파일과 설정파일을 제거 해서 새로 구동되는 CNI 와의 충돌을 변경해야 한다. 크게 다음의 2가지 과정으로 나눌 수 있다.
- CNI 바이너리 파일과 설정파일 삭제
- 네트워크 인터페이스 삭제
위 2가지 동작 수행에 대한 명령어는 하단과 같으며 다른 CNI의 세부 설정이 조금 상이할 수 있으므로 각 CNI에 맞게 확인하도록 하자. 특히 CNI default 디렉토리를 사용하지 않은 경우 별도로 설정한 디렉토리에 있는 실행파일과 설정파일을 제거해줘야 한다. 설정에 따라서는 네트워크 인터페이스 삭제를 위하여 노드 재부팅이 필요한 경우도 있다.
### CNI 바이너리 파일 삭제
rm -f /opt/cni/bin/weave*
### CNI 구성 설정 파일 삭제
rm -f /etc/cni/net.d/*weave*
### 네트워크 인터페이스 삭제
ip link delete weave
3. 신규 CNI 설치
다음으로 신규 CNI 를 설치한다. 설치 과정은 삭제와 동일하게 k8s manifest 파일을 이용하여 간단하게 설치할 수 있다.
Calico 의 설정에 대한 내용은 별도의 포스팅으로 다룰 예정이며, 여기서는 기본 manifest 파일을 이용한다.
kubectl apply -f calico.yaml
*추가(2021-10-07)
CNI를 변경한 경우에도 Linux iptable에 아직 이전 CNI의 룰이 남아있을 수 있다. 하단의 명령어를 사용하여 iptable을 초기화 시켜준 후에 리붓해준다. (변경된 CNI 룰은 초기화되어 리붓되면서 다시 생성된다.)
iptables -F
# 이후 reboot
'소프트웨어 아키텍처' 카테고리의 다른 글
KubeEdge concept (0) | 2021.09.24 |
---|---|
Container Network Interface : CNI (0) | 2021.09.03 |
Container 기반기술 : Namespace (0) | 2021.09.02 |
클라우드 컴퓨팅 : Introduction to cloud computing (0) | 2021.08.27 |
Edge Computing 과 Kube Edge (2) | 2020.04.10 |
댓글