Merge pull request #5131 from perithompson/windows-hostnetwork
Add Windows HostProcess Support
This commit is contained in:
commit
ff2e58d114
@ -59,4 +59,7 @@ const (
|
|||||||
|
|
||||||
// PodAnnotations are the annotations of the pod
|
// PodAnnotations are the annotations of the pod
|
||||||
PodAnnotations = "io.kubernetes.cri.pod-annotations"
|
PodAnnotations = "io.kubernetes.cri.pod-annotations"
|
||||||
|
|
||||||
|
// WindowsHostProcess is used by hcsshim to identify windows pods that are running HostProcesses
|
||||||
|
WindowsHostProcess = "microsoft.com/hostprocess-container"
|
||||||
)
|
)
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/containerd/containerd/oci"
|
"github.com/containerd/containerd/oci"
|
||||||
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
@ -118,6 +120,7 @@ func (c *criService) containerSpec(
|
|||||||
customopts.WithAnnotation(annotations.SandboxName, sandboxConfig.GetMetadata().GetName()),
|
customopts.WithAnnotation(annotations.SandboxName, sandboxConfig.GetMetadata().GetName()),
|
||||||
customopts.WithAnnotation(annotations.ContainerName, containerName),
|
customopts.WithAnnotation(annotations.ContainerName, containerName),
|
||||||
customopts.WithAnnotation(annotations.ImageName, imageName),
|
customopts.WithAnnotation(annotations.ImageName, imageName),
|
||||||
|
customopts.WithAnnotation(annotations.WindowsHostProcess, strconv.FormatBool(sandboxConfig.GetWindows().GetSecurityContext().GetHostProcess())),
|
||||||
)
|
)
|
||||||
return c.runtimeSpec(id, ociRuntime.BaseRuntimeSpec, specOpts...)
|
return c.runtimeSpec(id, ociRuntime.BaseRuntimeSpec, specOpts...)
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,7 @@ func getCreateContainerTestData() (*runtime.ContainerConfig, *runtime.PodSandbox
|
|||||||
SecurityContext: &runtime.WindowsContainerSecurityContext{
|
SecurityContext: &runtime.WindowsContainerSecurityContext{
|
||||||
RunAsUsername: "test-user",
|
RunAsUsername: "test-user",
|
||||||
CredentialSpec: "{\"test\": \"spec\"}",
|
CredentialSpec: "{\"test\": \"spec\"}",
|
||||||
|
HostProcess: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -130,6 +131,9 @@ func getCreateContainerTestData() (*runtime.ContainerConfig, *runtime.PodSandbox
|
|||||||
|
|
||||||
assert.Contains(t, spec.Annotations, annotations.SandboxName)
|
assert.Contains(t, spec.Annotations, annotations.SandboxName)
|
||||||
assert.EqualValues(t, spec.Annotations[annotations.SandboxName], "test-sandbox-name")
|
assert.EqualValues(t, spec.Annotations[annotations.SandboxName], "test-sandbox-name")
|
||||||
|
|
||||||
|
assert.Contains(t, spec.Annotations, annotations.WindowsHostProcess)
|
||||||
|
assert.EqualValues(t, spec.Annotations[annotations.WindowsHostProcess], "false")
|
||||||
}
|
}
|
||||||
return config, sandboxConfig, imageConfig, specCheck
|
return config, sandboxConfig, imageConfig, specCheck
|
||||||
}
|
}
|
||||||
|
@ -414,6 +414,9 @@ func (c *criService) loadSandbox(ctx context.Context, cntr containerd.Container)
|
|||||||
// Don't need to load netns for host network sandbox.
|
// Don't need to load netns for host network sandbox.
|
||||||
return sandbox, nil
|
return sandbox, nil
|
||||||
}
|
}
|
||||||
|
if goruntime.GOOS == "windows" && meta.Config.GetWindows().GetSecurityContext().GetHostProcess() {
|
||||||
|
return sandbox, nil
|
||||||
|
}
|
||||||
sandbox.NetNS = netns.LoadNetNS(meta.NetNSPath)
|
sandbox.NetNS = netns.LoadNetNS(meta.NetNSPath)
|
||||||
|
|
||||||
// It doesn't matter whether task is running or not. If it is running, sandbox
|
// It doesn't matter whether task is running or not. If it is running, sandbox
|
||||||
|
@ -110,12 +110,18 @@ func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandbox
|
|||||||
log.G(ctx).Debugf("Use OCI %+v for sandbox %q", ociRuntime, id)
|
log.G(ctx).Debugf("Use OCI %+v for sandbox %q", ociRuntime, id)
|
||||||
|
|
||||||
podNetwork := true
|
podNetwork := true
|
||||||
// Pod network is always needed on windows.
|
|
||||||
if goruntime.GOOS != "windows" &&
|
if goruntime.GOOS != "windows" &&
|
||||||
config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetNetwork() == runtime.NamespaceMode_NODE {
|
config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetNetwork() == runtime.NamespaceMode_NODE {
|
||||||
// Pod network is not needed on linux with host network.
|
// Pod network is not needed on linux with host network.
|
||||||
podNetwork = false
|
podNetwork = false
|
||||||
}
|
}
|
||||||
|
if goruntime.GOOS == "windows" &&
|
||||||
|
config.GetWindows().GetSecurityContext().GetHostProcess() {
|
||||||
|
//Windows HostProcess pods can only run on the host network
|
||||||
|
podNetwork = false
|
||||||
|
}
|
||||||
|
|
||||||
if podNetwork {
|
if podNetwork {
|
||||||
// If it is not in host network namespace then create a namespace and set the sandbox
|
// If it is not in host network namespace then create a namespace and set the sandbox
|
||||||
// handle. NetNSPath in sandbox metadata and NetNS is non empty only for non host network
|
// handle. NetNSPath in sandbox metadata and NetNS is non empty only for non host network
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/containerd/containerd"
|
"github.com/containerd/containerd"
|
||||||
"github.com/containerd/containerd/oci"
|
"github.com/containerd/containerd/oci"
|
||||||
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
@ -65,6 +67,7 @@ func (c *criService) sandboxContainerSpec(id string, config *runtime.PodSandboxC
|
|||||||
customopts.WithAnnotation(annotations.SandboxNamespace, config.GetMetadata().GetNamespace()),
|
customopts.WithAnnotation(annotations.SandboxNamespace, config.GetMetadata().GetNamespace()),
|
||||||
customopts.WithAnnotation(annotations.SandboxName, config.GetMetadata().GetName()),
|
customopts.WithAnnotation(annotations.SandboxName, config.GetMetadata().GetName()),
|
||||||
customopts.WithAnnotation(annotations.SandboxLogDir, config.GetLogDirectory()),
|
customopts.WithAnnotation(annotations.SandboxLogDir, config.GetLogDirectory()),
|
||||||
|
customopts.WithAnnotation(annotations.WindowsHostProcess, strconv.FormatBool(config.GetWindows().GetSecurityContext().GetHostProcess())),
|
||||||
)
|
)
|
||||||
|
|
||||||
return c.runtimeSpec(id, "", specOpts...)
|
return c.runtimeSpec(id, "", specOpts...)
|
||||||
|
@ -40,6 +40,13 @@ func getRunPodSandboxTestData() (*runtime.PodSandboxConfig, *imagespec.ImageConf
|
|||||||
LogDirectory: "test-log-directory",
|
LogDirectory: "test-log-directory",
|
||||||
Labels: map[string]string{"a": "b"},
|
Labels: map[string]string{"a": "b"},
|
||||||
Annotations: map[string]string{"c": "d"},
|
Annotations: map[string]string{"c": "d"},
|
||||||
|
Windows: &runtime.WindowsPodSandboxConfig{
|
||||||
|
SecurityContext: &runtime.WindowsSandboxSecurityContext{
|
||||||
|
RunAsUsername: "test-user",
|
||||||
|
CredentialSpec: "{\"test\": \"spec\"}",
|
||||||
|
HostProcess: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
imageConfig := &imagespec.ImageConfig{
|
imageConfig := &imagespec.ImageConfig{
|
||||||
Env: []string{"a=b", "c=d"},
|
Env: []string{"a=b", "c=d"},
|
||||||
@ -70,6 +77,9 @@ func getRunPodSandboxTestData() (*runtime.PodSandboxConfig, *imagespec.ImageConf
|
|||||||
|
|
||||||
assert.Contains(t, spec.Annotations, annotations.SandboxLogDir)
|
assert.Contains(t, spec.Annotations, annotations.SandboxLogDir)
|
||||||
assert.EqualValues(t, spec.Annotations[annotations.SandboxLogDir], "test-log-directory")
|
assert.EqualValues(t, spec.Annotations[annotations.SandboxLogDir], "test-log-directory")
|
||||||
|
|
||||||
|
assert.Contains(t, spec.Annotations, annotations.WindowsHostProcess)
|
||||||
|
assert.EqualValues(t, spec.Annotations[annotations.WindowsHostProcess], "false")
|
||||||
}
|
}
|
||||||
return config, imageConfig, specCheck
|
return config, imageConfig, specCheck
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,9 @@ func (c *criService) getIPs(sandbox sandboxstore.Sandbox) (string, []string, err
|
|||||||
// responsible for reporting the IP.
|
// responsible for reporting the IP.
|
||||||
return "", nil, nil
|
return "", nil, nil
|
||||||
}
|
}
|
||||||
|
if goruntime.GOOS == "windows" && config.GetWindows().GetSecurityContext().GetHostProcess() {
|
||||||
|
return "", nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
if closed, err := sandbox.NetNS.Closed(); err != nil {
|
if closed, err := sandbox.NetNS.Closed(); err != nil {
|
||||||
return "", nil, errors.Wrap(err, "check network namespace closed")
|
return "", nil, errors.Wrap(err, "check network namespace closed")
|
||||||
|
Loading…
Reference in New Issue
Block a user