ctl create cmm
This commit is contained in:
@@ -27,6 +27,7 @@ FUSE_OVERLAYFS="${FUSE_OVERLAYFS:-/usr/bin/fuse-overlayfs}"
|
|||||||
EXTRA_IMAGES=(
|
EXTRA_IMAGES=(
|
||||||
"${EXTRA_IMAGES[@]:-}"
|
"${EXTRA_IMAGES[@]:-}"
|
||||||
"docker-daemon:localhost/monok8s/node-control:$TAG"
|
"docker-daemon:localhost/monok8s/node-control:$TAG"
|
||||||
|
"docker-daemon:localhost/monok8s/cmm:$TAG"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Keep archive cache version/arch scoped so downloads do not get mixed.
|
# Keep archive cache version/arch scoped so downloads do not get mixed.
|
||||||
|
|||||||
@@ -11,6 +11,19 @@ BOOT_STATE=/run/monok8s/boot-state.env
|
|||||||
BOOTPART_FILE="$CONFIG_DIR/.bootpart"
|
BOOTPART_FILE="$CONFIG_DIR/.bootpart"
|
||||||
MIGRATION_STATE_DIR="$CONFIG_DIR/migration-state"
|
MIGRATION_STATE_DIR="$CONFIG_DIR/migration-state"
|
||||||
|
|
||||||
|
load_module_optional() {
|
||||||
|
module="$1"
|
||||||
|
|
||||||
|
if ! modprobe "$module"; then
|
||||||
|
echo "WARNING: failed to load optional module: $module"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Loading optional hardware offload modules..."
|
||||||
|
load_module_optional cdx
|
||||||
|
load_module_optional fci
|
||||||
|
load_module_optional auto_bridge
|
||||||
|
|
||||||
mkdir -p /dev/hugepages
|
mkdir -p /dev/hugepages
|
||||||
mountpoint -q /dev/hugepages || mount -t hugetlbfs none /dev/hugepages
|
mountpoint -q /dev/hugepages || mount -t hugetlbfs none /dev/hugepages
|
||||||
echo 256 > /proc/sys/vm/nr_hugepages
|
echo 256 > /proc/sys/vm/nr_hugepages
|
||||||
|
|||||||
@@ -3,36 +3,9 @@ set -eu
|
|||||||
|
|
||||||
CMM_CONFIG="${CMM_CONFIG:-/etc/cmm/cmm.conf}"
|
CMM_CONFIG="${CMM_CONFIG:-/etc/cmm/cmm.conf}"
|
||||||
|
|
||||||
# Vendor default from cmm.service: (131072 = 128 * 1024) max active conntrack/offload entries
|
# Vendor default from cmm.service:
|
||||||
|
# 131072 = 128 * 1024 max active conntrack/offload entries.
|
||||||
CMM_MAX_CONNECTIONS="${CMM_MAX_CONNECTIONS:-131072}"
|
CMM_MAX_CONNECTIONS="${CMM_MAX_CONNECTIONS:-131072}"
|
||||||
|
|
||||||
mkdir -p /run/ask /var/log
|
|
||||||
|
|
||||||
echo "[ask] loading auto_bridge"
|
|
||||||
modprobe auto_bridge || true
|
|
||||||
|
|
||||||
echo "[ask] loading cdx"
|
|
||||||
modprobe cdx
|
|
||||||
|
|
||||||
echo "[ask] waiting for /dev/cdx_ctrl"
|
|
||||||
for i in $(seq 1 40); do
|
|
||||||
if [ -e /dev/cdx_ctrl ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 0.25
|
|
||||||
done
|
|
||||||
test -e /dev/cdx_ctrl
|
|
||||||
|
|
||||||
if [ ! -e /run/ask/dpa_app.loaded ]; then
|
|
||||||
echo "[ask] running dpa_app"
|
|
||||||
/bin/dpa_app
|
|
||||||
touch /run/ask/dpa_app.loaded
|
|
||||||
else
|
|
||||||
echo "[ask] dpa_app already loaded; skipping"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "[ask] loading fci"
|
|
||||||
modprobe fci
|
|
||||||
|
|
||||||
echo "[ask] starting cmm"
|
echo "[ask] starting cmm"
|
||||||
exec /bin/cmm -D -f "$CMM_CONFIG" -n "$CMM_MAX_CONNECTIONS"
|
exec /bin/cmm -D -f "$CMM_CONFIG" -n "$CMM_MAX_CONNECTIONS"
|
||||||
|
|||||||
37
ask/cmm/init_dpa.sh
Executable file
37
ask/cmm/init_dpa.sh
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
STATE_DIR="${CMM_STATE_DIR:-/host/run/monok8s/cmm}"
|
||||||
|
DONE_FILE="$STATE_DIR/dpa_app.loaded"
|
||||||
|
LOCK_DIR="$STATE_DIR/dpa_app.lock"
|
||||||
|
|
||||||
|
mkdir -p "$STATE_DIR"
|
||||||
|
|
||||||
|
if [ -e "$DONE_FILE" ]; then
|
||||||
|
echo "[ask] dpa_app already loaded for this boot; skipping"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! mkdir "$LOCK_DIR" 2>/dev/null; then
|
||||||
|
echo "[ask] another dpa_app initialization is running; waiting"
|
||||||
|
|
||||||
|
while [ ! -e "$DONE_FILE" ]; do
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "[ask] dpa_app was loaded by another process; skipping"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
trap 'rmdir "$LOCK_DIR" 2>/dev/null || true' EXIT
|
||||||
|
|
||||||
|
if [ -e "$DONE_FILE" ]; then
|
||||||
|
echo "[ask] dpa_app already loaded for this boot; skipping"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[ask] running dpa_app"
|
||||||
|
/bin/dpa_app
|
||||||
|
|
||||||
|
date -u +"%Y-%m-%dT%H:%M:%SZ" > "$DONE_FILE"
|
||||||
|
echo "[ask] dpa_app loaded"
|
||||||
@@ -165,6 +165,47 @@ func NewCmdCreate(flags *genericclioptions.ConfigFlags) *cobra.Command {
|
|||||||
|
|
||||||
cmd.AddCommand(&agentcmd)
|
cmd.AddCommand(&agentcmd)
|
||||||
|
|
||||||
|
cmmconf := render.CMMConf{}
|
||||||
|
cmmcmd := cobra.Command{
|
||||||
|
Use: "cmm",
|
||||||
|
Short: "Print CMM daemonsets template",
|
||||||
|
RunE: func(cmd *cobra.Command, _ []string) error {
|
||||||
|
if len(cmmconf.ImagePullSecrets) > 0 && strings.TrimSpace(cmmconf.Image) == "" {
|
||||||
|
return fmt.Errorf("--image-pull-secret requires --image")
|
||||||
|
}
|
||||||
|
|
||||||
|
ns, _, err := flags.ToRawKubeConfigLoader().Namespace()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmmconf.Namespace = ns
|
||||||
|
|
||||||
|
out, err := render.RenderCMMDaemonSets(cmmconf)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = fmt.Fprint(cmd.OutOrStdout(), out)
|
||||||
|
return err
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cmmcmd.Flags().StringVar(
|
||||||
|
&cmmconf.Image,
|
||||||
|
"image",
|
||||||
|
"",
|
||||||
|
"CMM image, including optional registry and tag",
|
||||||
|
)
|
||||||
|
cmmcmd.Flags().StringSliceVar(
|
||||||
|
&cmmconf.ImagePullSecrets,
|
||||||
|
"image-pull-secret",
|
||||||
|
nil,
|
||||||
|
"Image pull secret name for the CMM image; may be specified multiple times or as a comma-separated list",
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd.AddCommand(&cmmcmd)
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
219
clitools/pkg/render/cmm.go
Normal file
219
clitools/pkg/render/cmm.go
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
package render
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
|
||||||
|
buildinfo "example.com/monok8s/pkg/buildinfo"
|
||||||
|
)
|
||||||
|
|
||||||
|
const cmmName = "cmm"
|
||||||
|
|
||||||
|
type CMMConf struct {
|
||||||
|
Namespace string
|
||||||
|
Image string
|
||||||
|
ImagePullSecrets []string
|
||||||
|
Labels map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
func RenderCMMDaemonSets(conf CMMConf) (string, error) {
|
||||||
|
objs, err := buildCMMDaemonSetObjects(conf)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return renderObjects(objs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildCMMDaemonSetObjects(conf CMMConf) ([]runtime.Object, error) {
|
||||||
|
if strings.TrimSpace(conf.Namespace) == "" {
|
||||||
|
return nil, fmt.Errorf("namespace is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
conf.Labels = map[string]string{
|
||||||
|
"app.kubernetes.io/name": cmmName,
|
||||||
|
"app.kubernetes.io/component": "hardware-offload",
|
||||||
|
"app.kubernetes.io/part-of": "monok8s",
|
||||||
|
"app.kubernetes.io/managed-by": "monok8s",
|
||||||
|
}
|
||||||
|
|
||||||
|
return []runtime.Object{
|
||||||
|
buildCMMServiceAccount(conf),
|
||||||
|
buildCMMDaemonSet(conf),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildCMMServiceAccount(conf CMMConf) *corev1.ServiceAccount {
|
||||||
|
return &corev1.ServiceAccount{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: "v1",
|
||||||
|
Kind: "ServiceAccount",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: cmmName,
|
||||||
|
Namespace: conf.Namespace,
|
||||||
|
Labels: copyStringMap(conf.Labels),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildCMMDaemonSet(conf CMMConf) *appsv1.DaemonSet {
|
||||||
|
privileged := true
|
||||||
|
dsLabels := map[string]string{
|
||||||
|
"app.kubernetes.io/name": cmmName,
|
||||||
|
"app.kubernetes.io/component": "hardware-offload",
|
||||||
|
"app.kubernetes.io/part-of": "monok8s",
|
||||||
|
"app.kubernetes.io/managed-by": "monok8s",
|
||||||
|
}
|
||||||
|
|
||||||
|
image, pullPolicy := cmmImage(conf)
|
||||||
|
|
||||||
|
return &appsv1.DaemonSet{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: "apps/v1",
|
||||||
|
Kind: "DaemonSet",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: cmmName,
|
||||||
|
Namespace: conf.Namespace,
|
||||||
|
Labels: copyStringMap(conf.Labels),
|
||||||
|
},
|
||||||
|
Spec: appsv1.DaemonSetSpec{
|
||||||
|
Selector: &metav1.LabelSelector{
|
||||||
|
MatchLabels: map[string]string{
|
||||||
|
"app.kubernetes.io/name": cmmName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Template: corev1.PodTemplateSpec{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: dsLabels,
|
||||||
|
},
|
||||||
|
Spec: corev1.PodSpec{
|
||||||
|
ServiceAccountName: cmmName,
|
||||||
|
HostNetwork: true,
|
||||||
|
DNSPolicy: corev1.DNSClusterFirstWithHostNet,
|
||||||
|
ImagePullSecrets: imagePullSecrets(conf.ImagePullSecrets),
|
||||||
|
Tolerations: []corev1.Toleration{
|
||||||
|
{Operator: corev1.TolerationOpExists},
|
||||||
|
},
|
||||||
|
InitContainers: []corev1.Container{
|
||||||
|
{
|
||||||
|
Name: "dpa-app",
|
||||||
|
Image: image,
|
||||||
|
ImagePullPolicy: pullPolicy,
|
||||||
|
Command: []string{"/init_dpa.sh"},
|
||||||
|
Env: cdxEnv(),
|
||||||
|
SecurityContext: &corev1.SecurityContext{
|
||||||
|
Privileged: &privileged,
|
||||||
|
},
|
||||||
|
VolumeMounts: append(
|
||||||
|
[]corev1.VolumeMount{
|
||||||
|
{
|
||||||
|
Name: "host-run-cmm",
|
||||||
|
MountPath: "/host/run/monok8s/cmm",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cdxVolumeMounts()...,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Containers: []corev1.Container{
|
||||||
|
{
|
||||||
|
Name: cmmName,
|
||||||
|
Image: image,
|
||||||
|
ImagePullPolicy: pullPolicy,
|
||||||
|
Env: cmmEnv(),
|
||||||
|
SecurityContext: &corev1.SecurityContext{
|
||||||
|
Privileged: &privileged,
|
||||||
|
},
|
||||||
|
VolumeMounts: cdxVolumeMounts(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Volumes: cmmVolumes(),
|
||||||
|
NodeSelector: map[string]string{
|
||||||
|
"node.kubernetes.io/instance-type": "mono-gateway",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cdxEnv() []corev1.EnvVar {
|
||||||
|
return []corev1.EnvVar{
|
||||||
|
{
|
||||||
|
Name: "CDX_CFG_FILE",
|
||||||
|
Value: "/etc/dpa/cdx_cfg.xml",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "CDX_PCD_FILE",
|
||||||
|
Value: "/etc/dpa/cdx_pcd.xml",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "CDX_PDL_FILE",
|
||||||
|
Value: "/etc/fmc/config/hxs_pdl_v3.xml",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "CDX_SP_FILE",
|
||||||
|
Value: "/etc/dpa/cdx_sp.xml",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmmEnv() []corev1.EnvVar {
|
||||||
|
return []corev1.EnvVar{
|
||||||
|
{
|
||||||
|
Name: "CMM_CONFIG",
|
||||||
|
Value: "/etc/cmm/cmm.conf",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "CMM_MAX_CONNECTIONS",
|
||||||
|
Value: "131072",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cdxVolumeMounts() []corev1.VolumeMount {
|
||||||
|
return []corev1.VolumeMount{
|
||||||
|
{
|
||||||
|
Name: "cdx-ctrl",
|
||||||
|
MountPath: "/dev/cdx_ctrl",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmmVolumes() []corev1.Volume {
|
||||||
|
return []corev1.Volume{
|
||||||
|
{
|
||||||
|
Name: "cdx-ctrl",
|
||||||
|
VolumeSource: corev1.VolumeSource{
|
||||||
|
HostPath: &corev1.HostPathVolumeSource{
|
||||||
|
Path: "/dev/cdx_ctrl",
|
||||||
|
Type: hostPathType(corev1.HostPathCharDev),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "host-run-cmm",
|
||||||
|
VolumeSource: corev1.VolumeSource{
|
||||||
|
HostPath: &corev1.HostPathVolumeSource{
|
||||||
|
Path: "/run/monok8s/cmm",
|
||||||
|
Type: hostPathType(corev1.HostPathDirectoryOrCreate),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmmImage(conf CMMConf) (string, corev1.PullPolicy) {
|
||||||
|
if conf.Image != "" {
|
||||||
|
return conf.Image, corev1.PullIfNotPresent
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("localhost/monok8s/cmm:%s", buildinfo.Version), corev1.PullNever
|
||||||
|
}
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
ARG ALPINE_SERIES=3.23
|
ARG ALPINE_SERIES=3.23
|
||||||
FROM alpine:${ALPINE_SERIES}
|
FROM alpine:${ALPINE_SERIES}
|
||||||
|
|
||||||
RUN apk add --no-cache kmod busybox-extras
|
|
||||||
|
|
||||||
COPY ./out/ASK/rootfs-cfg/etc /etc
|
COPY ./out/ASK/rootfs-cfg/etc /etc
|
||||||
COPY ./out/ASK/bin/cmm /bin/cmm
|
COPY ./out/ASK/bin/cmm /bin/cmm
|
||||||
COPY ./out/ASK/bin/dpa_app /bin/dpa_app
|
COPY ./out/ASK/bin/dpa_app /bin/dpa_app
|
||||||
COPY ./ask/cmm/cmm.conf /etc/cmm/cmm.conf
|
COPY ./ask/cmm/cmm.conf /etc/cmm/cmm.conf
|
||||||
COPY ./ask/cmm/entrypoint.sh /entrypoint.sh
|
COPY ./ask/cmm/entrypoint.sh /entrypoint.sh
|
||||||
|
COPY ./ask/cmm/init_dpa.sh /init_dpa.sh
|
||||||
|
|
||||||
RUN chmod +x /bin/cmm /bin/dpa_app /entrypoint.sh \
|
RUN chmod +x /bin/cmm /bin/dpa_app /init_dpa.sh /entrypoint.sh
|
||||||
&& mkdir -p /run/ask /var/log
|
|
||||||
|
|
||||||
ENTRYPOINT ["/entrypoint.sh"]
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|||||||
4
makefile
4
makefile
@@ -105,6 +105,7 @@ RELEASE_DEPS := \
|
|||||||
$(BOARD_ITB) \
|
$(BOARD_ITB) \
|
||||||
$(CLITOOLS_BIN) \
|
$(CLITOOLS_BIN) \
|
||||||
docker/alpine.Dockerfile \
|
docker/alpine.Dockerfile \
|
||||||
|
cmm-image \
|
||||||
$(ALPINE_SRCS) \
|
$(ALPINE_SRCS) \
|
||||||
build.env \
|
build.env \
|
||||||
makefile
|
makefile
|
||||||
@@ -253,9 +254,10 @@ cmm-image: ASK
|
|||||||
-f docker/cmm.Dockerfile \
|
-f docker/cmm.Dockerfile \
|
||||||
--build-arg ALPINE_SERIES=$(ALPINE_SERIES) \
|
--build-arg ALPINE_SERIES=$(ALPINE_SERIES) \
|
||||||
--load \
|
--load \
|
||||||
-t $(IMAGE_REPOSITORY)/cmm:$(KUBE_VERSION)-$(TAG) .
|
-t localhost/monok8s/cmm:$(TAG) .
|
||||||
|
|
||||||
push-cmm-image: cmm-image
|
push-cmm-image: cmm-image
|
||||||
|
docker tag -t localhost/monok8s/cmm:$(TAG) $(IMAGE_REPOSITORY)/cmm:$(KUBE_VERSION)-$(TAG) .
|
||||||
docker push $(IMAGE_REPOSITORY)/cmm:$(KUBE_VERSION)-$(TAG)
|
docker push $(IMAGE_REPOSITORY)/cmm:$(KUBE_VERSION)-$(TAG)
|
||||||
|
|
||||||
vpp: $(BUILD_BASE_STAMP) $(VPP_TAR) $(DPDK_TAR) $(FMLIB_TAR) $(FMC_TAR) $(NXP_TAR)
|
vpp: $(BUILD_BASE_STAMP) $(VPP_TAR) $(DPDK_TAR) $(FMLIB_TAR) $(FMC_TAR) $(NXP_TAR)
|
||||||
|
|||||||
Reference in New Issue
Block a user