Commit 6573b800 authored by Darren Shepherd's avatar Darren Shepherd

Usernetes

parent 652e3de3
...@@ -47,6 +47,7 @@ import ( ...@@ -47,6 +47,7 @@ import (
utilnode "k8s.io/kubernetes/pkg/util/node" utilnode "k8s.io/kubernetes/pkg/util/node"
utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl"
"k8s.io/utils/exec" "k8s.io/utils/exec"
rsystem "github.com/opencontainers/runc/libcontainer/system"
"k8s.io/klog" "k8s.io/klog"
) )
...@@ -258,6 +259,12 @@ func newProxyServer( ...@@ -258,6 +259,12 @@ func newProxyServer(
iptInterface.AddReloadFunc(proxier.Sync) iptInterface.AddReloadFunc(proxier.Sync)
var connTracker Conntracker
if !rsystem.RunningInUserNS(){
// if we are in userns, sysctl does not work and connTracker should be kept nil
connTracker = &realConntracker{}
}
return &ProxyServer{ return &ProxyServer{
Client: client, Client: client,
EventClient: eventClient, EventClient: eventClient,
...@@ -269,7 +276,7 @@ func newProxyServer( ...@@ -269,7 +276,7 @@ func newProxyServer(
Broadcaster: eventBroadcaster, Broadcaster: eventBroadcaster,
Recorder: recorder, Recorder: recorder,
ConntrackConfiguration: config.Conntrack, ConntrackConfiguration: config.Conntrack,
Conntracker: &realConntracker{}, Conntracker: connTracker,
ProxyMode: proxyMode, ProxyMode: proxyMode,
NodeRef: nodeRef, NodeRef: nodeRef,
MetricsBindAddress: config.MetricsBindAddress, MetricsBindAddress: config.MetricsBindAddress,
......
...@@ -28,6 +28,7 @@ import ( ...@@ -28,6 +28,7 @@ import (
libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups" libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs" libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
rsystem "github.com/opencontainers/runc/libcontainer/system"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
...@@ -97,8 +98,9 @@ func (l *libcontainerAdapter) newManager(cgroups *libcontainerconfigs.Cgroup, pa ...@@ -97,8 +98,9 @@ func (l *libcontainerAdapter) newManager(cgroups *libcontainerconfigs.Cgroup, pa
switch l.cgroupManagerType { switch l.cgroupManagerType {
case libcontainerCgroupfs: case libcontainerCgroupfs:
return &cgroupfs.Manager{ return &cgroupfs.Manager{
Cgroups: cgroups, Cgroups: cgroups,
Paths: paths, Rootless: rsystem.RunningInUserNS(),
Paths: paths,
}, nil }, nil
} }
return nil, fmt.Errorf("invalid cgroup manager configuration") return nil, fmt.Errorf("invalid cgroup manager configuration")
...@@ -368,7 +370,9 @@ func (m *cgroupManagerImpl) Create(cgroupConfig *CgroupConfig) error { ...@@ -368,7 +370,9 @@ func (m *cgroupManagerImpl) Create(cgroupConfig *CgroupConfig) error {
// in the tasks file. We use the function to create all the required // in the tasks file. We use the function to create all the required
// cgroup files but not attach any "real" pid to the cgroup. // cgroup files but not attach any "real" pid to the cgroup.
if err := manager.Apply(-1); err != nil { if err := manager.Apply(-1); err != nil {
return err if !rsystem.RunningInUserNS() {
return err
}
} }
// it may confuse why we call set after we do apply, but the issue is that runc // it may confuse why we call set after we do apply, but the issue is that runc
......
...@@ -32,6 +32,7 @@ import ( ...@@ -32,6 +32,7 @@ import (
"github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/cgroups/fs" "github.com/opencontainers/runc/libcontainer/cgroups/fs"
"github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs"
rsystem "github.com/opencontainers/runc/libcontainer/system"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
...@@ -375,7 +376,11 @@ func setupKernelTunables(option KernelTunableBehavior) error { ...@@ -375,7 +376,11 @@ func setupKernelTunables(option KernelTunableBehavior) error {
klog.V(2).Infof("Updating kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val) klog.V(2).Infof("Updating kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val)
err = sysctl.SetSysctl(flag, expectedValue) err = sysctl.SetSysctl(flag, expectedValue)
if err != nil { if err != nil {
errList = append(errList, err) if rsystem.RunningInUserNS() {
klog.Warningf("Updating kernel flag failed: %v: %v", flag, err)
} else {
errList = append(errList, err)
}
} }
} }
} }
...@@ -461,13 +466,20 @@ func (cm *containerManagerImpl) setupNode(activePods ActivePodsFunc) error { ...@@ -461,13 +466,20 @@ func (cm *containerManagerImpl) setupNode(activePods ActivePodsFunc) error {
}, },
} }
cont.ensureStateFunc = func(_ *fs.Manager) error { cont.ensureStateFunc = func(_ *fs.Manager) error {
return ensureProcessInContainerWithOOMScore(os.Getpid(), qos.KubeletOOMScoreAdj, &manager) err := ensureProcessInContainerWithOOMScore(os.Getpid(), qos.KubeletOOMScoreAdj, &manager)
if rsystem.RunningInUserNS() {
// if we are in userns, cgroups might not be available
err = nil
}
return err
} }
systemContainers = append(systemContainers, cont) systemContainers = append(systemContainers, cont)
} else { } else {
cm.periodicTasks = append(cm.periodicTasks, func() { cm.periodicTasks = append(cm.periodicTasks, func() {
if err := ensureProcessInContainerWithOOMScore(os.Getpid(), qos.KubeletOOMScoreAdj, nil); err != nil { if err := ensureProcessInContainerWithOOMScore(os.Getpid(), qos.KubeletOOMScoreAdj, nil); err != nil {
klog.Error(err) if !rsystem.RunningInUserNS() {
klog.Error(err)
}
return return
} }
cont, err := getContainer(os.Getpid()) cont, err := getContainer(os.Getpid())
......
...@@ -28,6 +28,7 @@ import ( ...@@ -28,6 +28,7 @@ import (
units "github.com/docker/go-units" units "github.com/docker/go-units"
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
rsystem "github.com/opencontainers/runc/libcontainer/system"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
utilfeature "k8s.io/apiserver/pkg/util/feature" utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/kubernetes/pkg/api/v1/resource" "k8s.io/kubernetes/pkg/api/v1/resource"
...@@ -82,7 +83,9 @@ func (m *qosContainerManagerImpl) Start(getNodeAllocatable func() v1.ResourceLis ...@@ -82,7 +83,9 @@ func (m *qosContainerManagerImpl) Start(getNodeAllocatable func() v1.ResourceLis
cm := m.cgroupManager cm := m.cgroupManager
rootContainer := m.cgroupRoot rootContainer := m.cgroupRoot
if !cm.Exists(rootContainer) { if !cm.Exists(rootContainer) {
return fmt.Errorf("root container %v doesn't exist", rootContainer) if !rsystem.RunningInUserNS() {
return fmt.Errorf("root container %v doesn't exist", rootContainer)
}
} }
// Top level for Qos containers are created only for Burstable // Top level for Qos containers are created only for Burstable
...@@ -296,15 +299,23 @@ func (m *qosContainerManagerImpl) UpdateCgroups() error { ...@@ -296,15 +299,23 @@ func (m *qosContainerManagerImpl) UpdateCgroups() error {
} }
} }
updateSuccess := true
for _, config := range qosConfigs { for _, config := range qosConfigs {
err := m.cgroupManager.Update(config) err := m.cgroupManager.Update(config)
if err != nil { if err != nil {
klog.Errorf("[ContainerManager]: Failed to update QoS cgroup configuration") if rsystem.RunningInUserNS() {
return err // if we are in userns, cgroups might not available
updateSuccess = false
} else {
klog.Errorf("[ContainerManager]: Failed to update QoS cgroup configuration")
return err
}
} }
} }
klog.V(4).Infof("[ContainerManager]: Updated QoS cgroup configuration") if updateSuccess {
klog.V(4).Infof("[ContainerManager]: Updated QoS cgroup configuration")
}
return nil return nil
} }
......
...@@ -27,6 +27,7 @@ import ( ...@@ -27,6 +27,7 @@ import (
"github.com/opencontainers/runc/libcontainer/cgroups/fs" "github.com/opencontainers/runc/libcontainer/cgroups/fs"
"github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs"
rsystem "github.com/opencontainers/runc/libcontainer/system"
utilversion "k8s.io/apimachinery/pkg/util/version" utilversion "k8s.io/apimachinery/pkg/util/version"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/klog" "k8s.io/klog"
...@@ -95,7 +96,10 @@ func (m *containerManager) doWork() { ...@@ -95,7 +96,10 @@ func (m *containerManager) doWork() {
// 1. Ensure processes run in the cgroups if m.cgroupsManager is not nil. // 1. Ensure processes run in the cgroups if m.cgroupsManager is not nil.
// 2. Ensure processes have the OOM score applied. // 2. Ensure processes have the OOM score applied.
if err := kubecm.EnsureDockerInContainer(version, dockerOOMScoreAdj, m.cgroupsManager); err != nil { if err := kubecm.EnsureDockerInContainer(version, dockerOOMScoreAdj, m.cgroupsManager); err != nil {
klog.Errorf("Unable to ensure the docker processes run in the desired containers: %v", err) // if we are in userns, the operation is likely to fail, unless cgroupfs is properly chown-ed.
if !rsystem.RunningInUserNS() {
klog.Errorf("Unable to ensure the docker processes run in the desired containers: %v", err)
}
} }
} }
......
...@@ -27,6 +27,8 @@ import ( ...@@ -27,6 +27,8 @@ import (
dockertypes "github.com/docker/docker/api/types" dockertypes "github.com/docker/docker/api/types"
dockercontainer "github.com/docker/docker/api/types/container" dockercontainer "github.com/docker/docker/api/types/container"
dockerfilters "github.com/docker/docker/api/types/filters" dockerfilters "github.com/docker/docker/api/types/filters"
rsystem "github.com/opencontainers/runc/libcontainer/system"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/klog" "k8s.io/klog"
runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
...@@ -535,11 +537,13 @@ func (ds *dockerService) ListPodSandbox(_ context.Context, r *runtimeapi.ListPod ...@@ -535,11 +537,13 @@ func (ds *dockerService) ListPodSandbox(_ context.Context, r *runtimeapi.ListPod
checkpoint := NewPodSandboxCheckpoint("", "", &CheckpointData{}) checkpoint := NewPodSandboxCheckpoint("", "", &CheckpointData{})
err := ds.checkpointManager.GetCheckpoint(id, checkpoint) err := ds.checkpointManager.GetCheckpoint(id, checkpoint)
if err != nil { if err != nil {
klog.Errorf("Failed to retrieve checkpoint for sandbox %q: %v", id, err) if !rsystem.RunningInUserNS() {
if err == errors.ErrCorruptCheckpoint { klog.Errorf("Failed to retrieve checkpoint for sandbox %q: %v", id, err)
err = ds.checkpointManager.RemoveCheckpoint(id) if err == errors.ErrCorruptCheckpoint {
if err != nil { err = ds.checkpointManager.RemoveCheckpoint(id)
klog.Errorf("Failed to delete corrupt checkpoint for sandbox %q: %v", id, err) if err != nil {
klog.Errorf("Failed to delete corrupt checkpoint for sandbox %q: %v", id, err)
}
} }
} }
continue continue
......
...@@ -32,6 +32,7 @@ import ( ...@@ -32,6 +32,7 @@ import (
cadvisorapi "github.com/google/cadvisor/info/v1" cadvisorapi "github.com/google/cadvisor/info/v1"
cadvisorapiv2 "github.com/google/cadvisor/info/v2" cadvisorapiv2 "github.com/google/cadvisor/info/v2"
rsystem "github.com/opencontainers/runc/libcontainer/system"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/fields"
...@@ -1514,10 +1515,13 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { ...@@ -1514,10 +1515,13 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
break break
} }
} }
// TODO(AkihiroSuda): implement rootless cgroup manager that can emulate Exists() properly
// Don't kill containers in pod if pod's cgroups already // Don't kill containers in pod if pod's cgroups already
// exists or the pod is running for the first time // exists or the pod is running for the first time
podKilled := false podKilled := false
if !pcm.Exists(pod) && !firstSync { if !pcm.Exists(pod) && !firstSync && !rsystem.RunningInUserNS() {
if err := kl.killPod(pod, nil, podStatus, nil); err == nil { if err := kl.killPod(pod, nil, podStatus, nil); err == nil {
podKilled = true podKilled = true
} }
...@@ -1536,7 +1540,9 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { ...@@ -1536,7 +1540,9 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
} }
if err := pcm.EnsureExists(pod); err != nil { if err := pcm.EnsureExists(pod); err != nil {
kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToCreatePodContainer, "unable to ensure pod container exists: %v", err) kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToCreatePodContainer, "unable to ensure pod container exists: %v", err)
return fmt.Errorf("failed to ensure that the pod: %v cgroups exist and are correctly applied: %v", pod.UID, err) if !rsystem.RunningInUserNS() {
return fmt.Errorf("failed to ensure that the pod: %v cgroups exist and are correctly applied: %v", pod.UID, err)
}
} }
} }
} }
......
...@@ -21,7 +21,9 @@ import ( ...@@ -21,7 +21,9 @@ import (
"k8s.io/klog" "k8s.io/klog"
rsystem "github.com/opencontainers/runc/libcontainer/system"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1"
"k8s.io/kubernetes/pkg/kubelet/util" "k8s.io/kubernetes/pkg/kubelet/util"
) )
...@@ -73,7 +75,13 @@ func (sp *summaryProviderImpl) Get(updateStats bool) (*statsapi.Summary, error) ...@@ -73,7 +75,13 @@ func (sp *summaryProviderImpl) Get(updateStats bool) (*statsapi.Summary, error)
nodeConfig := sp.provider.GetNodeConfig() nodeConfig := sp.provider.GetNodeConfig()
rootStats, networkStats, err := sp.provider.GetCgroupStats("/", updateStats) rootStats, networkStats, err := sp.provider.GetCgroupStats("/", updateStats)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get root cgroup stats: %v", err) if !rsystem.RunningInUserNS() {
return nil, fmt.Errorf("failed to get root cgroup stats: %v", err)
}
// if we are in userns, cgroups might not be available
klog.Errorf("failed to get root cgroup stats: %v", err)
rootStats = &statsapi.ContainerStats{}
networkStats = &statsapi.NetworkStats{}
} }
rootFsStats, err := sp.provider.RootFsStats() rootFsStats, err := sp.provider.RootFsStats()
if err != nil { if err != nil {
......
...@@ -25,6 +25,7 @@ import ( ...@@ -25,6 +25,7 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
rsystem "github.com/opencontainers/runc/libcontainer/system"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
...@@ -179,7 +180,10 @@ func NewCustomProxier(loadBalancer LoadBalancer, listenIP net.IP, iptables iptab ...@@ -179,7 +180,10 @@ func NewCustomProxier(loadBalancer LoadBalancer, listenIP net.IP, iptables iptab
err = setRLimit(64 * 1000) err = setRLimit(64 * 1000)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to set open file handler limit: %v", err) if !rsystem.RunningInUserNS() {
return nil, fmt.Errorf("failed to set open file handler limit to 64000: %v", err)
}
klog.Errorf("failed to set open file handler limit to 64000: %v", err)
} }
proxyPorts := newPortAllocator(pr) proxyPorts := newPortAllocator(pr)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment