Elasticsearch¶
Elasticsearch Installation¶
Warning
Elasticsearch is an external component outside of the main Seldon stack. Therefore, it is the cluster administrator’s responsibility to administrate and manage the Elasticsearch instance used by Seldon.
Initial Configuration¶
Copy the default Fluentd config
cp ./seldon-deploy-install/reference-configuration/efk/values-fluentd.yaml fluentd-values.yaml
As the starting fluentd configuration is crafted for Elasticsearch, by Open Distro, you need to modify the elasticsearch section in the fluentd-values.yaml file:
elasticsearch:
hosts: ['elasticsearch-master.seldon-logs.svc.cluster.local']
logstash:
enabled: true
prefix: 'kubernetes_cluster'
auth:
enabled: false
scheme: "http"
sslVerify: false
Ensure Required Namespaces Exist¶
We’ll be installing in the seldon-logs namespace.
We’ll also set up some config in the seldon-system namespace.
kubectl create namespace seldon-logs || echo "namespace seldon-logs exists"
kubectl create namespace seldon-system || echo "namespace seldon-system exists"
Elasticsearch¶
Elasticsearch can be installed using Elastic Cloud on Kubernetes (ECK). ECK can be installed using helm:
helm repo add elastic https://helm.elastic.co
helm repo update
helm install elastic-operator elastic/eck-operator -n elastic-system --create-namespace --version=2.11.1
Then, create an Elasticsearch instance called seldon in the seldon-logs namespace using the following scripts:
cat << EOF > elasticsearch.yaml
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: seldon
namespace: seldon-logs
spec:
nodeSets:
- config:
node.store.allow_mmap: false
count: 3
name: default
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
limits:
memory: 2Gi
requests:
cpu: "1"
memory: 2Gi
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: standard
version: 7.17.18
EOF
kubectl apply -f elasticsearch.yaml
Note
Currently, we guarantee compatibility with Elasticsearch 7.X. Compatibility with Elasticsearch 8.X is not guaranteed.
Authentication¶
Security is managed by the ECK operator and cannot be disabled.
The operator will create a secret with the credentials for the elastic user.
We can use this password to provide credentials to other components that need to access Elasticsearch.
To do this, we generate secrets in the seldon-logs (for the request logger) and seldon-system (for Seldon Enterprise
Platform) namespaces from the elastic user’s password:
ELASTIC_USERNAME=$(echo -n elastic | base64)
ELASTIC_PASSWORD=$(kubectl get secret seldon-es-elastic-user -n seldon-logs -o go-template='{{.data.elastic}}')
cat << EOF > elastic-credentials.yaml
apiVersion: v1
data:
password: ${ELASTIC_PASSWORD}
username: ${ELASTIC_USERNAME}
kind: Secret
metadata:
name: elastic-credentials
type: Opaque
EOF
kubectl apply -f elastic-credentials.yaml -n seldon-logs
kubectl apply -f elastic-credentials.yaml -n seldon-system
Fluentd¶
We need to modify the fluentd-values.yaml file to point to the Elasticsearch instance we just created, as well
as set the appropriate credentials. Retrieve the ELASTIC_PASSWORD:
export ELASTIC_PASSWORD=$(kubectl get secret elastic-credentials -n seldon-logs -o go-template='{{.data.password | base64decode}}')
Make a copy of the values-fluentd.yaml file:
cp values-fluentd.yaml values-elasticsearch-fluentd.yaml
Update the following values in values-elasticsearch-fluentd.yaml:
elasticsearch:
auth:
user: "elastic"
password: <ELASTIC_PASSWORD>
hosts:
- seldon-es-http.seldon-logs.svc.cluster.local
We can then install Fluentd using helm:
helm upgrade --install fluentd fluentd-elasticsearch \
--version 10.0.1 \
--namespace seldon-logs -f values-elasticsearch-fluentd.yaml \
--repo https://kokuwaio.github.io/helm-charts
Kibana (optional)¶
Kibana is useful for creating visualizations and dashboards for Elasticsearch. It is not required for Seldon Enterprise Platform, however users may choose to install it for debugging purposes:
As we are using ECK, we can install Kibana with the following script:
cat << EOF > kibana.yaml
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: seldon
namespace: seldon-logs
spec:
version: 7.17.18
count: 1
elasticsearchRef:
name: seldon
namespace: seldon-logs
EOF
kubectl apply -f kibana.yaml
kubectl rollout status deployment/kibana-kibana -n seldon-logs
Configure Seldon Enterprise Platform¶
The following Helm values need to be set in deploy-values.yaml.
If you did not install Knative Eventing, requestLogger.trigger.create has to be set to false.
requestLogger:
create: true
elasticsearch:
host: seldon-es-http.seldon-logs.svc.cluster.local
port: "9200"
protocol: http
trigger:
create: true # false if not using Knative
elasticsearch:
url: http://seldon-es-http.seldon-logs.svc.cluster.local:9200
basicAuth: true
secret:
name: "elastic-credentials"
userKey: "username"
passwordKey: "password"
As the Elasticsearch instance has authentication enabled, we set elasticsearch.basicAuth to true.
We also provide the name of the secret containing the elastic user’s credentials in the elasticsearch.secret section.
Configure EFK Ingress (Optional)¶
Kibana¶
It can be useful to access Kibana’s UI without having to port-forward.
To expose Kibana externally it needs to have its own path.
This means that we need to modify our kibana.yaml to include an extra spec.config and spec.http section:
spec:
config:
server.basePath: /kibana
http:
tls:
selfSignedCertificate:
disabled: true
The base path is required as Kibana be default runs behind a proxy that adds a random path component to its URL
The tls section is required to disable the self-signed certificate that Kibana uses by default, so that we can use our own certificate.
Then reapply the kibana.yaml:
kubectl apply -f kibana.yaml
Next, configure either an Istio VirtualService or an NGINX Ingress.
The following VirtualService for Kibana, created in kibana-vs.yaml, enables its ingress:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: kibana
namespace: seldon-logs
spec:
gateways:
- istio-system/seldon-gateway
hosts:
- '*'
http:
- match:
- uri:
prefix: /kibana/
- uri:
prefix: /kibana
rewrite:
uri: /
route:
- destination:
host: seldon-kb-http
port:
number: 5601
Then execute:
kubectl apply -f kibana-vs.yaml
The NGINX Ingress for Kibana is enabled like this:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kibana
namespace: seldon-logs
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
rules:
- http:
paths:
- path: /kibana(/|$)(.*)
pathType: Prefix
backend:
service:
name: seldon-kb-http
port:
number: 5601
ingressClassName: nginx
Then execute:
kubectl apply -f kibana-ingress.yaml
Afterwards you can access Kibana at <your-ingress>/kibana.