...
1
2
3
4
19
20 package kuberuntime
21
22 import (
23 v1 "k8s.io/api/core/v1"
24 "k8s.io/apimachinery/pkg/api/resource"
25 runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
26 "k8s.io/klog/v2"
27 kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
28 "k8s.io/kubernetes/pkg/kubelet/winstats"
29 "k8s.io/kubernetes/pkg/securitycontext"
30 )
31
32
33 func (m *kubeGenericRuntimeManager) applyPlatformSpecificContainerConfig(config *runtimeapi.ContainerConfig, container *v1.Container, pod *v1.Pod, uid *int64, username string, _ *kubecontainer.ContainerID) error {
34 windowsConfig, err := m.generateWindowsContainerConfig(container, pod, uid, username)
35 if err != nil {
36 return err
37 }
38 config.Windows = windowsConfig
39
40 return nil
41 }
42
43
44 func (m *kubeGenericRuntimeManager) generateContainerResources(pod *v1.Pod, container *v1.Container) *runtimeapi.ContainerResources {
45 return &runtimeapi.ContainerResources{
46 Windows: m.generateWindowsContainerResources(pod, container),
47 }
48 }
49
50
51 func (m *kubeGenericRuntimeManager) generateWindowsContainerResources(pod *v1.Pod, container *v1.Container) *runtimeapi.WindowsContainerResources {
52 wcr := m.calculateWindowsResources(container.Resources.Limits.Cpu(), container.Resources.Limits.Memory())
53
54 return wcr
55 }
56
57
58 func (m *kubeGenericRuntimeManager) calculateWindowsResources(cpuLimit, memoryLimit *resource.Quantity) *runtimeapi.WindowsContainerResources {
59 resources := runtimeapi.WindowsContainerResources{}
60
61 memLimit := memoryLimit.Value()
62
63 if !cpuLimit.IsZero() {
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 resources.CpuMaximum = calculateCPUMaximum(cpuLimit, int64(winstats.ProcessorCount()))
88 }
89
90
91
92
93 if resources.CpuCount > 0 {
94 if resources.CpuMaximum > 0 {
95 resources.CpuMaximum = 0
96 klog.InfoS("Mutually exclusive options: CPUCount priority > CPUMaximum priority on Windows Server Containers. CPUMaximum should be ignored")
97 }
98 }
99
100 if memLimit != 0 {
101 resources.MemoryLimitInBytes = memLimit
102 }
103
104 return &resources
105 }
106
107
108
109 func (m *kubeGenericRuntimeManager) generateWindowsContainerConfig(container *v1.Container, pod *v1.Pod, uid *int64, username string) (*runtimeapi.WindowsContainerConfig, error) {
110 wc := &runtimeapi.WindowsContainerConfig{
111 Resources: m.generateWindowsContainerResources(pod, container),
112 SecurityContext: &runtimeapi.WindowsContainerSecurityContext{},
113 }
114
115
116 effectiveSc := securitycontext.DetermineEffectiveSecurityContext(pod, container)
117
118 if username != "" {
119 wc.SecurityContext.RunAsUsername = username
120 }
121 if effectiveSc.WindowsOptions != nil &&
122 effectiveSc.WindowsOptions.GMSACredentialSpec != nil {
123 wc.SecurityContext.CredentialSpec = *effectiveSc.WindowsOptions.GMSACredentialSpec
124 }
125
126
127 if effectiveSc.WindowsOptions != nil && effectiveSc.WindowsOptions.RunAsUserName != nil {
128 wc.SecurityContext.RunAsUsername = *effectiveSc.WindowsOptions.RunAsUserName
129 }
130
131 if securitycontext.HasWindowsHostProcessRequest(pod, container) {
132 wc.SecurityContext.HostProcess = true
133 }
134
135 return wc, nil
136 }
137
138
139 func calculateCPUMaximum(cpuLimit *resource.Quantity, cpuCount int64) int64 {
140 cpuMaximum := 10 * cpuLimit.MilliValue() / cpuCount
141
142
143 if cpuMaximum < 1 {
144 cpuMaximum = 1
145 } else if cpuMaximum > 10000 {
146 cpuMaximum = 10000
147 }
148 return cpuMaximum
149 }
150
151 func toKubeContainerResources(statusResources *runtimeapi.ContainerResources) *kubecontainer.ContainerResources {
152 var cStatusResources *kubecontainer.ContainerResources
153 runtimeStatusResources := statusResources.GetWindows()
154 if runtimeStatusResources != nil {
155 var memLimit, cpuLimit *resource.Quantity
156
157
158 if runtimeStatusResources.CpuMaximum > 0 {
159 cpuLimitValue := runtimeStatusResources.CpuMaximum * int64(winstats.ProcessorCount()) / 10
160 cpuLimit = resource.NewMilliQuantity(cpuLimitValue, resource.DecimalSI)
161 }
162
163 if runtimeStatusResources.MemoryLimitInBytes > 0 {
164 memLimit = resource.NewQuantity(runtimeStatusResources.MemoryLimitInBytes, resource.BinarySI)
165 }
166
167 if cpuLimit != nil || memLimit != nil {
168 cStatusResources = &kubecontainer.ContainerResources{
169 CPULimit: cpuLimit,
170 MemoryLimit: memLimit,
171 }
172 }
173 }
174 return cStatusResources
175 }
176
View as plain text