静一夜花开半夏 發表於 2022-12-9 23:08:00

Ubuntu 22.04 搭建K8s集群

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1. 虚拟机基础配置<ul><li>配置静态ip</li><li>设置主机名</li><li>设置hosts</li><li>安装ssh</li></ul></li><li>2. Ubuntu系统设置<ul><li>禁用swap</li><li>修改内核参数</li></ul></li><li>3. 安装containerd</li><li>4. 安装Kubernetes组件<ul><li>添加apt repo</li><li>安装Kubectl, kubeadm &amp; kubelet</li></ul></li><li>5. 初始化Master节点</li><li>6. 加入Node节点</li><li>7. 配置集群网络</li><li>8. 测试K8s集群</li></ul></div><p></p>
<p>本文基于Mac平台和Parallels软件,在其中创建三个Ubuntu系统,搭建了一个3个节点(1个master和2个Node)的K8s集群。下面的步骤没有特殊说明,都是需要在所有节点上分别执行的。也可以在一个虚拟机上执行完之后,复制当前虚拟机作为其他节点。</p>
<h2 id="1-虚拟机基础配置">1. 虚拟机基础配置</h2>
<p>基于Parallels虚拟机软件,在其中安装三个ubuntu系统,后续用于创建K8s集群的master节点和两个Node节点,三个节点均采用静态ip,具体配置如下:</p>
<ul>
<li>
<p>Master节点:192.168.31.200 master</p>
</li>
<li>
<p>Node1节点:192.168.31.201 node1</p>
</li>
<li>
<p>Node2节点:192.168.31.202 node2</p>
</li>
</ul>

<h3 id="配置静态ip">配置静态ip</h3>
<p>需要在三个节点上分别配置,下面以master为例:</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223350_4d426.jpg"></p>
<p>修改虚拟机网络为桥接模式:</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223351_776ab.jpg"></p>
<h3 id="设置主机名">设置主机名</h3>
<p>在Master节点运行</p>
<pre><code>sudo hostnamectl set-hostname master
</code></pre>
<p>其他节点分别运行</p>
<pre><code>sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2
</code></pre>
<h3 id="设置hosts">设置hosts</h3>
<p>方便节点之间相互访问,在每个节点的<code>/etc/hosts</code>上添加如下配置:</p>
<pre><code>192.168.31.200 master
192.168.31.201 node1
192.168.31.202 node2
</code></pre>
<p>配置好之后,试下ping master、node1看能否正常访问。</p>
<h3 id="安装ssh">安装ssh</h3>
<p>安装ssh,方便后续连接到虚拟机执行cmd。</p>
<pre><code>sudo apt update

sudo apt install openssh-server

sudo systemctl status ssh

# 如果遇到防火墙的问题,可以尝试下面的command来允许ssh。

