Kubernetes pod:
DEEP DIVE
ContainerDays 2019
Hamburg, 26/06/2019
whoami
DARIO TRANCHITELLA
- Father
- Developer
- DevOps
- Gopher
- former drummer
CLOUD DEVOPS ENGINEER
NAMECHEAP (NC Cloud Team)
this
talk
IS ABOUT...
AND WHY THIS TALK?
THIS TALK IS NOT MADE
OF COPY-PASTED QUOTE
- Dario Tranchitella (ContainerDay 2018)
what is a pod?
kubernetes.io
A pod (as in a pod of whales or pea pod) is a group of one or more containers (such as Docker containers), with shared storage/network, and a specification for how to run the containers. A pod’s contents are always co-located and co-scheduled, and run in a shared context. A pod models an application-specific “logical host” - it contains one or more application containers which are relatively tightly coupled — in a pre-container world, being executed on the same physical or virtual machine would mean being executed on the same logical host.
https://kubernetes.io/docs/concepts/workloads/pods/pod/
the definition implementation
apiVersion: v1
kind: Pod
metadata:
name: containerdays
spec:
containers:
- name: foo
image: nginx:alpine
resources:
limits:
cpu: "500m"
memory: "256Mi"
requests:
cpu: "250m"
memory: "128Mi"
- name: bar
image: redis:alpine
resources:
limits:
cpu: "500m"
memory: "256Mi"
requests:
cpu: "250m"
memory: "128Mi"
...keep in mind that a container is made of:
- namespace
- cgroup
- copy on write FS
MORE INFO?
Giulio De Donato: Isoliamo un Processo senza Container (ContainerDay 2016)
K8S_POD_<NAME> AND PAUSE?
what is the pause container?
kuberentes pause container
https://github.com/kubernetes/kubernetes/blob/master/build/pause/pause.c
sigaction
examine and change a signal action: returns 0 on success, -1 on error.
SIGINT (2)
Interrupt from keyboard
SIGTERM (15)
Termination signal
SIGCHLD (20,17,18)
Child stopped or terminated
...what about 42?
Answer to the Ultimate Question of Life, the Universe, and Everything!
openshift pause container (< v4)
https://github.com/openshift/origin/blob/v4.0.0-alpha.0/images/pod/pod.go
signal.Notify
Go signal notification works by sending os.Signal values on a channe
os.Interrupt
It's sigint (2)
syscall.SIGTERM
It's sigterm (15)
os.Kill
It's sigkill (9)
PLEASE
ADD LITTLE
COMPLEXITY
...so, it's demo time!
START YOUR OWN POD
docker run \
-d \
--rm \
--name containerdays \
k8s.gcr.io/pause-amd64:3.1
docker run \
-d \
--rm \
--name containerdays_foo \
--network container:containerdays \
--cpu-shares 512 \
--cpu-quota 75000 \
--ipc container:containerdays \
nginx:alpine
docker run \
-d \
--rm \
--name containerdays_bar \
--network container:containerdays \
--cpu-shares 512 \
--cpu-quota 75000 \
--ipc container:containerdays \
redis:alpine
apiVersion: v1
kind: Pod
metadata:
name: containerdays
spec:
containers:
- name: foo
image: nginx:alpine
resources:
limits:
cpu: "750m"
memory: "256Mi"
requests:
cpu: "500m"
memory: "128Mi"
- name: bar
image: redis:alpine
resources:
limits:
cpu: "750m"
memory: "256Mi"
requests:
cpu: "500m"
memory: "128Mi"
...wut, something's missing
-
MEMORY REQUEST
memory request is primarily useful to the scheduler, which uses it to find a node with at least that many memory available
-
SECURITY CONTEXT
- --user
- --group-add
- --cap-{add,drop}
- --privileged
- --security-opt
- ...and so on
PLEASE
ADD MORE
COMPLEXITY
edamame.POD.service
[Unit]
Description=EdamamePod, awesome and tasty pod
Requires=docker.service
[Service]
ExecStartPre=/usr/bin/echo "This could be a init script, WDYT?"
ExecStartPre=/usr/bin/docker volume create edamame_volume
ExecStart=/usr/bin/docker run --rm --name edamame k8s.gcr.io/pause-amd64:3.1
ExecStop=/usr/bin/docker stop edamame
Restart=always
[Install]
WantedBy=multi-user.target
EDAMAME.foo.service
[Unit]
Description=edamame.foo, aka Redis
PartOf=edamame.pod.service
[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/docker run --rm --name edamame.foo -v edamame_volume:/etc/edamame --network container:edamame redis:alpine
ExecStop=/usr/bin/docker stop edamame.foo
Restart=always
[Install]
WantedBy=multi-user.target
EDAMAME.bar.service
[Unit]
Description=edamame.bar, aka NGINX
PartOf=edamame.pod.service
[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/docker run --rm --name edamame.bar -v edamame_volume:/etc/edamame --network container:edamame nginx:alpine
ExecStop=/usr/bin/docker stop edamame.bar
Restart=always
[Install]
WantedBy=multi-user.target
...mmm, where are container patterns?
designing distributed systems (brendan burns)
ambassador
https://github.com/prometherion/openshift-prometheus-grafana-ambassador
...any question?
ContainerDays 2019
By Dario Tranchitella
ContainerDays 2019
- 1,504