diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4527267..406b792 100755 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,5 +61,5 @@ jobs: platforms: linux/amd64 push: ${{ github.event_name != 'pull_request' }} tags: | - ${{ env.GHCR_REPO }}/jmeter-slave:${{ env.RELEASE_VERSION }},${{ env.GHCR_REPO }}/jmeter-base:latest + ${{ env.GHCR_REPO }}/jmeter-slave:${{ env.RELEASE_VERSION }},${{ env.GHCR_REPO }}/jmeter-slave:latest if: github.event_name != 'pull_request' \ No newline at end of file diff --git a/cluster/metric-server.yaml b/cluster/metric-server.yaml new file mode 100644 index 0000000..6f03abb --- /dev/null +++ b/cluster/metric-server.yaml @@ -0,0 +1,193 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + k8s-app: metrics-server + name: metrics-server + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + k8s-app: metrics-server + rbac.authorization.k8s.io/aggregate-to-admin: "true" + rbac.authorization.k8s.io/aggregate-to-edit: "true" + rbac.authorization.k8s.io/aggregate-to-view: "true" + name: system:aggregated-metrics-reader +rules: +- apiGroups: + - metrics.k8s.io + resources: + - pods + - nodes + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + k8s-app: metrics-server + name: system:metrics-server +rules: +- apiGroups: + - "" + resources: + - pods + - nodes + - nodes/stats + - namespaces + - configmaps + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + k8s-app: metrics-server + name: metrics-server-auth-reader + namespace: kube-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: extension-apiserver-authentication-reader +subjects: +- kind: ServiceAccount + name: metrics-server + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + k8s-app: metrics-server + name: metrics-server:system:auth-delegator +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:auth-delegator +subjects: +- kind: ServiceAccount + name: metrics-server + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + k8s-app: metrics-server + name: system:metrics-server +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:metrics-server +subjects: +- kind: ServiceAccount + name: metrics-server + namespace: kube-system +--- +apiVersion: v1 +kind: Service +metadata: + labels: + k8s-app: metrics-server + name: metrics-server + namespace: kube-system +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: https + selector: + k8s-app: metrics-server +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + k8s-app: metrics-server + name: metrics-server + namespace: kube-system +spec: + selector: + matchLabels: + k8s-app: metrics-server + strategy: + rollingUpdate: + maxUnavailable: 0 + template: + metadata: + labels: + k8s-app: metrics-server + spec: + containers: + - args: + - --cert-dir=/tmp + - --secure-port=443 + - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname + - --kubelet-use-node-status-port + - --metric-resolution=15s + - --kubelet-insecure-tls + image: k8s.gcr.io/metrics-server/metrics-server:v0.5.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /livez + port: https + scheme: HTTPS + periodSeconds: 10 + name: metrics-server + ports: + - containerPort: 443 + name: https + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /readyz + port: https + scheme: HTTPS + initialDelaySeconds: 20 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 200Mi + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + volumeMounts: + - mountPath: /tmp + name: tmp-dir + nodeSelector: + kubernetes.io/os: linux + priorityClassName: system-cluster-critical + serviceAccountName: metrics-server + volumes: + - emptyDir: {} + name: tmp-dir +--- +apiVersion: apiregistration.k8s.io/v1 +kind: APIService +metadata: + labels: + k8s-app: metrics-server + name: v1beta1.metrics.k8s.io +spec: + group: metrics.k8s.io + groupPriorityMinimum: 100 + insecureSkipTLSVerify: true + service: + name: metrics-server + namespace: kube-system + version: v1beta1 + versionPriority: 100 diff --git a/dashboard.sh b/dashboard.sh index c18a7c1..1c53d9e 100755 --- a/dashboard.sh +++ b/dashboard.sh @@ -22,15 +22,8 @@ kubectl create -n $tenant -f $working_dir/grafana-dashboard/jmeter_grafana_svc.y echo "Creating Influxdb jmeter Database" ##Wait until Influxdb Deployment is up and running -influxdb_status=`kubectl get po -n $tenant | grep influxdb-jmeter | awk '{print $2}' | grep Running +influxdb_status=`kubectl get po -n $tenant | grep influxdb-jmeter | awk '{print $3}' | grep Running` +## Create the influxdb datasource in Grafana influxdb_pod=`kubectl get po -n $tenant | grep influxdb-jmeter | awk '{print $1}'` kubectl exec -ti -n $tenant $influxdb_pod -- influx -execute 'CREATE DATABASE jmeter' - -## Create the influxdb datasource in Grafana -# echo "Creating the Influxdb data source" -# grafana_pod=`kubectl get po -n $tenant | grep jmeter-grafana | awk '{print $1}'` - -## Make load test script in Jmeter master pod executable -# kubectl exec -ti -n $tenant $grafana_pod -c grafana -- curl 'http://admin:admin@127.0.0.1:3000/api/datasources' -X POST -H 'Content-Type: application/json;charset=UTF-8' --data-binary \ -# '{"name":"jmeterdb","type":"influxdb","url":"http://jmeter-influxdb:8086","access":"proxy","isDefault":true,"database":"jmeter","user":"admin","password":"admin"}' diff --git a/grafana-dashboard/jmeter_grafana_deploy.yaml b/grafana-dashboard/jmeter_grafana_deploy.yaml index e0466a3..94dd462 100644 --- a/grafana-dashboard/jmeter_grafana_deploy.yaml +++ b/grafana-dashboard/jmeter_grafana_deploy.yaml @@ -14,6 +14,16 @@ spec: labels: app: jmeter-grafana spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: jmeter_mode + operator: In + values: + - slave + topologyKey: "kubernetes.io/hostname" containers: - name: grafana image: grafana/grafana:6.7.5 @@ -36,6 +46,9 @@ spec: requests: cpu: 20m memory: 50Mi + limits: + cpu: 100m + memory: 200Mi volumeMounts: - name: data mountPath: /var/lib/grafana @@ -54,6 +67,13 @@ spec: imagePullPolicy: IfNotPresent ports: - containerPort: 8686 + resources: + requests: + cpu: 10m + memory: 50Mi + limits: + cpu: 100m + memory: 200Mi volumes: - emptyDir: {} name: data diff --git a/grafana-dashboard/jmeter_grafana_reporter.yaml b/grafana-dashboard/jmeter_grafana_reporter.yaml index 527f041..e3207a1 100644 --- a/grafana-dashboard/jmeter_grafana_reporter.yaml +++ b/grafana-dashboard/jmeter_grafana_reporter.yaml @@ -20,7 +20,6 @@ spec: imagePullPolicy: IfNotPresent ports: - containerPort: 8686 - --- apiVersion: v1 kind: Service diff --git a/grafana-dashboard/jmeter_influxdb_deploy.yaml b/grafana-dashboard/jmeter_influxdb_deploy.yaml index 4ebac45..49ddfad 100644 --- a/grafana-dashboard/jmeter_influxdb_deploy.yaml +++ b/grafana-dashboard/jmeter_influxdb_deploy.yaml @@ -14,10 +14,27 @@ spec: labels: app: influxdb-jmeter spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: jmeter_mode + operator: In + values: + - slave + topologyKey: "kubernetes.io/hostname" containers: - image: influxdb:1.8 imagePullPolicy: IfNotPresent name: influxdb + resources: + requests: + memory: "100Mi" + cpu: "20m" + limits: + memory: "350Mi" + cpu: "200m" volumeMounts: - name: config-volume mountPath: /etc/influxdb diff --git a/jmeter-cluster/jmeter_master_deploy.yaml b/jmeter-cluster/jmeter_master_deploy.yaml index e639b5d..ab6f389 100644 --- a/jmeter-cluster/jmeter_master_deploy.yaml +++ b/jmeter-cluster/jmeter_master_deploy.yaml @@ -30,6 +30,13 @@ spec: imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 30; done;" ] + resources: + requests: + memory: "100Mi" + cpu: "50m" + limits: + memory: "1Gi" + cpu: "250m" volumeMounts: - name: loadtest mountPath: /load_test