Bonjour,
Je débute avec la stack Elastic et Kubernetes. J'essaie de faire fonctionner la stack Elastic avec ECK. Je ne travaille qu'en local avec :
- Windows 10 PRO
- Docker Desktop
- WSL 1 + Ubuntu 18.04
Pour le moment, j'ai Filebeat, Elasticsearch et Kibana qui sont en running. A terme je devrai ajouter Logstash. Mais pour le moment, pour tester que les données passent bien à travers la stack, j'essaie juste d'ajouter un Nginx, mais je n'arrive pas à accéder à la page "Welcome to Nginx" dans Chrome.
Pour commencer, voici les fichiers que j'utilise :
Fichier .yaml pour filebeat :
---
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
namespace: beats
labels:
k8s-app: filebeat
data:
filebeat.yml: |-
filebeat.autodiscover:
providers:
- type: kubernetes
host: ${NODE_NAME}
hints.enabled: true
hints.default_config:
type: container
paths:
- /var/log/containers/*${data.kubernetes.container.id}.log
processors:
- add_cloud_metadata:
- add_host_metadata:
output.elasticsearch:
hosts: ['https://${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
username: ${ELASTICSEARCH_USERNAME}
password: ${ELASTICSEARCH_PASSWORD}
ssl.certificate_authorities:
- /mnt/elastic/tls.crt
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: beats
labels:
k8s-app: filebeat
spec:
selector:
matchLabels:
k8s-app: filebeat
template:
metadata:
labels:
k8s-app: filebeat
spec:
serviceAccountName: filebeat
terminationGracePeriodSeconds: 30
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.8.0
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
env:
- name: ELASTICSEARCH_HOST
value: monitor-es-http
- name: ELASTICSEARCH_PORT
value: "9200"
- name: ELASTICSEARCH_USERNAME
value: elastic
- name: ELASTICSEARCH_PASSWORD
valueFrom:
secretKeyRef:
key: elastic
name: monitor-es-elastic-user
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
securityContext:
runAsUser: 0
# If using Red Hat OpenShift uncomment this:
#privileged: true
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: config
mountPath: /etc/filebeat.yml
readOnly: true
subPath: filebeat.yml
- name: data
mountPath: /usr/share/filebeat/data
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: varlog
mountPath: /var/log
readOnly: true
- name: es-certs
mountPath: /mnt/elastic/tls.crt
readOnly: true
subPath: tls.crt
volumes:
- name: config
configMap:
defaultMode: 0600
name: filebeat-config
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: varlog
hostPath:
path: /var/log
# data folder stores a registry of read status for all files, so we don't send everything again on a Filebeat pod restart
- name: data
hostPath:
path: /var/lib/filebeat-data
type: DirectoryOrCreate
- name: es-certs
secret:
secretName: monitor-es-http-certs-public
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: filebeat
subjects:
- kind: ServiceAccount
name: filebeat
namespace: beats
roleRef:
kind: ClusterRole
name: filebeat
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: filebeat
labels:
k8s-app: filebeat
rules:
- apiGroups: [""] # "" indicates the core API group
resources:
- namespaces
- pods
verbs:
- get
- watch
- list
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: filebeat
namespace: beats
labels:
k8s-app: filebeat
Fichier .yaml pour Elasticsearch, Kibana et Volume :
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: monitor
namespace: beats
spec:
version: 7.8.0
nodeSets:
- name: mdi
count: 1
config:
node.store.allow_mmap: false
node.master: true
node.data: true
node.ingest: true
xpack.security.authc:
anonymous:
username: anonymous
roles: superuser
authz_exception: false
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
storageClassName: es-data
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: monitor
namespace: beats
spec:
version: 7.8.0
count: 1
elasticsearchRef:
name: "monitor"
http:
service:
spec:
type: LoadBalancer
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: es-data
namespace: beats
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: es-pv-data
namespace: beats
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: es-data
hostPath:
path: /c/Users/ID_USER/workspace/workshop-k8s-dev-to-prod/platforms/workshop/workshop-k8s/workshop-eck/eck_example/es-data
Fichier .yaml pour Nginx :
---
apiVersion: v1
kind: Service
metadata:
namespace: beats
name: nginx
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: http
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: beats
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: http
containerPort: 8080
L'injection de données directement dans Elasticsearch (avec curl et account.json par exemple) fonctionne bien. Je récupère l'index dans Kibana et ces données sont bien persistées dans le persistent volume.
Pour tester la récolte de données avec Filebeat, je voudrais juste pouvoir faire des F5 sur la page d'accueil Nginx et vérifier que les logs correspondants sont bien récupérés. J'avais déjà utilisé cette méthode précédemment pour un déploiement de la stack avec Docker Compose (en guise d'entrainement.
Donc ici, une fois les pods, services... déployés (kubectl apply sur les fichiers au-dessus), j'utilise la commande :
kubectl -n beats port-forward service/nginx 8080
(J'utilise le même type de commande pour accéder à Kibana ou la page de contrôle d'Elasticsearch et là ça fonctionne).
Mais ensuite dans Chrome, je ne parviens pas à afficher la page Nginx :
- Avec "http://localhost:8080", j'obtiens "Ce site est inaccessible..." et dans la console :
Handling connection for 8080
E0711 16:18:44.944162 6792 portforward.go:400] an error occurred forwarding 8080 -> 8080: error forwarding port 8080 to pod 50cf19ab998c488b6d067309ae9b5affa9d6008344e5fba8e09e24d9671c8306, uid : exit status 1: 2020/07/11 12:53:26 socat[52337] E connect(16, AF=2 127.0.0.1:8080, 16): Connection refused
- Avec "https://localhost:8080", j'obtiens "Cette page ne fonctionne pas..." et le même type de message qu'au-dessus dans la console.
Je précise que je récupère le même type d'erreur si le service Nginx est de type LoadBalancer.
Voilà à peu près tout ce que je peux dire de mon problème pour le moment. Je continue à fouiller à droite et à gauche. Dites-moi si jamais il y a besoin d'autres informations.
En tout cas, merci par avance pour l'aide que vous pourrez m'apporter.
Guillaume.