Commit Graph

9605 Commits

Author SHA1 Message Date
Clayton Coleman
6b9a381185 kubelet: Force deleted pods can fail to move out of terminating
If a CRI error occurs during the terminating phase after a pod is
force deleted (API or static) then the housekeeping loop will not
deliver updates to the pod worker which prevents the pod's state
machine from progressing. The pod will remain in the terminating
phase but no further attempts to terminate or cleanup will occur
until the kubelet is restarted.

The pod worker now maintains a store of the pods state that it is
attempting to reconcile and uses that to resync unknown pods when
SyncKnownPods() is invoked, so that failures in sync methods for
unknown pods no longer hang forever.

The pod worker's store tracks desired updates and the last update
applied on podSyncStatuses. Each goroutine now synchronizes to
acquire the next work item, context, and whether the pod can start.
This synchronization moves the pending update to the stored last
update, which will ensure third parties accessing pod worker state
don't see updates before the pod worker begins synchronizing them.

As a consequence, the update channel becomes a simple notifier
(struct{}) so that SyncKnownPods can coordinate with the pod worker
to create a synthetic pending update for unknown pods (i.e. no one
besides the pod worker has data about those pods). Otherwise the
pending update info would be hidden inside the channel.

In order to properly track pending updates, we have to be very
careful not to mix RunningPods (which are calculated from the
container runtime and are missing all spec info) and config-
sourced pods. Update the pod worker to avoid using ToAPIPod()
and instead require the pod worker to directly use
update.Options.Pod or update.Options.RunningPod for the
correct methods. Add a new SyncTerminatingRuntimePod to prevent
accidental invocations of runtime only pod data.

Finally, fix SyncKnownPods to replay the last valid update for
undesired pods which drives the pod state machine towards
termination, and alter HandlePodCleanups to:

- terminate runtime pods that aren't known to the pod worker
- launch admitted pods that aren't known to the pod worker

Any started pods receive a replay until they reach the finished
state, and then are removed from the pod worker. When a desired
pod is detected as not being in the worker, the usual cause is
that the pod was deleted and recreated with the same UID (almost
always a static pod since API UID reuse is statistically
unlikely). This simplifies the previous restartable pod support.
We are careful to filter for active pods (those not already
terminal or those which have been previously rejected by
admission). We also force a refresh of the runtime cache to
ensure we don't see an older version of the state.

Future changes will allow other components that need to view the
pod worker's actual state (not the desired state the podManager
represents) to retrieve that info from the pod worker.

Several bugs in pod lifecycle have been undetectable at runtime
because the kubelet does not clearly describe the number of pods
in use. To better report, add the following metrics:

  kubelet_desired_pods: Pods the pod manager sees
  kubelet_active_pods: "Admitted" pods that gate new pods
  kubelet_mirror_pods: Mirror pods the kubelet is tracking
  kubelet_working_pods: Breakdown of pods from the last sync in
    each phase, orphaned state, and static or not
  kubelet_restarted_pods_total: A counter for pods that saw a
    CREATE before the previous pod with the same UID was finished
  kubelet_orphaned_runtime_pods_total: A counter for pods detected
    at runtime that were not known to the kubelet. Will be
    populated at Kubelet startup and should never be incremented
    after.

Add a metric check to our e2e tests that verifies the values are
captured correctly during a serial test, and then verify them in
detail in unit tests.

Adds 23 series to the kubelet /metrics endpoint.
2023-03-08 22:03:51 -06:00
Paco Xu
b5dbb33da9 upgrade etcd deps to v3.5.7
Signed-off-by: Paco Xu <paco.xu@daocloud.io>
2023-03-01 12:14:52 +08:00
Kubernetes Prow Robot
a1f4fa0b0c Merge pull request #116141 from thockin/codegen_script_wide_vars
Codegen: set LC_ALL and unset GREP_OPTIONS
2023-02-28 14:54:23 -08:00
Kubernetes Prow Robot
de995809d0 Merge pull request #116130 from pohly/test-golangci-lint-improvements
golangci-lint improvements
2023-02-28 14:54:07 -08:00
Kubernetes Prow Robot
1efc044598 Merge pull request #116105 from thockin/codegen-15-subprojects
Fix codegen for older bash
2023-02-28 14:53:45 -08:00
Tim Hockin
6a09ba8f52 Codegen: set LC_ALL and unset GREP_OPTIONS
LC_ALL is always wanted and GREP_OPTIONS is never wanted.  The `grep
--color=never` dates back to 2016, an issue with OLD grep on Macs, which
was hard to deal with when this was all Makefile magic.  Now that it's a
script, we can do it simpler.
2023-02-28 10:17:52 -08:00
Patrick Ohly
fa98647a30 golangci-lint: update logcheck original-url 2023-02-28 17:22:33 +01:00
Patrick Ohly
cf2e6291d1 hack: move golangci-lint config files
Because the script now explicitly selects the configuration file, the files no
longer have to be in the root directory. Having them in hack without the
leading dot is better because they then have the same owners as the script and
are more visible.

