Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
68433e9
[local] Create CI for kata-containers
zaymat Jun 14, 2024
cde2f41
[local] Add the dummy module to the kernel to support emissary
zaymat Jun 17, 2024
1f9549e
[local] CI: build kernel 6.8
zaymat Oct 9, 2024
5efc7b3
[local] Generate sbom of the rootfs
antoine-gaillard Oct 9, 2024
2b741f8
[local] CI in Github actions
zaymat Oct 28, 2024
e518fb2
[local] Switch back to ubuntu 22.04
antoine-gaillard Dec 30, 2024
2df4040
[local] Add the option to add new files in the created rootfs
zaymat Feb 18, 2025
7420b78
[local] Change systemd's max process limit to 131072
zaymat Feb 18, 2025
daad380
[local] Specific OS_VERSION when building OS
zaymat Feb 18, 2025
b37b059
[local] Gzip SBOM file
zaymat Feb 20, 2025
dd93999
Take CPU shares into account when computing the sandbox size
zaymat May 22, 2025
1b5f10d
Update src/runtime/virtcontainers/utils/utils.go
zaymat May 22, 2025
76580f0
Add OCI image build infrastructure
antoine-gaillard Aug 5, 2025
9b4c4df
Fix after review
antoine-gaillard Aug 5, 2025
d8eafbf
Configuration files fixes
antoine-gaillard Aug 6, 2025
840a95d
Bump golang toolchain and set GOTOOLCHAIN to auto to avoid mismatch
antoine-gaillard Aug 21, 2025
0e727b1
runtime-go: fixes early closed stdout/err on exec w/o stdin option (#26)
EricMountain Aug 21, 2025
652c623
Use GITHUB_TOKEN secret to upload release artefacts (#28)
EricMountain Aug 22, 2025
6b09cd2
Harmonise sysctl between host and guest
zaymat Sep 10, 2025
8c3a150
New compression format for Kata starting 3.21.0
zaymat Oct 13, 2025
850b852
add eBPF support
safchain Sep 16, 2025
c42a247
add btf
safchain Sep 25, 2025
d6c821b
[local] Add libssl-dev to CI image
zaymat Sep 30, 2025
55cb324
make it work on arm
safchain Sep 30, 2025
74d6554
add pahole
safchain Sep 30, 2025
5c6cb28
Bump ci image version
zaymat Oct 8, 2025
27c7723
Bump CI runner resources
zaymat Oct 13, 2025
6157ab8
Use bootable image of the kernel instead of vmlinux
zaymat Nov 28, 2025
0715071
kernel: Enable netkit device support
HadrienPatte Sep 15, 2025
62a2c6f
runtime: Add support for netkit endpoints
HadrienPatte Nov 24, 2025
b3e0ea1
runtime: Reject netkit L3 devices with clear error
HadrienPatte Nov 27, 2025
fc8ec34
runtime: Fix netkit endpoint tests using non-existent struct fields
antoine-gaillard Jan 22, 2026
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
86 changes: 86 additions & 0 deletions .github/workflows/build-kata-os.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: Build Kata OS
run-name: Build Kata OS
on: [push]
permissions:
contents: write
jobs:
build:
strategy:
matrix:
runner: [ubuntu-22.04, arm-8core-linux]
include:
- runner: ubuntu-22.04
arch: amd64
kernel_version: 6.8
- runner: arm-8core-linux
arch: arm64
kernel_version: 6.8
runs-on: ${{ matrix.runner }}
steps:
- name: Check out repository code
uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: ">=1.24.0"
- name: Install dependencies
run: sudo apt-get update && sudo apt-get install -y libelf-dev flex bison libssl-dev pahole
- name: Build Ubuntu image ${{ matrix.arch }}
run: cd tools/osbuilder && sudo make USE_DOCKER=true OS_VERSION=jammy image-ubuntu
- name: Build Kernel ${{ matrix.kernel_version }}
run: |
cd tools/packaging/kernel
sudo ./build-kernel.sh -v ${{ matrix.kernel_version }} setup
sudo ./build-kernel.sh -v ${{ matrix.kernel_version }} build
- name: Build containerd-shim-kata-v2
run: |
cd src/runtime
make -j$(nproc) containerd-shim-v2
- name: Bundle artifacts
run: |
if [[ "${{ matrix.arch }}" == "amd64" ]]
then
cp tools/packaging/kernel/kata-linux-*/arch/x86/boot/bzImage /tmp/vmlinux
else
cp tools/packaging/kernel/kata-linux-*/arch/arm64/boot/Image.gz /tmp/vmlinux
fi
cp tools/osbuilder/kata-containers-image-ubuntu.img /tmp/kata-containers-image-ubuntu.img
cp sbom.cdx.gz /tmp/sbom.cdx.gz
cp src/runtime/containerd-shim-kata-v2 /tmp/containerd-shim-kata-v2
mkdir -p /tmp/artifacts
zip -j /tmp/artifacts/artifacts-${{ matrix.arch }}.zip /tmp/vmlinux /tmp/kata-containers-image-ubuntu.img /tmp/sbom.cdx.gz /tmp/containerd-shim-kata-v2
cd /tmp/artifacts
sha256sum artifacts-${{ matrix.arch }}.zip > checksum-${{ matrix.arch }}.sha256
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: artifacts-${{ matrix.arch }}
path: /tmp/artifacts
retention-days: 1
release:
runs-on: ubuntu-22.04
needs: build
# Only create a release when a new tag is created
if: ${{ startsWith(github.ref, 'refs/tags/') }}
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Download artifacts amd64
uses: actions/download-artifact@v4
with:
name: artifacts-amd64
- name: Download artifacts arm64
uses: actions/download-artifact@v4
with:
name: artifacts-arm64
- name: "Create New Release"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
RELEASE_VERSION=$(echo ${{ github.ref }} | sed 's/refs\/tags\///')
echo "Creating release $RELEASE_VERSION"
gh release create ${RELEASE_VERSION} -t ${RELEASE_VERSION} --draft
gh release upload "${RELEASE_VERSION}" artifacts-amd64.zip
gh release upload "${RELEASE_VERSION}" artifacts-arm64.zip
gh release upload "${RELEASE_VERSION}" checksum-amd64.sha256
gh release upload "${RELEASE_VERSION}" checksum-arm64.sha256
gh release edit ${RELEASE_VERSION} --verify-tag --draft=false
115 changes: 115 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
include: https://gitlab-templates.ddbuild.io/compute-delivery/v2/compute-delivery.yml

variables:
CI_IMAGE: 3
KERNEL_VERSION: 6.8
KUBERNETES_CPU_REQUEST: "10"
KUBERNETES_MEMORY_REQUEST: "20Gi"
KUBERNETES_MEMORY_LIMIT: "40Gi"

stages:
- ci-image
- build
- publish
- notify

ci-image:
stage: ci-image
extends: .build-docker-image
when: manual
only:
- branches
variables:
IMAGE_NAME: "$CI_PROJECT_NAME/ci"
IMAGE_TAG: $CI_IMAGE
CONTEXT_DIR: "./tools/packaging/kernel"
TARGET: "build"

build-kernel-amd64:
image: registry.ddbuild.io/$CI_PROJECT_NAME/ci:$CI_IMAGE
stage: build
tags: [ "arch:amd64" ]
script:
- cd tools/packaging/kernel
- ./build-kernel.sh -v $KERNEL_VERSION setup
- ./build-kernel.sh -v $KERNEL_VERSION build
- cp kata-linux-*/arch/x86_64/boot/bzImage ./vmlinux-amd64
artifacts:
paths:
- tools/packaging/kernel/vmlinux-amd64
expire_in: 1 week

build-kernel-arm64:
image: registry.ddbuild.io/$CI_PROJECT_NAME/ci:$CI_IMAGE
stage: build
tags: [ "arch:arm64" ]
script:
- cd tools/packaging/kernel
- ./build-kernel.sh -v $KERNEL_VERSION setup
- ./build-kernel.sh -v $KERNEL_VERSION build
- cp kata-linux-*/arch/arm64/boot/Image.gz ./vmlinux-arm64
artifacts:
paths:
- tools/packaging/kernel/vmlinux-arm64
expire_in: 1 week

build-shim-amd64:
image: registry.ddbuild.io/images/mirror/library/golang:1.24.5
stage: build
tags: [ "arch:amd64" ]
variables:
GOTOOLCHAIN: auto
script:
- cd src/runtime
- make containerd-shim-v2
- mv containerd-shim-kata-v2 containerd-shim-kata-v2-amd64
artifacts:
paths:
- src/runtime/containerd-shim-kata-v2-amd64
expire_in: 1 week

build-shim-arm64:
image: registry.ddbuild.io/images/mirror/library/golang:1.24.5
stage: build
tags: [ "arch:arm64" ]
variables:
GOTOOLCHAIN: auto
script:
- cd src/runtime
- make containerd-shim-v2
- mv containerd-shim-kata-v2 containerd-shim-kata-v2-arm64
artifacts:
paths:
- src/runtime/containerd-shim-kata-v2-arm64
expire_in: 1 week

publish-artifacts:
image: registry.ddbuild.io/$CI_PROJECT_NAME/ci:$CI_IMAGE
stage: publish
only:
- tags
tags: [ "arch:amd64" ]
dependencies:
- "build-kernel-amd64"
- "build-kernel-arm64"
variables:
GIT_STRATEGY: none
script:
- aws s3 cp tools/packaging/kernel/vmlinux-amd64 s3://kata-containers-ci-artifacts/$CI_COMMIT_REF_NAME/amd64/vmlinux
- aws s3 cp tools/packaging/kernel/vmlinux-arm64 s3://kata-containers-ci-artifacts/$CI_COMMIT_REF_NAME/arm64/vmlinux
- echo $CI_COMMIT_REF_NAME > LATEST && aws s3 cp LATEST s3://kata-containers-ci-artifacts/LATEST

publish-oci-image:
stage: publish
extends: .build-docker-image
dependencies:
- "build-kernel-amd64"
- "build-kernel-arm64"
- "build-shim-amd64"
- "build-shim-arm64"
variables:
EXTRA_ARGS: "-f docker/Dockerfile --build-arg CI_COMMIT_TAG=$CI_COMMIT_TAG"
IMAGE_TAG: "$CI_COMMIT_TAG"
only:
- tags

83 changes: 83 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Builder stage
FROM ubuntu:22.04 AS builder

# CI_COMMIT_TAG will be passed as build arg (e.g., 3.18.0-dd.202526)
ARG CI_COMMIT_TAG

# Install packages
RUN apt-get update && \
apt-get install -y curl wget unzip xz-utils zstd ca-certificates && \
rm -rf /var/lib/apt/lists/*

# Create directory structure
RUN mkdir -p /kata-build/opt/kata/bin \
/kata-build/opt/kata/conf/qemu/config.d \
/kata-build/opt/kata/libexec \
/kata-build/opt/kata/share/kata-containers \
/kata-build/etc/containerd/config.d

# Download and extract kata package
# Extract version from tag and construct URL
ARG TARGETARCH
RUN KATA_VERSION=${CI_COMMIT_TAG%%-dd.*} && \
echo "Downloading kata ${KATA_VERSION} from tag ${CI_COMMIT_TAG}" && \
wget -q "https://github.com/kata-containers/kata-containers/releases/download/${KATA_VERSION}/kata-static-${KATA_VERSION}-${TARGETARCH}.tar.zst" -O /tmp/kata.tar.zst && \
tar --zstd -xf /tmp/kata.tar.zst -C /kata-build --wildcards \
'./opt/kata/bin/qemu-system-*' \
'./opt/kata/libexec/virtiofsd' \
'./opt/kata/lib/kata-qemu/libfdt.a' \
'./opt/kata/lib/kata-qemu/pkgconfig/libfdt.pc' \
'./opt/kata/include/fdt.h' \
'./opt/kata/include/libfdt.h' \
'./opt/kata/include/libfdt_env.h' \
'./opt/kata/share/kata-qemu/qemu/bios-256k.bin' \
'./opt/kata/share/kata-qemu/qemu/bios-microvm.bin' \
'./opt/kata/share/kata-qemu/qemu/bios.bin' \
'./opt/kata/share/kata-qemu/qemu/edk2-i386-code.fd' \
'./opt/kata/share/kata-qemu/qemu/edk2-i386-secure-code.fd' \
'./opt/kata/share/kata-qemu/qemu/edk2-i386-vars.fd' \
'./opt/kata/share/kata-qemu/qemu/edk2-x86_64-code.fd' \
'./opt/kata/share/kata-qemu/qemu/edk2-x86_64-secure-code.fd' \
'./opt/kata/share/kata-qemu/qemu/edk2-licenses.txt' \
'./opt/kata/share/kata-qemu/qemu/efi-virtio.rom' \
'./opt/kata/share/kata-qemu/qemu/firmware/50-edk2-i386-secure.json' \
'./opt/kata/share/kata-qemu/qemu/firmware/50-edk2-x86_64-secure.json' \
'./opt/kata/share/kata-qemu/qemu/firmware/60-edk2-i386.json' \
'./opt/kata/share/kata-qemu/qemu/firmware/60-edk2-x86_64.json' \
'./opt/kata/share/kata-qemu/qemu/kvmvapic.bin' \
'./opt/kata/share/kata-qemu/qemu/linuxboot.bin' \
'./opt/kata/share/kata-qemu/qemu/linuxboot_dma.bin' \
'./opt/kata/share/kata-qemu/qemu/multiboot_dma.bin' \
'./opt/kata/share/kata-qemu/qemu/pvh.bin' \
'./opt/kata/share/kata-qemu/qemu/qboot.rom' \
'./opt/kata/share/kata-qemu/qemu/qemu-nsis.bmp' \
'./opt/kata/share/defaults/kata-containers/configuration-qemu.toml' \
'./opt/kata/share/kata-containers/kata-ubuntu-noble.image' && \
mv /kata-build/opt/kata/share/kata-containers/kata-ubuntu-noble.image /kata-build/opt/kata/share/kata-containers/kata-containers-datadog.img && \
rm -f /tmp/kata.tar.xz

# Copy CI-built kernel for the target architecture and rename to datadog convention
COPY tools/packaging/kernel/vmlinux-${TARGETARCH} /kata-build/opt/kata/share/kata-containers/vmlinux-datadog

# Copy CI-built shim binary
# This should be built by the CI pipeline and placed in the expected location
COPY src/runtime/containerd-shim-kata-v2-${TARGETARCH} /kata-build/opt/kata/bin/containerd-shim-kata-v2
RUN chmod +x /kata-build/opt/kata/bin/containerd-shim-kata-v2

# Create symlinks for kata-containers.img and vmlinux.container
RUN ln -s /opt/kata/share/kata-containers/kata-containers-datadog.img /kata-build/opt/kata/share/kata-containers/kata-containers.img && \
ln -s /opt/kata/share/kata-containers/vmlinux-datadog /kata-build/opt/kata/share/kata-containers/vmlinux.container

# Link configuration
RUN ln /kata-build/opt/kata/share/defaults/kata-containers/configuration-qemu.toml /kata-build/opt/kata/conf/qemu/configuration-qemu.toml

# Copy override configuration
COPY docker/qemu/config.d/10-override.toml /kata-build/opt/kata/conf/qemu/config.d/10-override.toml

# Copy containerd runtime dropin
COPY docker/containerd/config.d/20-kata-runtime.toml /kata-build/etc/containerd/config.d/20-kata-runtime.toml

# Final scratch-based data volume
FROM scratch
COPY --from=builder /kata-build/opt/kata /opt/kata
COPY --from=builder /kata-build/etc/containerd /etc/containerd
10 changes: 10 additions & 0 deletions docker/containerd/config.d/20-kata-runtime.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Kata Containers runtime configuration dropin for containerd
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.kata-qemu]
runtime_type = 'io.containerd.kata.v2'
runtime_path = '/opt/kata/bin/containerd-shim-kata-v2'
pod_annotations = ['io.katacontainers.*']
privileged_without_host_devices = true
sandboxer = ''

[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.kata-qemu.options]
ConfigPath = '/opt/kata/conf/qemu/configuration-qemu.toml'
9 changes: 9 additions & 0 deletions docker/qemu/config.d/10-override.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[hypervisor.qemu]
kernel_params = "systemd.unified_cgroup_hierarchy=1"
enable_annotations = ["enable_iommu", "virtio_fs_extra_args", "kernel_params", "default_memory"]

[agent.kata]
debug_console_enabled = false

[runtime]
static_sandbox_resource_mgmt=true
32 changes: 23 additions & 9 deletions src/runtime/pkg/oci/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -1398,7 +1398,7 @@ func (a *annotationConfiguration) setFloat32WithCheck(f func(float32) error) err
// be added to the VM if sandbox annotations are provided with this sizing details
func CalculateSandboxSizing(spec *specs.Spec) (numCPU float32, memSizeMB uint32) {
var memory, quota int64
var period uint64
var period, shares uint64
var err error

if spec == nil || spec.Annotations == nil {
Expand Down Expand Up @@ -1429,6 +1429,15 @@ func CalculateSandboxSizing(spec *specs.Spec) (numCPU float32, memSizeMB uint32)
}
}

annotation, ok = spec.Annotations[ctrAnnotations.SandboxCPUShares]
if ok {
shares, err = strconv.ParseUint(annotation, 10, 64)
if err != nil {
ociLog.Warningf("sandbox-sizing: failure to parse SandboxCPUShares: %s", annotation)
shares = 0
}
}

annotation, ok = spec.Annotations[ctrAnnotations.SandboxMem]
if ok {
memory, err = strconv.ParseInt(annotation, 10, 64)
Expand All @@ -1438,35 +1447,40 @@ func CalculateSandboxSizing(spec *specs.Spec) (numCPU float32, memSizeMB uint32)
}
}

return calculateVMResources(period, quota, memory)
return calculateVMResources(period, quota, shares, memory)
}

// CalculateContainerSizing will calculate the number of CPUs and amount of memory that is needed
// based on the provided LinuxResources
func CalculateContainerSizing(spec *specs.Spec) (numCPU float32, memSizeMB uint32) {
var memory, quota int64
var period uint64
var period, shares uint64

if spec == nil || spec.Linux == nil || spec.Linux.Resources == nil {
return 0, 0
}

resources := spec.Linux.Resources

if resources.CPU != nil && resources.CPU.Quota != nil && resources.CPU.Period != nil {
quota = *resources.CPU.Quota
period = *resources.CPU.Period
if resources.CPU != nil {
if resources.CPU.Quota != nil && resources.CPU.Period != nil {
quota = *resources.CPU.Quota
period = *resources.CPU.Period
}
if resources.CPU.Shares != nil {
shares = *resources.CPU.Shares
}
}

if resources.Memory != nil && resources.Memory.Limit != nil {
memory = *resources.Memory.Limit
}

return calculateVMResources(period, quota, memory)
return calculateVMResources(period, quota, shares, memory)
}

func calculateVMResources(period uint64, quota int64, memory int64) (numCPU float32, memSizeMB uint32) {
numCPU = vcutils.CalculateCPUsF(quota, period)
func calculateVMResources(period uint64, quota int64, shares uint64, memory int64) (numCPU float32, memSizeMB uint32) {
numCPU = vcutils.CalculateCPUsF(quota, period, shares)

if memory < 0 {
// While spec allows for a negative value to indicate unconstrained, we don't
Expand Down
Loading
Loading