Support migrating single cluster among others
This commit is contained in:
parent
8dc19e0066
commit
6a596f69e0
2 changed files with 27 additions and 42 deletions
|
@ -31,19 +31,21 @@ There are two GCP requirements that complicate changing the backend service bala
|
|||
|
||||
#### How to run
|
||||
```shell
|
||||
go run main.go {project-id} {region} {target-balance-mode}
|
||||
go run main.go {project-id} {cluster-id} {region} {target-balance-mode}
|
||||
|
||||
#Examples
|
||||
# Fetch cluster id
|
||||
CLUSTERID=`kubectl get configmaps ingress-uid -o jsonpath='{.data.uid}' --namespace=kube-system`
|
||||
# for upgrading
|
||||
go run main.go my-project us-central1 RATE
|
||||
go run main.go my-project $CLUSTERID us-central1 RATE
|
||||
|
||||
# for reversing
|
||||
go run main.go my-project us-central1 UTILIZATION
|
||||
go run main.go my-project $CLUSTERID us-central1 UTILIZATION
|
||||
```
|
||||
|
||||
**Example Run**
|
||||
```shell
|
||||
➜ go run mode-updater.go nicksardo-project us-central1 RATE
|
||||
➜ go run mode-updater.go nicksardo-project c4424dd5f02d3cad us-central1 RATE
|
||||
|
||||
Backend-Service BalancingMode Updater 0.1
|
||||
Backend Services:
|
||||
|
@ -102,7 +104,7 @@ Step 8: Delete temporary instance groups
|
|||
#### TODO
|
||||
- [x] If only one backend-service exists, just update it in place.
|
||||
- [x] If all backend-services are already the target balancing mode, early return.
|
||||
- [ ] Wait for op completion instead of sleeping
|
||||
- [x] Wait for op completion instead of sleeping
|
||||
- [ ] Adjust warning
|
||||
|
||||
#### Warning
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
|
@ -20,6 +19,7 @@ import (
|
|||
|
||||
var (
|
||||
projectID string
|
||||
clusterID string
|
||||
regionName string
|
||||
targetBalancingMode string
|
||||
|
||||
|
@ -47,10 +47,10 @@ func main() {
|
|||
flag.Parse()
|
||||
|
||||
args := flag.Args()
|
||||
if len(args) != 3 {
|
||||
log.Fatalf("Expected three arguments: project_id region balancing_mode")
|
||||
if len(args) != 4 {
|
||||
log.Fatalf("Expected four arguments: project_id cluster_id region balancing_mode")
|
||||
}
|
||||
projectID, regionName, targetBalancingMode = args[0], args[1], args[2]
|
||||
projectID, clusterID, regionName, targetBalancingMode = args[0], args[1], args[2], args[3]
|
||||
|
||||
switch targetBalancingMode {
|
||||
case balancingModeRATE, balancingModeUTIL:
|
||||
|
@ -82,6 +82,12 @@ func main() {
|
|||
}
|
||||
zones = zoneList.Items
|
||||
|
||||
if len(zones) == 0 {
|
||||
panic(fmt.Errorf("Expected at least one zone in region: %v", regionName))
|
||||
}
|
||||
|
||||
instanceGroupName = fmt.Sprintf("k8s-ig--%s", clusterID)
|
||||
|
||||
// Get instance groups
|
||||
for _, z := range zones {
|
||||
igl, err := s.InstanceGroups.List(projectID, z.Name).Do()
|
||||
|
@ -89,14 +95,10 @@ func main() {
|
|||
panic(err)
|
||||
}
|
||||
for _, ig := range igl.Items {
|
||||
if !strings.HasPrefix(ig.Name, "k8s-ig--") {
|
||||
if instanceGroupName != ig.Name {
|
||||
continue
|
||||
}
|
||||
|
||||
if instanceGroupName == "" {
|
||||
instanceGroupName = ig.Name
|
||||
}
|
||||
|
||||
// Note instances
|
||||
r := &compute.InstanceGroupsListInstancesRequest{InstanceState: "ALL"}
|
||||
instList, err := s.InstanceGroups.ListInstances(projectID, getResourceName(ig.Zone, "zones"), ig.Name, r).Do()
|
||||
|
@ -118,8 +120,12 @@ func main() {
|
|||
}
|
||||
}
|
||||
|
||||
if instanceGroupName == "" {
|
||||
panic(errors.New("Could not determine k8s load balancer instance group"))
|
||||
if len(igs) == 0 {
|
||||
panic(fmt.Errorf("Expected at least one instance group named: %v", instanceGroupName))
|
||||
}
|
||||
|
||||
if len(instances) == 0 {
|
||||
panic(fmt.Errorf("Expected at least one instance within instance group: %v", instanceGroupName))
|
||||
}
|
||||
|
||||
bs := getBackendServices()
|
||||
|
@ -135,7 +141,7 @@ func main() {
|
|||
// Early return for special cases
|
||||
switch len(bs) {
|
||||
case 0:
|
||||
fmt.Println("There are 0 backend services - no action necessary")
|
||||
fmt.Println("\nThere are 0 backend services - no action necessary")
|
||||
return
|
||||
case 1:
|
||||
updateSingleBackend(bs[0])
|
||||
|
@ -144,14 +150,7 @@ func main() {
|
|||
|
||||
// Check there's work to be done
|
||||
if typeOfBackends(bs) == targetBalancingMode {
|
||||
fmt.Println("Backends are already set to target mode")
|
||||
return
|
||||
}
|
||||
|
||||
// Check no orphan instance groups will throw us off
|
||||
clusters := getIGClusterIds()
|
||||
if len(clusters) != 1 {
|
||||
fmt.Println("Expecting only cluster of instance groups in GCE, found", clusters)
|
||||
fmt.Println("\nBackends are already set to target mode")
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -273,7 +272,7 @@ func getBackendServices() (bs []*compute.BackendService) {
|
|||
|
||||
for _, bsli := range bsl.Items {
|
||||
// Ignore regional backend-services and only grab Kubernetes resources
|
||||
if bsli.Region == "" && strings.HasPrefix(bsli.Name, "k8s-be-") {
|
||||
if bsli.Region == "" && strings.HasPrefix(bsli.Name, "k8s-be-") && strings.HasSuffix(bsli.Name, clusterID) {
|
||||
bs = append(bs, bsli)
|
||||
}
|
||||
}
|
||||
|
@ -363,22 +362,6 @@ func updateSingleBackend(bs *compute.BackendService) {
|
|||
fmt.Println("Updated single backend service to target balancing mode.")
|
||||
}
|
||||
|
||||
func getIGClusterIds() []string {
|
||||
clusterIds := make(map[string]struct{})
|
||||
for _, ig := range igs {
|
||||
s := strings.Split(ig.Name, "--")
|
||||
if len(s) > 2 {
|
||||
panic(fmt.Errorf("Expected two parts to instance group name, got %v", s))
|
||||
}
|
||||
clusterIds[s[1]] = struct{}{}
|
||||
}
|
||||
var ids []string
|
||||
for v, _ := range clusterIds {
|
||||
ids = append(ids, v)
|
||||
}
|
||||
return ids
|
||||
}
|
||||
|
||||
// Below operations are copied from the GCE CloudProvider and modified to be static
|
||||
|
||||
func waitForOp(op *compute.Operation, getOperation func(operationName string) (*compute.Operation, error)) error {
|
||||
|
|
Loading…
Reference in a new issue