The downside is that manual invocations of golangci-lint without the parameter
no longer work.
2023-02-28 17:22:31 +01:00
Patrick Ohly
2d513e1330 golangci-lint: show more information about actual invocation
Both env variables and parameters are relevant for users who want to invoke the
command directly or follow how it is used.
2023-02-28 17:21:52 +01:00
Kubernetes Prow Robot
6f68a13696 Merge pull request #115961 from pohly/e2e-framework-deprecate-gomega-wrappers
e2e framework: deprecate gomega wrappers
2023-02-28 06:27:29 -08:00
Tim Hockin
23eaa6e1e4 Fix codegen for older bash 2023-02-27 11:57:46 -08:00
Jordan Liggitt
588884dd69 Add CRD compatibility objects 2023-02-27 14:12:59 -05:00
Kubernetes Prow Robot
015e2fa20c Merge pull request #115953 from pohly/lint-gomega
test: fixing + linting gomega usage
2023-02-27 00:56:20 -08:00
Patrick Ohly
181fc50f8e e2e framework: deprecate gomega wrappers
All wrappers except for ExpectNoError are identical to their gomega
counterparts. The only advantage that they have is that their invocations are
shorter.

That advantage does not outweigh their disadvantages:
- cannot be used in combination with gomega.Eventually/Consistently
- not a full replacement for gomega, so we just end up using both
- don't support passing a stack offset and thus cannot be used in helper
  functions
- ginkgolinter does not work for them, so sub-optimal calls like this one
  are not reported:

     framework.ExpectEqual(len(items), 0)
     ->
     gomega.Expect(items).To(gomega.BeEmpty())
- developers try to make do with what's available in the framework, leading
  to sub-optimal checks like this:

    framework.ExpectEqual(true, strings.Contains(event.Message, expectedEventError), "Event error should indicate non-root policy caused container to not start")
    ->
    gomega.Expect(event.Message).To(gomega.ContainSubstring(expectedEventError), "Event error should indicate non-root policy caused container to not start")

