<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kittisuw</title>
    <description>The latest articles on DEV Community by kittisuw (@kittisuw).</description>
    <link>https://dev.to/kittisuw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F346951%2Fb0ee69aa-e18b-4e46-99ba-9a46228e7a9e.jpg</url>
      <title>DEV Community: kittisuw</title>
      <link>https://dev.to/kittisuw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kittisuw"/>
    <language>en</language>
    <item>
      <title>🚀 How to Self-Host n8n with Docker Compose</title>
      <dc:creator>kittisuw</dc:creator>
      <pubDate>Mon, 28 Jul 2025 08:53:49 +0000</pubDate>
      <link>https://dev.to/kittisuw/how-to-self-host-n8n-with-docker-compose-3o9p</link>
      <guid>https://dev.to/kittisuw/how-to-self-host-n8n-with-docker-compose-3o9p</guid>
      <description>&lt;p&gt;n8n is a powerful open-source workflow automation tool. If you're deploying it yourself using Docker Compose, it's important to &lt;strong&gt;pin the image version&lt;/strong&gt; for reliability and control.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, ensure your system has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/get-docker/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/compose/install/" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;A working terminal (Linux, macOS, or WSL on Windows)&lt;/li&gt;
&lt;li&gt;Basic knowledge of Docker CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;-v&lt;/span&gt;
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Step-by-Step Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Create a directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/n8n-docker &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/n8n-docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2️⃣ Create &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.7"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;n8n&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;n8nio/n8n:1.103.2&lt;/span&gt;  &lt;span class="c1"&gt;# ✅ Pin the version&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5678:5678"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;GENERIC_TIMEZONE=Asia/Bangkok&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_ACTIVE=true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_USER=admin&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_PASSWORD=your-password&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./n8n_data:/home/node/.n8n&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧐 &lt;strong&gt;Explanation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;volumes&lt;/code&gt;: persists your workflows and credentials.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;restart: unless-stopped&lt;/code&gt;: auto-restarts unless manually stopped.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;image: n8nio/n8n:1.103.2&lt;/code&gt;: fixes version to avoid surprises on update.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;restart: unless-stopped&lt;/code&gt;: self restart&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3️⃣ Start the container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4️⃣ Access n8n
&lt;/h3&gt;

&lt;p&gt;Visit: &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt;&lt;br&gt;
Login: &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;your-password&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Why You Should Pin the Docker Image Version
&lt;/h2&gt;

