<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>온프레미스 Archives -</title>
	<atom:link href="https://blog.kwt.co.kr/tag/%ec%98%a8%ed%94%84%eb%a0%88%eb%af%b8%ec%8a%a4/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.kwt.co.kr/tag/온프레미스/</link>
	<description>여러분의 돈과 시간을 낭비하지마세요.</description>
	<lastBuildDate>Tue, 24 Feb 2026 00:32:44 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>

<image>
	<url>https://blog.kwt.co.kr/wp-content/uploads/2022/07/cropped-logo_bg-32x32.jpg</url>
	<title>온프레미스 Archives -</title>
	<link>https://blog.kwt.co.kr/tag/온프레미스/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kubernetes 온프레미스 클러스터 업그레이드하기</title>
		<link>https://blog.kwt.co.kr/kubernetes-%ec%98%a8%ed%94%84%eb%a0%88%eb%af%b8%ec%8a%a4-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/</link>
					<comments>https://blog.kwt.co.kr/kubernetes-%ec%98%a8%ed%94%84%eb%a0%88%eb%af%b8%ec%8a%a4-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/#respond</comments>
		
		<dc:creator><![CDATA[시간 조절자]]></dc:creator>
		<pubDate>Sun, 22 Feb 2026 14:58:08 +0000</pubDate>
				<category><![CDATA[기술]]></category>
		<category><![CDATA[쿠버네티스]]></category>
		<category><![CDATA[CKA]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[etcd]]></category>
		<category><![CDATA[kubeadm]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[온프레미스]]></category>
		<category><![CDATA[클러스터 업그레이드]]></category>
		<guid isPermaLink="false">https://blog.kwt.co.kr/?p=1619</guid>

					<description><![CDATA[<p>6노드 온프레미스 Kubernetes 클러스터를 v1.30.4에서 v1.31.14로 업그레이드한 과정을 정리한다. etcd 백업부터 control-plane, worker 노드 순차 업그레이드까지 실전에서 주의할 점을 공유한다.</p>
<p>The post <a href="https://blog.kwt.co.kr/kubernetes-%ec%98%a8%ed%94%84%eb%a0%88%eb%af%b8%ec%8a%a4-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/">Kubernetes 온프레미스 클러스터 업그레이드하기</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">들어가며</h2>



<p><a href="https://blog.kwt.co.kr/?p=744">이전 포스팅</a>에서 집에 굴러다니는 미니PC들로 쿠버네티스 클러스터를 구축한 이야기를 했었다.</p>



<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><a href="https://kwt.co.kr/kubernetes">쿠버네티스 클러스터 둘러보기</a></mark></p>



<p>그때 설치한 버전이 v1.30.4였는데, 그 뒤로 Jenkins, Kafka, MySQL InnoDB Cluster, Redis 같은 것들을 하나씩 올리면서 &#8220;잘 돌아가는데 굳이 건드려야 하나&#8221; 싶어서 업그레이드를 계속 미뤄왔다. 근데 v1.30 지원 종료(EOL)도 되었고(on-prem은 2025년에 만료), CKA 시험 준비를 하면서 kubeadm 업그레이드를 공부하다 보니 이참에 직접 해보자 싶었다.</p>



<p>실제 프로덕션 워크로드가 돌아가는 환경에서 하는 거라 우려했는데, 막상 절차대로 하니까 생각보다 어렵지 않았다. 그 과정을 기록해둔다.</p>



<h2 class="wp-block-heading">3줄 요약</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li>Kubernetes는 <strong>한 번에 1 마이너 버전씩만</strong> 업그레이드할 수 있다 (v1.30 → v1.31 OK, v1.30 → v1.32 불가. <s>도대체 왜 이렇게 만든건가?</s>)</li>



<li>반드시 <strong>control-plane 먼저, worker 나중에</strong> 순서를 지켜야 한다</li>



<li>업그레이드 전 <strong>etcd 백업은 필수</strong> &#8211; 실패 시 복구할 수 있는 유일한 보험</li>
</ul>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Kubernetes 클러스터 구성</h2>



<p>업그레이드 대상 클러스터 구성은 이렇게 생겼다:</p>



<p>Kubernetes Cluster v1.30.4</p>



<p>Control Plane (3대)</p>



<ul class="wp-block-list">
<li>luckys-worker0
<ul class="wp-block-list">
<li>ingress-nginx-controller</li>



<li>redis-node-0</li>



<li>mysql-operator</li>
</ul>
</li>



<li>luckys-worker1
<ul class="wp-block-list">
<li>ingress-nginx-controller</li>



<li>dev-mysql-cluster-0</li>
</ul>
</li>



<li>luckys-worker2
<ul class="wp-block-list">
<li>kafka-controller-2</li>



<li>redis-node-2</li>
</ul>
</li>
</ul>



<p>Worker (3대)</p>



<ul class="wp-block-list">
<li><s>luckys-worker3 &#8211; 사망</s></li>



<li>luckys-worker4
<ul class="wp-block-list">
<li>kafka-controller-1</li>



<li>prod-mysql-cluster-1</li>



<li>loki (로그 수집)</li>
</ul>
</li>



<li>luckys-worker5
<ul class="wp-block-list">
<li>kafka-controller-0</li>



<li>prod-mysql-cluster-2</li>



<li>prometheus, alertmanager</li>



<li>redis-dev-master (standalone)</li>
</ul>
</li>



<li>luckys-worker6
<ul class="wp-block-list">
<li>prod-mysql-cluster-0</li>



<li>ingress-nginx-controller</li>



<li>jenkins</li>



<li>nexus, openclaw, grafana</li>
</ul>
</li>
</ul>



<p>주요 워크로드: Jenkins, Kafka, MySQL InnoDB Cluster, Redis Sentinel, Longhorn, MetalLB, Ingress-Nginx, 이외 다수 Application</p>



<p>OS는 Ubuntu 24.04 LTS, 컨테이너 런타임은 containerd.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">사전 준비</h2>



<h3 class="wp-block-heading">1. 현재 버전 확인</h3>



<pre class="wp-block-code"><code>kubeadm version
# kubeadm version: v1.30.4

kubelet --version
# Kubernetes v1.30.4

kubectl version</code></pre>



<h3 class="wp-block-heading">2. 업그레이드 가능한 버전 확인</h3>



<p>v1.31 저장소를 추가하고 사용 가능한 버전을 확인한다:</p>



<pre class="wp-block-code"><code># v1.31 저장소 추가
echo 'deb &#91;signed-by=/etc/apt/keyrings/kubernetes-apt-keyring-v1.31.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' \
  | sudo tee /etc/apt/sources.list.d/kubernetes-v1.31.list

# GPG 키 등록
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key \
  | sudo gpg --dearmor --yes -o /etc/apt/keyrings/kubernetes-apt-keyring-v1.31.gpg

sudo apt update
sudo apt-cache madison kubeadm | head -5</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>참고:</strong> 기존 v1.30 저장소의 GPG 키가 만료되어 <code>apt update</code> 시 에러가 발생할 수 있다. v1.31 저장소만 정상이면 업그레이드 진행에 문제없다.</p>
</blockquote>



<h3 class="wp-block-heading">3. etcd 백업 (필수!)</h3>



<p>업그레이드 전 반드시 etcd를 백업한다. 문제가 생기면 이 백업으로 클러스터를 복구할 수 있다.</p>



<pre class="wp-block-code"><code># 인증서 경로 확인
kubectl describe pod etcd-luckys-worker0 -n kube-system

# etcd 백업 실행
export ETCDCTL_API=3
etcdctl snapshot save /opt/etcd-backup-before-upgrade.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 백업 확인
etcdctl snapshot status /opt/etcd-backup-before-upgrade.db --write-out=table</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>etcdctl이 설치되어 있지 않다면 <code>kubectl exec</code>으로 etcd Pod 안에서 실행하거나, etcd 바이너리를 직접 설치하면 된다.</p>
</blockquote>



<h3 class="wp-block-heading">4. 노드별 워크로드 분포 확인</h3>



<p>drain 하면 영향받는 워크로드를 미리 파악해야 한다:</p>



<pre class="wp-block-code"><code># 각 노드에서 돌아가는 Pod 확인
kubectl get pods -A -o wide --field-selector spec.nodeName=luckys-worker0 | grep -v kube-system

# Taint 확인 (control-plane에 Taint가 없으면 일반 워크로드도 올라가 있을 수 있음)
kubectl describe node luckys-worker0 | grep -i taint</code></pre>



<p>내 클러스터는 control-plane에 Taint가 설정되어 있지 않아서(마스터도 예외 없다) 일반 워크로드도 control-plane 노드에서 실행되고 있었다. MySQL InnoDB Cluster, Redis, Ingress 등의 분포를 확인하고 drain해도 프로덕션에 영향이 없는지 검증한 후 진행했다.</p>



<h3 class="wp-block-heading">업그레이드 시 안전도</h3>



<p>비교적 안전</p>



<ul class="wp-block-list">
<li>luckys-worker0 (prod 1개뿐, MySQL/Kafka 없음)</li>



<li>luckys-worker2 (워크로드 적음)</li>
</ul>



<p>우려됨</p>



<ul class="wp-block-list">
<li>luckys-worker1 (prod 앱 + ingress)</li>



<li>luckys-worker5 (모니터링 + MySQL + Kafka)</li>
</ul>



<p>매우 우려됨</p>



<ul class="wp-block-list">
<li>luckys-worker4 (워크로드 최다 + MySQL + Kafka)</li>



<li>luckys-worker6 (prod 앱 많음 + MySQL + Jenkins + Ingress)</li>
</ul>



<p>사실 다른 것도 그렇지만, Longhorn 으로 데이터가 서로 다른 노드에 동기화 되어야 하는데, upgrade로 인한 중단 시 쓰기 지연이 발생할 경우 클러스터 전체의 성능이 대폭 하락하는 문제가 있어서 이 지점이 가장 골머리 아프다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">업그레이드 순서</h2>



<p><strong>반드시 control-plane → worker 순서로 해야한다.</strong> kubelet은 apiserver보다 높은 버전일 수 없기 때문이다.</p>



<pre class="wp-block-code"><code>1. Control Plane #1 (luckys-worker0) ← 첫 번째는 kubeadm upgrade apply
2. Control Plane #2 (luckys-worker1) ← 이후는 kubeadm upgrade node
3. Control Plane #3 (luckys-worker2)
4. Worker #1 (luckys-worker4)        ← 전부 kubeadm upgrade node
5. Worker #2 (luckys-worker5)
6. Worker #3 (luckys-worker6)</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Control Plane 첫 번째 노드 업그레이드</h2>



<p>첫 번째 control-plane 노드만 <code>kubeadm upgrade apply</code>를 사용한다. 나머지는 전부 <code>kubeadm upgrade node</code>를 쓴다.</p>



<h3 class="wp-block-heading">Step 1: kubeadm 업그레이드</h3>



<pre class="wp-block-code"><code># kubeadm 패키지 잠금 해제 → 설치 → 다시 잠금
apt-mark unhold kubeadm &amp;&amp; \
apt-get update &amp;&amp; apt-get install -y kubeadm=1.31.14-1.1 &amp;&amp; \
apt-mark hold kubeadm</code></pre>



<h3 class="wp-block-heading">Step 2: 업그레이드 계획 확인 및 실행</h3>



<pre class="wp-block-code"><code># 버전 확인
kubeadm version

# 업그레이드 계획 확인
sudo kubeadm upgrade plan

# 업그레이드 실행
sudo kubeadm upgrade apply v1.31.14</code></pre>



<p><code>kubeadm upgrade plan</code>은 현재 상태를 분석해서 업그레이드 가능 여부를 보여준다. 문제가 없으면 <code>apply</code>로 실제 업그레이드를 진행한다.</p>



<h3 class="wp-block-heading">Step 3: 노드에서 Pod 퇴거 (drain)</h3>



<p>kubeadm upgrade 후, kubelet 업그레이드 전에 drain한다.</p>



<pre class="wp-block-code"><code>kubectl drain luckys-worker0 --ignore-daemonsets</code></pre>



<ul class="wp-block-list">
<li><code>--ignore-daemonsets</code>: DaemonSet Pod(모니터링, 네트워크 등)은 무시</li>



<li>emptyDir 사용하는 Pod 때문에 실패하면 <code>--delete-emptydir-data</code> 추가</li>
</ul>



<h3 class="wp-block-heading">Step 4: kubelet &amp; kubectl 업그레이드</h3>



<pre class="wp-block-code"><code># 패키지 잠금 해제 → 설치 → 다시 잠금
apt-mark unhold kubelet kubectl &amp;&amp; \
apt-get update &amp;&amp; apt-get install -y kubelet=1.31.14-1.1 kubectl=1.31.14-1.1 &amp;&amp; \
apt-mark hold kubelet kubectl

# kubelet 재시작
sudo systemctl daemon-reload
sudo systemctl restart kubelet</code></pre>



<h3 class="wp-block-heading">Step 5: 노드 복귀 (uncordon)</h3>



<pre class="wp-block-code"><code>kubectl uncordon luckys-worker0</code></pre>



<h3 class="wp-block-heading">Step 6: 업그레이드 확인</h3>



<pre class="wp-block-code"><code>kubectl get nodes
# luckys-worker0의 VERSION이 v1.31.14로 변경되었는지 확인</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">나머지 Control Plane 노드 업그레이드</h2>



<p>두 번째, 세 번째 control-plane 노드는 <strong><code>kubeadm upgrade node</code></strong>를 사용한다. <code>apply</code>가 아닌 점에 주의. <code>kubeadm upgrade plan</code>도 불필요하다.</p>



<p>각 노드에 SSH 접속 후:</p>



<pre class="wp-block-code"><code># 1. kubeadm 업그레이드
apt-mark unhold kubeadm &amp;&amp; \
apt-get update &amp;&amp; apt-get install -y kubeadm=1.31.14-1.1 &amp;&amp; \
apt-mark hold kubeadm

# 2. 노드 업그레이드
sudo kubeadm upgrade node          # ← apply가 아닌 node!

# 3. drain (다른 control-plane 노드에서 실행)
kubectl drain luckys-worker1 --ignore-daemonsets

# 4. kubelet &amp; kubectl 업그레이드
apt-mark unhold kubelet kubectl &amp;&amp; \
apt-get update &amp;&amp; apt-get install -y kubelet=1.31.14-1.1 kubectl=1.31.14-1.1 &amp;&amp; \
apt-mark hold kubelet kubectl

sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 5. uncordon (다른 노드에서 실행)
kubectl uncordon luckys-worker1</code></pre>



<p>luckys-worker2도 동일하게 진행한다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Worker 노드 업그레이드</h2>



<p>Worker 노드도 거의 동일하다. <code>kubeadm upgrade node</code>를 사용한다.</p>



<pre class="wp-block-code"><code># 1. kubeadm 업그레이드
apt-mark unhold kubeadm &amp;&amp; \
apt-get update &amp;&amp; apt-get install -y kubeadm=1.31.14-1.1 &amp;&amp; \
apt-mark hold kubeadm

# 2. 노드 업그레이드
sudo kubeadm upgrade node

# 3. drain (control-plane에서 실행)
kubectl drain luckys-worker4 --ignore-daemonsets

# 4. kubelet &amp; kubectl
apt-mark unhold kubelet kubectl &amp;&amp; \
apt-get update &amp;&amp; apt-get install -y kubelet=1.31.14-1.1 kubectl=1.31.14-1.1 &amp;&amp; \
apt-mark hold kubelet kubectl

sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 5. uncordon (control-plane에서 실행)
kubectl uncordon luckys-worker4</code></pre>



<p>luckys-worker5, luckys-worker6도 동일하게 진행한다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">전체 업그레이드 완료 확인</h2>



<pre class="wp-block-code"><code>kubectl get nodes -o wide</code></pre>



<pre class="wp-block-code"><code>NAME             STATUS   ROLES           VERSION    OS-IMAGE
luckys-worker0   Ready    control-plane   v1.31.14   Ubuntu 24.04 LTS
luckys-worker1   Ready    control-plane   v1.31.14   Ubuntu 24.04 LTS
luckys-worker2   Ready    control-plane   v1.31.14   Ubuntu 24.04 LTS
luckys-worker4   Ready    &lt;none&gt;          v1.31.14   Ubuntu 24.04 LTS
luckys-worker5   Ready    &lt;none&gt;          v1.31.14   Ubuntu 24.04 LTS
luckys-worker6   Ready    &lt;none&gt;          v1.31.14   Ubuntu 24.04 LTS</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">주의사항 &amp; 삽질 기록</h2>



<h3 class="wp-block-heading">GPG 키 만료 문제</h3>



<p>v1.30 저장소의 GPG 키가 만료되어 <code>apt update</code> 시 에러가 났다:</p>



<pre class="wp-block-code"><code>EXPKEYSIG 234654DA9A296436 isv:kubernetes OBS Project</code></pre>



<p>v1.31 저장소를 새로 추가하고 키를 등록하면 해결된다. 기존 v1.30 저장소 에러는 무시해도 된다.</p>



<p><strong>1. v1.31 GPG 키 다운로드 및 등록</strong></p>



<pre class="wp-block-code"><code>curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring-v1.31.gpg</code></pre>



<p><strong>2. v1.31 저장소 추가</strong></p>



<pre class="wp-block-code"><code>echo 'deb &#91;signed-by=/etc/apt/keyrings/kubernetes-apt-keyring-v1.31.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes-v1.31.list</code></pre>



<h3 class="wp-block-heading">control-plane에 Taint가 없는 경우</h3>



<p>일반적으로 control-plane 노드에는 <code>NoSchedule</code> Taint가 설정되어 있어서 일반 워크로드가 배치되지 않는다. 근데 내 클러스터처럼 Taint가 없으면 MySQL, Redis, Ingress 등이 control-plane에서도 실행된다.(Taint를 설정하기엔 비용 이슈가..)</p>



<p>drain 전에 반드시 해당 노드의 워크로드를 확인하고, 프로덕션 영향을 검토해야 한다:</p>



<pre class="wp-block-code"><code>kubectl get pods -A -o wide --field-selector spec.nodeName=&lt;노드명&gt; | grep -v kube-system</code></pre>



<h3 class="wp-block-heading">drain vs cordon</h3>



<ul class="wp-block-list">
<li><code>kubectl drain</code>: 기존 Pod를 다른 노드로 퇴거시키고 스케줄 차단</li>



<li><code>kubectl cordon</code>: 새 Pod 스케줄만 차단, 기존 Pod는 그대로</li>
</ul>



<p>프로덕션 영향이 걱정되면 <code>cordon</code>만 하고 업그레이드를 진행하는 방법도 있다. kubelet 재시작 시 잠깐 중단되지만 Pod가 다른 노드로 이동하지는 않는다.</p>



<h3 class="wp-block-heading">MySQL InnoDB Cluster 고려</h3>



<p>MySQL InnoDB Cluster는 3개 인스턴스가 서로 다른 노드에 분산되어 있어서, 한 노드를 drain해도 나머지 2개가 쿼럼을 유지한다. drain 전에 어떤 노드에 어떤 인스턴스가 있는지 확인하자:</p>



<pre class="wp-block-code"><code>kubectl get pods -A -o wide | grep mysql
kubectl get innodbcluster -A</code></pre>



<h3 class="wp-block-heading">한 대씩, 확인하면서</h3>



<p>절대 여러 노드를 동시에 drain하지 말자. 특히 control-plane은 etcd 쿼럼(과반수) 유지가 필수다. 3대 중 2대가 동시에 내려가면 클러스터가 멈춘다.</p>



<pre class="wp-block-code"><code>한 대 업그레이드 완료 → kubectl get nodes로 Ready 확인 → 다음 노드</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">업그레이드 절차 요약</h2>



<pre class="wp-block-code"><code>&#91;사전 준비]
  etcd 백업 → 저장소 추가 → 워크로드 분포 확인

&#91;Control Plane 첫 번째 노드]
  kubeadm 설치 → kubeadm upgrade apply → drain → kubelet kubectl 설치 → restart → uncordon

&#91;Control Plane 나머지 + Worker 전체]
  kubeadm 설치 → kubeadm upgrade node → drain → kubelet kubectl 설치 → restart → uncordon

&#91;완료]
  kubectl get nodes로 전체 버전 확인</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">마치며</h2>



<p>막상 해보니 절차만 지키면 크게 어렵지 않아서 이걸 왜이리 미뤄왔나 싶다.</p>



<p>핵심은 세 가지다:</p>



<ol class="wp-block-list">
<li><strong>etcd 백업</strong>: 만약을 위한 보험</li>



<li><strong>순서 준수</strong>: control-plane 먼저, worker 나중에</li>



<li><strong>한 대씩</strong>: 확인하고 넘어가기</li>
</ol>



<p>CKA 시험에서도 kubeadm 업그레이드는 거의 매번 출제되는 문제라고 한다. 실제 클러스터에서 한 번 해보면 시험에서도 별 문제 없이 풀 수 있을 것 같다.</p>



<h3 class="wp-block-heading">참고 링크</h3>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/">Kubernetes 공식 문서 &#8211; Upgrading kubeadm clusters</a></li>



<li><a href="https://kubernetes.io/releases/version-skew-policy/">Kubernetes Version Skew Policy</a></li>



<li><a href="https://training.linuxfoundation.org/certification/certified-kubernetes-administrator-cka/">CKA 시험 공식 페이지</a></li>



<li><a href="https://blog.kwt.co.kr/?p=744">홈 서버 쿠버네티스 클러스터 구축기</a></li>
</ul>
		<div class="wpulike wpulike-robeen " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="Like Button"
					data-ulike-id="1619"
					data-ulike-nonce="83b27dfa1e"
					data-ulike-type="post"
					data-ulike-template="wpulike-robeen"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_1619"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	<p>The post <a href="https://blog.kwt.co.kr/kubernetes-%ec%98%a8%ed%94%84%eb%a0%88%eb%af%b8%ec%8a%a4-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/">Kubernetes 온프레미스 클러스터 업그레이드하기</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kwt.co.kr/kubernetes-%ec%98%a8%ed%94%84%eb%a0%88%eb%af%b8%ec%8a%a4-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
