# kubeadm 설치하기

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

<img src="/images/kubeadm-stacked-color.png" align="right" width="150px"></img>
이 페이지에서는 `kubeadm` 툴박스 설치 방법을 보여준다.
이 설치 프로세스를 수행한 후 kubeadm으로 클러스터를 만드는 방법에 대한 자세한 내용은 
[kubeadm으로 클러스터 생성하기](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) 페이지를 참고한다.







<div class="version-list">
    <p>
        This installation guide is for Kubernetes v1.36. If you want to use a different Kubernetes version, please refer to the following pages instead:
    </p>
    <ul>
        
            
        
            
            <li>
                <a href="https://v1-35.docs.kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">kubeadm 설치하기 (Kubernetes v1.35)</a>
            </li>
            
        
            
            <li>
                <a href="https://v1-34.docs.kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">kubeadm 설치하기 (Kubernetes v1.34)</a>
            </li>
            
        
            
            <li>
                <a href="https://v1-33.docs.kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">kubeadm 설치하기 (Kubernetes v1.33)</a>
            </li>
            
        
            
            <li>
                <a href="https://v1-32.docs.kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">kubeadm 설치하기 (Kubernetes v1.32)</a>
            </li>
            
        
    </ul>
</div>


## 시작하기 전에

* 호환되는 리눅스 호스트. 쿠버네티스 프로젝트는 데비안 및 레드햇 기반 리눅스 배포판과
   패키지 매니저가 없는 배포판에 대한 일반적인 지침을 제공한다.
