Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ECK resources Helm chart - Beats #5899

Merged
merged 28 commits into from
Nov 23, 2022
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
4344045
Add initial version of ECK-Managed Beats Helm Chart
naemono Jul 28, 2022
6c2bd6c
don't reference fullname in notes, as each instance is named differen…
naemono Jul 28, 2022
6eaa51f
Move beats chart to not use a list of instances.
naemono Jul 28, 2022
8009bac
adding additional beats examples.
naemono Jul 28, 2022
f623f15
rename test suite name for beats.
naemono Jul 28, 2022
52bf7ac
Adding missing newlines in files, and removing an errant space.
naemono Jul 28, 2022
b84235e
Update eck-stack chart readme
naemono Jul 28, 2022
ac019e8
Add documentation for helm unit tests.
naemono Aug 23, 2022
26bbd21
Add license file to beat helm chart
naemono Sep 9, 2022
0f12ceb
Merge branch 'main' into 5505-beats-eck-resource-helm-chart
naemono Sep 12, 2022
9f71258
Merge branch 'main' into 5505-beats-eck-resource-helm-chart
naemono Sep 13, 2022
f4f56f6
Update to use nindent, not indent for beat annotations
naemono Sep 20, 2022
a98b3c0
Making svc/clusterRole/ClusterRoleBinding consistent across Charts.
naemono Sep 20, 2022
8cbdcad
Use toYaml properly in helper.
naemono Sep 20, 2022
c8116eb
Adding/removing newlines
naemono Sep 20, 2022
57f35ed
Merge branch 'main' into 5505-beats-eck-resource-helm-chart
naemono Oct 4, 2022
aad783c
wip
naemono Oct 31, 2022
02df23a
Add examples and tests for all supported beat types.
naemono Oct 31, 2022
2f93c12
Consistent versions
naemono Oct 31, 2022
330bfad
Merge branch 'main' into 5505-beats-eck-resource-helm-chart
naemono Oct 31, 2022
5762226
Review comments.
naemono Nov 21, 2022
89516ad
Merge branch 'main' into 5505-beats-eck-resource-helm-chart
naemono Nov 21, 2022
690bf12
Update examples/values to be consistent on naming of es/kibana/*refs.
naemono Nov 21, 2022
b493116
Update one final example
naemono Nov 21, 2022
6c14b30
Update all versions to latest stack 8.5.0
naemono Nov 21, 2022
1c53785
Bumping agent/elasticsearch/fleet-server/kibana chart versions becaus…
naemono Nov 21, 2022
b5fc323
Increment Minor version to be more clear about potential breaking def…
naemono Nov 21, 2022
e50c6b3
remove from eck-stack example as well.
naemono Nov 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions deploy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,37 @@ To see all resources installed by the helm chart
kubectl get elastic -l "app.kubernetes.io/instance"=es-kb-quickstart -n elastic-stack
```

## ECK Helm Chart Development

### ECK Helm Chart test suite

[Helm UnitTest Plugin](https://github.com/quintush/helm-unittest) is used to ensure Helm Charts render properly.

#### Installation

```
helm plugin install https://github.com/quintush/helm-unittest --version 0.2.8
```

#### Running Test Suite

The test suite can be run from the Makefile in the root of the project with the following command:

```
make helm-test
```

*Note* that the Makefile target runs the script in `{root}/hack/helm/test.sh`

#### Manually invoking the Helm Unit Tests for a particular Chart

The Helm unit tests can be manually invoked for any of the charts with the following command:

```
cd deploy/eck-stack
helm unittest -3 -f 'templates/tests/*.yaml' .
``````

## Licensing

The ECK Helm Charts are licensed under the [Elastic License 2.0](https://www.elastic.co/licensing/elastic-license) like the operator, but require different subscription levels.
Expand Down
24 changes: 24 additions & 0 deletions deploy/eck-beats/.helmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
templates/tests
11 changes: 11 additions & 0 deletions deploy/eck-beats/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apiVersion: v2
name: eck-beats
description: A Helm chart to deploy Elastic Beats managed by the ECK Operator.
# Requirement comes from minimum version supported for eck-operator (https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s_supported_versions.html)
kubeVersion: ">= 1.20.0-0"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same question here, how do maintain this version? (It is also mentioned in deploy/eck-stack/README.md , I think it feels a bit redundant with what's in the main README.md)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated this to include the reasoning behind this requirement, as I think it's important. This would need to be updated during the normal release process for the eck-operator, when the requirement changes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If a user is using a version of the operator that still supports a previous k8s version (for example ECK 2.2 which still supports K8S 1.19), but the user needs to update the Helm Chart: does it prevent the user to use that new version of the Chart on 1.19? I'm just trying to understand how the min. k8s version supported by the operator and the min. k8s version supported by a Chart are tied.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If a user was running eck 2.2 on K8S 1.19 and attempted to use these Helm Charts, they would fail (helm would throw a failure) because of this K8S version requirement in the Chart.yaml.

type: application
version: 0.1.0
naemono marked this conversation as resolved.
Show resolved Hide resolved
sources:
- https://github.com/elastic/cloud-on-k8s
- https://github.com/elastic/beats
icon: https://helm.elastic.co/icons/beats.png
93 changes: 93 additions & 0 deletions deploy/eck-beats/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
Elastic License 2.0

URL: https://www.elastic.co/licensing/elastic-license

## Acceptance

By using the software, you agree to all of the terms and conditions below.

## Copyright License

The licensor grants you a non-exclusive, royalty-free, worldwide,
non-sublicensable, non-transferable license to use, copy, distribute, make
available, and prepare derivative works of the software, in each case subject to
the limitations and conditions below.

## Limitations

You may not provide the software to third parties as a hosted or managed
service, where the service provides users with access to any substantial set of
the features or functionality of the software.

You may not move, change, disable, or circumvent the license key functionality
in the software, and you may not remove or obscure any functionality in the
software that is protected by the license key.

You may not alter, remove, or obscure any licensing, copyright, or other notices
of the licensor in the software. Any use of the licensor’s trademarks is subject
to applicable law.

## Patents

The licensor grants you a license, under any patent claims the licensor can
license, or becomes able to license, to make, have made, use, sell, offer for
sale, import and have imported the software, in each case subject to the
limitations and conditions in this license. This license does not cover any
patent claims that you cause to be infringed by modifications or additions to
the software. If you or your company make any written claim that the software
infringes or contributes to infringement of any patent, your patent license for
the software granted under these terms ends immediately. If your company makes
such a claim, your patent license ends immediately for work on behalf of your
company.

## Notices

You must ensure that anyone who gets a copy of any part of the software from you
also gets a copy of these terms.

If you modify the software, you must include in any modified copies of the
software prominent notices stating that you have modified the software.

## No Other Rights

These terms do not imply any licenses other than those expressly granted in
these terms.

## Termination

If you use the software in violation of these terms, such use is not licensed,
and your licenses will automatically terminate. If the licensor provides you
with a notice of your violation, and you cease all violation of this license no
later than 30 days after you receive that notice, your licenses will be
reinstated retroactively. However, if you violate these terms after such
reinstatement, any additional violation of these terms will cause your licenses
to terminate automatically and permanently.

## No Liability

*As far as the law allows, the software comes as is, without any warranty or
condition, and the licensor will not be liable to you for any damages arising
out of these terms or the use or nature of the software, under any kind of
legal claim.*

## Definitions

The **licensor** is the entity offering these terms, and the **software** is the
software the licensor makes available under these terms, including any portion
of it.

**you** refers to the individual or entity agreeing to these terms.

**your company** is any legal entity, sole proprietorship, or other kind of
organization that you work for, plus all organizations that have control over,
are under the control of, or are under common control with that
organization. **control** means ownership of substantially all the assets of an
entity, or the power to direct its management and policies by vote, contract, or
otherwise. Control can be direct or indirect.

**your licenses** are all the licenses granted to you for the software under
these terms.

**use** means anything you do with the software requiring one of your licenses.

**trademark** means trademarks, service marks, and similar rights.
111 changes: 111 additions & 0 deletions deploy/eck-beats/examples/auditbeat_hosts.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: auditbeat
version: 8.3.3
spec:
type: auditbeat
elasticsearchRef:
name: elasticsearch
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we use the default names Elasticsearch and Kibana get when using the corresponding Helm charts?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've updated this per most comments, but want to check into this further tomorrow, as these names are dependent on the name of the chart itself, unless doing a full name override, so I'll want to ensure this is consistent with the other charts.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pebrc I've updated all values and all examples across all charts to be consistent for naming and updated all versions to latest stack 8.5.0, along with updating all tests to match/pass.

I've also bumped the versions of all charts where stack version changes were made, and updated the eck-stack Chart.yaml's dependency versions to match.

This should be ready for another set of 👀

kibanaRef:
name: kibana
config:
auditbeat.modules:
- module: file_integrity
paths:
- /hostfs/bin
- /hostfs/usr/bin
- /hostfs/sbin
- /hostfs/usr/sbin
- /hostfs/etc
exclude_files:
- '(?i)\.sw[nop]$'
- '~$'
- '/\.git($|/)'
scan_at_start: true
scan_rate_per_sec: 50 MiB
max_file_size: 100 MiB
hash_types: [sha1]
recursive: true
- module: auditd
audit_rules: |
# Executions
-a always,exit -F arch=b64 -S execve,execveat -k exec

# Unauthorized access attempts (amd64 only)
-a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EACCES -k access
-a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EPERM -k access

processors:
- add_cloud_metadata: {}
- add_host_metadata: {}
- add_process_metadata:
match_pids: ['process.pid']
daemonSet:
podTemplate:
spec:
hostPID: true # Required by auditd module
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true # Allows to provide richer host metadata
automountServiceAccountToken: true # some older Beat versions are depending on this settings presence in k8s context
securityContext:
runAsUser: 0
volumes:
- name: bin
hostPath:
path: /bin
- name: usrbin
hostPath:
path: /usr/bin
- name: sbin
hostPath:
path: /sbin
- name: usrsbin
hostPath:
path: /usr/sbin
- name: etc
hostPath:
path: /etc
- name: run-containerd
hostPath:
path: /run/containerd
type: DirectoryOrCreate
# Uncomment the below when running on GKE. See https://github.com/elastic/beats/issues/8523 for more context.
#- name: run
# hostPath:
# path: /run
#initContainers:
#- name: cos-init
# image: docker.elastic.co/beats/auditbeat:8.3.3
# volumeMounts:
# - name: run
# mountPath: /run
# command: ['sh', '-c', 'export SYSTEMD_IGNORE_CHROOT=1 && systemctl stop systemd-journald-audit.socket && systemctl mask systemd-journald-audit.socket && systemctl restart systemd-journald']
containers:
- name: auditbeat
securityContext:
capabilities:
add:
# Capabilities needed for auditd module
- 'AUDIT_READ'
- 'AUDIT_WRITE'
- 'AUDIT_CONTROL'
volumeMounts:
- name: bin
mountPath: /hostfs/bin
readOnly: true
- name: sbin
mountPath: /hostfs/sbin
readOnly: true
- name: usrbin
mountPath: /hostfs/usr/bin
readOnly: true
- name: usrsbin
mountPath: /hostfs/usr/sbin
readOnly: true
- name: etc
mountPath: /hostfs/etc
readOnly: true
# Directory with root filesystems of containers executed with containerd, this can be
# different with other runtimes. This volume is needed to monitor the file integrity
# of files in containers.
- name: run-containerd
mountPath: /run/containerd
readOnly: true
49 changes: 49 additions & 0 deletions deploy/eck-beats/examples/filebeat_no_autodiscover.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
apiVersion: beat.k8s.elastic.co/v1beta1
naemono marked this conversation as resolved.
Show resolved Hide resolved
kind: Beat
metadata:
name: filebeat
spec:
type: filebeat
version: 8.3.3
elasticsearchRef:
name: elasticsearch
kibanaRef:
name: kibana
config:
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
processors:
- add_host_metadata: {}
- add_cloud_metadata: {}
daemonSet:
podTemplate:
spec:
automountServiceAccountToken: true
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true # Allows to provide richer host metadata
containers:
- name: filebeat
securityContext:
runAsUser: 0
# If using Red Hat OpenShift uncomment this:
#privileged: true
volumeMounts:
- name: varlogcontainers
mountPath: /var/log/containers
- name: varlogpods
mountPath: /var/log/pods
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
volumes:
- name: varlogcontainers
hostPath:
path: /var/log/containers
- name: varlogpods
hostPath:
path: /var/log/pods
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
24 changes: 24 additions & 0 deletions deploy/eck-beats/examples/heartbeat_es_kb_health.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: heartbeat
version: 8.3.3
spec:
type: heartbeat
elasticsearchRef:
name: elasticsearch
config:
heartbeat.monitors:
- type: tcp
schedule: '@every 5s'
# This should directly match the name of the Elasticsearch instance
# with "-es-http" appended to the name.
hosts: ["elasticsearch-es-http.default.svc:9200"]
- type: tcp
schedule: '@every 5s'
# This should directly match the names of the Kibana instance
# with "-kb-http" appended to the name.
hosts: ["eck-kibana-kb-http.default.svc:5601"]
deployment:
replicas: 1
podTemplate:
spec:
securityContext:
runAsUser: 0
Loading