ruiyaoOps

func (c *routerOperator) createOrUpdateRouterWorkload(namespace string, publishService bool, servicemeshEnabled bool) error {
obj, ok := c.routerTemplates["DEPLOYMENT"]
if !ok {
klog.Error("Deployment template file not loaded")
return fmt.Errorf("deployment template file not loaded")
}
deployName := ingressControllerPrefix + namespace
deployment, err := c.client.AppsV1().Deployments(ingressControllerNamespace).Get(context.Background(), deployName, metav1.GetOptions{})
createDeployment := true
if err != nil {
if errors.IsNotFound(err) {
deploymentOri := obj.(*v1.Deployment)
deployment = deploymentOri.DeepCopy()
deployment.Name = ingressControllerPrefix + namespace
// Add project label
deployment.Spec.Selector.MatchLabels["project"] = namespace
deployment.Spec.Template.Labels["project"] = namespace
// Add configmap
deployment.Spec.Template.Spec.Containers[0].Args = append(deployment.Spec.Template.Spec.Containers[0].Args, "--configmap=$(POD_NAMESPACE)/"+deployment.Name+configMapSuffix)
// Isolate namespace
deployment.Spec.Template.Spec.Containers[0].Args = append(deployment.Spec.Template.Spec.Containers[0].Args, "--watch-namespace="+namespace)
// Choose self as master
deployment.Spec.Template.Spec.Containers[0].Args = append(deployment.Spec.Template.Spec.Containers[0].Args, "--election-id="+deployment.Name)
}
} else {
createDeployment = false
for i := range deployment.Spec.Template.Spec.Containers {
if deployment.Spec.Template.Spec.Containers[i].Name == "nginx-ingress-controller" {
var args []string
for j := range deployment.Spec.Template.Spec.Containers[i].Args {
argument := deployment.Spec.Template.Spec.Containers[i].Args[j]
if strings.HasPrefix("--publish-service", argument) ||
strings.HasPrefix("--configmap", argument) ||
strings.HasPrefix("--report-node-internal-ip-address", argument) {
continue
}
args = append(args, deployment.Spec.Template.Spec.Containers[i].Args[j])
}
deployment.Spec.Template.Spec.Containers[i].Args = args
}
}
}
if deployment.Spec.Template.Annotations == nil {
deployment.Spec.Template.Annotations = make(map[string]string, 0)
}
if servicemeshEnabled {
deployment.Spec.Template.Annotations[sidecarInject] = "true"
} else {
deployment.Spec.Template.Annotations[sidecarInject] = "false"
}
if publishService {
deployment.Spec.Template.Spec.Containers[0].Args = append(deployment.Spec.Template.Spec.Containers[0].Args, "--publish-service="+ingressControllerNamespace+"/"+ingressControllerPrefix+namespace)
} else {
deployment.Spec.Template.Spec.Containers[0].Args = append(deployment.Spec.Template.Spec.Containers[0].Args, "--report-node-internal-ip-address")
}
if createDeployment {
deployment, err = c.client.AppsV1().Deployments(ingressControllerNamespace).Create(context.Background(), deployment, metav1.CreateOptions{})
} else {
deployment, err = c.client.AppsV1().Deployments(ingressControllerNamespace).Update(context.Background(), deployment, metav1.UpdateOptions{})
}
if err != nil {
klog.Error(err)
return err
}
return nil
}
这段代码显示的是每个项目都会在ingressControllerNamespace命名空间下创建一个ingress-nginx-controller,