Skip to content

Commit

Permalink
Merge pull request #8194 from saschagrunert/platforms-guide
Browse files Browse the repository at this point in the history
Add platforms guide
  • Loading branch information
k8s-ci-robot authored Nov 26, 2024
2 parents b9a05f6 + 280f2b9 commit ade28d6
Showing 1 changed file with 146 additions and 0 deletions.
146 changes: 146 additions & 0 deletions contributors/guide/platforms.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
---
title: "Platforms Guide"
weight: 5
description: |
Outlines the necessary steps to either add or remove supported platform builds
in Kubernetes.
---

## Adding supported platforms

The default Kubernetes platform is `linux/amd64`. This platform has always been
fully tested, and the build and release systems initially supported only this
platform. SIG Release started an [effort to support multiple architectures][0].
As part of this effort, they added support in our build and release pipelines
for the architectures `arm`, `arm64`, `ppc64le` and `s390x` on different
operating systems like Linux, Windows and macOS.

[0]: https://github.com/kubernetes/kubernetes/issues/38067

The main focus was to have binaries and container images to be available for
these architectures/operating systems. Contributors should be able to to take
these artifacts and set up CI jobs to adequately test these platforms.
Specifically to call out the ability to run conformance tests on these
platforms.

Target of this document is to provide a starting point for adding new platforms
to Kubernetes from a SIG Architecture and SIG Release perspective. This does not
include release mechanics or supportability in terms of functionality.

### Step 0: Engage with the community

The first step is to express the interest in adding a new platform or promoting
one into a different Tier. This can be done by opening a GitHub issue in the
[SIG Release repository](https://github.com/kubernetes/sig-release/issues),
attending the weekly SIG Release meetings or writing a message to the [SIG
Release mailing list](https://groups.google.com/g/kubernetes-sig-release).

The ultimate decision to approve or reject a platform will be done in the
community as part of the standard lazy consensus. Even if all mentioned
requirements for a platform are being met, it's possible that external
dependencies, infrastructure costs or anything else have influence on the
maintainability of the platform.

### Step 1: Building

The container image based build infrastructure should support this architecture.
This implicitly requires the following:

- golang should support the platform
- All dependencies, whether vendored or run separately, should support this
platform

In other words, anyone in the community should be able to use the SIG Release
provided build tooling to generate all artifacts required to build Kubernetes.

More information about how to build Kubernetes can be found in [the build
documentation][1].

[1]: https://github.com/kubernetes/kubernetes/tree/3f7c09e/build#building-kubernetes

### Step 2: Testing

It is not enough for builds to work as it gets bit-rotted quickly when vendoring
in in new changes, update versions of things to be used etc. This means the
project need a good set of tests that exercise a wide battery of jobs in this
new architecture.

A good starting point from a testing perspective are:

- unit tests
- e2e tests
- node e2e tests

This will ensure that community members can rely on these architectures on a
consistent basis, which will give folks who are making changes a signal when
they break things in a specific architecture.

This implies a set of folks who stand up and maintain both post-submit and
periodic tests, watch them closely and raise the flag when things break. They
will also have to help debug and fix any platform specific issues as well.

Creating custom [testgrid][4] dashboards can help to monitor platform specific
tests.

[4]: https://testgrid.k8s.io

### Step 3: Releasing

The first 2 steps provide a reasonable expectation that there are people taking
care of a supported platform and it works in a reproducible environment.

Getting to the next level is another big jump, because it needs to be ensured
that real users can rely on the shipped artifacts.

This means specifically to add a set of CI jobs to the release-informing and
release-blocking tabs of testgrid. The Kubernetes release team has a "CI signal"
group that relies on the status(es) of these jobs to either ship or hold a
release. Essentially, if things are mostly red with occasional green, it would
be prudent to not even bother making this architecture as part of the release.
CI jobs get added to release-informing first and when these get to a point where
they work really well, then they get promoted to release-blocking.

The main problem here is once the project starts to ship something, users will
start to rely on it. While it's straight forward to setup a CI job as a one time
thing, it's a totally one to consistently maintain them over time. What SIG
Release is looking for is a strong green CI signal for release managers to cut a
release and for folks to be able to report problems and them getting addressed.
This also includes [conformance testing][2] to ensure that the supported
platform behaves as intended. This can be done by working with SIG Architecture
as part of the [conformance sub project][3] in addition to testing and release.

[2]: https://github.com/cncf/k8s-conformance
[3]: https://github.com/kubernetes/community/tree/master/sig-architecture#conformance-definition

### Step 4: Finishing

If you got this far, you really have made it! You have a clear engagement with
the community, you are working seamlessly with all the relevant SIGs, you have
your content in the Kubernetes release and get end users to adopt your
architecture. Having achieved conformance, you will gain conditional use of the
Kubernetes trademark relative to your offerings.

## Deprecating and removing supported platforms

Supported platforms may be considered as deprecated for various reasons, for
example if they are being replaced by new ones, are not actively used or
maintained any more. Deprecating an already supported platform has to follow a
couple of steps:

1. The platform deprecation has been announced on the [Kubernetes Announce
mailing list](https://groups.google.com/g/kubernetes-announce)
and links to an Kubernetes GitHub issue for further discussions and consensus.

1. The deprecation will be active immediately after consensus has been reached
at a set deadline. This incorporates approval from SIG Release and
Architecture.

1. Removing the supported platform will be done in the beginning of the next
minor (v1.N+1.0) release cycle, which means to:
- Update the Kubernetes build scripts to exclude the platform from all targets
- Update the [kubernetes/sig-release](https://github.com/kubernetes/sig-release)
repository to reflect the current set of supported platforms.

Please note that actively supported release branches are not affected by the
removal. This ensures compatibility with existing artifact consumers on a best
effort basis.

0 comments on commit ade28d6

Please sign in to comment.