@@ -55,6 +55,7 @@ import (
55
55
"k8s.io/client-go/tools/record"
56
56
"k8s.io/client-go/util/flowcontrol"
57
57
featuregatetesting "k8s.io/component-base/featuregate/testing"
58
+ "k8s.io/component-base/metrics/testutil"
58
59
internalapi "k8s.io/cri-api/pkg/apis"
59
60
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
60
61
remote "k8s.io/cri-client/pkg"
@@ -65,6 +66,7 @@ import (
65
66
cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing"
66
67
"k8s.io/kubernetes/pkg/kubelet/clustertrustbundle"
67
68
"k8s.io/kubernetes/pkg/kubelet/cm"
69
+ "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
68
70
"k8s.io/kubernetes/pkg/kubelet/config"
69
71
"k8s.io/kubernetes/pkg/kubelet/configmap"
70
72
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
@@ -74,6 +76,7 @@ import (
74
76
"k8s.io/kubernetes/pkg/kubelet/kuberuntime"
75
77
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
76
78
"k8s.io/kubernetes/pkg/kubelet/logs"
79
+ "k8s.io/kubernetes/pkg/kubelet/metrics"
77
80
"k8s.io/kubernetes/pkg/kubelet/network/dns"
78
81
"k8s.io/kubernetes/pkg/kubelet/nodeshutdown"
79
82
"k8s.io/kubernetes/pkg/kubelet/pleg"
@@ -89,12 +92,14 @@ import (
89
92
"k8s.io/kubernetes/pkg/kubelet/status"
90
93
"k8s.io/kubernetes/pkg/kubelet/status/state"
91
94
statustest "k8s.io/kubernetes/pkg/kubelet/status/testing"
95
+ "k8s.io/kubernetes/pkg/kubelet/sysctl"
92
96
"k8s.io/kubernetes/pkg/kubelet/token"
93
97
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
94
98
kubeletutil "k8s.io/kubernetes/pkg/kubelet/util"
95
99
"k8s.io/kubernetes/pkg/kubelet/util/queue"
96
100
kubeletvolume "k8s.io/kubernetes/pkg/kubelet/volumemanager"
97
101
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework"
102
+ "k8s.io/kubernetes/pkg/scheduler/framework/plugins/tainttoleration"
98
103
"k8s.io/kubernetes/pkg/util/oom"
99
104
"k8s.io/kubernetes/pkg/volume"
100
105
_ "k8s.io/kubernetes/pkg/volume/hostpath"
@@ -3461,3 +3466,200 @@ func TestIsPodResizeInProgress(t *testing.T) {
3461
3466
})
3462
3467
}
3463
3468
}
3469
+
3470
+ func TestRecordAdmissionRejection (t * testing.T ) {
3471
+ metrics .Register ()
3472
+
3473
+ testCases := []struct {
3474
+ name string
3475
+ reason string
3476
+ wants string
3477
+ }{
3478
+ {
3479
+ name : "AppArmor" ,
3480
+ reason : lifecycle .AppArmorNotAdmittedReason ,
3481
+ wants : `
3482
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3483
+ # TYPE kubelet_admission_rejections_total counter
3484
+ kubelet_admission_rejections_total{reason="AppArmor"} 1
3485
+ ` ,
3486
+ },
3487
+ {
3488
+ name : "PodOSSelectorNodeLabelDoesNotMatch" ,
3489
+ reason : lifecycle .PodOSSelectorNodeLabelDoesNotMatch ,
3490
+ wants : `
3491
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3492
+ # TYPE kubelet_admission_rejections_total counter
3493
+ kubelet_admission_rejections_total{reason="PodOSSelectorNodeLabelDoesNotMatch"} 1
3494
+ ` ,
3495
+ },
3496
+ {
3497
+ name : "PodOSNotSupported" ,
3498
+ reason : lifecycle .PodOSNotSupported ,
3499
+ wants : `
3500
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3501
+ # TYPE kubelet_admission_rejections_total counter
3502
+ kubelet_admission_rejections_total{reason="PodOSNotSupported"} 1
3503
+ ` ,
3504
+ },
3505
+ {
3506
+ name : "InvalidNodeInfo" ,
3507
+ reason : lifecycle .InvalidNodeInfo ,
3508
+ wants : `
3509
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3510
+ # TYPE kubelet_admission_rejections_total counter
3511
+ kubelet_admission_rejections_total{reason="InvalidNodeInfo"} 1
3512
+ ` ,
3513
+ },
3514
+ {
3515
+ name : "InitContainerRestartPolicyForbidden" ,
3516
+ reason : lifecycle .InitContainerRestartPolicyForbidden ,
3517
+ wants : `
3518
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3519
+ # TYPE kubelet_admission_rejections_total counter
3520
+ kubelet_admission_rejections_total{reason="InitContainerRestartPolicyForbidden"} 1
3521
+ ` ,
3522
+ },
3523
+ {
3524
+ name : "UnexpectedAdmissionError" ,
3525
+ reason : lifecycle .UnexpectedAdmissionError ,
3526
+ wants : `
3527
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3528
+ # TYPE kubelet_admission_rejections_total counter
3529
+ kubelet_admission_rejections_total{reason="UnexpectedAdmissionError"} 1
3530
+ ` ,
3531
+ },
3532
+ {
3533
+ name : "UnknownReason" ,
3534
+ reason : lifecycle .UnknownReason ,
3535
+ wants : `
3536
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3537
+ # TYPE kubelet_admission_rejections_total counter
3538
+ kubelet_admission_rejections_total{reason="UnknownReason"} 1
3539
+ ` ,
3540
+ },
3541
+ {
3542
+ name : "UnexpectedPredicateFailureType" ,
3543
+ reason : lifecycle .UnexpectedPredicateFailureType ,
3544
+ wants : `
3545
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3546
+ # TYPE kubelet_admission_rejections_total counter
3547
+ kubelet_admission_rejections_total{reason="UnexpectedPredicateFailureType"} 1
3548
+ ` ,
3549
+ },
3550
+ {
3551
+ name : "node(s) had taints that the pod didn't tolerate" ,
3552
+ reason : tainttoleration .ErrReasonNotMatch ,
3553
+ wants : `
3554
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3555
+ # TYPE kubelet_admission_rejections_total counter
3556
+ kubelet_admission_rejections_total{reason="node(s) had taints that the pod didn't tolerate"} 1
3557
+ ` ,
3558
+ },
3559
+ {
3560
+ name : "Evicted" ,
3561
+ reason : eviction .Reason ,
3562
+ wants : `
3563
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3564
+ # TYPE kubelet_admission_rejections_total counter
3565
+ kubelet_admission_rejections_total{reason="Evicted"} 1
3566
+ ` ,
3567
+ },
3568
+ {
3569
+ name : "SysctlForbidden" ,
3570
+ reason : sysctl .ForbiddenReason ,
3571
+ wants : `
3572
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3573
+ # TYPE kubelet_admission_rejections_total counter
3574
+ kubelet_admission_rejections_total{reason="SysctlForbidden"} 1
3575
+ ` ,
3576
+ },
3577
+ {
3578
+ name : "TopologyAffinityError" ,
3579
+ reason : topologymanager .ErrorTopologyAffinity ,
3580
+ wants : `
3581
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3582
+ # TYPE kubelet_admission_rejections_total counter
3583
+ kubelet_admission_rejections_total{reason="TopologyAffinityError"} 1
3584
+ ` ,
3585
+ },
3586
+ {
3587
+ name : "NodeShutdown" ,
3588
+ reason : nodeshutdown .NodeShutdownNotAdmittedReason ,
3589
+ wants : `
3590
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3591
+ # TYPE kubelet_admission_rejections_total counter
3592
+ kubelet_admission_rejections_total{reason="NodeShutdown"} 1
3593
+ ` ,
3594
+ },
3595
+ {
3596
+ name : "OutOfcpu" ,
3597
+ reason : "OutOfcpu" ,
3598
+ wants : `
3599
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3600
+ # TYPE kubelet_admission_rejections_total counter
3601
+ kubelet_admission_rejections_total{reason="OutOfcpu"} 1
3602
+ ` ,
3603
+ },
3604
+ {
3605
+ name : "OutOfmemory" ,
3606
+ reason : "OutOfmemory" ,
3607
+ wants : `
3608
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3609
+ # TYPE kubelet_admission_rejections_total counter
3610
+ kubelet_admission_rejections_total{reason="OutOfmemory"} 1
3611
+ ` ,
3612
+ },
3613
+ {
3614
+ name : "OutOfephemeral-storage" ,
3615
+ reason : "OutOfephemeral-storage" ,
3616
+ wants : `
3617
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3618
+ # TYPE kubelet_admission_rejections_total counter
3619
+ kubelet_admission_rejections_total{reason="OutOfephemeral-storage"} 1
3620
+ ` ,
3621
+ },
3622
+ {
3623
+ name : "OutOfpods" ,
3624
+ reason : "OutOfpods" ,
3625
+ wants : `
3626
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3627
+ # TYPE kubelet_admission_rejections_total counter
3628
+ kubelet_admission_rejections_total{reason="OutOfpods"} 1
3629
+ ` ,
3630
+ },
3631
+ {
3632
+ name : "OutOfgpu" ,
3633
+ reason : "OutOfgpu" ,
3634
+ wants : `
3635
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3636
+ # TYPE kubelet_admission_rejections_total counter
3637
+ kubelet_admission_rejections_total{reason="OutOfExtendedResources"} 1
3638
+ ` ,
3639
+ },
3640
+ {
3641
+ name : "OtherReason" ,
3642
+ reason : "OtherReason" ,
3643
+ wants : `
3644
+ # HELP kubelet_admission_rejections_total [ALPHA] Cumulative number pod admission rejections by the Kubelet.
3645
+ # TYPE kubelet_admission_rejections_total counter
3646
+ kubelet_admission_rejections_total{reason="Other"} 1
3647
+ ` ,
3648
+ },
3649
+ }
3650
+
3651
+ // Run tests.
3652
+ for _ , tc := range testCases {
3653
+ t .Run (tc .name , func (t * testing.T ) {
3654
+ // Clear the metrics after the test.
3655
+ metrics .AdmissionRejectionsTotal .Reset ()
3656
+
3657
+ // Call the function.
3658
+ recordAdmissionRejection (tc .reason )
3659
+
3660
+ if err := testutil .GatherAndCompare (metrics .GetGather (), strings .NewReader (tc .wants ), "kubelet_admission_rejections_total" ); err != nil {
3661
+ t .Error (err )
3662
+ }
3663
+ })
3664
+ }
3665
+ }
0 commit comments