// CreatePodSandbox creates a pod-level sandbox. // The definition of PodSandbox is at https://github.com/kubernetes/kubernetes/pull/25899 // For docker, PodSandbox is implemented by a container holding the network // namespace for the pod. // Note: docker doesn't use LogDirectory (yet). func (ds *dockerService) CreatePodSandbox(config *runtimeApi.PodSandboxConfig) (string, error) { // Step 1: Pull the image for the sandbox. // TODO: How should we handle pulling custom pod infra container image // (with credentials)? image := defaultSandboxImage if err := ds.client.PullImage(image, dockertypes.AuthConfig{}, dockertypes.ImagePullOptions{}); err != nil { return "", fmt.Errorf("unable to pull image for the sandbox container: %v", err) } // Step 2: Create the sandbox container. createConfig := makeSandboxDockerConfig(config, image) createResp, err := ds.client.CreateContainer(*createConfig) if err != nil || createResp == nil { return "", fmt.Errorf("failed to create a sandbox for pod %q: %v", config.GetName(), err) } // Step 3: Start the sandbox container. // Assume kubelet's garbage collector would remove the sandbox later, if // startContainer failed. err = ds.StartContainer(createResp.ID) return createResp.ID, err }
func makeFakeContainer(m *kubeGenericRuntimeManager, pod *api.Pod, container api.Container, sandboxConfig *runtimeApi.PodSandboxConfig) (*apitest.FakeContainer, error) { containerConfig, err := m.generateContainerConfig(&container, pod, 0, "") if err != nil { return nil, err } containerID := containerConfig.GetName() runningState := runtimeApi.ContainerState_RUNNING imageRef := containerConfig.Image.GetImage() return &apitest.FakeContainer{ ContainerStatus: runtimeApi.ContainerStatus{ Id: &containerID, Name: containerConfig.Name, Image: containerConfig.Image, ImageRef: &imageRef, CreatedAt: &fakeCreatedAt, State: &runningState, Labels: containerConfig.Labels, Annotations: containerConfig.Annotations, }, SandboxID: sandboxConfig.GetName(), }, nil }
func (r *FakeRuntimeService) CreatePodSandbox(config *runtimeApi.PodSandboxConfig) (string, error) { r.Lock() defer r.Unlock() r.Called = append(r.Called, "CreatePodSandbox") // PodSandboxID should be randomized for real container runtime, but here just use // sandbox's name for easily making fake sandboxes. podSandboxID := config.GetName() createdAt := time.Now().Unix() readyState := runtimeApi.PodSandBoxState_READY r.Sandboxes[podSandboxID] = &FakePodSandbox{ PodSandbox: runtimeApi.PodSandbox{ Id: &podSandboxID, Name: config.Name, State: &readyState, CreatedAt: &createdAt, Labels: config.Labels, }, Annotations: config.Annotations, } return podSandboxID, nil }
func makeSandboxDockerConfig(c *runtimeApi.PodSandboxConfig, image string) *dockertypes.ContainerCreateConfig { // Merge annotations and labels because docker supports only labels. labels := makeLabels(c.GetLabels(), c.GetAnnotations()) // Apply a label to distinguish sandboxes from regular containers. labels[containerTypeLabelKey] = containerTypeLabelSandbox hc := &dockercontainer.HostConfig{} createConfig := &dockertypes.ContainerCreateConfig{ Name: c.GetName(), Config: &dockercontainer.Config{ Hostname: c.GetHostname(), // TODO: Handle environment variables. Image: image, Labels: labels, }, HostConfig: hc, } // Apply linux-specific options. if lc := c.GetLinux(); lc != nil { // Apply Cgroup options. // TODO: Check if this works with per-pod cgroups. hc.CgroupParent = lc.GetCgroupParent() // Apply namespace options. hc.NetworkMode, hc.UTSMode, hc.PidMode = "", "", "" nsOpts := lc.GetNamespaceOptions() if nsOpts != nil { if nsOpts.GetHostNetwork() { hc.NetworkMode = namespaceModeHost } else { // Assume kubelet uses either the cni or the kubenet plugin. // TODO: support docker networking. hc.NetworkMode = "none" } if nsOpts.GetHostIpc() { hc.IpcMode = namespaceModeHost } if nsOpts.GetHostPid() { hc.PidMode = namespaceModeHost } } } // Set port mappings. exposedPorts, portBindings := makePortsAndBindings(c.GetPortMappings()) createConfig.Config.ExposedPorts = exposedPorts hc.PortBindings = portBindings // Set DNS options. if dnsOpts := c.GetDnsOptions(); dnsOpts != nil { hc.DNS = dnsOpts.GetServers() hc.DNSSearch = dnsOpts.GetSearches() } // Apply resource options. setSandboxResources(c.GetResources(), hc) // Set security options. hc.SecurityOpt = []string{getSeccompOpts()} return createConfig }