mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
This adds a command-line tool named `gvisor_k8s_tool` that allows running the
`runsc` installer image as a DaemonSet in a Kubernetes cluster, either through
GKE or through `kubectl` configuration.
Example:
```shell
# Install using default kubectl context:
$ ./gvisor_k8s_tool install --cluster=kube: --image=my-runsc-installer
# Install using custom kubectl config and context:
$ KUBECONFIG=/tmp/myconfig ./gvisor_k8s_tool \
install --cluster=kube:mycontext --image=my-runsc-installer
# Install in a GKE cluster:
$ ./gvisor_k8s_tool install \
--cluster=gke:projects/myproject/locations/us-central1-a/clusters/mylittlecluster \
--image=my-runsc-installer
```
PiperOrigin-RevId: 557945316
129 lines
3.6 KiB
Go
129 lines
3.6 KiB
Go
// Copyright 2023 The gVisor Authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
// Package spec contains Kubernetes object specifications for gVisor setup.
|
|
package spec
|
|
|
|
import (
|
|
"google.golang.org/protobuf/proto"
|
|
appsv1 "k8s.io/api/apps/v1"
|
|
v13 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/api/resource"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
)
|
|
|
|
const (
|
|
// SystemNamespace is the name of the Kubernetes system namespace.
|
|
SystemNamespace = "kube-system"
|
|
// PauseContainerImage is the name of a container image that does nothing.
|
|
PauseContainerImage = "gcr.io/google-containers/pause"
|
|
// gvisorNodepoolKey the key for the label given to GKE Sandbox nodepools.
|
|
gvisorNodepoolKey = "sandbox.gke.io/runtime"
|
|
// gvisorRuntimeClass the runtimeClassName used for GKE Sandbox pods.
|
|
gvisorRuntimeClass = "gvisor"
|
|
)
|
|
|
|
var (
|
|
// GKESandboxNodeSelector selects GKE Sandbox nodes on GKE.
|
|
GKESandboxNodeSelector = map[string]string{gvisorNodepoolKey: gvisorRuntimeClass}
|
|
)
|
|
|
|
// InstallOptions is the set of options to install runsc.
|
|
type InstallOptions struct {
|
|
DaemonSetNamespace string
|
|
DaemonSetName string
|
|
Labels map[string]string
|
|
NodeSelector map[string]string
|
|
PauseContainerImage string
|
|
}
|
|
|
|
// RunscInstallDaemonSet returns a DaemonSet spec that installs runsc in
|
|
// Kubernetes.
|
|
func RunscInstallDaemonSet(image string, options InstallOptions) *appsv1.DaemonSet {
|
|
hpType := v13.HostPathDirectory
|
|
return &appsv1.DaemonSet{
|
|
TypeMeta: v1.TypeMeta{
|
|
Kind: "DaemonSet",
|
|
APIVersion: "apps/v1",
|
|
},
|
|
ObjectMeta: v1.ObjectMeta{
|
|
Name: options.DaemonSetName,
|
|
Namespace: options.DaemonSetNamespace,
|
|
},
|
|
Spec: appsv1.DaemonSetSpec{
|
|
Selector: &v1.LabelSelector{
|
|
MatchLabels: options.Labels,
|
|
},
|
|
UpdateStrategy: appsv1.DaemonSetUpdateStrategy{
|
|
Type: appsv1.RollingUpdateDaemonSetStrategyType,
|
|
},
|
|
Template: v13.PodTemplateSpec{
|
|
ObjectMeta: v1.ObjectMeta{
|
|
Labels: options.Labels,
|
|
},
|
|
Spec: v13.PodSpec{
|
|
Tolerations: []v13.Toleration{
|
|
{
|
|
Operator: v13.TolerationOpExists,
|
|
},
|
|
},
|
|
HostPID: true,
|
|
InitContainers: []v13.Container{
|
|
{
|
|
Name: options.DaemonSetName,
|
|
Image: image,
|
|
VolumeMounts: []v13.VolumeMount{
|
|
{
|
|
Name: "host",
|
|
MountPath: "/host",
|
|
},
|
|
},
|
|
Resources: v13.ResourceRequirements{
|
|
Requests: v13.ResourceList{
|
|
v13.ResourceCPU: resource.MustParse("5m"),
|
|
v13.ResourceMemory: resource.MustParse("5Mi"),
|
|
},
|
|
},
|
|
SecurityContext: &v13.SecurityContext{
|
|
Capabilities: &v13.Capabilities{
|
|
Add: []v13.Capability{"CAP_SYS_ADMIN"},
|
|
},
|
|
Privileged: proto.Bool(true),
|
|
},
|
|
},
|
|
},
|
|
Containers: []v13.Container{
|
|
{
|
|
Name: "pause",
|
|
Image: options.PauseContainerImage,
|
|
},
|
|
},
|
|
NodeSelector: options.NodeSelector,
|
|
Volumes: []v13.Volume{
|
|
{
|
|
Name: "host",
|
|
VolumeSource: v13.VolumeSource{
|
|
HostPath: &v13.HostPathVolumeSource{
|
|
Path: "/",
|
|
Type: &hpType,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|