sudo ufw allow ssh
</code></pre>
<blockquote>
<p>后续为了方便在多个terminal同时输入command,可以使用iterm同时打开三个窗口,然后输入<code>cmd + shift + I</code>进入多个输入的模式,如果需要退出,可以输入<code>⌘Command + ⇧Shift + ⌥Option + I</code>。</p>
</blockquote>
<h2 id="2-ubuntu系统设置">2. Ubuntu系统设置</h2>
<h3 id="禁用swap">禁用swap</h3>
<pre><code>sudo swapoff -a
sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
</code></pre>
<p>这步之后,最好重启ubuntu系统保证修改生效。</p>
<h3 id="修改内核参数">修改内核参数</h3>
<p>载入如下内核模块,</p>
<pre><code>sudo tee /etc/modules-load.d/containerd.conf &lt;&lt;EOF
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
</code></pre>
<p>相关资料参考:</p>
<ul>
<li>
<p>Linux overlay文件系统解析</p>
</li>
<li>
<p>linux透明防火墙--br_netfilter</p>
</li>
</ul>
<p>配置下面的网络参数:</p>
<pre><code>sudo tee /etc/sysctl.d/kubernetes.conf &lt;&lt;EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
</code></pre>
<p>运行下面的command使改动生效:</p>
<pre><code>sudo sysctl --system
</code></pre>
<h2 id="3-安装containerd">3. 安装containerd</h2>
<p>Docker,Kubernetes 等工具来运行一个容器时会调用组件(CRI)比如 containerd,CRI-O来来完成容器的创建、运行、销毁等实际工作。Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 containerd,CRI-O等,这些组件都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行。</p>
<p>他们之间的相互关系如下:</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223351_45230.jpg"></p>
<p>具体安装步骤如下:</p>
<ul>
<li>安装dependencies:</li>
</ul>
<pre><code>sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
</code></pre>
<ul>
<li>添加docker repo:</li>
</ul>
<pre><code>sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
</code></pre>
<ul>
<li>安装containerd</li>
</ul>
<pre><code>sudo apt update
sudo apt install -y containerd.io
</code></pre>
<ul>
<li>配置containerd使用systemd作为cgroup</li>
</ul>
<pre><code>containerd config default | sudo tee /etc/containerd/config.toml &gt;/dev/null 2&gt;&amp;1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
</code></pre>
<ul>
<li>重启并设置开机自启</li>
</ul>
<pre><code>sudo systemctl restart containerd
sudo systemctl enable containerd
</code></pre>
<h2 id="4-安装kubernetes组件">4. 安装Kubernetes组件</h2>
<h3 id="添加apt-repo">添加apt repo</h3>
<pre><code>curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
</code></pre>
<h3 id="安装kubectl-kubeadm--kubelet">安装Kubectl, kubeadm &amp; kubelet</h3>
<pre><code>sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
</code></pre>
<blockquote>
<p>apt-mark 用于将软件包标记/取消标记为自动安装。 hold 选项用于将软件包标记为保留,以防止软件包被自动安装、升级或删除。这里主要是为了防止kubelet等组件自动升级。</p>
</blockquote>
<h2 id="5-初始化master节点">5. 初始化Master节点</h2>
<p>这步需要在Master节点进行设置,运行如下的节点初始化整个k8s集群。</p>
<pre><code>sudo kubeadm init --control-plane-endpoint=192.168.31.200
</code></pre>
<p>当看到如下的输出时,说明系统master节点初始化完成。</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223351_443a3.jpg"></p>
<p>接着按照提示信息,进行后续的初始化工作:</p>
<pre><code>mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
</code></pre>
<p>完成上面的工作之后,可以尝试运行下面的command来查看当前集群的状态:</p>
<pre><code>kubectl cluster-info
kubectl get nodes
</code></pre>
<p>输入类似如下</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223352_05198.jpg"></p>
<h2 id="6-加入node节点">6. 加入Node节点</h2>
<p>在master节点的初始化输出的最下面,会列出node节点加入的command,直接copy然后到每个node节点运行即可。下面是个例子,得换成实际的command,</p>
<pre><code>sudo kubeadm join 192.168.31.200:6443 --token mjy0xx.95lsse7r7fw5sb00
--discovery-token-ca-cert-hash sha256:73b92db9baf19a3e14d679e6d44b5c7a804902d6ffa3d170858d2ccfd5e0c93f
</code></pre>
<p>加入成功之后,可以查看当前集群的node状态,此时由于没有安装网络相关插件,所有节点出于NotReady的状态。下一步会进行安装。</p>
<pre><code>kubectl get nodes
</code></pre>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223352_23b6e.jpg"></p>
<h2 id="7-配置集群网络">7. 配置集群网络</h2>
<p>一般可以安装Calico、Flannel和Weave-net等插件,下面以Calico为例进行操作。</p>
<pre><code>curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml
</code></pre>
<p>输出结果大概如下:</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223352_52ad9.jpg"></p>
<p>此时可以查看系统namespace下的所有基础组件的运行情况,</p>
<pre><code>kubectl get pods -n kube-system
</code></pre>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223352_cc71e.jpg"></p>
<p>接下来检查节点状态:</p>
<pre><code>kubectl get nodes
</code></pre>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223353_b15b5.jpg"></p>
<p>至此,整个k8s集群搭建完毕, 下面可以进行一些基本测试。</p>
<h2 id="8-测试k8s集群">8. 测试K8s集群</h2>
<p>这里部署了一个nginx的app来进行测试,</p>
<pre><code>kubectl create deployment nginx-app --image=nginx --replicas=2
</code></pre>
<p>查看nginx的状态:</p>
<pre><code>kubectl get deployment nginx-app
</code></pre>
<p>将deployment暴露出去,采用NodePort的方式(这种方式会在每个节点上开放同一个端口,外部可以通过节点ip+port的方式进行访问)</p>
<pre><code>kubectl expose deployment nginx-app --type=NodePort --port=80
</code></pre>
<p>可以检查service的状态,</p>
<pre><code>kubectl get svc nginx-app
kubectl describe svc nginx-app
</code></pre>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223353_fc58b.jpg"></p>
<p>下面是测试结果:</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223353_2ee40.jpg"></p>
<p>说明Nginx运行正常,整个k8s节点部署成功。</p>
<hr>
<p>参考:</p>
<ul>
<li>https://www.linuxtechi.com/install-kubernetes-on-ubuntu-22-04/</li>
</ul>
<p>本文由『后端精进之路』原创,首发于博客 http://teckee.github.io/ , 转载请注明出处</p>
<p><img src="https://imgs.lfeng.tech/images/blog/20221211223354_c9e28.jpg"></p><br><br>
来源:https://www.cnblogs.com/way2backend/p/16970506.html
頁: [1]
查看完整版本: Ubuntu 22.04 搭建K8s集群