I noticed a couple of issues when creating a loadbalancer service using kube-vip.
Could you please take a look at it? Thank you.
Issue number 1. Cannot change VIP for the service that did not have hardcoded loadBalancerIP.
My setup:
kubectl apply -f https://kube-vip.io/manifests/rbac.yaml
KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name"
)
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION"
kube-vip manifest daemonset --services --inCluster --arp --interface eth0 | kubectl apply -f -
kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifes
t/kube-vip-cloud-controller.yaml
echo $KVVERSION
v0.4.0
The service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
# not present initially
#loadBalancerIP: XXX.YY.77.148
selector:
app: nginx
ports:
# By default and for convenience, the `targetPort` is set to the same value as the `port` field.
- port: 80
targetPort: 80
# Optional field
# By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767)
nodePort: 30080
protocol: TCP
The kubevip configmap:
apiVersion: v1
kind: ConfigMap
metadata:
name: kubevip
namespace: kube-system
data:
cidr-global: XXX.YY.77.148/32,XXX.YY.77.149/32
Initial setup logs for the above loadbalancer service.
Log from kube-vip-cloud-provider-0
I1117 01:43:38.982374 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuringLoadBalancer" message="Ensuring load balancer"
I1117 01:43:39.133704 1 loadBalancer.go:149] syncing service 'nginx-service' (035b0b4c-48ac-42bf-90bb-6b90406b7ed5)
I1117 01:43:39.134248 1 loadBalancer.go:229] No cidr config for namespace [default] exists in key [cidr-default] configmap [kubevip]
I1117 01:43:39.134263 1 loadBalancer.go:234] Taking address from [cidr-global] pool
I1117 01:43:39.134321 1 loadBalancer.go:190] Updating service [nginx-service], with load balancer IPAM address [XXX.YY.77.148]
E1117 01:43:39.201644 1 controller.go:275] error processing service default/nginx-service (will retry): failed to ensure load balancer: Error updating Service Spec [nginx-service] : Operation cannot be fulfilled on services "nginx-service": the object has been modified; please apply your changes to the latest version and try again
I1117 01:43:39.201788 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Warning" reason="SyncLoadBalancerFailed" message="Error syncing load balancer: failed to ensure load balancer: Error updating Service Spec [nginx-service] : Operation cannot be fulfilled on services \"nginx-service\": the object has been modified; please apply your changes to the latest version and try again"
I1117 01:43:44.204320 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuringLoadBalancer" message="Ensuring load balancer"
I1117 01:43:44.271326 1 loadBalancer.go:149] syncing service 'nginx-service' (035b0b4c-48ac-42bf-90bb-6b90406b7ed5)
I1117 01:43:44.271372 1 loadBalancer.go:229] No cidr config for namespace [default] exists in key [cidr-default] configmap [kubevip]
I1117 01:43:44.271387 1 loadBalancer.go:234] Taking address from [cidr-global] pool
I1117 01:43:44.271401 1 loadBalancer.go:190] Updating service [nginx-service], with load balancer IPAM address [XXX.YY.77.148]
I1117 01:43:44.428180 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuredLoadBalancer" message="Ensured load balancer"
Log from kube-vip-ds
[kube-vip-ds-vhkxp] time="2021-11-17T01:43:38Z" level=info msg="Service [nginx-service] has been addded/modified, it has no assigned external addresses"
[kube-vip-ds-vhkxp] time="2021-11-17T01:43:39Z" level=info msg="Service [nginx-service] has been addded/modified, it has no assigned external addresses"
[kube-vip-ds-vhkxp] time="2021-11-17T01:43:44Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.148]"
[kube-vip-ds-vhkxp] time="2021-11-17T01:43:44Z" level=info msg="New VIP [XXX.YY.77.148] for [nginx-service/035b0b4c-48ac-42bf-90bb-6b90406b7ed5] "
OK, that worked
$ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 6d10h
nginx-service LoadBalancer 10.43.157.128 XXX.YY.77.148 80:30080/TCP 19s
However, if I try to update the service now w/ loadBalancerIP, it fails.
I set "loadBalancerIP" XXX.YY.77.149 in the loadbalancer service, and apply it with k apply -f file.
Log from kube-vip-cloud-provider-0
I1117 01:49:27.706107 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="LoadbalancerIP" message="XXX.YY.77.148 -> XXX.YY.77.149"
I1117 01:49:27.706484 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuringLoadBalancer" message="Ensuring load balancer"
I1117 01:49:27.800194 1 loadBalancer.go:149] syncing service 'nginx-service' (035b0b4c-48ac-42bf-90bb-6b90406b7ed5)
I1117 01:49:27.800583 1 loadBalancer.go:164] found existing service 'nginx-service' (035b0b4c-48ac-42bf-90bb-6b90406b7ed5) with vip XXX.YY.77.148
I1117 01:49:27.801227 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuredLoadBalancer" message="Ensured load balancer"
Log from kube-vip-ds
[kube-vip-ds-vhkxp] time="2021-11-17T01:49:27Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.149]"
kubectl - Issue here is that vip is not updated to XXX.YY.77.149
$ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 6d10h
nginx-service LoadBalancer 10.43.157.128 XXX.YY.77.148 80:30080/TCP 7m40s`
So, I delete the service now.
$ k delete -f ../tmp/test-loadbalancer.yaml
deployment.apps "nginx-deployment" deleted
service "nginx-service" deleted
Log from kube-vip-cloud-provider-0
I1117 01:54:27.307074 1 loadBalancer.go:96] deleting service 'nginx-service' (035b0b4c-48ac-42bf-90bb-6b90406b7ed5)
I1117 01:54:27.307543 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="DeletingLoadBalancer" message="Deleting load balancer"
I1117 01:54:27.477461 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="DeletedLoadBalancer" message="Deleted load balancer"
Log from kube-vip-ds
[kube-vip-ds-vhkxp] time="2021-11-17T01:54:27Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.149]"
[kube-vip-ds-vhkxp] time="2021-11-17T01:54:27Z" level=info msg="[LOADBALANCER] Stopping load balancers"
[kube-vip-ds-vhkxp] time="2021-11-17T01:54:27Z" level=info msg="[VIP] Releasing the Virtual IP [XXX.YY.77.148]"
[kube-vip-ds-vhkxp] time="2021-11-17T01:54:27Z" level=info msg=Stopped
[kube-vip-ds-vhkxp] time="2021-11-17T01:54:27Z" level=info msg="Removed [035b0b4c-48ac-42bf-90bb-6b90406b7ed5] from manager, [0] advertised services remain"
[kube-vip-ds-vhkxp] time="2021-11-17T01:54:27Z" level=info msg="Service [nginx-service] has been deleted
Now, I add service back in still with XXX.YY.77.149 hardcoded and that works, but keep going ...
$ k apply -f ../tmp/test-loadbalancer.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
Log from kube-vip-cloud-provider-0
I1117 01:58:06.109447 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuringLoadBalancer" message="Ensuring load balancer"
I1117 01:58:06.612550 1 loadBalancer.go:149] syncing service 'nginx-service' (28dec8dc-d5dc-4d70-92b7-a1da283f3940)
I1117 01:58:06.704250 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuredLoadBalancer" message="Ensured load balancer"
Log from kube-vip-ds
[kube-vip-ds-vhkxp] time="2021-11-17T01:58:06Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.149]"
[kube-vip-ds-vhkxp] time="2021-11-17T01:58:06Z" level=info msg="New VIP [XXX.YY.77.149] for [nginx-service/28dec8dc-d5dc-4d70-92b7-a1da283f3940] "
[kube-vip-ds-vhkxp] time="2021-11-17T01:58:06Z" level=info msg="Starting advertising address [XXX.YY.77.149] with kube-vip"
[kube-vip-ds-vhkxp] time="2021-11-17T01:58:06Z" level=info msg="Started Load Balancer and Virtual IP"
[kube-vip-ds-vhkxp] time="2021-11-17T01:58:06Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.149]"
[kube-vip-ds-vhkxp] time="2021-11-17T01:58:06Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.149]"`
However, this is where the issue number 2 comes in.
If I now, delete the loadbalancer service and add it back in with a new hardcoded loadBalancerIP XXX.YY.77.148, it fails to assign the desired VIP.
Log from kube-vip-cloud-provider-0 (delete followed by add)
Delete
I1117 02:10:27.676977 1 loadBalancer.go:96] deleting service 'nginx-service' (dfa8a94a-f5b0-443a-9228-a5b984c778fe)
I1117 02:10:27.678238 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="DeletingLoadBalancer" message="Deleting load balancer"
I1117 02:10:27.822216 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="DeletedLoadBalancer" message="Deleted load balancer"
Add with loadbalancerip XXX.YY.77.148
I1117 02:11:52.265166 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuringLoadBalancer" message="Ensuring load balancer"
I1117 02:11:52.388895 1 loadBalancer.go:149] syncing service 'nginx-service' (ce7a213f-cece-41a5-88e4-e5cd8f8552e2)
I1117 02:11:52.425914 1 event.go:291] "Event occurred" object="default/nginx-service" kind="Service" apiVersion="v1" type="Normal" reason="EnsuredLoadBalancer" message="Ensured load balancer"
Log from kube-vip-ds (delete followed by add)
Delete
[kube-vip-ds-vhkxp] time="2021-11-17T02:10:27Z" level=info msg="[VIP] Releasing the Virtual IP [XXX.YY.77.149]"
[kube-vip-ds-vhkxp] time="2021-11-17T02:10:27Z" level=info msg=Stopped
[kube-vip-ds-vhkxp] time="2021-11-17T02:10:27Z" level=info msg="Removed [dfa8a94a-f5b0-443a-9228-a5b984c778fe] from manager, [0] advertised services remain"
[kube-vip-ds-vhkxp] time="2021-11-17T02:10:27Z" level=info msg="Service [nginx-service] has been deleted"
Add with loadbalancer ip XXX.YY.77.148
[kube-vip-ds-vhkxp] time="2021-11-17T02:11:52Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.148]"
[kube-vip-ds-vhkxp] time="2021-11-17T02:11:52Z" level=info msg="New VIP [XXX.YY.77.148] for [nginx-service/ce7a213f-cece-41a5-88e4-e5cd8f8552e2] "
[kube-vip-ds-vhkxp] time="2021-11-17T02:11:52Z" level=info msg="Starting advertising address [XXX.YY.77.148] with kube-vip"
[kube-vip-ds-vhkxp] time="2021-11-17T02:11:52Z" level=info msg="Started Load Balancer and Virtual IP"
[kube-vip-ds-vhkxp] time="2021-11-17T02:11:52Z" level=error msg="Error updating Service [nginx-service] Status: Operation cannot be fulfilled on services \"nginx-service\": the object has been modified; please apply your changes to the latest version and try again"
[kube-vip-ds-vhkxp] time="2021-11-17T02:11:52Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.148]"
[kube-vip-ds-vhkxp] time="2021-11-17T02:12:45Z" level=info msg="Service [rke2-coredns-rke2-coredns] has been addded/modified, it has no assigned external addresses"
[kube-vip-ds-vhkxp] time="2021-11-17T02:12:45Z" level=info msg="Service [rke2-metrics-server] has been addded/modified, it has no assigned external addresses"
[kube-vip-ds-vhkxp] time="2021-11-17T02:12:45Z" level=info msg="Service [nginx-service] has been addded/modified, it has an assigned external addresses [XXX.YY.77.148]"
[kube-vip-ds-vhkxp] time="2021-11-17T02:12:45Z" level=info msg="Service [kubernetes] has been addded/modified, it has no assigned external addresses"
kubectl - external IP is shown as pending whereas it should have been assigned the expected XXX.YY.77.148
$ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 6d10h
nginx-service LoadBalancer 10.43.234.151 <pending> 80:30080/TCP 21m