kube-vip이란?
kube-vip은 Kubernetes 클러스터 내에서 가상 IP(VIP)를 제공하는 경량의 load-balancer 입니다. 클러스터의 HA를 보장하기 위해 API 서버의 접근 포인트로서 중요한 역할을 하고 이는 특히 Static-pod으로 구성하여 클러스터에 통합할 때 더욱 유용하다. 오늘은 kube-vip를 설정하는 방법을 알아보겠다.
설치 전 준비사항
- 기존 Kubernetes 클러스터: 이미 설치된 클러스터가 있어야 합니다.
- kube-vip 준비: kube-vip 설치 파일과 필요한 구성 요소를 준비합니다.
kube-vip의 추가 기능
- Control-plane VIP:
--controlplane플래그를 사용하면 kube-vip가 컨트롤 플레인에 사용될 가상 IP를 제공하고 광고합니다. - Service Load Balancer:
--services플래그를 사용하면 Kubernetes 내부에서 생성된 서비스 리소스에 대한 로드 밸런싱을 제공합니다.
이번에는 Control-plane VIP를 사용해 보도록 하겠다.
manifest 생성을 위한 환경 변수 설정
환경 변수 설정
- VIP 주소와 인터페이스 이름을 설정합니다.
export VIP=192.168.0.40
export INTERFACE=ens160
kube-vip 릴리스 버전 설정
- 최신 버전을 자동으로 가져오거나 수동으로 설정할 수 있습니다.
# 최신 버전을 불러오는 방법
KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")
# 지정된 버전을 사용하는 방법
export KVVERSION=v0.5.0
컨테이너 런타임에 따른 kube-vip 명령 설정
kube-vip 매니페스트를 생성하기 위한 명령은 사용하는 컨테이너 런타임에 따라 달라집니다. 다음은 각 런타임을 위한 설정 방법이다.
containerd 사용 시
alias kube-vip="ctr image pull ghcr.io/kube-vip/kube-vip:$KVVERSION; ctr run --rm --net-host ghcr.io/kube-vip/kube-vip:$KVVERSION vip /kube-vip"
Docker 사용 시
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION"
manifest 파일을 설정하는 법
- 방금 alias로 설정한 명령어를 통해 manifest파일 을 생성한다.
- 지금은 controlplane,service 설정 둘 다 되어 있지만 controlplane 3중화를 할려면 controlplane 부분만 설정해주면 된다.
manifest 설정 명령어
kube-vip manifest pod \ --interface $INTERFACE \ --address $VIP \ --controlplane \ --services \ --arp \ --leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml
manifest 설정 결과
- manifest 설정을 하기 싫다면 이 파일을 copy 하여 변수만 바꿔서 사용하면 된다.
- 대표적으로 바꿔야 할 변수는
- vip, port ,vip_interface,address가 있다.
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: kube-vip
namespace: kube-system
spec:
containers:
- args:
- manager
env:
- name: vip_arp
value: "true"
- name: port
value: "6443"
- name: vip_nodename
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: vip_interface
value: ens18
- name: vip_cidr
value: "32"
- name: dns_mode
value: first
- name: cp_enable
value: "true"
- name: cp_namespace
value: kube-system
- name: svc_enable
value: "true"
- name: svc_leasename
value: plndr-svcs-lock
- name: vip_leaderelection
value: "true"
- name: vip_leasename
value: plndr-cp-lock
- name: vip_leaseduration
value: "5"
- name: vip_renewdeadline
value: "3"
- name: vip_retryperiod
value: "1"
- name: address
value: 192.168.0.50
- name: prometheus_server
value: :2112
image: ghcr.io/kube-vip/kube-vip:v0.8.0
imagePullPolicy: IfNotPresent
name: kube-vip
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
volumeMounts:
- mountPath: /etc/kubernetes/admin.conf
name: kubeconfig
hostAliases:
- hostnames:
- kubernetes
ip: 127.0.0.1
hostNetwork: true
volumes:
- hostPath:
path: /etc/kubernetes/admin.conf
name: kubeconfig
status: {}
생성결과

, ARP 방식을 사용할 경우, 생성된 manifest 파일을 /etc/kubernetes/manifests/kube-vip.yaml에 저장합니다. 이 manifest 첫 번째 컨트롤 플레인 노드에서 실행이 필요하다.
아래와 같이 kube-vip-master가 뜬 것을 확인 할 수 있다.
[root@master1 istio-base]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-dccd4fb69-8r22d 1/1 Running 0 42h
coredns-dccd4fb69-wjdkh 1/1 Running 0 42h
etcd-master1 1/1 Running 0 42h
kube-apiserver-master1 1/1 Running 0 42h
kube-controller-manager-master1 1/1 Running 0 42h
kube-flannel-ds-pwxp6 1/1 Running 0 42h
kube-flannel-ds-tm7kl 1/1 Running 0 42h
kube-flannel-ds-ws4xb 1/1 Running 0 42h
kube-proxy-7psq6 1/1 Running 0 42h
kube-proxy-ncgwl 1/1 Running 0 42h
kube-proxy-zr9gh 1/1 Running 0 42h
kube-scheduler-master1 1/1 Running 0 42h
kube-vip-master1 1/1 Running 0 155m
이로써 글을 마치도록 하겠다. 다음에는 이 kube-vip를 통해 control-plane을 3중화 하는 챕터를 가져 보도록 하겠다.
control-plane 3중화는 API 서버 Load Balancing과, HA에 아주 중요한 역할을 한다. 다음 글도 꼭 참고하여 완벽한 kubernetes 구축을 진행 할 수 있도록 하자!