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 }