github.com/verrazzano/verrazzano-monitoring-operator@v0.0.30/pkg/resources/services/elasticsearch.go (about) 1 // Copyright (C) 2020, 2022, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package services 5 6 import ( 7 "fmt" 8 vmcontrollerv1 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/apis/vmcontroller/v1" 9 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/config" 10 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/constants" 11 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources" 12 "github.com/verrazzano/verrazzano-monitoring-operator/pkg/resources/nodes" 13 corev1 "k8s.io/api/core/v1" 14 "k8s.io/apimachinery/pkg/util/intstr" 15 ) 16 17 // Creates OpenSearch Client service element 18 func createOpenSearchIngestServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service { 19 var openSearchIngestService = createServiceElement(vmo, config.OpensearchIngest) 20 if nodes.IsSingleNodeCluster(vmo) { 21 openSearchIngestService.Spec.Selector = resources.GetSpecID(vmo.Name, config.ElasticsearchMaster.Name) 22 // In dev mode, only a single node/pod all ingest/data goes to the 9200 port on the back end node 23 openSearchIngestService.Spec.Ports = []corev1.ServicePort{resources.GetServicePort(config.ElasticsearchData)} 24 } 25 return openSearchIngestService 26 } 27 28 // Creates OpenSearch MasterNodes service element 29 func createOpenSearchMasterServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service { 30 openSearchMasterService := createServiceElement(vmo, config.ElasticsearchMaster) 31 if !nodes.IsSingleNodeCluster(vmo) { 32 // MasterNodes service is headless 33 openSearchMasterService.Spec.Type = corev1.ServiceTypeClusterIP 34 openSearchMasterService.Spec.ClusterIP = corev1.ClusterIPNone 35 } 36 return openSearchMasterService 37 } 38 39 // Creates OpenSearch DataNodes service element 40 func createOpenSearchDataServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service { 41 var openSearchDataService = createServiceElement(vmo, config.ElasticsearchData) 42 if nodes.IsSingleNodeCluster(vmo) { 43 // In dev mode, only a single node/pod all ingest/data goes to the 9200 port on the back end node 44 openSearchDataService.Spec.Selector = resources.GetSpecID(vmo.Name, config.ElasticsearchMaster.Name) 45 openSearchDataService.Spec.Ports[0].TargetPort = intstr.FromInt(constants.OSHTTPPort) 46 } 47 return openSearchDataService 48 } 49 50 // Creates the master HTTP Service with Cluster IP 51 func createMasterServiceHTTP(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance) *corev1.Service { 52 masterHTTPService := createServiceElement(vmo, config.ElasticsearchMaster) 53 masterHTTPService.Name = masterHTTPService.Name + "-http" 54 masterHTTPService.Spec.Ports[0].Name = "http-" + config.ElasticsearchMaster.Name 55 masterHTTPService.Spec.Ports[0].Port = constants.OSHTTPPort 56 masterHTTPService.Spec.Ports[0].TargetPort = intstr.FromInt(constants.OSHTTPPort) 57 return masterHTTPService 58 } 59 60 // Creates *all* OpenSearch service elements 61 func createOpenSearchServiceElements(vmo *vmcontrollerv1.VerrazzanoMonitoringInstance, useNodeRoleSelectors bool) []*corev1.Service { 62 masterService := createOpenSearchMasterServiceElements(vmo) 63 masterServiceHTTP := createMasterServiceHTTP(vmo) 64 dataService := createOpenSearchDataServiceElements(vmo) 65 ingestService := createOpenSearchIngestServiceElements(vmo) 66 67 // if the cluster supports node role selectors, use those instead of service app selectors 68 if useNodeRoleSelectors { 69 masterService.Spec.Selector = map[string]string{nodes.RoleMaster: nodes.RoleAssigned} 70 masterServiceHTTP.Spec.Selector = map[string]string{nodes.RoleMaster: nodes.RoleAssigned} 71 dataService.Spec.Selector = map[string]string{nodes.RoleData: nodes.RoleAssigned} 72 ingestService.Spec.Selector = map[string]string{nodes.RoleIngest: nodes.RoleAssigned} 73 } 74 75 return []*corev1.Service{ 76 masterService, 77 masterServiceHTTP, 78 dataService, 79 ingestService, 80 } 81 } 82 83 // OpenSearchPodSelector creates a pod selector like 84 // 'app in (system-es-master, system-es-data, system-es-ingest)' 85 // to select all pods in the vmi cluster 86 func OpenSearchPodSelector(vmoName string) string { 87 return fmt.Sprintf("%s in (%s, %s, %s)", 88 constants.ServiceAppLabel, 89 fmt.Sprintf("%s-%s", vmoName, config.ElasticsearchMaster.Name), 90 fmt.Sprintf("%s-%s", vmoName, config.ElasticsearchData.Name), 91 fmt.Sprintf("%s-%s", vmoName, config.OpensearchIngest.Name), 92 ) 93 } 94 95 // UseNodeRoleSelector verifies if all OpenSearch pods are using node role selectors. 96 // If all pods are using node role selectors, this implies service selectors can be updated 97 // to use node roles instead of service app labels. 98 func UseNodeRoleSelector(pods *corev1.PodList) bool { 99 for _, pod := range pods.Items { 100 _, isData := pod.Labels[nodes.RoleData] 101 _, isIngest := pod.Labels[nodes.RoleIngest] 102 _, isMaster := pod.Labels[nodes.RoleMaster] 103 104 if !isData && !isIngest && !isMaster { 105 return false 106 } 107 } 108 return true 109 }