Skip to content

Commit d2915ea

Browse files
MichaelKatsoulismergify-bot
authored andcommitted
Add support for ephemeral containers in elastic agent dynamic provider (#27707)
* Add support for ephemeral containers in elastic agent dynamic provider (cherry picked from commit 8afb80e)
1 parent 7feae9e commit d2915ea

3 files changed

Lines changed: 92 additions & 1 deletion

File tree

x-pack/elastic-agent/CHANGELOG.next.asciidoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,4 @@
135135
- Add new --enroll-delay option for install and enroll commands. {pull}27118[27118]
136136
- Add link to troubleshooting guide on fatal exits. {issue}26367[26367] {pull}27236[27236]
137137
- Agent now adapts the beats queue size based on output settings. {issue}26638[26638] {pull}27429[27429]
138+
- Support ephemeral containers in Kubernetes dynamic provider. {issue}#27020[#27020] {pull}27707[27707]

x-pack/elastic-agent/pkg/composable/providers/kubernetes/pod.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ func (p *pod) emitRunning(pod *kubernetes.Pod) {
6767

6868
// TODO: deal with init containers stopping after initialization
6969
p.emitContainers(pod, pod.Spec.InitContainers, pod.Status.InitContainerStatuses)
70-
// TODO: deal with ephemeral containers
70+
71+
// Get ephemeral containers and their status
72+
ephContainers, ephContainersStatuses := getEphemeralContainers(pod)
73+
p.emitContainers(pod, ephContainers, ephContainersStatuses)
74+
7175
}
7276

7377
func (p *pod) emitContainers(pod *kubernetes.Pod, containers []kubernetes.Container, containerstatuses []kubernetes.PodContainerStatus) {
@@ -222,3 +226,16 @@ func generateContainerData(
222226
comm.AddOrUpdate(eventID, ContainerPriority, mapping, processors)
223227
}
224228
}
229+
230+
func getEphemeralContainers(pod *kubernetes.Pod) ([]kubernetes.Container, []kubernetes.PodContainerStatus) {
231+
var ephContainers []kubernetes.Container
232+
var ephContainersStatuses []kubernetes.PodContainerStatus
233+
for _, c := range pod.Spec.EphemeralContainers {
234+
c := kubernetes.Container(c.EphemeralContainerCommon)
235+
ephContainers = append(ephContainers, c)
236+
}
237+
for _, s := range pod.Status.EphemeralContainerStatuses {
238+
ephContainersStatuses = append(ephContainersStatuses, s)
239+
}
240+
return ephContainers, ephContainersStatuses
241+
}

x-pack/elastic-agent/pkg/composable/providers/kubernetes/pod_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,79 @@ func TestGenerateContainerPodData(t *testing.T) {
166166

167167
}
168168

169+
func TestGetEphemeralContainers(t *testing.T) {
170+
name := "filebeat"
171+
namespace := "default"
172+
podIP := "127.0.0.1"
173+
containerID := "docker://foobar"
174+
uid := "005f3b90-4b9d-12f8-acf0-31020a840133"
175+
containerImage := "elastic/filebeat:6.3.0"
176+
node := "node"
177+
178+
expectedEphemeralContainers :=
179+
[]kubernetes.Container{
180+
{
181+
Name: "filebeat",
182+
Image: "elastic/filebeat:6.3.0",
183+
},
184+
}
185+
expectedephemeralContainersStatuses :=
186+
[]kubernetes.PodContainerStatus{
187+
{
188+
Name: "filebeat",
189+
State: v1.ContainerState{
190+
Running: &v1.ContainerStateRunning{
191+
StartedAt: metav1.Time{},
192+
},
193+
},
194+
Ready: false,
195+
ContainerID: "docker://foobar",
196+
},
197+
}
198+
199+
pod :=
200+
&kubernetes.Pod{
201+
ObjectMeta: metav1.ObjectMeta{
202+
Name: name,
203+
UID: types.UID(uid),
204+
Namespace: namespace,
205+
Labels: map[string]string{},
206+
Annotations: map[string]string{},
207+
},
208+
TypeMeta: metav1.TypeMeta{
209+
Kind: "Pod",
210+
APIVersion: "v1",
211+
},
212+
Status: v1.PodStatus{
213+
PodIP: podIP,
214+
Phase: kubernetes.PodRunning,
215+
EphemeralContainerStatuses: []kubernetes.PodContainerStatus{
216+
{
217+
Name: name,
218+
ContainerID: containerID,
219+
State: v1.ContainerState{
220+
Running: &v1.ContainerStateRunning{},
221+
},
222+
},
223+
},
224+
},
225+
Spec: v1.PodSpec{
226+
NodeName: node,
227+
EphemeralContainers: []v1.EphemeralContainer{
228+
{
229+
EphemeralContainerCommon: v1.EphemeralContainerCommon{
230+
Image: containerImage,
231+
Name: name,
232+
},
233+
},
234+
},
235+
},
236+
}
237+
ephContainers, ephContainersStatuses := getEphemeralContainers(pod)
238+
assert.Equal(t, expectedEphemeralContainers, ephContainers)
239+
assert.Equal(t, expectedephemeralContainersStatuses, ephContainersStatuses)
240+
}
241+
169242
// MockDynamicComm is used in tests.
170243
type MockDynamicComm struct {
171244
context.Context

0 commit comments

Comments
 (0)