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