So let's remove these wrappers. As a first step they get marked as deprecated.
This enables stricter
linting (https://github.com/kubernetes/kubernetes/pull/109728), once enabled,
to report new code which uses them.
2023-02-23 09:51:42 +01:00
andrew_li
78c0018ca0 fix make verify (#115871) 2023-02-22 07:17:56 -08:00
Patrick Ohly
443b1c6c23 hack/tools: bump golangci-lint to v1.51.2 2023-02-22 07:54:20 +01:00
Kubernetes Prow Robot
e29d3229cc Merge pull request #115272 from thockin/codegen-mocks-neg-glob
Fix update-mocks to use better globs
2023-02-20 09:39:49 -08:00
Davanum Srinivas
4ecb4670cc Remove unnecessary ETCD_UNSUPPORTED_ARCH for arm64
we should only use this env var for `arm`, since `arm64` is fully
supported by etcd folks, let us drop this!

(ex - https://github.com/etcd-io/etcd/releases/tag/v3.5.6)

ppc64le comment should be dropped as well

Signed-off-by: Davanum Srinivas <davanum@gmail.com>
2023-02-16 21:29:13 -05:00
cpanato
65230338ad [go] Bump images, dependencies and versions to go 1.20.1
Signed-off-by: cpanato <ctadeu@gmail.com>
2023-02-16 13:38:32 +01:00
Lucas Severo Alves
6b34fafdaf Add ctx logging involved in KS startup (#115588)
* ctx logging involved in startup

as per https://github.com/kubernetes/kubernetes/pull/111155#pullrequestreview-1283257121

* use klog.Background().Error in flag handling

* revert scheduler_perf changes

* refence issue in code comment

* enable ctx logcheck for cmd/kube-scheduler
2023-02-13 09:19:29 -08:00
Kubernetes Prow Robot
e818649c10 Merge pull request #115690 from tzneal/fix-buildx-check
fix docker buildx check
2023-02-12 14:27:30 -08:00
Kubernetes Prow Robot
4303743736 Merge pull request #115692 from liggitt/go1.20
Disable unified build and static init optimization for tests
2023-02-10 18:11:30 -08:00
Kubernetes Prow Robot
0424a530a4 Merge pull request #115678 from pohly/e2e-full-reports
e2e: revise complete report creation
2023-02-10 15:07:29 -08:00
Jordan Liggitt
e20d77bb79 Disable unified build and static init optimization for tests 2023-02-10 17:57:56 -05:00
Todd Neal
0c99212e78 fix docker buildx check
In testing, docker reports an exit code of zero if --help
is passed, regardless of the subcommand
2023-02-10 14:26:15 -06:00
Patrick Ohly
3e2b26ce52 e2e: revise complete report creation
The previous approach was based on the observation that some Prow jobs use the
--report-dir parameter instead of the E2E_REPORT_DIR env variable. Parsing the
command line was necessary to use the --json-report and --junit-report
parameters.

But that is complex and can be avoided by triggering the creation of complete
reports in the E2E test suite. The paths are hard-coded and relative to the
report directory to keep the code simple.

There was a report that k8s-triage started processing more data after
6db4b741dd was merged. It's unclear whether
that was because of the new <report-dir>/ginkgo_report.xml file. To avoid
this potential problem, the reports are now in a "ginkgo" sub-directory.

While at it, error checking gets enhanced:
- Create directories at the start of
  the suite and bail out early if that fails.
- *All* e2e suites using the framework do this, not just test/e2e.
- Added missing error checking of truncated JUnit report writing.
2023-02-10 10:20:20 +01:00
Anish Ramasekar
b6b00e65bc logcheck.conf: ensure that kms and value/encrypt uses structured logging
Signed-off-by: Anish Ramasekar <anish.ramasekar@gmail.com>
2023-02-10 02:28:39 +00:00
Madhav Jivrajani
64cf942ce8 hack/tools: Bump golangci-lint version
Bump golangci-lint version. This version
adds support for go1.20.

This consequently also bumps the version of
staticcheck. Note that this was changed to
use master to be compatible with 1.20. This
commit reverts back to using a tagged release.

Signed-off-by: Madhav Jivrajani <madhav.jiv@gmail.com>
2023-02-06 12:27:16 +05:30
cpanato
b9ddf07a75 [go] Bump images, dependencies and versions to go 1.20
Signed-off-by: cpanato <ctadeu@gmail.com>
2023-02-03 22:55:24 +01:00
Jordan Liggitt
1e4a032a34 Add golang.org/x/lint to unwanted dependencies 2023-02-02 17:12:23 -05:00
Jordan Liggitt
fa66ec647d Invoke gimme from kube::golang::verify_go_version
Defaults to ensuring .go-version is used
Override the go version by setting GO_VERSION=1.x
Force using the host go version with FORCE_HOST_GO=y
2023-02-01 17:03:30 -05:00
Jordan Liggitt
f6bb29c2d2 Add gimme 2023-02-01 16:34:23 -05:00
Jordan Liggitt
7cc6b724ab Defer builds to test-cmd and test-integration targets 2023-02-01 15:35:14 -05:00
Kubernetes Prow Robot
5d4776adc1 Merge pull request #114948 from haoruan/feature-api-doc-field-linter
Add linter to check if api docs match field tag names
2023-01-30 16:21:09 -08:00
Mohamed Zaian
90570b7595 etcd: Update to version 3.5.7 2023-01-27 17:24:00 +01:00
Kubernetes Prow Robot
336934ab0a Merge pull request #115243 from liggitt/host-protoc
Use host protoc if it is the correct version
2023-01-26 18:52:24 -08:00
Jordan Liggitt
71174aa2da Generate proto uncontainerized if host has required protoc version 2023-01-26 18:00:10 -05:00
Jordan Liggitt
028683efe6 Add missing proto path to kube::protoc::protoc invocation 2023-01-26 18:00:09 -05:00
Jordan Liggitt
d49d988467 Allow init.sh and protoc.sh to be sourced idempotently 2023-01-26 18:00:09 -05:00
Jordan Liggitt
3548e7febe Add helper script to install protoc 2023-01-26 18:00:08 -05:00
Jordan Liggitt
238e0226db Check protoc version strictly 2023-01-26 18:00:06 -05:00
Tim Hockin
c3e0a0a0b3 Fix update-mocks to use better globs
This was fixed in other update scripts, but this one was already merged.
2023-01-23 09:20:12 -08:00
Patrick Ohly
1d79a191c2 hack: update logtools to v0.4.1
Contains some bug fixes, for example allowing some additional
functions when enforcing contextual logging.
2023-01-23 14:24:29 +01:00
Kubernetes Prow Robot
0fcc3dbd55 Merge pull request #115240 from thockin/codegen-9-use-ls-files
Use `git ls-files` in a few places instead of `find`
2023-01-23 00:26:21 -08:00
Tim Hockin
6a49eae422 Make update-netparse-cve use ls-files 2023-01-22 15:21:37 -08:00
Tim Hockin
822745512d Make update-gofmt use ls-files 2023-01-22 15:16:23 -08:00
Kubernetes Prow Robot
91cfe7f0c3 Merge pull request #115246 from thockin/codegen-11-swagger-from-update-codegen
Generate swagger from update-codegen
2023-01-22 11:24:10 -08:00
Kubernetes Prow Robot
bc2fccaa96 Merge pull request #115245 from thockin/codegen-10-protobuf-from-update-codegen
Call update-generated-protobuf from update-codegen
2023-01-22 11:24:03 -08:00
Kubernetes Prow Robot
f09b318dda Merge pull request #115248 from thockin/codegen-12-mocks
Codegen: use ls files and pre-remove gen'ed mocks
2023-01-22 05:52:02 -08:00
Tim Hockin
597d52ac10 Remove openapi files before regen 2023-01-21 17:46:22 -08:00