&lt;p&gt;Avoid using &lt;code&gt;latest&lt;/code&gt; — it could break your workflows after unexpected updates.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;latest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;May auto-update on pull, could introduce breaking changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:1.103.2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stable and predictable version&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 Check &lt;a href="https://hub.docker.com/r/n8nio/n8n/tags" rel="noopener noreferrer"&gt;Docker Hub tags&lt;/a&gt; and &lt;a href="https://docs.n8n.io/release-notes/" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 Upgrade Procedure
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Backup the &lt;code&gt;./n8n_data&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;Update the image tag in &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pull and restart and verify system health
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose pull
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CONTAINER ID   IMAGE               COMMAND                  CREATED       STATUS       PORTS                    NAMES
923e00afb0bc   n8nio/n8n:1.103.3   &lt;span class="s2"&gt;"tini -- /docker-ent…"&lt;/span&gt;   2 hours ago   Up 2 hours   0.0.0.0:5678-&amp;gt;5678/tcp   n8n-n8n-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Self-host n8n with Docker Compose&lt;/li&gt;
&lt;li&gt;Pin the Docker image version&lt;/li&gt;
&lt;li&gt;Secure access with basic auth&lt;/li&gt;
&lt;li&gt;Persist data with volume mounts&lt;/li&gt;
&lt;li&gt;Safe upgrade flow&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;#n8n #Automation #SelfHosted&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Installing Kubernetes with Kubespray on CenOS 7 Guide</title>
      <dc:creator>kittisuw</dc:creator>
      <pubDate>Wed, 27 Jan 2021 06:50:35 +0000</pubDate>
      <link>https://dev.to/kittisuw/installing-kubernetes-with-kubespray-on-cenos-7-guide-4ee3</link>
      <guid>https://dev.to/kittisuw/installing-kubernetes-with-kubespray-on-cenos-7-guide-4ee3</guid>
      <description>&lt;h1&gt;
  
  
  Installing Kubernetes with Kubespray on CenOS 7 Guide
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Preparing ansible
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Disable selinbux and firewalld
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;setenforce 0
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/^SELINUX&lt;/span&gt;&lt;span class="se"&gt;\=&lt;/span&gt;&lt;span class="s2"&gt;enforcing/SELINUX&lt;/span&gt;&lt;span class="se"&gt;\=&lt;/span&gt;&lt;span class="s2"&gt;disabled/g"&lt;/span&gt; /etc/selinux/config
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemctl disable firewalld&lt;span class="p"&gt;;&lt;/span&gt; systemctl stop firewalld&lt;span class="p"&gt;;&lt;/span&gt; systemctl mask firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Installation require package for git,ansible
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yum update
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;epel-release
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;python-pip
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; — upgrade pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.Git clone the Kubespray repository and install requirement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git clone https://github.com/kubernetes-sigs/kubespray.git
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;kubespray
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c"&gt;##Install requirements&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c"&gt;##Copy ``inventory/sample`` as ``inventory/mycluster``&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-rfp&lt;/span&gt; inventory/sample inventory/mycluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Genarate ssh key and copy to all vm that prepare to install K8s cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssh-copy-id &lt;span class="nt"&gt;-p&lt;/span&gt; 2324 admin@&lt;span class="o"&gt;{&lt;/span&gt;ip of K8s node&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Prepare file config hosts
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray/inventory/k8scluster
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;inventory.ini hosts.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  hosts.ini
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray/inventory/k8scluster
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi hosts.ini
&lt;span class="go"&gt;---
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## Configure 'ip' variable to bind kubernetes services on a&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## different ip than the default iface&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.&lt;/span&gt;
&lt;span class="go"&gt;[all]
k8sm901 ansible_host=10.233.247.64 ip=10.30.2.25
k8sm902 ansible_host=10.233.247.65 ip=10.30.2.26
k8sm903 ansible_host=10.233.247.66 ip=10.30.2.27
k8sw901 ansible_host=10.233.247.67 ip=10.30.2.28
k8sw902 ansible_host=10.233.247.68 ip=10.30.2.29
k8sw903 ansible_host=10.233.247.69 ip=10.30.2.30
k8sw904 ansible_host=10.233.247.61 ip=10.30.2.22
k8sw905 ansible_host=10.233.247.62 ip=10.30.2.23

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## configure a bastion host if your nodes are not directly reachable&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bastion &lt;span class="nv"&gt;ansible_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;x.x.x.x &lt;span class="nv"&gt;ansible_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;some_user
&lt;span class="go"&gt;
[kube-master]
k8sm901
k8sm902
k8sm903

[etcd]
k8sm901
k8sm902
k8sm903

[kube-node]
k8sm901
k8sm902
k8sm903
k8sw901
k8sw902
k8sw903
k8sw904
k8sw905

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

