Update K8s Monitoring
[osm/devops.git] / installers / k8s / install_osm_k8s_monitoring.sh
1 #!/bin/bash
2
3 # Copyright 2019 Minsait - Indra S.A.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 # Author: Jose Manuel Palacios (jmpalacios@minsait.com)
17 # Author: Jose Antonio Martinez (jamartinezv@minsait.com)
18
19 # Obtain the path where the script is located
20 HERE=$(dirname $(readlink -f ${BASH_SOURCE[0]}))
21
22 echo $HERE
23 # Load component versions to be deployed
24 source $HERE/versions_monitoring
25 V_OPERATOR=""
26 V_MONGODB_EXPORTER=""
27 V_MYSQL_EXPORTER=""
28 V_KAFKA_EXPORTER=""
29
30 V_OPERATOR=$PROMETHEUS_OPERATOR
31 V_MONGODB_EXPORTER=$PROMETHEUS_MONGODB_EXPORTER
32 V_MYSQL_EXPORTER=$PROMETHEUS_MYSQL_EXPORTER
33 V_KAFKA_EXPORTER=$PROMETHEUS_KAFKA_EXPORTER
34
35
36 function usage(){
37 echo -e "usage: $0 [OPTIONS]"
38 echo -e "Install OSM Monitoring"
39 echo -e " OPTIONS"
40 echo -e " -n <namespace> : use specified kubernetes namespace - default: monitoring"
41 echo -e " -s <service_type>: service type (ClusterIP|NodePort|LoadBalancer) - default: NodePort"
42 echo -e " --debug : debug script"
43 echo -e " --dump : dump arguments and versions"
44 echo -e " -h / --help : print this help"
45 }
46
47 NAMESPACE=monitoring
48 HELM=""
49 DEBUG=""
50 DUMP_VARS=""
51 SERVICE_TYPE=""
52 while getopts ":h-:n:s:" o; do
53 case "${o}" in
54 h)
55 usage && exit 0
56 ;;
57 n)
58 NAMESPACE="${OPTARG}"
59 ;;
60
61 s)
62 SERVICE_TYPE="${OPTARG}"
63 ;;
64
65 -)
66 [ "${OPTARG}" == "help" ] && usage && exit 0
67 [ "${OPTARG}" == "debug" ] && DEBUG="y" && continue
68 [ "${OPTARG}" == "dump" ] && DUMP_VARS="y" && continue
69 echo -e "Invalid option: '--$OPTARG'\n" >&2
70 usage && exit 1
71 ;;
72
73 \?)
74 echo -e "Invalid option: '-$OPTARG'\n" >&2
75 usage && exit 1
76 ;;
77 *)
78 usage && exit 1
79 ;;
80 esac
81 done
82
83 function dump_vars(){
84 echo "Args...."
85 echo "NAMESPACE=$NAMESPACE"
86 echo "SERVICE_TYPE=$SERVICE_TYPE"
87 echo "DEBUG=$DEBUG"
88 echo "Versions...."
89 echo "V_OPERATOR=$V_OPERATOR"
90 echo "V_MONGODB_EXPORTER=$V_MONGODB_EXPORTER"
91 echo "V_MYSQL_EXPORTER=$V_MYSQL_EXPORTER"
92 echo "V_KAFKA_EXPORTER=$V_KAFKA_EXPORTER"
93 }
94
95 # Check K8s version
96 kubernetes_version=`kubectl version --short | grep Server | awk '{print $3}'`
97 min_kubernetes_version="v1.16.0"
98 if [[ "$kubernetes_version" < "$min_kubernetes_version" ]]
99 then
100 echo "K8s monitoring could not be installed: Kube-prometheus-stack requires a Kubernetes 1.16+ (current version: $kubernetes_version)"
101 exit 1
102 fi
103
104 if [ -n "$SERVICE_TYPE" ] ; then
105 if [ [ $SERVICE_TYPE != "ClusterIP" ] || [ $SERVICE_TYPE != "NodePort" ] || [ $SERVICE_TYPE != "LoadBalancer" ] ] ; then
106 echo "Wrong service type..."
107 usage && exit 1
108 fi
109 else
110 SERVICE_TYPE="NodePort"
111 fi
112
113 if [ -n "$DEBUG" ] ; then
114 set -x
115 fi
116
117 if [ -n "$DUMP_VARS" ] ; then
118 dump_vars
119 fi
120
121 # Check if helm is installed
122 helm > /dev/null 2>&1
123 if [ $? != 0 ] ; then
124 echo "Helm is not installed, installing ....."
125 curl https://get.helm.sh/helm-v3.7.2-linux-amd64.tar.gz --output helm-v3.7.2.tar.gz
126 tar -zxvf helm-v3.7.2.tar.gz
127 sudo mv linux-amd64/helm /usr/local/bin/helm
128 rm -r linux-amd64
129 rm helm-v3.7.2.tar.gz
130 fi
131
132 # Create monitoring namespace
133 echo "Creating namespace $NAMESPACE"
134 kubectl create namespace $NAMESPACE
135
136 # Needed changes for Kube-Prometheus on Kubeadm installation
137 # Kube-Controller-Manager
138 sudo sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-controller-manager.yaml
139 # Kube-Scheduler
140 sudo sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-scheduler.yaml
141 # Kube-Proxy
142 kubectl -n kube-system get cm/kube-proxy -o yaml > $HERE/kube-proxy-cm.yaml
143 sed -e "s/metricsBindAddress: \"\"/metricsBindAddress: 0.0.0.0:10249/" -i $HERE/kube-proxy-cm.yaml
144 kubectl -n kube-system delete cm kube-proxy
145 kubectl -n kube-system apply -f $HERE/kube-proxy-cm.yaml
146 rm $HERE/kube-proxy-cm.yaml
147 kubectl delete pod -l k8s-app=kube-proxy -n kube-system
148 # Etcd
149 sudo cp /etc/kubernetes/pki/etcd/healthcheck-client.key $HERE/healthcheck-client.key
150 sudo chmod a+r $HERE/healthcheck-client.key
151 kubectl -n $NAMESPACE create secret generic etcd-client-cert --from-file=/etc/kubernetes/pki/etcd/ca.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=$HERE/healthcheck-client.key
152 sudo awk '/--trusted-ca-file=\/etc\/kubernetes\/pki\/etcd\/ca.crt/ { print; print " - --metrics=extensive"; next }1' /etc/kubernetes/manifests/etcd.yaml > $HERE/tmp && sudo mv $HERE/tmp /etc/kubernetes/manifests/etcd.yaml
153 sudo chown root:root /etc/kubernetes/manifests/etcd.yaml
154 sudo chmod 600 /etc/kubernetes/manifests/etcd.yaml
155
156 # Add Helm prometheus-community repo
157 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
158 helm repo update
159
160 # kube-prometheus-stack installation (previously called prometheus-operator)
161 $HERE/change-charts-prometheus-operator.sh
162 echo "Creating stable/kube-prometheus-stack"
163 cat > $HERE/kube-prometheus-stack-values.yaml <<EOF
164 kubeControllerManager:
165 service:
166 enabled: true
167 port: 10257
168 targetPort: 10257
169 serviceMonitor:
170 https: true
171 insecureSkipVerify: true
172 kubeScheduler:
173 service:
174 enabled: true
175 port: 10259
176 targetPort: 10259
177 serviceMonitor:
178 https: true
179 insecureSkipVerify: true
180 kubelet:
181 serviceMonitor:
182 https: true
183 kubeEtcd:
184 serviceMonitor:
185 scheme: https
186 insecureSkipVerify: false
187 serverName: localhost
188 caFile: /etc/prometheus/secrets/etcd-client-cert/ca.crt
189 certFile: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.crt
190 keyFile: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.key
191 alertmanager:
192 service:
193 type: $SERVICE_TYPE
194 grafana:
195 enabled: false
196 forceDeployDashboards: true
197 prometheus:
198 service:
199 type: $SERVICE_TYPE
200 prometheusSpec:
201 serviceMonitorSelectorNilUsesHelmValues: false
202 secrets: ['etcd-client-cert']
203 EOF
204 helm install osm-monitoring --namespace $NAMESPACE --version=$V_OPERATOR -f $HERE/kube-prometheus-stack-values.yaml $HERE/helm_charts/kube-prometheus-stack
205
206 # Exporters installation
207 # MongoDB
208 # exporter
209 echo "Creating prometheus-community/prometheus-mongodb-exporter"
210 helm install osm-mongodb-exporter --namespace $NAMESPACE --version=$V_MONGODB_EXPORTER --set serviceMonitor.additionalLabels.release=osm-monitoring,mongodb.uri='mongodb://mongodb-k8s.osm:27017' prometheus-community/prometheus-mongodb-exporter
211 #dashboard:
212 kubectl -n $NAMESPACE apply -f $HERE/mongodb-exporter-dashboard.yaml
213 # Mysql
214 # exporter
215 echo "Creating prometheus-community/prometheus-mysql-exporter"
216 helm install osm-mysql-exporter --namespace $NAMESPACE --version=$V_MYSQL_EXPORTER --set serviceMonitor.enabled=true,serviceMonitor.additionalLabels.release=osm-monitoring,mysql.user="root",mysql.pass=`kubectl -n osm get secret ro-db-secret -o yaml | grep -i -A1 '^data:$' | grep MYSQL_ROOT_PASSWORD | awk '{print $2}' | base64 -d`,mysql.host="mysql.osm",mysql.port="3306",'collectors.info_schema\.tables=true' prometheus-community/prometheus-mysql-exporter
217 #dashboard:
218 kubectl -n $NAMESPACE apply -f $HERE/mysql-exporter-dashboard.yaml
219 # Kafka
220 # exporter
221 echo "Creating prometheus-community/prometheus-kafka-exporter"
222 helm install osm-kafka-exporter --namespace $NAMESPACE --version=$V_KAFKA_EXPORTER --set prometheus.serviceMonitor.enabled=true,prometheus.serviceMonitor.additionalLabels.release=osm-monitoring,kafkaServer={kafka.osm.svc.cluster.local:9092},service.port=9092 prometheus-community/prometheus-kafka-exporter
223 # dashboard:
224 kubectl -n $NAMESPACE apply -f $HERE/kafka-exporter-dashboard.yaml
225
226 # Deploy summary dashboard
227 kubectl -n $NAMESPACE apply -f $HERE/summary-dashboard.yaml
228
229 # Deploy nodes dashboards
230 kubectl -n $NAMESPACE apply -f $HERE/nodes-dashboard.yaml
231