* 머신당 2GB 이상의 RAM (이보다 적으면 앱을 위한 공간이 거의 남지 않는다).
* 컨트롤 플레인 머신에는 2개 이상의 CPU.
* 클러스터의 모든 머신 간 완전한 네트워크 연결 (공용 또는 사설 네트워크 무관).
* 모든 노드에 대해 고유한 호스트네임, MAC 주소, 그리고 product_uuid. 자세한 내용은 [여기](#verify-mac-address)를 참고한다.
* 머신에 특정 포트들이 열려있어야 한다. 자세한 내용은 [여기](#check-required-ports)를 참고한다.


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4><code>kubeadm</code> 설치는 동적 링킹을 사용하는 바이너리를 통해 수행되며 대상 시스템이 <code>glibc</code>를 제공한다고 가정한다.
이는 많은 리눅스 배포판(데비안, 우분투, 페도라, CentOS 등 포함)에서 합리적인 가정이지만
알파인 리눅스(Alpine Linux)와 같이 기본적으로 <code>glibc</code>를
포함하지 않는 커스텀 및 경량 배포판에서는 항상 그런 것은 아니다.
배포판이 <code>glibc</code>를 포함하거나 예상되는 심볼을 제공하는
<a href="https://wiki.alpinelinux.org/wiki/Running_glibc_programs">호환성 레이어</a>를 포함할 것으로 예상된다.</div>


<!-- steps -->

## OS 버전 확인

<div class="alert alert-secondary callout third-party-content" role="note"><strong>참고:</strong>&puncsp;이 섹션은 쿠버네티스에 필요한 기능을 제공하는 써드파티 프로젝트와 관련이 있다. 쿠버네티스 프로젝트 작성자는 써드파티 프로젝트에 책임이 없다. 이 페이지는 <a href="https://github.com/cncf/foundation/blob/master/website-guidelines.md" target="_blank">CNCF 웹사이트 가이드라인</a>에 따라 프로젝트를 알파벳 순으로 나열한다. 이 목록에 프로젝트를 추가하려면 변경사항을 제출하기 전에 <a href="/contribute/style/content-guide/#third-party-content">콘텐츠 가이드</a>를 읽어본다.</div>


<ul class="nav nav-tabs" id="tabs-operating-system-version-check" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-operating-system-version-check-0" role="tab" aria-controls="tabs-operating-system-version-check-0" aria-selected="true">Linux</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-operating-system-version-check-1" role="tab" aria-controls="tabs-operating-system-version-check-1">Windows</a></li></ul>

<div class="tab-content" id="tabs-operating-system-version-check-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-operating-system-version-check-0" role="tabpanel" aria-labelledby="tabs-operating-system-version-check-0-tab" tabindex="operating-system-version-check"><ul>
<li>kubeadm 프로젝트는 LTS 커널을 지원한다. <a href="https://www.kernel.org/category/releases.html">LTS 커널 목록</a>을 참고한다.</li>
<li><code>uname -r</code> 명령을 사용하여 커널 버전을 확인할 수 있다</li>
</ul>
<p>자세한 정보는 <a href="/ko/docs/reference/node/kernel-version-requirements/">리눅스 커널 요구사항</a>을 참고한다.</p>
</div><div class="tab-body tab-pane fade"
        id="tabs-operating-system-version-check-1" role="tabpanel" aria-labelledby="tabs-operating-system-version-check-1-tab" tabindex="operating-system-version-check"><ul>
<li>kubeadm 프로젝트는 최신 커널 버전을 지원한다. 최신 커널 목록은 <a href="https://learn.microsoft.com/ko-kr/windows/release-health/windows-server-release-info">윈도우 서버 릴리스 정보</a>를 참고한다.</li>
<li><code>systeminfo</code> 명령을 사용하여 커널 버전(OS 버전이라고도 함)을 확인할 수 있다</li>
</ul>
<p>자세한 정보는 <a href="https://kubernetes.io/ko/docs/concepts/windows/intro/">윈도우 OS 버전 호환성</a>을 참고한다.</p>
</div></div>


kubeadm으로 생성된 쿠버네티스 클러스터는 커널 기능을 사용하는 소프트웨어에 의존한다.
이 소프트웨어에는 <a class='glossary-tooltip' title='컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/setup/production-environment/container-runtimes/' target='_blank' aria-label='컨테이너 런타임'>컨테이너 런타임</a>,
<a class='glossary-tooltip' title='클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/reference/generated/kubelet' target='_blank' aria-label='kubelet'>kubelet</a>, 
그리고 <a class='glossary-tooltip' title='컨테이너 네트워크 인터페이스(CNI) 플러그인은 appc/CNI 스팩을 따르는 네트워크 플러그인의 일종이다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/' target='_blank' aria-label='컨테이너 네트워크 인터페이스'>컨테이너 네트워크 인터페이스</a> 플러그인이 포함되지만 이에 국한되지 않는다.

지원되지 않는 커널 버전으로 인한 예기치 않은 오류를 방지하기 위해, kubeadm은 `SystemVerification` 사전 검사를 실행한다. 
이 검사는 커널 버전이 지원되지 않으면 실패한다.

kubeadm이 커널 버전을 지원하지 않더라도, 
커널이 필요한 기능을 제공한다는 것을 알고 있다면 검사를 건너뛰도록 선택할 수 있다.

## 모든 노드에서 MAC 주소와 product_uuid가 고유한지 확인 {#verify-mac-address}

* `ip link` 또는 `ifconfig -a` 명령을 사용하여 네트워크 인터페이스의 MAC 주소를 확인할 수 있다
* `sudo cat /sys/class/dmi/id/product_uuid` 명령을 사용하여 product_uuid를 확인할 수 있다

하드웨어 장치는 고유한 주소를 가질 가능성이 매우 높지만, 일부 가상 머신은 동일한 값을 가질 수 있다. 
쿠버네티스는 이러한 값을 사용하여 클러스터의 노드를 고유하게 식별한다.
이러한 값이 각 노드에서 고유하지 않으면 설치 과정이 
[실패](https://github.com/kubernetes/kubeadm/issues/31)할 수 있다.

## 네트워크 어댑터 확인

네트워크 어댑터가 두 개 이상이고, 쿠버네티스 컴포넌트가 디폴트 라우트(default route)에서 도달할 수 없는
경우, 쿠버네티스 클러스터 주소가 적절한 어댑터를 통해 이동하도록 IP 경로를 추가하는 것이 좋다.

## 필수 포트 확인 {#check-required-ports}

쿠버네티스 컴포넌트가 서로 통신하려면 이러한 
[필수 포트](https://kubernetes.io/ko/docs/reference/networking/ports-and-protocols/)가 열려 있어야 한다.
[netcat](https://netcat.sourceforge.net)과 같은 도구를 사용하여 포트가 열려 있는지 확인할 수 있다. 예를 들어

```shell
nc 127.0.0.1 6443 -zv -w 2
```

사용하는 파드 네트워크 플러그인도 특정 포트가 열려 있어야 할 수 있다.
각 파드 네트워크 플러그인마다 다르므로, 
해당 플러그인이 필요로 하는 포트에 대해서는 플러그인 문서를 참고한다.

## 스왑 구성 {#swap-configuration}

노드에서 스왑 메모리가 감지되면 kubelet의 기본 동작은 시작에 실패하는 것이다.
이는 스왑이 비활성화되거나 kubelet에 의해 용인되어야 함을 의미한다.

* 스왑을 용인하려면, kubelet 구성에 `failSwapOn: false`를 추가하거나 커맨드라인 인수로 설정한다.
  참고: `failSwapOn: false`가 제공되더라도 워크로드는 기본적으로 스왑에 접근할 수 없다.
  이는 kubelet 구성 파일에서 다시 `swapBehavior`를 설정하여 변경할 수 있다. 스왑을 사용하려면,
  기본 `NoSwap` 설정이 아닌 다른 `swapBehavior`를 설정한다.
  자세한 내용은 [스왑 메모리 관리](/docs/concepts/architecture/nodes/#swap-memory)를 참고한다.
* 스왑을 비활성화하려면, `sudo swapoff -a`를 사용하여 일시적으로 스와핑을 비활성화할 수 있다.
  재부팅 후에도 이 변경사항을 유지하려면, 시스템 구성 방법에 따라
  `/etc/fstab`, `systemd.swap`과 같은 구성 파일에서 스왑이 비활성화되어 있는지 확인한다.


## 컨테이너 런타임 설치 {#installing-runtime}

파드에서 컨테이너를 실행하기 위해, 쿠버네티스는
<a class='glossary-tooltip' title='컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/setup/production-environment/container-runtimes/' target='_blank' aria-label='컨테이너 런타임'>컨테이너 런타임</a>을 사용한다.

기본적으로, 쿠버네티스는
<a class='glossary-tooltip' title='Kubelet과 컨테이너 런타임을 통합시키기 위한 API' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/overview/components/#%ec%bb%a8%ed%85%8c%ec%9d%b4%eb%84%88-%eb%9f%b0%ed%83%80%ec%9e%84' target='_blank' aria-label='컨테이너 런타임 인터페이스'>컨테이너 런타임 인터페이스</a>(CRI)를
사용하여 사용자가 선택한 컨테이너 런타임과 인터페이스한다.

런타임을 지정하지 않으면, kubeadm은 잘 알려진 엔드포인트를 스캐닝하여 
설치된 컨테이너 런타임을 자동으로 감지하려고 한다.

컨테이너 런타임이 여러 개 감지되거나 하나도 감지되지 않은 경우, 
kubeadm은 에러를 반환하고 사용자가 어떤 것을 사용할지를 명시하도록 요청할 것이다.

자세한 정보는 [컨테이너 런타임](/ko/docs/setup/production-environment/container-runtimes/)
을 참고한다.


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>도커 엔진은 컨테이너 런타임이 쿠버네티스와 호환되기 위한 요구 사항인
<a href="/ko/docs/concepts/architecture/cri/">CRI</a>를 만족하지 않는다.
이러한 이유로, 추가 서비스인 <a href="https://github.com/Mirantis/cri-dockerd">cri-dockerd</a>가 설치되어야 한다.
cri-dockerd는 쿠버네티스 버전 1.24부터 kubelet에서 <a href="/dockershim/">제거</a>된
기존 내장 도커 엔진 지원을 기반으로 한 프로젝트이다.</div>


아래 표는 지원 운영 체제에 대한 알려진 엔드포인트를 담고 있다.

<ul class="nav nav-tabs" id="tabs-container-runtime" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-container-runtime-0" role="tab" aria-controls="tabs-container-runtime-0" aria-selected="true">리눅스</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-container-runtime-1" role="tab" aria-controls="tabs-container-runtime-1">윈도우</a></li></ul>

<div class="tab-content" id="tabs-container-runtime-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-container-runtime-0" role="tabpanel" aria-labelledby="tabs-container-runtime-0-tab" tabindex="container-runtime"><table><caption style="display: none;">리눅스 컨테이너 런타임</caption>
	<thead>
			<tr>
					<th>런타임</th>
					<th>유닉스 도메인 소켓 경로</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>containerd</td>
					<td><code>unix:///var/run/containerd/containerd.sock</code></td>
			</tr>
			<tr>
					<td>CRI-O</td>
					<td><code>unix:///var/run/crio/crio.sock</code></td>
			</tr>
			<tr>
					<td>도커 엔진 (cri-dockerd 사용)</td>
					<td><code>unix:///var/run/cri-dockerd.sock</code></td>
			</tr>
	</tbody>
</table>
</div><div class="tab-body tab-pane fade"
        id="tabs-container-runtime-1" role="tabpanel" aria-labelledby="tabs-container-runtime-1-tab" tabindex="container-runtime"><table><caption style="display: none;">윈도우 컨테이너 런타임</caption>
	<thead>
			<tr>
					<th>런타임</th>
					<th>윈도우 네임드 파이프(named pipe) 경로</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>containerd</td>
					<td><code>npipe:////./pipe/containerd-containerd</code></td>
			</tr>
			<tr>
					<td>도커 엔진 (cri-dockerd 사용)</td>
					<td><code>npipe:////./pipe/cri-dockerd</code></td>
			</tr>
	</tbody>
</table>
</div></div>


## kubeadm, kubelet 및 kubectl 설치

모든 머신에 다음 패키지들을 설치한다.

* `kubeadm`: 클러스터를 부트스트랩하는 명령이다.

* `kubelet`: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과
    같은 작업을 수행하는 컴포넌트이다.

* `kubectl`: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다.

kubeadm은 `kubelet` 또는 `kubectl` 을 설치하거나 관리하지 **않으므로**, kubeadm이
설치하려는 쿠버네티스 컨트롤 플레인의 버전과 일치하는지
확인해야 한다. 그렇지 않으면, 예상치 못한 버그 동작으로 이어질 수 있는
버전 차이(skew)가 발생할 위험이 있다. 그러나, kubelet과 컨트롤 플레인 사이에 _하나의_
마이너 버전 차이가 지원되지만, kubelet 버전은 API 서버 버전 보다
높을 수 없다. 예를 들어, 1.7.0 버전의 kubelet은 1.8.0 API 서버와 완전히 호환되어야 하지만,
그 반대의 경우는 아니다.

`kubectl` 설치에 대한 정보는 [kubectl 설치 및 설정](/ko/docs/tasks/tools/)을 참고한다.

<div class="alert alert-danger" role="note"><h4 class="alert-heading">경고:</h4>이 지침은 모든 시스템 업그레이드에서 모든 쿠버네티스 패키지를 제외한다.
이는 kubeadm 및 쿠버네티스를
<a href="/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/">업그레이드 하는 데 특별한 주의</a>가 필요하기 때문이다.</div>


버전 차이에 대한 자세한 내용은 다음을 참고한다.

* 쿠버네티스 [버전 및 버전-차이 정책](/ko/releases/version-skew-policy/)
* Kubeadm 관련 [버전 차이 정책](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy)

<div class="alert alert-secondary callout note" role="note">
  <strong>참고:</strong> The legacy package repositories (<code>apt.kubernetes.io</code> and <code>yum.kubernetes.io</code>) have been
<a href="/blog/2023/08/31/legacy-package-repository-deprecation/">deprecated and frozen starting from September 13, 2023</a>.
<strong>Using the <a href="/blog/2023/08/15/pkgs-k8s-io-introduction/">new package repositories hosted at <code>pkgs.k8s.io</code></a>
is strongly recommended and required in order to install Kubernetes versions released after September 13, 2023.</strong>
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.
</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>각 쿠버네티스 마이너 버전마다 전용 패키지 저장소가 있다.
v1.36가 아닌 다른 마이너 버전을 설치하려면,
원하는 마이너 버전에 대한 설치 가이드를 참고한다.</div>


<ul class="nav nav-tabs" id="tabs-k8s-install" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-k8s-install-0" role="tab" aria-controls="tabs-k8s-install-0" aria-selected="true">데비안 기반 배포판</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-install-1" role="tab" aria-controls="tabs-k8s-install-1">레드햇 기반 배포판</a></li>
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-install-2" role="tab" aria-controls="tabs-k8s-install-2">패키지 매니저를 사용하지 않는 경우</a></li></ul>

<div class="tab-content" id="tabs-k8s-install-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-k8s-install-0" role="tabpanel" aria-labelledby="tabs-k8s-install-0-tab" tabindex="k8s-install"><p>다음 지침은 쿠버네티스 v1.36에 대한 것이다.</p>
<ol>
<li>
<p><code>apt</code> 패키지 인덱스를 업데이트하고 쿠버네티스 <code>apt</code> 리포지터리를 사용하는 데 필요한 패키지를 설치한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl"><span class="c1"># apt-transport-https는 더미 패키지일 수 있다. 그렇다면 해당 패키지를 건너뛸 수 있다</span>
</span></span><span class="line"><span class="cl">sudo apt-get install -y apt-transport-https ca-certificates curl gpg
</span></span></code></pre></div></li>
<li>
<p>쿠버네티스 패키지 리포지터리용 공개 샤이닝 키를 다운로드한다.
모든 리포지터리에 동일한 서명 키가 사용되므로 URL의 버전은 무시할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># `/etc/apt/keyrings` 디렉터리가 존재하지 않으면, curl 명령 전에 생성해야 한다. 아래 참고사항을 읽어본다.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># sudo mkdir -p -m 755 /etc/apt/keyrings</span>
</span></span><span class="line"><span class="cl">curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key <span class="p">|</span> sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
</span></span></code></pre></div></li>
</ol>
<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>데비안 12와 우분투 22.04보다 오래된 릴리스에서는 <code>/etc/apt/keyrings</code>
디렉터리가 기본적으로 존재하지 않으며, curl 명령 전에 생성되어야 한다.</div>
<ol start="3">
<li>
<p>적절한 쿠버네티스 <code>apt</code> 리포지터리를 추가한다. 이 리포지터리에는 쿠버네티스 1.36에 대한
패키지만 있다는 점에 유의한다. 다른 쿠버네티스 마이너 버전의 경우, 원하는 마이너 버전과 일치하도록
URL의 쿠버네티스 마이너 버전을 변경해야 한다
(설치할 계획인 쿠버네티스 버전에 대한 문서를 읽고 있는지도
확인해야 한다).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 이 명령어는 /etc/apt/sources.list.d/kubernetes.list 에 있는 기존 구성을 덮어쓴다.</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /&#39;</span> <span class="p">|</span> sudo tee /etc/apt/sources.list.d/kubernetes.list
</span></span></code></pre></div></li>
<li>
<p><code>apt</code> 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl">sudo apt-get install -y kubelet kubeadm kubectl
</span></span><span class="line"><span class="cl">sudo apt-mark hold kubelet kubeadm kubectl
</span></span></code></pre></div></li>
<li>
<p>(선택사항) kubeadm을 실행하기 전에 kubelet 서비스를 활성화한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div></li>
</ol>
</div><div class="tab-body tab-pane fade"
        id="tabs-k8s-install-1" role="tabpanel" aria-labelledby="tabs-k8s-install-1-tab" tabindex="k8s-install"><ol>
<li>
<p>SELinux를 <code>permissive</code> 모드로 설정한다.</p>
<p>다음 지침은 쿠버네티스 1.36에 대한 것이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># SELinux를 permissive 모드로 설정한다 (효과적으로 비활성화)</span>
</span></span><span class="line"><span class="cl">sudo setenforce <span class="m">0</span>
</span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/^SELINUX=enforcing$/SELINUX=permissive/&#39;</span> /etc/selinux/config
</span></span></code></pre></div></li>
</ol>
<div class="alert alert-caution" role="note"><h4 class="alert-heading">주의:</h4><ul>
<li><code>setenforce 0</code> 및 <code>sed ...</code> 실행으로 SELinux를 permissive 모드로 설정하면 효과적으로 비활성화된다.
이는 컨테이너가 호스트 파일시스템에 접근할 수 있도록 하기 위해 필요하다.
예를 들어, 일부 클러스터 네트워크 플러그인에서 이를 요구한다.
kubelet에서 SELinux 지원이 개선될 때까지 이렇게 해야 한다.</li>
<li>SELinux를 구성하는 방법을 알고 있다면 SELinux를 활성화된 상태로 둘 수 있지만
kubeadm에서 지원하지 않는 설정이 필요할 수 있다.</li>
</ul>
</div>
<ol start="2">
<li>
<p>쿠버네티스 <code>yum</code> 리포지터리를 추가한다.
리포지터리 정의의 <code>exclude</code> 파라미터는 쿠버네티스를 업그레이드하기 위해
따라야 하는 특별한 절차가 있으므로 <code>yum update</code> 실행 시 쿠버네티스와 관련된
패키지가 업그레이드되지 않도록 한다.
이 리포지터리에는 쿠버네티스 1.36에
대한 패키지만 있다는 점에 유의한다.
다른 쿠버네티스 마이너 버전의 경우, 원하는 마이너 버전과 일치하도록
URL의 쿠버네티스 마이너 버전을 변경해야 한다
(설치할 계획인 쿠버네티스 버전에 대한 문서를 읽고 있는지도 확인해야 한다).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 이것은 /etc/yum.repos.d/kubernetes.repo에 있는 기존 구성을 덮어쓴다</span>
</span></span><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
</span></span></span><span class="line"><span class="cl"><span class="s">[kubernetes]
</span></span></span><span class="line"><span class="cl"><span class="s">name=Kubernetes
</span></span></span><span class="line"><span class="cl"><span class="s">baseurl=https://pkgs.k8s.io/core:/stable:/v1.36/rpm/
</span></span></span><span class="line"><span class="cl"><span class="s">enabled=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgcheck=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgkey=https://pkgs.k8s.io/core:/stable:/v1.36/rpm/repodata/repomd.xml.key
</span></span></span><span class="line"><span class="cl"><span class="s">exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></div></li>
<li>
<p>kubelet, kubeadm 및 kubectl을 설치한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo yum install -y kubelet kubeadm kubectl --disableexcludes<span class="o">=</span>kubernetes
</span></span></code></pre></div></li>
<li>
<p>(선택사항) kubeadm을 실행하기 전에 kubelet 서비스를 활성화한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div></li>
</ol>
</div><div class="tab-body tab-pane fade"
        id="tabs-k8s-install-2" role="tabpanel" aria-labelledby="tabs-k8s-install-2-tab" tabindex="k8s-install"><p>CNI 플러그인 설치(대부분의 파드 네트워크에 필요)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CNI_PLUGINS_VERSION</span><span class="o">=</span><span class="s2">&#34;v1.3.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DEST</span><span class="o">=</span><span class="s2">&#34;/opt/cni/bin&#34;</span>
</span></span><span class="line"><span class="cl">sudo mkdir -p <span class="s2">&#34;</span><span class="nv">$DEST</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">curl -L <span class="s2">&#34;https://github.com/containernetworking/plugins/releases/download/</span><span class="si">${</span><span class="nv">CNI_PLUGINS_VERSION</span><span class="si">}</span><span class="s2">/cni-plugins-linux-</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">-</span><span class="si">${</span><span class="nv">CNI_PLUGINS_VERSION</span><span class="si">}</span><span class="s2">.tgz&#34;</span> <span class="p">|</span> sudo tar -C <span class="s2">&#34;</span><span class="nv">$DEST</span><span class="s2">&#34;</span> -xz
</span></span></code></pre></div><p>명령어 파일을 다운로드할 디렉터리 정의</p>
<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4><code>DOWNLOAD_DIR</code> 변수는 쓰기 가능한 디렉터리로 설정되어야 한다.
Flatcar Container Linux를 실행 중인 경우, <code>DOWNLOAD_DIR=&quot;/opt/bin&quot;</code> 을 설정한다.</div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">DOWNLOAD_DIR</span><span class="o">=</span><span class="s2">&#34;/usr/local/bin&#34;</span>
</span></span><span class="line"><span class="cl">sudo mkdir -p <span class="s2">&#34;</span><span class="nv">$DOWNLOAD_DIR</span><span class="s2">&#34;</span>
</span></span></code></pre></div><p>선택적으로 crictl을 설치한다 (컨테이너 런타임 인터페이스(CRI)와의 상호작용에 필요, kubeadm에는 선택사항).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CRICTL_VERSION</span><span class="o">=</span><span class="s2">&#34;v1.31.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl">curl -L <span class="s2">&#34;https://github.com/kubernetes-sigs/cri-tools/releases/download/</span><span class="si">${</span><span class="nv">CRICTL_VERSION</span><span class="si">}</span><span class="s2">/crictl-</span><span class="si">${</span><span class="nv">CRICTL_VERSION</span><span class="si">}</span><span class="s2">-linux-</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">.tar.gz&#34;</span> <span class="p">|</span> sudo tar -C <span class="nv">$DOWNLOAD_DIR</span> -xz
</span></span></code></pre></div><p><code>kubeadm</code>, <code>kubelet</code>을 설치하고 <code>kubelet</code> systemd 서비스를 추가한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">RELEASE</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>curl -sSL https://dl.k8s.io/release/stable.txt<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> <span class="nv">$DOWNLOAD_DIR</span>
</span></span><span class="line"><span class="cl">sudo curl -L --remote-name-all https://dl.k8s.io/release/<span class="si">${</span><span class="nv">RELEASE</span><span class="si">}</span>/bin/linux/<span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span>/<span class="o">{</span>kubeadm,kubelet<span class="o">}</span>
</span></span><span class="line"><span class="cl">sudo chmod +x <span class="o">{</span>kubeadm,kubelet<span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">RELEASE_VERSION</span><span class="o">=</span><span class="s2">&#34;v0.16.2&#34;</span>
</span></span><span class="line"><span class="cl">curl -sSL <span class="s2">&#34;https://raw.githubusercontent.com/kubernetes/release/</span><span class="si">${</span><span class="nv">RELEASE_VERSION</span><span class="si">}</span><span class="s2">/cmd/krel/templates/latest/kubelet/kubelet.service&#34;</span> <span class="p">|</span> sed <span class="s2">&#34;s:/usr/bin:</span><span class="si">${</span><span class="nv">DOWNLOAD_DIR</span><span class="si">}</span><span class="s2">:g&#34;</span> <span class="p">|</span> sudo tee /usr/lib/systemd/system/kubelet.service
</span></span><span class="line"><span class="cl">sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
</span></span><span class="line"><span class="cl">curl -sSL <span class="s2">&#34;https://raw.githubusercontent.com/kubernetes/release/</span><span class="si">${</span><span class="nv">RELEASE_VERSION</span><span class="si">}</span><span class="s2">/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf&#34;</span> <span class="p">|</span> sed <span class="s2">&#34;s:/usr/bin:</span><span class="si">${</span><span class="nv">DOWNLOAD_DIR</span><span class="si">}</span><span class="s2">:g&#34;</span> <span class="p">|</span> sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
</span></span></code></pre></div><div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>기본적으로 <code>glibc</code>를 포함하지 않는 리눅스 배포판에 대해서는
<a href="#before-you-begin">시작하기 전에</a> 섹션의 참고사항을 참고한다.</div>
<p><a href="/ko/docs/tasks/tools/#kubectl">도구 설치 페이지</a>의 지침에 따라 <code>kubectl</code>을 설치한다.</p>
<p>선택적으로, kubeadm을 실행하기 전에 kubelet 서비스를 활성화한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div><div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>Flatcar Container Linux 배포판은 <code>/usr</code> 디렉터리를 읽기 전용 파일시스템으로 마운트한다.
클러스터를 부트스트랩하기 전에, 쓰기 가능한 디렉터리를 구성하기 위한 추가 단계를 수행해야 한다.
쓰기 가능한 디렉터리를 설정하는 방법을 알아 보려면
<a href="/ko/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#usr-mounted-read-only/">Kubeadm 문제 해결 가이드</a>를 참고한다.</div>
</div></div>


kubelet은 이제 kubeadm이 수행할 작업을 알려 줄 때까지 크래시루프(crashloop) 상태로
기다려야 하므로 몇 초마다 다시 시작된다.

## cgroup 드라이버 구성

컨테이너 런타임과 kubelet은 
["cgroup 드라이버"](/ko/docs/setup/production-environment/container-runtimes/)라는 속성을 갖고 있으며, 
cgroup 드라이버는 리눅스 머신의 cgroup 관리 측면에 있어서 중요하다.

<div class="alert alert-danger" role="note"><h4 class="alert-heading">경고:</h4><p>컨테이너 런타임과 kubelet의 cgroup 드라이버를 일치시켜야 하며, 그렇지 않으면 kubelet 프로세스에 오류가 발생한다.</p>
<p>더 자세한 사항은 <a href="/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/">cgroup 드라이버 설정하기</a>를 참고한다.</p>
</div>


## 문제 해결

kubeadm에 문제가 있는 경우, 
[문제 해결 문서](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/)를 참고한다.

## 다음 내용

* [kubeadm을 사용하여 클러스터 생성](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
