github.com/percona/percona-xtradb-cluster-operator@v1.14.0/pkg/pxc/app/pmm.go (about)

     1  package app
     2  
     3  import (
     4  	corev1 "k8s.io/api/core/v1"
     5  	"k8s.io/apimachinery/pkg/util/intstr"
     6  
     7  	api "github.com/percona/percona-xtradb-cluster-operator/pkg/apis/pxc/v1"
     8  	"github.com/percona/percona-xtradb-cluster-operator/pkg/pxc/users"
     9  )
    10  
    11  func PMMClient(cr *api.PerconaXtraDBCluster, spec *api.PMMSpec, secret *corev1.Secret, envVarsSecret *corev1.Secret) corev1.Container {
    12  	ports := []corev1.ContainerPort{{ContainerPort: 7777}}
    13  
    14  	for i := 30100; i <= 30105; i++ {
    15  		ports = append(ports, corev1.ContainerPort{ContainerPort: int32(i)})
    16  	}
    17  
    18  	pmmEnvs := []corev1.EnvVar{
    19  		{
    20  			Name:  "PMM_SERVER",
    21  			Value: spec.ServerHost,
    22  		},
    23  	}
    24  
    25  	clientEnvs := []corev1.EnvVar{
    26  		{
    27  			Name:  "CLIENT_PORT_LISTEN",
    28  			Value: "7777",
    29  		},
    30  		{
    31  			Name:  "CLIENT_PORT_MIN",
    32  			Value: "30100",
    33  		},
    34  		{
    35  			Name:  "CLIENT_PORT_MAX",
    36  			Value: "30105",
    37  		},
    38  	}
    39  
    40  	if spec.ServerUser != "" {
    41  		pmmEnvs = append(pmmEnvs, pmmEnvServerUser(spec.ServerUser, secret.Name, spec.UseAPI(secret))...)
    42  	}
    43  
    44  	container := corev1.Container{
    45  		Name:            "pmm-client",
    46  		Image:           spec.Image,
    47  		ImagePullPolicy: spec.ImagePullPolicy,
    48  		Env:             pmmEnvs,
    49  		SecurityContext: spec.ContainerSecurityContext,
    50  	}
    51  
    52  	if cr.CompareVersionWith("1.2.0") >= 0 {
    53  		container.Env = append(container.Env, clientEnvs...)
    54  		container.Ports = ports
    55  	}
    56  
    57  	if cr.CompareVersionWith("1.7.0") >= 0 {
    58  		container.LivenessProbe = &corev1.Probe{
    59  			InitialDelaySeconds: 60,
    60  			TimeoutSeconds:      5,
    61  			PeriodSeconds:       10,
    62  			ProbeHandler: corev1.ProbeHandler{
    63  				HTTPGet: &corev1.HTTPGetAction{
    64  					Port: intstr.FromInt(7777),
    65  					Path: "/local/Status",
    66  				},
    67  			},
    68  		}
    69  
    70  		pmmAgentEnvs := pmmAgentEnvs(spec.ServerHost, spec.ServerUser, secret.Name, spec.UseAPI(secret))
    71  		if cr.CompareVersionWith("1.14.0") >= 0 {
    72  			val := "$(POD_NAMESPASE)-$(POD_NAME)"
    73  			if len(envVarsSecret.Data["PMM_PREFIX"]) > 0 {
    74  				val = "$(PMM_PREFIX)$(POD_NAMESPASE)-$(POD_NAME)"
    75  			}
    76  			pmmAgentEnvs = append(pmmAgentEnvs, corev1.EnvVar{
    77  				Name:  "PMM_AGENT_SETUP_NODE_NAME",
    78  				Value: val,
    79  			})
    80  		} else {
    81  			pmmAgentEnvs = append(pmmAgentEnvs, corev1.EnvVar{
    82  				Name:  "PMM_AGENT_SETUP_NODE_NAME",
    83  				Value: "$(POD_NAMESPASE)-$(POD_NAME)",
    84  			})
    85  		}
    86  
    87  		container.Env = append(container.Env, pmmAgentEnvs...)
    88  		container.Lifecycle = &corev1.Lifecycle{
    89  			PreStop: &corev1.LifecycleHandler{
    90  				Exec: &corev1.ExecAction{
    91  					// TODO https://jira.percona.com/browse/PMM-7010
    92  					Command: []string{"bash", "-c", "pmm-admin inventory remove node --force $(pmm-admin status --json | python -c \"import sys, json; print(json.load(sys.stdin)['pmm_agent_status']['node_id'])\")"},
    93  				},
    94  			},
    95  		}
    96  	}
    97  
    98  	if cr.CompareVersionWith("1.13.0") >= 0 {
    99  		container.VolumeMounts = []corev1.VolumeMount{
   100  			{
   101  				Name:      BinVolumeName,
   102  				MountPath: "/var/lib/mysql",
   103  			},
   104  		}
   105  
   106  		container.Lifecycle = &corev1.Lifecycle{
   107  			PreStop: &corev1.LifecycleHandler{
   108  				Exec: &corev1.ExecAction{
   109  					Command: []string{
   110  						"bash",
   111  						"-c",
   112  						"pmm-admin unregister --force",
   113  					},
   114  				},
   115  			},
   116  		}
   117  	}
   118  
   119  	return container
   120  }
   121  
   122  func pmmAgentEnvs(pmmServerHost, pmmServerUser, secrets string, useAPI bool) []corev1.EnvVar {
   123  	var pmmServerPassKey string
   124  	if useAPI {
   125  		pmmServerUser = "api_key"
   126  		pmmServerPassKey = users.PMMServerKey
   127  	} else {
   128  		pmmServerPassKey = users.PMMServer
   129  	}
   130  	return []corev1.EnvVar{
   131  		{
   132  			Name: "POD_NAME",
   133  			ValueFrom: &corev1.EnvVarSource{
   134  				FieldRef: &corev1.ObjectFieldSelector{
   135  					FieldPath: "metadata.name",
   136  				},
   137  			},
   138  		},
   139  		{
   140  			Name: "POD_NAMESPASE",
   141  			ValueFrom: &corev1.EnvVarSource{
   142  				FieldRef: &corev1.ObjectFieldSelector{
   143  					FieldPath: "metadata.namespace",
   144  				},
   145  			},
   146  		},
   147  		{
   148  			Name:  "PMM_AGENT_SERVER_ADDRESS",
   149  			Value: pmmServerHost,
   150  		},
   151  		{
   152  			Name:  "PMM_AGENT_SERVER_USERNAME",
   153  			Value: pmmServerUser,
   154  		},
   155  		{
   156  			Name: "PMM_AGENT_SERVER_PASSWORD",
   157  			ValueFrom: &corev1.EnvVarSource{
   158  				SecretKeyRef: SecretKeySelector(secrets, pmmServerPassKey),
   159  			},
   160  		},
   161  		{
   162  			Name:  "PMM_AGENT_LISTEN_PORT",
   163  			Value: "7777",
   164  		},
   165  		{
   166  			Name:  "PMM_AGENT_PORTS_MIN",
   167  			Value: "30100",
   168  		},
   169  		{
   170  			Name:  "PMM_AGENT_PORTS_MAX",
   171  			Value: "30105",
   172  		},
   173  		{
   174  			Name:  "PMM_AGENT_CONFIG_FILE",
   175  			Value: "/usr/local/percona/pmm2/config/pmm-agent.yaml",
   176  		},
   177  		{
   178  			Name:  "PMM_AGENT_SERVER_INSECURE_TLS",
   179  			Value: "1",
   180  		},
   181  		{
   182  			Name:  "PMM_AGENT_LISTEN_ADDRESS",
   183  			Value: "0.0.0.0",
   184  		},
   185  		{
   186  			Name:  "PMM_AGENT_SETUP_METRICS_MODE",
   187  			Value: "push",
   188  		},
   189  		{
   190  			Name:  "PMM_AGENT_SETUP",
   191  			Value: "1",
   192  		},
   193  		{
   194  			Name:  "PMM_AGENT_SETUP_FORCE",
   195  			Value: "1",
   196  		},
   197  		{
   198  			Name:  "PMM_AGENT_SETUP_NODE_TYPE",
   199  			Value: "container",
   200  		},
   201  	}
   202  }
   203  
   204  func PMMAgentScript(cr *api.PerconaXtraDBCluster, dbType string) []corev1.EnvVar {
   205  	if cr.CompareVersionWith("1.13.0") < 0 {
   206  		pmmServerArgs := " $(PMM_ADMIN_CUSTOM_PARAMS) --skip-connection-check --metrics-mode=push"
   207  		pmmServerArgs += " --username=$(DB_USER) --password=$(DB_PASSWORD) --cluster=$(CLUSTER_NAME)"
   208  		if dbType != "haproxy" {
   209  			pmmServerArgs += " --service-name=$(PMM_AGENT_SETUP_NODE_NAME) --host=$(POD_NAME) --port=$(DB_PORT)"
   210  		}
   211  
   212  		if dbType == "mysql" {
   213  			pmmServerArgs += " $(DB_ARGS)"
   214  		}
   215  
   216  		if dbType == "haproxy" {
   217  			pmmServerArgs += " $(PMM_AGENT_SETUP_NODE_NAME)"
   218  		}
   219  		return []corev1.EnvVar{
   220  			{
   221  				Name:  "PMM_AGENT_PRERUN_SCRIPT",
   222  				Value: "pmm-admin status --wait=10s;\npmm-admin add $(DB_TYPE)" + pmmServerArgs + ";\npmm-admin annotate --service-name=$(PMM_AGENT_SETUP_NODE_NAME) 'Service restarted'",
   223  			},
   224  		}
   225  	}
   226  
   227  	return []corev1.EnvVar{
   228  		{
   229  			Name:  "PMM_AGENT_PRERUN_SCRIPT",
   230  			Value: "/var/lib/mysql/pmm-prerun.sh",
   231  		},
   232  	}
   233  }
   234  
   235  func pmmEnvServerUser(user, secrets string, useAPI bool) []corev1.EnvVar {
   236  	var passKey string
   237  	if useAPI {
   238  		user = "api_key"
   239  		passKey = users.PMMServerKey
   240  	} else {
   241  		passKey = users.PMMServer
   242  	}
   243  	return []corev1.EnvVar{
   244  		{
   245  			Name:  "PMM_USER",
   246  			Value: user,
   247  		},
   248  		{
   249  			Name: "PMM_PASSWORD",
   250  			ValueFrom: &corev1.EnvVarSource{
   251  				SecretKeyRef: SecretKeySelector(secrets, passKey),
   252  			},
   253  		},
   254  	}
   255  }