From 7994c21c7309a0d3cd7547fdaf2dd45343b41e0c Mon Sep 17 00:00:00 2001 From: Andrea Panattoni Date: Tue, 19 Nov 2024 17:27:13 +0100 Subject: [PATCH 1/3] Build plugin image Add Dockerfile and related entrypoint.sh to build the binary and copy it to the host. Signed-off-by: Andrea Panattoni --- images/Dockerfile | 15 +++++++++++++++ images/entrypoint.sh | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 images/Dockerfile create mode 100755 images/entrypoint.sh diff --git a/images/Dockerfile b/images/Dockerfile new file mode 100644 index 0000000..c56d3b6 --- /dev/null +++ b/images/Dockerfile @@ -0,0 +1,15 @@ +# This Dockerfile is used to build the image available on DockerHub +FROM docker.io/golang:1.23 AS build + +WORKDIR /usr/src/bond-cni +COPY . . +RUN make build-bin + +FROM docker.io/alpine:latest +LABEL org.opencontainers.image.source=https://github.com/k8snetworkplumbingwg/bond-cni +WORKDIR / +COPY --from=build /usr/src/bond-cni/bin . +COPY LICENSE . +COPY images/entrypoint.sh . + +CMD ["/entrypoint.sh"] diff --git a/images/entrypoint.sh b/images/entrypoint.sh new file mode 100755 index 0000000..7d18013 --- /dev/null +++ b/images/entrypoint.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -u -e -x + +CNI_BIN_DIR=${CNI_BIN_DIR:-"/host/opt/cni/bin/"} + +cp -f /bond $CNI_BIN_DIR + +# Unless told otherwise, sleep forever. +# This prevents Kubernetes from restarting the pod repeatedly. +should_sleep=${SLEEP:-"true"} +echo "Done configuring CNI. Sleep=$should_sleep" +while [ "$should_sleep" == "true" ]; do + sleep 1000000000000 +done From 96f904836ebf526ddc4b2b9cdbc7c83cca1b8a2d Mon Sep 17 00:00:00 2001 From: Andrea Panattoni Date: Tue, 19 Nov 2024 17:28:00 +0100 Subject: [PATCH 2/3] Build and publish images in CI Add GitHub configuration to publish the docker image with the plugin binary Signed-off-by: Andrea Panattoni --- .github/workflows/image-build.yml | 20 +++++++++++ .github/workflows/image-push-master.yml | 36 +++++++++++++++++++ .github/workflows/image-push-release.yml | 44 ++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 .github/workflows/image-build.yml create mode 100644 .github/workflows/image-push-master.yml create mode 100644 .github/workflows/image-push-release.yml diff --git a/.github/workflows/image-build.yml b/.github/workflows/image-build.yml new file mode 100644 index 0000000..a148f7d --- /dev/null +++ b/.github/workflows/image-build.yml @@ -0,0 +1,20 @@ +name: Image build +on: [pull_request] +jobs: + build: + name: Image plugin + runs-on: ubuntu-latest + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build container image + uses: docker/build-push-action@v5 + with: + context: . + push: false + tags: ghcr.io/${{ github.repository }}:latest + file: images/Dockerfile diff --git a/.github/workflows/image-push-master.yml b/.github/workflows/image-push-master.yml new file mode 100644 index 0000000..ef58995 --- /dev/null +++ b/.github/workflows/image-push-master.yml @@ -0,0 +1,36 @@ +name: Image push for master +on: + push: + branches: + - master +env: + image-push-owner: 'k8snetworkplumbingwg' +jobs: + + push: + name: Image push + runs-on: ubuntu-latest + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + if: ${{ github.repository_owner == env.image-push-owner }} + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Push container image + if: ${{ github.repository_owner == env.image-push-owner }} + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: | + ghcr.io/${{ github.repository }}:latest + file: images/Dockerfile diff --git a/.github/workflows/image-push-release.yml b/.github/workflows/image-push-release.yml new file mode 100644 index 0000000..d1d5799 --- /dev/null +++ b/.github/workflows/image-push-release.yml @@ -0,0 +1,44 @@ +name: Image push release +on: + push: + tags: + - v* +env: + image-push-owner: 'k8snetworkplumbingwg' +jobs: + push: + name: Image push + runs-on: ubuntu-latest + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + if: ${{ github.repository_owner == env.image-push-owner }} + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker meta + id: docker_meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository }} + flavor: | + latest=false + + - name: Push container image + if: ${{ github.repository_owner == env.image-push-owner }} + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: | + ghcr.io/${{ github.repository }}:stable + ${{ steps.docker_meta.outputs.tags }} + file: images/Dockerfile From d79f9ea55c44328165fb98f38395a598a97ca35e Mon Sep 17 00:00:00 2001 From: Andrea Panattoni Date: Tue, 19 Nov 2024 17:29:21 +0100 Subject: [PATCH 3/3] Deployment file With this configuration, `bond` CNI plugin can be deployed via: ``` kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/bond-cni/master/manifests/bond.yml ``` Signed-off-by: Andrea Panattoni --- manifests/bond-cni.yaml | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 manifests/bond-cni.yaml diff --git a/manifests/bond-cni.yaml b/manifests/bond-cni.yaml new file mode 100644 index 0000000..8da9f56 --- /dev/null +++ b/manifests/bond-cni.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: bond-cni + labels: + tier: node + app: bond-cni +spec: + selector: + matchLabels: + app: bond-cni + updateStrategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 10% + template: + metadata: + labels: + tier: node + app: bond-cni + spec: + nodeSelector: + kubernetes.io/arch: amd64 + kubernetes.io/os: linux + tolerations: + - key: node-role.kubernetes.io/master + operator: Exists + effect: NoSchedule + containers: + - name: bond-cni-plugin + image: ghcr.io/k8snetworkplumbingwg/bond-cni:latest + resources: + requests: + cpu: "10m" + memory: "15Mi" + volumeMounts: + - name: cnibin + mountPath: /host/opt/cni/bin/ + volumes: + - name: cnibin + hostPath: + path: /opt/cni/bin/