[all:vars]
ansible_ssh_user=admin
ansible_ssh_port=2324
---
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Test ansible ping
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/k8scluster/hosts.ini  &lt;span class="nt"&gt;-m&lt;/span&gt; ping all
&lt;span class="gp"&gt;k8sw901 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sm902 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sm903 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sm901 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sw903 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sw904 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sw905 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sw906 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;span class="gp"&gt;k8sw902 | SUCCESS =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "changed": false,
    "ping": "pong"
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Preparing k8s nodes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7. Uninstall docker,k8s on K8s nodes and install jq
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;docker ps &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;docker rmi &lt;span class="sb"&gt;`&lt;/span&gt;docker images &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubeadm reset 
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yum remove kubeadm kubectl kubelet kubernetes-cni kube&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yum autoremove 
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.kube
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c"&gt;##Install jq&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;epel-release &lt;span class="nt"&gt;-y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; yum &lt;span class="nb"&gt;install &lt;/span&gt;jq &lt;span class="nt"&gt;-y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setup K8s cluster via kubespray
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8. setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="go"&gt;ansible-playbook -i inventory/k8scluster/hosts.ini cluster.yml --become

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;Download kube config file from one of master node to bastion vm
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2324 admin@k8sm901 &lt;span class="s1"&gt;'sudo cat /etc/kubernetes/admin.conf'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;~/.kube/config
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;Check all node status is Ready
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE     VERSION
k8sm901   Ready    control-plane,master   2d21h   v1.20.0
k8sm902   Ready    control-plane,master   2d21h   v1.20.0
k8sm903   Ready    control-plane,master   2d21h   v1.20.0
&lt;/span&gt;&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0
&lt;span class="gp"&gt;k8sw906   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node &lt;span class="nt"&gt;-o&lt;/span&gt; wide
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
&lt;/span&gt;&lt;span class="gp"&gt;k8sm901   Ready    control-plane,master   2d21h   v1.20.0   10.30.2.25    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sm902   Ready    control-plane,master   2d21h   v1.20.0   10.30.2.26    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sm903   Ready    control-plane,master   2d21h   v1.20.0   10.30.2.27    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0   10.30.2.28    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0   10.30.2.29    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0   10.30.2.30    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0   10.30.2.22    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0   10.30.2.23    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;span class="gp"&gt;k8sw906   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d21h   v1.20.0   10.30.2.24    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  FAQS
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Remove node from cluster
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE     VERSION
k8sm901   Ready    control-plane,master   2d22h   v1.20.0
k8sm902   Ready    control-plane,master   2d22h   v1.20.0
k8sm903   Ready    control-plane,master   2d22h   v1.20.0
&lt;/span&gt;&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d22h   v1.20.0
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d22h   v1.20.0
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d22h   v1.20.0
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d22h   v1.20.0
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d22h   v1.20.0
&lt;span class="gp"&gt;k8sw906   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d22h   v1.20.0
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/k8scluster/hosts.ini remove-node.yml &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"node=k8sw906"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE     VERSION
k8sm901   Ready    control-plane,master   2d23h   v1.20.0
k8sm902   Ready    control-plane,master   2d23h   v1.20.0
k8sm903   Ready    control-plane,master   2d23h   v1.20.0
&lt;/span&gt;&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add new node to cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;sudo -i
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi &lt;span class="nv"&gt;$HOME&lt;/span&gt;/inventory/k8scluster/hosts.ini
&lt;span class="go"&gt;---
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## Configure 'ip' variable to bind kubernetes services on a&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## different ip than the default iface&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.&lt;/span&gt;
&lt;span class="go"&gt;[all]
k8sm901 ansible_host=10.233.247.64 ip=10.30.2.25
k8sm902 ansible_host=10.233.247.65 ip=10.30.2.26
k8sm903 ansible_host=10.233.247.66 ip=10.30.2.27
k8sw901 ansible_host=10.233.247.67 ip=10.30.2.28
k8sw902 ansible_host=10.233.247.68 ip=10.30.2.29
k8sw903 ansible_host=10.233.247.69 ip=10.30.2.30
k8sw904 ansible_host=10.233.247.61 ip=10.30.2.22
k8sw905 ansible_host=10.233.247.62 ip=10.30.2.23
*k8sw906 ansible_host=10.233.247.63 ip=10.30.2.24

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## configure a bastion host if your nodes are not directly reachable&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bastion &lt;span class="nv"&gt;ansible_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;x.x.x.x &lt;span class="nv"&gt;ansible_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;some_user
&lt;span class="go"&gt;
[kube-master]
k8sm901
k8sm902
k8sm903

[etcd]
k8sm901
k8sm902
k8sm903

[kube-node]
k8sm901
k8sm902
k8sm903
k8sw901
k8sw902
k8sw903
k8sw904
k8sw905
*k8sw906 

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

[all:vars]
ansible_ssh_user=admin
ansible_ssh_port=2324
---
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE     VERSION
k8sm901   Ready    control-plane,master   2d23h   v1.20.0
k8sm902   Ready    control-plane,master   2d23h   v1.20.0
k8sm903   Ready    control-plane,master   2d23h   v1.20.0
&lt;/span&gt;&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;2d23h   v1.20.0
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/k8scluster/hosts.ini scale.yml &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE   VERSION
k8sm901   Ready    control-plane,master   47m   v1.20.0
k8sm902   Ready    control-plane,master   46m   v1.20.0
k8sm903   Ready    control-plane,master   46m   v1.20.0
&lt;/span&gt;&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;45m   v1.20.0
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;45m   v1.20.0
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;45m   v1.20.0
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;45m   v1.20.0
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;45m   v1.20.0
&lt;span class="gp"&gt;k8sw906   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;66s   v1.20.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reset Cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/k8scluster/hosts.ini reset.yml &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node
&lt;span class="go"&gt;The connection to the server 10.30.2.25:6443 was refused - did you specify the right host or port?
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Upgrade Kubernetes version all node in Cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE     VERSION
k8sm901   Ready    control-plane,master   4m53s   v1.20.0
k8sm902   Ready    control-plane,master   4m22s   v1.20.0
k8sm903   Ready    control-plane,master   4m12s   v1.20.0
&lt;/span&gt;&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;3m12s   v1.20.0
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;3m12s   v1.20.0
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;3m12s   v1.20.0
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;3m12s   v1.20.0
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;3m12s   v1.20.0
&lt;span class="gp"&gt;k8sw906   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;3m4s    v1.20.0
&lt;span class="gp"&gt;#&lt;/span&gt;Edit kube_version
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray/inventory/k8scluster/group_vars/k8s-cluster/k8s-cluster.yml
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;kube_version: v1.20.0   #&lt;/span&gt;edit to v1.20.2
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/k8scluster/hosts.ini upgrade-cluster.yml &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;watch &lt;span class="nt"&gt;-x&lt;/span&gt; kubectl get node,pod &lt;span class="nt"&gt;-o&lt;/span&gt; wide
&lt;span class="go"&gt;NAME           STATUS   ROLES                  AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                K
ERNEL-VERSION                CONTAINER-RUNTIME
&lt;/span&gt;&lt;span class="gp"&gt;node/k8sm901   Ready    control-plane,master   100m   v1.20.2   10.30.2.25    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3
&lt;span class="go"&gt;.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;/span&gt;&lt;span class="gp"&gt;node/k8sm902   Ready    control-plane,master   100m   v1.20.2   10.30.2.26    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3
&lt;span class="go"&gt;.10.0-1160.11.1.el7.x86_64   docker://19.3.14
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Renew certificate
&lt;/h3&gt;

&lt;p&gt;Because Client certificates generated by kubeadm expire after 1 year.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;By Upgrade Kubernetes&lt;br&gt;
As kubespray background is kubeadm so when you Upgrade Kubernetes version certificates will Renew automaticaly. It is a best practice to upgrade your cluster frequently in order to stay secure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/"&gt;https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By set force_certificate_regeneration&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray/inventory/k8scluster/group_vars/k8s-cluster/k8s-cluster.yml
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="go"&gt;force_certificate_regeneration: true
---
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/k8scluster/hosts.ini cluster.yml &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Change container runtime
&lt;/h3&gt;

&lt;p&gt;Because Kubernetes is only deprecating Docker as a container runtime after v1.20. They are currently only planning to remove Docker runtime support in the 1.22 release in late 2021(almost year!).&lt;br&gt;&lt;br&gt;
Example change from docker to containerd&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c"&gt;#Edit &lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray/inventory/k8scluster/group_vars/k8s-cluster/
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;k8s-cluster.yml k8s-cluster.yml.bk
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi k8s-cluster.yml
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;container_manager: docker #&lt;/span&gt;Change from docker to containerd
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray/inventory/k8scluster/group_vars
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;etcd.yml etcd.yaml.bk
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi etcd.yml
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;etcd_deployment_type: docker #&lt;/span&gt;Change from docker to host
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray/inventory/k8scluster/group_vars/all
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;containerd.yml containerd.yml.bk
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c"&gt;# unbar config&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vi containerd.yml
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="go"&gt;---
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Please see roles/container-engine/containerd/defaults/main.yml &lt;span class="k"&gt;for &lt;/span&gt;more configuration options
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Example: define registry mirror &lt;span class="k"&gt;for &lt;/span&gt;docker hub
&lt;span class="go"&gt;
containerd_config:
  grpc:
    max_recv_message_size: 16777216
    max_send_message_size: 16777216
  debug:
    level: ""
  registries:
    "docker.io":
      - "https://mirror.gcr.io"
      - "https://registry-1.docker.io"
  max_container_log_line_size: -1
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;metrics:
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;address: &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;grpc_histogram: &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;span class="go"&gt;---
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c"&gt;# Apply the new Container runtime&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/kubespray
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/k8scluster/hosts.ini cluster.yml &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="c"&gt;# Check container runtime&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kubectl get node &lt;span class="nt"&gt;-o&lt;/span&gt; wide
&lt;span class="go"&gt;NAME      STATUS   ROLES                  AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
&lt;/span&gt;&lt;span class="gp"&gt;k8sm901   Ready    control-plane,master   11h   v1.20.2   10.30.2.25    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sm902   Ready    control-plane,master   11h   v1.20.2   10.30.2.26    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sm903   Ready    control-plane,master   11h   v1.20.2   10.30.2.27    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sw901   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;11h   v1.20.2   10.30.2.28    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sw902   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;11h   v1.20.2   10.30.2.29    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sw903   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;11h   v1.20.2   10.30.2.30    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sw904   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;11h   v1.20.2   10.30.2.22    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sw905   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;11h   v1.20.2   10.30.2.23    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;span class="gp"&gt;k8sw906   Ready    &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;11h   v1.20.2   10.30.2.24    &amp;lt;none&amp;gt;        CentOS Linux 7 &lt;span class="o"&gt;(&lt;/span&gt;Core&lt;span class="o"&gt;)&lt;/span&gt;   3.10.0-1160.11.1.el7.x86_64   containerd://1.4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/kubernetes-sigs/kubespray/blob/master/docs/containerd.md"&gt;https://github.com/kubernetes-sigs/kubespray/blob/master/docs/containerd.md&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
  </channel>
</rss>
