instruction: Create a Dockerfile for cluster
output: ```dockerfile
  from September 13, 2023.
  Using the new package repositories hosted at pkgs.k8s.io
  is strongly recommended and required in order to install Kubernetes versions released after September 13, 2023.
  The deprecated legacy repositories, and their contents, might be removed at any time in the future and without
  a further notice period. The new package repositories provide downloads for Kubernetes versions starting with v1.24.0.
  
  Note:There's a dedicated package repository for each Kubernetes minor version. If you want to install
  a minor version other than v1.31, please see the installation guide for
  your desired minor version.
  Debian-based distributions
  Red Hat-based distributions
  Without a package manager
  
  These instructions are for Kubernetes v1.31.
  
  Update the apt package index and install packages needed to use the Kubernetes apt repository:
  sudo apt-get update
  # apt-transport-https may be a dummy package; if so, you can skip that package
  sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  
  Download the public signing key for the Kubernetes package repositories.
  The same signing key is used for all repositories so you can disregard the version in the URL:
  # If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
  # sudo mkdir -p -m 755 /etc/apt/keyrings
  curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  
  Note:In releases older than Debian 12 and Ubuntu 22.04, directory /etc/apt/keyrings does not
  exist by default, and it should be created before the curl command.
  
  Add the appropriate Kubernetes apt repository. Please note that this repository have packages
  only for Kubernetes 1.31; for other Kubernetes minor versions, you need to
  change the Kubernetes minor version in the URL to match your desired minor version
  (you should also check that you are reading the documentation for the version of Kubernetes
  that you plan to install).
  # This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
  echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
  
  Update the apt package index, install kubelet, kubeadm and kubectl, and pin their version:
  sudo apt-get update
  sudo apt-get install -y kubelet kubeadm kubectl
  sudo apt-mark hold kubelet kubeadm kubectl
  
  (Optional) Enable the kubelet service before running kubeadm:
  sudo systemctl enable --now kubelet
  
  Set SELinux to permissive mode:
  These instructions are for Kubernetes 1.31.
  # Set SELinux in permissive mode (effectively disabling it)
  sudo setenforce 0
  sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  
  Caution:
  Setting SELinux in permissive mode by running setenforce 0 and sed ...
  effectively disables it. This is required to allow containers to access the host
  filesystem; for example, some cluster network plugins require that. You have to
  do this until SELinux support is improved in the kubelet.
  You can leave SELinux enabled if you know how to configure it but it may require
  settings that are not supported by kubeadm.
  
  Add the Kubernetes yum repository. The exclude parameter in the
  repository definition ensures that the packages related to Kubernetes are
  not upgraded upon running yum update as there's a special procedure that
  must be followed for upgrading Kubernetes. Please note that this repository
  have packages only for Kubernetes 1.31; for other
  Kubernetes minor versions, you need to change the Kubernetes minor version
  in the URL to match your desired minor version (you should also check that
  you are reading the documentation for the version of Kubernetes that you
  plan to install).
  # This overwrites any existing configuration in /etc/yum.repos.d/kubernetes.repo
  cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
  [kubernetes]
  name=Kubernetes
  baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
  enabled=1
  gpgcheck=1
  gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
  exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
  EOF
  
  Install kubelet, kubeadm and kubectl:
  sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  
  (Optional) Enable the kubelet service before running kubeadm:
  sudo systemctl enable --now kubelet
  
  Install CNI plugins (required for most pod network):
  CNI_PLUGINS_VERSION="v1.3.0"
  ARCH="amd64"
  DEST="/opt/cni/bin"
  sudo mkdir -p "$DEST"
  curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-${ARCH}-${CNI_PLUGINS_VERSION}.tgz" | sudo tar -C "$DEST" -xz
  Define the directory to download command files:
  Note:The DOWNLOAD_DIR variable must be set to a writable directory.
  If you are running Flatcar Container Linux, set DOWNLOAD_DIR="/opt/bin".
  DOWNLOAD_DIR="/usr/local/bin"
  sudo mkdir -p "$DOWNLOAD_DIR"
  Optionally install crictl (required for interaction with the Container Runtime Interface (CRI), optional for kubeadm):
  CRICTL_VERSION="v1.31.0"
  ARCH="amd64"
  curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
  Install kubeadm, kubelet and add a kubelet systemd service:
  RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
  ARCH="amd64"
  cd $DOWNLOAD_DIR
  sudo curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet}
  sudo chmod +x {kubeadm,kubelet}
  
  RELEASE_VERSION="v0.16.2"
  curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service
  sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
  curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
  Note:Please refer to the note in the Before you begin section for Linux distributions
  that do not include glibc by default.
  Install kubectl by following the instructions on Install Tools page.
  Optionally, enable the kubelet service before running kubeadm:
  sudo systemctl enable --now kubelet
  Note:The Flatcar Container Linux distribution mounts the /usr directory as a read-only filesystem.
  Before bootstrapping your cluster, you need to take additional steps to configure a writable directory.
  See the Kubeadm Troubleshooting guide
  to learn how to set up a writable directory.
  
  The kubelet is now restarting every few seconds, as it waits in a crashloop for
  kubeadm to tell it what to do.
  Configuring a cgroup driver
  Both the container runtime and the kubelet have a property called
  "cgroup driver", which is important
  for the management of cgroups on Linux machines.
  Warning:Matching the container runtime and kubelet cgroup drivers is required or otherwise the kubelet process will fail.
  See Configuring a cgroup driver for more details.
  
  Troubleshooting
  If you are running into difficulties with kubeadm, please consult our
  troubleshooting docs.
  What's next
  
  Using kubeadm to Create a Cluster
  
  Feedback
  Was this page helpful?
  Yes
  No
  
   Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on
  
   Stack Overflow.
   Open an issue in the GitHub Repository if you want to
  
   report a problem
   or
  
   suggest an improvement.
  
   Last modified October 16, 2024 at 9:28 AM PST: Tweak and clean up four kubeadm files (67c5917e32)
  
    Create child page
   Create documentation issue
   Print entire section
  
  Before you begin
  Verify the MAC address and product_uuid are unique for every node
  Check network adapters
  Check required ports
  Swap configuration
  Installing a container runtime
  Installing kubeadm, kubelet and kubectl
  Configuring a cgroup driver
  Troubleshooting
  What's next
  
  © 2025 The Kubernetes Authors | Documentation Distributed under CC BY 4.0
  © 2025 The Linux Foundation ®. ICP license: 京ICP备17074266号-3
  ```