目录

一、前言

二、简单介绍

二、服务器环境准备

三、k8s基础环境配置(所有节点)

Step1:修改主机名、配置hots

Step2:时间同步

Step3:关闭swap

Step4:禁用SELinux

Step5:关闭防火墙/开放必要端口

Step6:修改Linux的内核参数

Step7:配置ipvs功能(可选)

Step8:安装Docker并配置cgroup

Step9:安装cri-docker并配置

四、k8s安装与初始化

五、网络插件安装

六、kuboard安装


一、前言

由于之前对云原生的学习了解只到Docker那块,但是实际工作中有很多公司其实已经用到了k8s这块了。加上自己平常浏览的博客论坛对这方面的知识介绍也很多了,这个玩意在我看来也差不多相当于容器化学习的进阶版了吧。所以咱们在技术这块也不能永远停留在容器化层面止步不前,因此抱着学习的态度,结合自己微弱的容器化基础,尝试着照葫芦画瓢也试试搭建一个简易版k8s集群,以此深化理解,并探索其在实际应用中的无限可能。

二、简单介绍

Kubernetes这个单词来自于希腊语,含义是舵手或领航员。K8S是它的缩写,用“8”字替代了“ubernete”这8个字符。据说这是和硅谷的人起名有关系,他们有一个坏习惯,就是喜欢把一个单词首字母+跳过的字母数来进行缩写,目的是让爷爷奶奶们读不懂,比如亚马逊的Algorithms被缩写成A9,所以kubernetes缩写为k8s,意思就是k后面跳过8个字母后到s,就变成了k8s。

和Docker不同,K8S的创造者,是众人皆知的行业巨头——Google。然而,K8S并不是一件全新的发明。它的前身,是Google自己捣鼓了十多年的Borg系统

K8S是2014年6月由Google公司正式公布出来并宣布开源的。

同年7月,微软、Red Hat、IBM、Docker、CoreOS、Mesosphere和Saltstack等公司,相继加入K8S。

之后的一年内,VMware、HP、Intel等公司,也陆续加入。

2015年7月,Google正式加入OpenStack基金会。与此同时,Kuberentes v1.0正式发布。

目前呢,他的最新版本也来到了1.30了。

Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。 Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。 Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。

所以呢,Kubernetes作为云原生应用的基石,相当于一个云操作系统,其重要性当然是不言而喻的了。

二、服务器环境准备

参考k8s中文文档中可得知k8s集群的基础安装环境要求如下:

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。

  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。

  • CPU 2 核心及以上。

  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。

  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。

  • 开启机器上的某些端口,比如。

  • 交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,sudo swapoff -a 将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如 /etc/fstabsystemd.swap 等配置文件中禁用交换分区。

所以咱们搭建这样的集群至少的准备两台服务器,并且配置至少2核2G。但是笔者没条件买云服务器,并且电脑配置不高,因此只能在自己电脑上通过虚拟机搭建最低配版的k8s集群了,即1-master:1-node。介于之前已经有一个Ubuntu22.04的虚拟机系统了,并且一般的参考文档上使用CentOS系统搭建k8s较多。所以本次搭建采用两个不同的Linux系统来搭建k8s集群。具体配置如下:

系统名称内存配置处理器配置硬盘网络适配模式IP地址计划节点命名
Ubuntu 22.044G4核30G桥接模式192.168.1.200master01
CentOS 7.92G2核20G桥接模式192.168.1.201node01

三、k8s基础环境配置(所有节点)

虽然目前搭建的系统不太一样,但是在基础环境的配置上大致类似,在搭建k8s集群时,这些步骤是必不可少的。基本流程如下:

  1. 修改主机名、配置hosts

  2. 时间同步

  3. 关闭swap

  4. 禁用SELinux

  5. 关闭防火墙/开放必要端口

  6. 修改Linux的内核参数(可选)

  7. 配置ipvs功能(可选)

  8. 安装Docker并配置cgroup

  9. 安装cri-docker并配置

由于这些流程中涉及的命令在Ubuntu和CentOS中差异并不大,因此这部分操作主要以Ubuntu的操作作为展示。

Step1:修改主机名、配置hots

#修改主机命名
root@young-virtual-machine:~# hostnamectl set-hostname master01
#添加hosts信息
root@young-virtual-machine:~# cat >>/etc/hosts<<EOF
> 192.168.1.200 master01
> 192.168.1.201 node01
> EOF
root@young-virtual-machine:~# hostname
master01

Step2:时间同步

root@master01:~#  apt install chrony
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
下列软件包是自动安装的并且现在不需要了:
  libwpe-1.0-1 libwpebackend-fdo-1.0-1
使用'apt autoremove'来卸载它(它们)。
下列软件包将被【卸载】:
  systemd-timesyncd
下列【新】软件包将被安装:
  chrony
升级了 0 个软件包,新安装了 1 个软件包,要卸载 1 个软件包,有 67 个软件包未被升级。
需要下载 290 kB 的归档。
解压缩后会消耗 360 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.aliyun.com/ubuntu jammy/main amd64 chrony amd64 4.2-2ubuntu2 [290 kB]
已下载 290 kB,耗时 1秒 (202 kB/s)
(正在读取数据库 ... 系统当前共安装有 211705 个文件和目录。)
正在卸载 systemd-timesyncd (249.11-0ubuntu3.12) ...

进度:[  0%] [..........................................................................................................................................................................] 
进度:[ 14%] [########################..................................................................................................................................................] 
正在选中未选择的软件包 chrony。###############################..........................................................................................................................] 
(正在读取数据库 ... 系统当前共安装有 211691 个文件和目录。)
准备解压 .../chrony_4.2-2ubuntu2_amd64.deb  ...

正在解压 chrony (4.2-2ubuntu2) ...####################################################..................................................................................................] 

正在设置 chrony (4.2-2ubuntu2) ...#############################################################################.........................................................................] 

进度:[ 71%] [#########################################################################################################################.................................................] 
Creating config file /etc/chrony/chrony.conf with new version

Creating config file /etc/chrony/chrony.keys with new version
dpkg-statoverride: 警告: --update 已指定但 /var/log/chrony 不存在
Created symlink /etc/systemd/system/chronyd.service → /lib/systemd/system/chrony.service.
Created symlink /etc/systemd/system/multi-user.target.wants/chrony.service → /lib/systemd/system/chrony.service.

正在处理用于 dbus (1.12.20-2ubuntu4.1) 的触发器 ...############################################################################################################.........................] 
正在处理用于 man-db (2.10.2-1) 的触发器 ...
root@master01:~# systemctl start chronyd
root@master01:~# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^- prod-ntp-4.ntp4.ps5.cano>     2   6   277    12  +7917us[+7917us] +/-  123ms
^- alphyn.canonical.com          2   6   377    12    -23ms[  -23ms] +/-  152ms
^- prod-ntp-3.ntp1.ps5.cano>     2   6   377    12    +13ms[  +13ms] +/-  121ms
^? prod-ntp-5.ntp1.ps5.cano>     0   8     0     -     +0ns[   +0ns] +/-    0ns
^+ 111.230.189.174               2   6   277    11  +1185us[+1185us] +/-   48ms
^- ntp5.flashdance.cx            2   6   377    13    +23ms[  +23ms] +/-  159ms
^* dns1.synet.edu.cn             1   6   377    16  -4901us[-4511us] +/-   22ms
^+ time.neu.edu.cn               1   6   277    13  -2529us[-2529us] +/-   20ms

对应的CentOS系统可以用yum安装即可,这里不重复演示。

Step3:关闭swap

root@master01:~# free -h
               total        used        free      shared  buff/cache   available
内存:      3.8Gi       1.6Gi       352Mi        22Mi       1.8Gi       1.9Gi
交换:      2.1Gi       1.0Mi       2.1Gi
#临时关闭
root@master01:~# swapoff -a
root@master01:~# free -h
               total        used        free      shared  buff/cache   available
内存:      3.8Gi       1.6Gi       366Mi        22Mi       1.8Gi       1.9Gi
交换:         0B          0B          0B

可以通过free -h查看交换分区情况,如果不是都为0的话就代表这开启状态,需要进行关闭。如果需要永久关闭可以在/etc/fstab上注释掉swap分区信息那一行即可。也可以通过命令修改,不过需要重启后生效:

#永久关闭
root@master01:~# sed -ri 's/.*swap.*/#&/' /etc/fstab
root@master01:~# cat /etc/fstab 
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda3 during installation
UUID=04d12df4-f504-449e-9468-23bc9a82dd6c /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda2 during installation
UUID=9445-6E2C  /boot/efi       vfat    umask=0077      0       1
#/swapfile                                 none            swap    sw              0       0

Step4:禁用SELinux

但是这一步其实在Ubuntu22.04系统上是不需要的。因为在Ubuntu 22.04中,默认情况下并没有启用SELinux(Security-Enhanced Linux),因为Ubuntu使用的是AppArmor作为其默认的安全模块。所以如果搭建系统采用的是Ubuntu22.04可以略过该步骤。如果使用CentOS的小伙伴可能需要配置一下:

#临时关闭
[root@node01 ~]# setenforce 0
#永久关闭,重启生效
[root@node01 ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

Step5:关闭防火墙/开放必要端口

像云服务器那一类的防火墙默认应该都是关闭的,所以只需要在对应的安全组策略上开放必要的端口就行了。但是对于我们这种虚拟机,可以考虑直接关闭防火墙,或者开放部分k8s需要用到的通信端口都行。

一般考虑到k8s的组件情况,需要放行的端口如下:

协议方向端口范围目的使用者
TCP入站6443Kubernetes API 服务器所有
TCP入站2379-2380etcd 服务器客户端 APIkube-apiserver、etcd
TCP入站10250kubelet API自身、控制面
TCP入站10259kube-scheduler自身
TCP入站10257kube-controller-manager自身
TCP入站10250kubelet API自身、控制面
TCP入站10256kube-proxy自身、负载均衡器
TCP入站30000-32767NodePort Services†所有

这里笔者以Ubuntu放行端口为例进行操作:

root@master01:~# ufw allow 6443/tcp
规则已添加
规则已添加 (v6)
root@master01:~# ufw allow 2379:2380/tcp
规则已添加
规则已添加 (v6)
root@master01:~# ufw allow 10250:10259/tcp
规则已添加
规则已添加 (v6)
root@master01:~# ufw allow 30000:32727/tcp
规则已添加
规则已添加 (v6)
root@master01:~# ufw reload
已经重新载入防火墙

CentOS系统如果需要直接关闭防火墙就执行下列命令即可:

[root@node01 ~]# systemctl stop firewalld
[root@node01 ~]# systemctl disable firewalld

Step6:修改Linux的内核参数

修改Linux的内核参数主要是以添加网桥过滤和转发功能为主,主要是为了确保容器网络的正常运行和安全性。具体来说,这些配置的作用包括:

  1. 网桥过滤(Netfilter):通过配置net.bridge.bridge-nf-call-iptablesnet.bridge.bridge-nf-call-ip6tables参数,可以让Linux内核在处理桥接网络流量时调用iptables规则。这有助于确保Kubernetes的网络策略(如NetworkPolicy)能够正确应用,从而提高容器网络的安全性。

  2. IP转发(IP Forwarding):通过配置net.ipv4.ip_forward参数,可以启用IP转发功能,使得Linux内核能够转发不同网络接口之间的IP数据包。这对于Kubernetes集群中Pod之间的通信至关重要,因为Pod可能分布在不同的网络接口上。

虽然这些配置不是严格意义上的“必须”,但它们对于Kubernetes集群的正常运行和安全性是非常重要的。如果不进行这些配置,可能会导致以下问题:

  • 网络策略无法生效:如果没有配置网桥过滤,Kubernetes的NetworkPolicy可能无法正确应用,从而导致安全漏洞。

  • Pod间通信问题:如果没有启用IP转发,Pod之间的通信可能会受到影响,导致网络连接问题。

所以这部分内容,小伙伴可根据系统情况自行选择即可:

root@master01:~# cat > /etc/sysctl.d/k8s.conf <<EOF
> net.bridge.bridge-nf-call-iptables  = 1
> net.bridge.bridge-nf-call-ip6tables = 1
> net.ipv4.ip_forward                 = 1
> EOF
root@master01:~# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
> br_netfilter
> EOF
br_netfilter
#显式加载br_netfilter模块
root@master01:~# modprobe br_netfilter
#查看
root@master01:~# lsmod | grep br_netfilter
br_netfilter           32768  0
bridge                413696  1 br_netfilter
#应用生效
root@master01:~# sysctl --system

Step7:配置ipvs功能(可选)

在Kubernetes集群中配置IPVS(IP Virtual Server)可以提高集群的网络性能和负载均衡能力。IPVS是Linux内核的一部分,提供了高效的负载均衡算法。虽然IPVS不是搭建Kubernetes集群的必须配置,但它可以显著提升网络性能,特别是在大规模集群中。所以部分也是可选配置项。但是在Ubuntu和CentOS中的配置并不一样。

Ubuntu配置方式如下:

root@master01:~# apt install -y ipvsadm ipset
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
下列软件包是自动安装的并且现在不需要了:
  libwpe-1.0-1 libwpebackend-fdo-1.0-1
使用'apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
  libipset13
建议安装:
  heartbeat keepalived ldirectord
下列【新】软件包将被安装:
  ipset ipvsadm libipset13
升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 67 个软件包未被升级。
需要下载 138 kB 的归档。
解压缩后会消耗 528 kB 的额外空间。
获取:1 http://mirrors.aliyun.com/ubuntu jammy/main amd64 libipset13 amd64 7.15-1build1 [63.4 kB]
获取:2 http://mirrors.aliyun.com/ubuntu jammy/main amd64 ipset amd64 7.15-1build1 [32.8 kB]
获取:3 http://mirrors.aliyun.com/ubuntu jammy/main amd64 ipvsadm amd64 1:1.31-1build2 [42.2 kB]
已下载 138 kB,耗时 2秒 (89.1 kB/s)
正在选中未选择的软件包 libipset13:amd64。
(正在读取数据库 ... 系统当前共安装有 211742 个文件和目录。)
准备解压 .../libipset13_7.15-1build1_amd64.deb  ...

进度:[  0%] [.............................................................................................................] 
正在解压 libipset13:amd64 (7.15-1build1) ..................................................................................] 

正在选中未选择的软件包 ipset。.............................................................................................] 
准备解压 .../ipset_7.15-1build1_amd64.deb  ...

正在解压 ipset (7.15-1build1) ...######....................................................................................] 

正在选中未选择的软件包 ipvsadm。###############............................................................................] 
准备解压 .../ipvsadm_1%3a1.31-1build2_amd64.deb  ...

正在解压 ipvsadm (1:1.31-1build2) ...##################....................................................................] 

正在设置 ipvsadm (1:1.31-1build2) ...###########################...........................................................] 

进度:[ 54%] [##########################################################...................................................] 
正在设置 libipset13:amd64 (7.15-1build1) ...#####################################..........................................] 

进度:[ 69%] [###########################################################################..................................] 
正在设置 ipset (7.15-1build1) ...################################################################..........................] 

进度:[ 85%] [############################################################################################.................] 
正在处理用于 man-db (2.10.2-1) 的触发器 ...#######################################################################.........] 
正在处理用于 libc-bin (2.35-0ubuntu3.8) 的触发器 ...
root@master01:~# cat >>/etc/modules<<EOF
> ip_vs
> ip_vs_rr
> ip_vs_wrr
> ip_vs_sh
> nf_conntrack
> EOF
#使用modprobe命令手动加载这些模块
root@master01:~#modprobe ip_vs
root@master01:~# modprobe ip_vs_rr
root@master01:~# modprobe ip_vs_wrr
root@master01:~# modprobe ip_vs_sh
root@master01:~# modprobe nf_conntrack

CentOS配置方式如下:

首先同样需要安装ipset和ipvsadm:

[root@node01 ~]# yum install -y ipset ipvsadm
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                                                                                                    | 3.6 kB  00:00:00     
extras                                                                                                  | 2.9 kB  00:00:00     
updates                                                                                                 | 2.9 kB  00:00:00     
软件包 ipset-7.1-1.el7.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 ipvsadm.x86_64.0.1.27-8.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

===============================================================================================================================
 Package                       架构                         版本                              源                          大小
===============================================================================================================================
正在安装:
 ipvsadm                       x86_64                       1.27-8.el7                        base                        45 k

事务概要
===============================================================================================================================
安装  1 软件包

总下载量:45 k
安装大小:75 k
Downloading packages:
ipvsadm-1.27-8.el7.x86_64.rpm                                                                           |  45 kB  00:00:05     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : ipvsadm-1.27-8.el7.x86_64                                                                                  1/1 
  验证中      : ipvsadm-1.27-8.el7.x86_64                                                                                  1/1 

已安装:
  ipvsadm.x86_64 0:1.27-8.el7                                                                                                  

完毕!

然后添加脚本模块文件并授权执行查看添加情况:

[root@node01 ~]# cat >/etc/sysconfig/modules/ipvs.modules<<EOF
> #!/bin/bash
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack_ipv4
> EOF
[root@node01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4      19149  7 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack          143411  8 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack

Step8:安装Docker并配置cgroup

Ubuntu这块就不具体演示了,之前有写过一个一键安装Docker脚本,可直接使用:

#!/bin/bash

#删除旧版本docker
apt-get remove docker docker-engine docker.io containerd runc
#更新软件包
sudo apt update sudo apt upgrade
#安装docker依赖
apt-get install ca-certificates curl gnupg lsb-release
#添加docker官方密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#添加docker软件源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#安装docker
apt-get install docker-ce docker-ce-cli containerd.io
#配置用户组
sudo usermod -aG docker $USER
#设置docker自启
systemctl enable --now docker
#安装工具
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
#重启docker
systemctl restart docker
#安装docker命令使用tab补全
apt-get install -y bash-completion
source /usr/share/bash-completion/completions/docker
source /usr/share/bash-completion/bash_completion
#验证docker是否安装成功
docker -v

#配置阿里云镜像、日志限制、存储驱动
cat > /etc/docker/daemon.json <<EOF
>{
> "exec-opts": ["native.cgroupdriver=systemd"],
> "registry-mirrors": ["https://hjvrgh7a.mirror.aliyuncs.com"],
> "log-driver": "json-file",
> "log-opts": {
> "max-size": "100m"
> },
> "storage-driver": "overlay2"
>}
>EOF

最后的daemon.json配置是必须的,其中cgroup、镜像源和存储引擎是几个相对较为重要的配置。

CentOS可参照下列方式安装Docker:

#配置yum源
[root@node01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装yum-config-manager配置工具
[root@node01 ~]# yum -y install yum-utils
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
软件包 yum-utils-1.1.31-54.el7_8.noarch 已安装并且是最新版本
无须任何处理
#配置yum源
[root@node01 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
#安装Docker
[root@node01 ~]# yum install -y docker-ce
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
docker-ce-stable                                                                                        | 3.5 kB  00:00:00     
(1/2): docker-ce-stable/7/x86_64/updateinfo                                                             |   55 B  00:00:05     
(2/2): docker-ce-stable/7/x86_64/primary_db                                                             | 152 kB  00:00:06     
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker-ce.x86_64.3.26.1.4-1.el7 将被 安装
--> 正在处理依赖关系 container-selinux >= 2:2.74,它被软件包 3:docker-ce-26.1.4-1.el7.x86_64 需要
--> 正在处理依赖关系 containerd.io >= 1.6.24,它被软件包 3:docker-ce-26.1.4-1.el7.x86_64 需要
--> 正在处理依赖关系 docker-ce-cli,它被软件包 3:docker-ce-26.1.4-1.el7.x86_64 需要
--> 正在处理依赖关系 docker-ce-rootless-extras,它被软件包 3:docker-ce-26.1.4-1.el7.x86_64 需要
--> 正在检查事务
---> 软件包 container-selinux.noarch.2.2.119.2-1.911c772.el7_8 将被 安装
---> 软件包 containerd.io.x86_64.0.1.6.33-3.1.el7 将被 安装
---> 软件包 docker-ce-cli.x86_64.1.26.1.4-1.el7 将被 安装
--> 正在处理依赖关系 docker-buildx-plugin,它被软件包 1:docker-ce-cli-26.1.4-1.el7.x86_64 需要
--> 正在处理依赖关系 docker-compose-plugin,它被软件包 1:docker-ce-cli-26.1.4-1.el7.x86_64 需要
---> 软件包 docker-ce-rootless-extras.x86_64.0.26.1.4-1.el7 将被 安装
--> 正在处理依赖关系 fuse-overlayfs >= 0.7,它被软件包 docker-ce-rootless-extras-26.1.4-1.el7.x86_64 需要
--> 正在处理依赖关系 slirp4netns >= 0.4,它被软件包 docker-ce-rootless-extras-26.1.4-1.el7.x86_64 需要
--> 正在检查事务
---> 软件包 docker-buildx-plugin.x86_64.0.0.14.1-1.el7 将被 安装
---> 软件包 docker-compose-plugin.x86_64.0.2.27.1-1.el7 将被 安装
---> 软件包 fuse-overlayfs.x86_64.0.0.7.2-6.el7_8 将被 安装
--> 正在处理依赖关系 libfuse3.so.3(FUSE_3.2)(64bit),它被软件包 fuse-overlayfs-0.7.2-6.el7_8.x86_64 需要
--> 正在处理依赖关系 libfuse3.so.3(FUSE_3.0)(64bit),它被软件包 fuse-overlayfs-0.7.2-6.el7_8.x86_64 需要
--> 正在处理依赖关系 libfuse3.so.3()(64bit),它被软件包 fuse-overlayfs-0.7.2-6.el7_8.x86_64 需要
---> 软件包 slirp4netns.x86_64.0.0.4.3-4.el7_8 将被 安装
--> 正在检查事务
---> 软件包 fuse3-libs.x86_64.0.3.6.1-4.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

===============================================================================================================================
 Package                              架构              版本                                 源                           大小
===============================================================================================================================
正在安装:
 docker-ce                            x86_64            3:26.1.4-1.el7                       docker-ce-stable             27 M
为依赖而安装:
 container-selinux                    noarch            2:2.119.2-1.911c772.el7_8            extras                       40 k
 containerd.io                        x86_64            1.6.33-3.1.el7                       docker-ce-stable             35 M
 docker-buildx-plugin                 x86_64            0.14.1-1.el7                         docker-ce-stable             14 M
 docker-ce-cli                        x86_64            1:26.1.4-1.el7                       docker-ce-stable             15 M
 docker-ce-rootless-extras            x86_64            26.1.4-1.el7                         docker-ce-stable            9.4 M
 docker-compose-plugin                x86_64            2.27.1-1.el7                         docker-ce-stable             13 M
 fuse-overlayfs                       x86_64            0.7.2-6.el7_8                        extras                       54 k
 fuse3-libs                           x86_64            3.6.1-4.el7                          extras                       82 k
 slirp4netns                          x86_64            0.4.3-4.el7_8                        extras                       81 k

事务概要
===============================================================================================================================
安装  1 软件包 (+9 依赖软件包)

总下载量:114 M
安装大小:401 M
Downloading packages:
(1/10): container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm                                            |  40 kB  00:00:05     
warning: /var/cache/yum/x86_64/7/docker-ce-stable/packages/docker-buildx-plugin-0.14.1-1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY
docker-buildx-plugin-0.14.1-1.el7.x86_64.rpm 的公钥尚未安装
(2/10): docker-buildx-plugin-0.14.1-1.el7.x86_64.rpm                                                    |  14 MB  00:01:24     
(3/10): containerd.io-1.6.33-3.1.el7.x86_64.rpm                                                         |  35 MB  00:03:27     
(4/10): docker-ce-26.1.4-1.el7.x86_64.rpm                                                               |  27 MB  00:02:38     
(5/10): docker-ce-cli-26.1.4-1.el7.x86_64.rpm                                                           |  15 MB  00:01:27     
(6/10): docker-ce-rootless-extras-26.1.4-1.el7.x86_64.rpm                                               | 9.4 MB  00:00:53     
(7/10): fuse-overlayfs-0.7.2-6.el7_8.x86_64.rpm                                                         |  54 kB  00:00:05     
(8/10): fuse3-libs-3.6.1-4.el7.x86_64.rpm                                                               |  82 kB  00:00:06     
(9/10): slirp4netns-0.4.3-4.el7_8.x86_64.rpm                                                            |  81 kB  00:00:00     
(10/10): docker-compose-plugin-2.27.1-1.el7.x86_64.rpm                                                  |  13 MB  00:01:16     
-------------------------------------------------------------------------------------------------------------------------------
总计                                                                                           314 kB/s | 114 MB  00:06:11     
从 https://mirrors.aliyun.com/docker-ce/linux/centos/gpg 检索密钥
导入 GPG key 0x621E9F35:
 用户ID     : "Docker Release (CE rpm) <docker@docker.com>"
 指纹       : 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
 来自       : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch                                                        1/10 
  正在安装    : containerd.io-1.6.33-3.1.el7.x86_64                                                                       2/10 
  正在安装    : docker-buildx-plugin-0.14.1-1.el7.x86_64                                                                  3/10 
  正在安装    : slirp4netns-0.4.3-4.el7_8.x86_64                                                                          4/10 
  正在安装    : fuse3-libs-3.6.1-4.el7.x86_64                                                                             5/10 
  正在安装    : fuse-overlayfs-0.7.2-6.el7_8.x86_64                                                                       6/10 
  正在安装    : docker-compose-plugin-2.27.1-1.el7.x86_64                                                                 7/10 
  正在安装    : 1:docker-ce-cli-26.1.4-1.el7.x86_64                                                                       8/10 
  正在安装    : docker-ce-rootless-extras-26.1.4-1.el7.x86_64                                                             9/10 
  正在安装    : 3:docker-ce-26.1.4-1.el7.x86_64                                                                          10/10 
  验证中      : docker-compose-plugin-2.27.1-1.el7.x86_64                                                                 1/10 
  验证中      : fuse3-libs-3.6.1-4.el7.x86_64                                                                             2/10 
  验证中      : fuse-overlayfs-0.7.2-6.el7_8.x86_64                                                                       3/10 
  验证中      : slirp4netns-0.4.3-4.el7_8.x86_64                                                                          4/10 
  验证中      : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch                                                        5/10 
  验证中      : containerd.io-1.6.33-3.1.el7.x86_64                                                                       6/10 
  验证中      : 3:docker-ce-26.1.4-1.el7.x86_64                                                                           7/10 
  验证中      : 1:docker-ce-cli-26.1.4-1.el7.x86_64                                                                       8/10 
  验证中      : docker-ce-rootless-extras-26.1.4-1.el7.x86_64                                                             9/10 
  验证中      : docker-buildx-plugin-0.14.1-1.el7.x86_64                                                                 10/10 

已安装:
  docker-ce.x86_64 3:26.1.4-1.el7                                                                                              

作为依赖被安装:
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8                containerd.io.x86_64 0:1.6.33-3.1.el7                     
  docker-buildx-plugin.x86_64 0:0.14.1-1.el7                        docker-ce-cli.x86_64 1:26.1.4-1.el7                       
  docker-ce-rootless-extras.x86_64 0:26.1.4-1.el7                   docker-compose-plugin.x86_64 0:2.27.1-1.el7               
  fuse-overlayfs.x86_64 0:0.7.2-6.el7_8                             fuse3-libs.x86_64 0:3.6.1-4.el7                           
  slirp4netns.x86_64 0:0.4.3-4.el7_8                               

完毕!
[root@node01 ~]# systemctl start docker && systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

然后跟上面一样设置一下daemon.json配置重启doceker即可。

Step9:安装cri-docker并配置

在Kubernetes早起的时候,Kubernetes为了支持Docker,通过硬编码的方式直接调用Docker API。后面随着Docker的不断发展以及Google的主导,出现了更多容器运行时可以使用,Kubernetes为了支持更多精简的容器运行时,google就和redhat主导推出了OCI标准,用于将Kubernetes平台和特定的容器运行时解耦。

而cri-docker就是是一个支持CRI标准的shim(垫片)。一头通过CRl跟kubelet交互,另一头跟docker api交互,从而间接的实现了kubemetes以docker作为容器运行时。但是这种架构缺点也很明显,调用链更长,效率更低。

由于从kubernetes 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持kubemetes主推的CRI(容器运行时接口)标准,所以docker不能再作为kubernetes的容器运行时了,即从kubernetesv1.24开始不再使用docker了。但是如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。因此如果我们使用Docker作为k8s的容器工具的话还需要安装cri-docker。

可以在cri-docker下载地址直接进行下载对应系统的安装包即可,如果有访问问题导致不可下载的小伙伴可在笔者资源自取。

CentOS安装流程如下:

#解压
[root@node01 cri-dockerd-file]# tar -zxf cri-dockerd-0.3.15.amd64.tgz 
#将cri-dockerd二进制包移动到/usr/local/bin目录
[root@node01 cri-dockerd-file]# cp -ap cri-dockerd/cri-dockerd /usr/local/bin
#为 cri-dockerd 配置 systemd 单元
[root@node01 cri-dockerd-file]# wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
[root@node01 cri-dockerd-file]# wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
[root@node01 cri-dockerd-file]# mv cri-docker.socket cri-docker.service /etc/systemd/system/
#修改cri-dockerd的实际地址
[root@node01 cri-dockerd-file]# sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
[root@node01 cri-dockerd-file]# vi /etc/systemd/system/cri-docker.service
#修改服务执行信息,指定网络插件,更改国内pause镜像
[root@node01 cri-dockerd-file]# cat /etc/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
[root@node01 cri-dockerd-file]# systemctl daemon-reload
[root@node01 cri-dockerd-file]# systemctl start cri-docker && systemctl enable cri-docker --now
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /etc/systemd/system/cri-docker.service.
[root@node01 cri-dockerd-file]# systemctl status cri-docker
● cri-docker.service - CRI Interface for Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/cri-docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2024-08-14 18:16:12 CST; 11s ago
     Docs: https://docs.mirantis.com
 Main PID: 71653 (cri-dockerd)
    Tasks: 8
   Memory: 8.6M
   CGroup: /system.slice/cri-docker.service
           └─71653 /usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_co...

8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="Hairpin mode is set to none"
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="The binary conntrack is not...anup."
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="The binary conntrack is not...anup."
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="Loaded network plugin cni"
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="Docker cri networking manag...n cni"
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="Setting cgroupDriver systemd"
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="Docker cri received runtime...:,},}"
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="Starting the GRPC backend f...face."
8月 14 18:16:12 node01 cri-dockerd[71653]: time="2024-08-14T18:16:12+08:00" level=info msg="Start cri-dockerd grpc backend"
8月 14 18:16:12 node01 systemd[1]: Started CRI Interface for Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.

Ubuntu就更简单了,直接安装对应的安装包后修改一下服务文件即可,它上面会自动安装:

root@master01:/opt/cri-docker-file# ll
总计 10860
drwxr-xr-x 2 root root     4096  8月 14 18:42 ./
drwxr-xr-x 6 root root     4096  8月 14 18:42 ../
-rw-r--r-- 1 root root 11109732  8月 14 18:43 cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb
root@master01:/opt/cri-docker-file# apt install ./cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
注意,选中 'cri-dockerd' 而非 './cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb'
下列软件包是自动安装的并且现在不需要了:
  libwpe-1.0-1 libwpebackend-fdo-1.0-1
使用'apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
  cgroupfs-mount
推荐安装:
  aufs-tools
下列【新】软件包将被安装:
  cgroupfs-mount cri-dockerd
升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 67 个软件包未被升级。
需要下载 6,320 B/11.1 MB 的归档。
解压缩后会消耗 48.2 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 /opt/cri-docker-file/cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb cri-dockerd amd64 0:0.3.15~3-0~ubuntu-jammy [11.1 MB]
获取:2 http://mirrors.aliyun.com/ubuntu jammy/universe amd64 cgroupfs-mount all 1.4 [6,320 B]
已下载 6,320 B,耗时 0秒 (15.4 kB/s)       
正在选中未选择的软件包 cgroupfs-mount。
(正在读取数据库 ... 系统当前共安装有 217548 个文件和目录。)
准备解压 .../cgroupfs-mount_1.4_all.deb  ...

进度:[  0%] [...............................................................................................................] 
正在解压 cgroupfs-mount (1.4) ...............................................................................................] 

正在选中未选择的软件包 cri-dockerd。##.......................................................................................] 
准备解压 .../cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb  ...

正在解压 cri-dockerd (0.3.15~3-0~ubuntu-jammy) ..............................................................................] 

正在设置 cgroupfs-mount (1.4) ...##############################..............................................................] 

进度:[ 56%] [#############################################################..................................................] 
正在设置 cri-dockerd (0.3.15~3-0~ubuntu-jammy) ...#####################################......................................] 

Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /lib/systemd/system/cri-docker.service......] 
Created symlink /etc/systemd/system/sockets.target.wants/cri-docker.socket → /lib/systemd/system/cri-docker.socket.

正在处理用于 man-db (2.10.2-1) 的触发器 ...#####################################################################.............] 

四、k8s安装与初始化

一般而言k8s的安装有很多种方法,比如使用 Minikube、使用 K3s、使用 KubeSpray、二进制或kubeadm。其中最麻烦的就是二进制了,需要单独安装k8s的各类组件,对应用水平要求较高。最常见的应该就是kubeadm了。

kubeadm 是 Kubernetes 官方的工具,可用于快速部署和管理 Kubernetes 集群。适合用于生产环境。因此对于咱们这种初学者来说使用kubeadm是最合适的了。下面的工作主要是为k8s添加阿里云源,为kubeadm下载做准备。

Ubuntu系统操作如下:

root@master01:/etc/systemd/system# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
OK
root@master01:/etc/systemd/system# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
> deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
> EOF
root@master01:/etc/systemd/system# apt install -y kubelet kubeadm kubectl
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
下列软件包是自动安装的并且现在不需要了:
  libwpe-1.0-1 libwpebackend-fdo-1.0-1
使用'apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
  conntrack cri-tools ebtables kubernetes-cni socat
下列【新】软件包将被安装:
  conntrack cri-tools ebtables kubeadm kubectl kubelet kubernetes-cni socat
升级了 0 个软件包,新安装了 8 个软件包,要卸载 0 个软件包,有 67 个软件包未被升级。
需要下载 87.1 MB 的归档。
解压缩后会消耗 336 MB 的额外空间。
获取:1 http://mirrors.aliyun.com/ubuntu jammy/main amd64 conntrack amd64 1:1.4.6-2build2 [33.5 kB]
获取:2 http://mirrors.aliyun.com/ubuntu jammy/main amd64 ebtables amd64 2.0.11-4build2 [84.9 kB]
获取:3 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 cri-tools amd64 1.26.0-00 [18.9 MB]
获取:4 http://mirrors.aliyun.com/ubuntu jammy/main amd64 socat amd64 1.7.4.1-3ubuntu4 [349 kB]
获取:5 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubernetes-cni amd64 1.2.0-00 [27.6 MB]           
获取:6 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubelet amd64 1.28.2-00 [19.5 MB]                 
获取:7 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubectl amd64 1.28.2-00 [10.3 MB]                 
获取:8 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubeadm amd64 1.28.2-00 [10.3 MB]                 
已下载 87.1 MB,耗时 1分 26秒 (1,011 kB/s)                                                                                      
正在选中未选择的软件包 conntrack。
(正在读取数据库 ... 系统当前共安装有 217563 个文件和目录。)
准备解压 .../0-conntrack_1%3a1.4.6-2build2_amd64.deb  ...

进度:[  0%] [...............................................................................................................] 
正在解压 conntrack (1:1.4.6-2build2) ........................................................................................] 

正在选中未选择的软件包 cri-tools。...........................................................................................] 
准备解压 .../1-cri-tools_1.26.0-00_amd64.deb  ...

正在解压 cri-tools (1.26.0-00) ..............................................................................................] 

正在选中未选择的软件包 ebtables。............................................................................................] 
准备解压 .../2-ebtables_2.0.11-4build2_amd64.deb  ...

正在解压 ebtables (2.0.11-4build2) ..........................................................................................] 

正在选中未选择的软件包 kubernetes-cni。......................................................................................] 
准备解压 .../3-kubernetes-cni_1.2.0-00_amd64.deb  ...

正在解压 kubernetes-cni (1.2.0-00) ..........................................................................................] 

正在选中未选择的软件包 socat。##########.....................................................................................] 
准备解压 .../4-socat_1.7.4.1-3ubuntu4_amd64.deb  ...

正在解压 socat (1.7.4.1-3ubuntu4) ...#######.................................................................................] 

正在选中未选择的软件包 kubelet。###############..............................................................................] 
准备解压 .../5-kubelet_1.28.2-00_amd64.deb  ...

正在解压 kubelet (1.28.2-00) ...##################...........................................................................] 

正在选中未选择的软件包 kubectl。######################.......................................................................] 
准备解压 .../6-kubectl_1.28.2-00_amd64.deb  ...

正在解压 kubectl (1.28.2-00) ...#########################....................................................................] 

正在选中未选择的软件包 kubeadm。#############################................................................................] 
准备解压 .../7-kubeadm_1.28.2-00_amd64.deb  ...

正在解压 kubeadm (1.28.2-00) ...################################.............................................................] 

正在设置 conntrack (1:1.4.6-2build2) ...###########################..........................................................] 

进度:[ 52%] [#########################################################......................................................] 
正在设置 kubectl (1.28.2-00) ...##########################################...................................................] 

进度:[ 58%] [###############################################################................................................] 
正在设置 ebtables (2.0.11-4build2) ...###########################################............................................] 

进度:[ 64%] [######################################################################.........................................] 
正在设置 socat (1.7.4.1-3ubuntu4) ...##################################################......................................] 

进度:[ 70%] [#############################################################################..................................] 
正在设置 cri-tools (1.26.0-00) ...############################################################...............................] 

进度:[ 76%] [####################################################################################...........................] 
正在设置 kubernetes-cni (1.2.0-00) ...###############################################################........................] 

进度:[ 82%] [##########################################################################################.....................] 
正在设置 kubelet (1.28.2-00) ...############################################################################.................] 

Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /lib/systemd/system/kubelet.service............] 

正在设置 kubeadm (1.28.2-00) ...##################################################################################...........] 

进度:[ 94%] [########################################################################################################.......] 
正在处理用于 man-db (2.10.2-1) 的触发器 ...##############################################################################....] 
root@master01:/etc/systemd/system# kubectl version
Client Version: v1.28.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?

这里再没制定版本的情况下它默认给我下载的是1.28.2版本的。然后再看看CentOS系统会咋样:

[root@node01 cri-dockerd-file]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
> enabled=1
> gpgcheck=0
> repo_gpgcheck=0
> gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
> EOF
[root@node01 cri-dockerd-file]# yum install kubelet kubeadm kubectl
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
kubernetes                                                                                                | 1.4 kB  00:00:00     
kubernetes/primary                                                                                        | 137 kB  00:00:05     
kubernetes                                                                                                             1022/1022
正在解决依赖关系
--> 正在检查事务
---> 软件包 kubeadm.x86_64.0.1.28.2-0 将被 安装
--> 正在处理依赖关系 kubernetes-cni >= 0.8.6,它被软件包 kubeadm-1.28.2-0.x86_64 需要
--> 正在处理依赖关系 cri-tools >= 1.19.0,它被软件包 kubeadm-1.28.2-0.x86_64 需要
---> 软件包 kubectl.x86_64.0.1.28.2-0 将被 安装
---> 软件包 kubelet.x86_64.0.1.28.2-0 将被 安装
--> 正在处理依赖关系 socat,它被软件包 kubelet-1.28.2-0.x86_64 需要
--> 正在处理依赖关系 conntrack,它被软件包 kubelet-1.28.2-0.x86_64 需要
--> 正在检查事务
---> 软件包 conntrack-tools.x86_64.0.1.4.4-7.el7 将被 安装
--> 正在处理依赖关系 libnetfilter_cttimeout.so.1(LIBNETFILTER_CTTIMEOUT_1.1)(64bit),它被软件包 conntrack-tools-1.4.4-7.el7.x86_64 需要
--> 正在处理依赖关系 libnetfilter_cttimeout.so.1(LIBNETFILTER_CTTIMEOUT_1.0)(64bit),它被软件包 conntrack-tools-1.4.4-7.el7.x86_64 需要
--> 正在处理依赖关系 libnetfilter_cthelper.so.0(LIBNETFILTER_CTHELPER_1.0)(64bit),它被软件包 conntrack-tools-1.4.4-7.el7.x86_64 需要
--> 正在处理依赖关系 libnetfilter_queue.so.1()(64bit),它被软件包 conntrack-tools-1.4.4-7.el7.x86_64 需要
--> 正在处理依赖关系 libnetfilter_cttimeout.so.1()(64bit),它被软件包 conntrack-tools-1.4.4-7.el7.x86_64 需要
--> 正在处理依赖关系 libnetfilter_cthelper.so.0()(64bit),它被软件包 conntrack-tools-1.4.4-7.el7.x86_64 需要
---> 软件包 cri-tools.x86_64.0.1.26.0-0 将被 安装
---> 软件包 kubernetes-cni.x86_64.0.1.2.0-0 将被 安装
---> 软件包 socat.x86_64.0.1.7.3.2-2.el7 将被 安装
--> 正在检查事务
---> 软件包 libnetfilter_cthelper.x86_64.0.1.0.0-11.el7 将被 安装
---> 软件包 libnetfilter_cttimeout.x86_64.0.1.0.0-7.el7 将被 安装
---> 软件包 libnetfilter_queue.x86_64.0.1.0.2-2.el7_2 将被 安装
--> 解决依赖关系完成

依赖关系解决

=================================================================================================================================
 Package                                架构                   版本                             源                          大小
=================================================================================================================================
正在安装:
 kubeadm                                x86_64                 1.28.2-0                         kubernetes                  11 M
 kubectl                                x86_64                 1.28.2-0                         kubernetes                  11 M
 kubelet                                x86_64                 1.28.2-0                         kubernetes                  21 M
为依赖而安装:
 conntrack-tools                        x86_64                 1.4.4-7.el7                      base                       187 k
 cri-tools                              x86_64                 1.26.0-0                         kubernetes                 8.6 M
 kubernetes-cni                         x86_64                 1.2.0-0                          kubernetes                  17 M
 libnetfilter_cthelper                  x86_64                 1.0.0-11.el7                     base                        18 k
 libnetfilter_cttimeout                 x86_64                 1.0.0-7.el7                      base                        18 k
 libnetfilter_queue                     x86_64                 1.0.2-2.el7_2                    base                        23 k
 socat                                  x86_64                 1.7.3.2-2.el7                    base                       290 k

事务概要
=================================================================================================================================
安装  3 软件包 (+7 依赖软件包)

总下载量:69 M
安装大小:292 M
Is this ok [y/d/N]: y
Downloading packages:
(1/10): conntrack-tools-1.4.4-7.el7.x86_64.rpm                                                            | 187 kB  00:00:05     
(2/10): 3f5ba2b53701ac9102ea7c7ab2ca6616a8cd5966591a77577585fde1c434ef74-cri-tools-1.26.0-0.x86_64.rpm    | 8.6 MB  00:00:12     
(3/10): cee73f8035d734e86f722f77f1bf4e7d643e78d36646fd000148deb8af98b61c-kubeadm-1.28.2-0.x86_64.rpm      |  11 MB  00:00:14     
(4/10): a24e42254b5a14b67b58c4633d29c27370c28ed6796a80c455a65acc813ff374-kubectl-1.28.2-0.x86_64.rpm      |  11 MB  00:00:08     
(5/10): libnetfilter_cthelper-1.0.0-11.el7.x86_64.rpm                                                     |  18 kB  00:00:05     
(6/10): libnetfilter_cttimeout-1.0.0-7.el7.x86_64.rpm                                                     |  18 kB  00:00:05     
(7/10): libnetfilter_queue-1.0.2-2.el7_2.x86_64.rpm                                                       |  23 kB  00:00:00     
(8/10): socat-1.7.3.2-2.el7.x86_64.rpm                                                                    | 290 kB  00:00:00     
(9/10): e1cae938e231bffa3618f5934a096bd85372ee9b1293081f5682a22fe873add8-kubelet-1.28.2-0.x86_64.rpm      |  21 MB  00:00:16     
(10/10): 0f2a2afd740d476ad77c508847bad1f559afc2425816c1f2ce4432a62dfe0b9d-kubernetes-cni-1.2.0-0.x86_64.r |  17 MB  00:00:13     
---------------------------------------------------------------------------------------------------------------------------------
总计                                                                                             2.0 MB/s |  69 MB  00:00:34     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : libnetfilter_cthelper-1.0.0-11.el7.x86_64                                                                   1/10 
  正在安装    : socat-1.7.3.2-2.el7.x86_64                                                                                  2/10 
  正在安装    : libnetfilter_cttimeout-1.0.0-7.el7.x86_64                                                                   3/10 
  正在安装    : cri-tools-1.26.0-0.x86_64                                                                                   4/10 
  正在安装    : libnetfilter_queue-1.0.2-2.el7_2.x86_64                                                                     5/10 
  正在安装    : conntrack-tools-1.4.4-7.el7.x86_64                                                                          6/10 
  正在安装    : kubernetes-cni-1.2.0-0.x86_64                                                                               7/10 
  正在安装    : kubelet-1.28.2-0.x86_64                                                                                     8/10 
  正在安装    : kubectl-1.28.2-0.x86_64                                                                                     9/10 
  正在安装    : kubeadm-1.28.2-0.x86_64                                                                                    10/10 
  验证中      : kubectl-1.28.2-0.x86_64                                                                                     1/10 
  验证中      : conntrack-tools-1.4.4-7.el7.x86_64                                                                          2/10 
  验证中      : libnetfilter_queue-1.0.2-2.el7_2.x86_64                                                                     3/10 
  验证中      : cri-tools-1.26.0-0.x86_64                                                                                   4/10 
  验证中      : kubernetes-cni-1.2.0-0.x86_64                                                                               5/10 
  验证中      : kubelet-1.28.2-0.x86_64                                                                                     6/10 
  验证中      : libnetfilter_cttimeout-1.0.0-7.el7.x86_64                                                                   7/10 
  验证中      : socat-1.7.3.2-2.el7.x86_64                                                                                  8/10 
  验证中      : libnetfilter_cthelper-1.0.0-11.el7.x86_64                                                                   9/10 
  验证中      : kubeadm-1.28.2-0.x86_64                                                                                    10/10 

已安装:
  kubeadm.x86_64 0:1.28.2-0                 kubectl.x86_64 0:1.28.2-0                 kubelet.x86_64 0:1.28.2-0                

作为依赖被安装:
  conntrack-tools.x86_64 0:1.4.4-7.el7                            cri-tools.x86_64 0:1.26.0-0                                    
  kubernetes-cni.x86_64 0:1.2.0-0                                 libnetfilter_cthelper.x86_64 0:1.0.0-11.el7                    
  libnetfilter_cttimeout.x86_64 0:1.0.0-7.el7                     libnetfilter_queue.x86_64 0:1.0.2-2.el7_2                      
  socat.x86_64 0:1.7.3.2-2.el7                                   

完毕!
[root@node01 cri-dockerd-file]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@node01 cri-dockerd-file]# kubectl version
Client Version: v1.28.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?

这里版本也是1.28.2的,但是可以发现两次查看版本信息时会出现这个问题The connection to the server localhost:8080 was refused - did you specify the right host or port?,实际上这是因为咱们没有进行初始化所以才会这样。不光如此,在未初始化完成的情况下如果我们查看服务状态systemctl status kubelet偶尔也会出现失败的情况。这些都是正常的,可以暂时不管在意,等初始化完成后均可解决。

然后咱们需要事先下载一些k8s的组件镜像,方便快速初始化。这里可以编写个脚本进行封装执行:

[root@node01 cri-dockerd-file]# vi images.sh
[root@node01 cri-dockerd-file]# cat images.sh 
#!/bin/bash
images=(
kube-apiserver:v1.28.2
kube-proxy:v1.28.2
kube-controller-manager:v1.28.2
kube-scheduler:v1.28.2
coredns:1.8.6
etcd:3.5.3-0
pause:3.7
)
for imageName in ${images[@]} ; do
docker pull registry.aliyuncs.com/google_containers/$imageName
done
[root@node01 cri-dockerd-file]# chmod +x ./images.sh && ./images.sh
[root@node01 cri-dockerd-file]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED         SIZE
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.2   cdcab12b2dd1   11 months ago   126MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.2   c120fed2beb8   11 months ago   73.1MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.2   55f13c92defb   11 months ago   122MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.2   7a5d9d67a13f   11 months ago   60.1MB
registry.aliyuncs.com/google_containers/etcd                      3.5.3-0   aebe758cef4c   2 years ago     299MB
registry.aliyuncs.com/google_containers/pause                     3.7       221177c6082a   2 years ago     711kB
registry.aliyuncs.com/google_containers/coredns                   1.8.6     a4ca41631cc7   2 years ago     46.8MB

下载完成后就可以进行master节点初始化工作了,node工作节点可以不做初始化。直接执行命令即可,注意指定一些必要的相关参数。

root@master01:/opt/cri-docker-file# kubeadm init \
> --apiserver-advertise-address=192.168.1.200 \
> --image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.28.2 \
> --service-cidr=10.1.0.0/16 \
> --pod-network-cidr=10.244.0.0/16 \
> --cri-socket unix:///run/cri-dockerd.sock
[init] Using Kubernetes version: v1.28.2
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master01] and IPs [10.1.0.1 192.168.1.200]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost master01] and IPs [192.168.1.200 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost master01] and IPs [192.168.1.200 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 7.004939 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node master01 as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node master01 as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: uuyk4n.4uynbpkq9o4zmb4k
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.200:6443 --token uuyk4n.4uynbpkq9o4zmb4k \
        --discovery-token-ca-cert-hash sha256:03b3151a71f597b541144e5b6a299ca9b49a9128594acd3066d4d75eaae61204 

这几个信息配置完基本是一步过,如果少了其中一两个可能会出现错误。下面对init初始化的一些参数简单说明一下:

  • –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers

  • –kubernetes-version string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.28.2)来跳过网络请求。

  • –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。

  • –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。不知道的参照官网使用默认的就行。

  • service-cidr 主要用于设置 Kubernetes 服务的 IP 地址范围。这些 IP 地址用于集群中的服务(Service),允许在同一集群内的 Pods 使用这些服务 IP 地址进行通信。每当我们创建一个新的服务时,Kubernetes 会在此 CIDR 范围内分配一个 IP 地址,供 Pods 使用以访问该服务。它选取不能和PodCIDR及本机网络有重叠或者冲突。 默认情况下,serviceCIDR 的值通常是 10.96.0.0/12,这意味着可以使用从 10.96.0.0 开始的多个 IP 地址。一般可以选择一个本机网络和PodCIDR都没有用到的私网地址段,比如PODCIDR使用192.168.0.1/16, 那么service cidr可以选择172.16.0.1/20. 主机网段可以选10.1.0.1/8. 三者之间网络无重叠冲突即可

  • --control-plane-endpoint cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里需要先做配置hosts映射:192.168.1.200 cluster-endpoint。 那么 --control-plane-endpoint=cluster-endpoint 可以传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 我们可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。kubeadm 不支持将没有 --control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群。这个笔者这块就没做配置了,暂时没发现会影响初始化。

  • --cri-socket 指明运行时,如果不添加就得加上下面这个参数。

  • --v=5

最后我们根据上面的提示,照着配置一下环境变量即可。

root@master01:/opt/cri-docker-file# mkdir -p $HOME/.kube
root@master01:/opt/cri-docker-file# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@master01:/opt/cri-docker-file# sudo chown $(id -u):$(id -g) $HOME/.kube/config
#临时生效
root@master01:/opt/cri-docker-file# export KUBECONFIG=/etc/kubernetes/admin.conf
#永久生效
root@master01:/opt/cri-docker-file# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
root@master01:/opt/cri-docker-file# source  ~/.bash_profile

然后在工作节点node01上根据最后的提示添加进master01主节点,注意添加--cri-socket,不然会有提示。

[root@node01 cri-dockerd-file]# kubeadm join 192.168.1.200:6443 --token uuyk4n.4uynbpkq9o4zmb4k \
>         --discovery-token-ca-cert-hash sha256:03b3151a71f597b541144e5b6a299ca9b49a9128594acd3066d4d75eaae61204 
Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v=5 or higher
[root@node01 cri-dockerd-file]# kubeadm join 192.168.1.200:6443 --token uuyk4n.4uynbpkq9o4zmb4k         --discovery-token-ca-cert-hash sha256:03b3151a71f597b541144e5b6a299ca9b49a9128594acd3066d4d75eaae61204 --cri-socket unix:///run/cri-dockerd.sock
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

至此,咱们两个节点就算关联上,可以在主节点上查看一下:

root@master01:/opt/cri-docker-file# kubectl get nodes
NAME       STATUS     ROLES           AGE     VERSION
master01   NotReady   control-plane   23m     v1.28.2
node01     NotReady   <none>          3m43s   v1.28.2

如果期间节点初始化出错了我们可以通过reset进行重置,然后重新进行。

#重置
root@master01:kubeadm reset --cri-socket unix:///run/cri-dockerd.sock
#如果已经生成了其他文件,建议清理后再init
root@master01:rm -fr ~/.kube/  /etc/kubernetes/* var/lib/etcd/*

但是可以发现,虽然两个节点关联上了,但是他们的状态都是NotReady的,这里咱们看一下kubelet状态也能看到:

root@master01:/opt/cri-docker-file# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
     Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/kubelet.service.d
             └─10-kubeadm.conf
     Active: active (running) since Wed 2024-08-14 20:50:14 CST; 28min ago
       Docs: https://kubernetes.io/docs/home/
   Main PID: 98497 (kubelet)
      Tasks: 12 (limit: 4548)
     Memory: 35.7M
        CPU: 31.554s
     CGroup: /system.slice/kubelet.service
             └─98497 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes>

8月 14 21:17:40 master01 kubelet[98497]: E0814 21:17:40.927712   98497 kubelet.go:2855] "Container runtime network not ready" ne>
8月 14 21:17:45 master01 kubelet[98497]: E0814 21:17:45.930786   98497 kubelet.go:2855] "Container runtime network not ready" ne>
lines 1-15

那么咱们还必须部署一个基于 Pod 网络插件的容器网络接口 (CNI),以便后面的Pod 可以相互通信。

五、网络插件安装

这里一般有两个网络插件可以选择,一个是calico,另一个是flannel。关于区别这里就不多介绍了,主要是这两个的镜像文件都在外网,包括yml文件,都比较难下载。这里由于之前的学习中有flannel的镜像资源和文件资源所以直接拿来用了,有需要的小伙伴可在笔者资源处自行下载。

#上载后解压
root@master01:/opt/cri-docker-file# unzip flannel文件包.zip 
Archive:  flannel文件包.zip
   creating: flannel文件包/
  inflating: flannel文件包/flannel.tar  
  inflating: flannel文件包/kube-flannel.yml  
root@master01:/opt/cri-docker-file# ll
总计 39588
drwxr-xr-x 3 root root     4096  8月 14 21:33 ./
drwxr-xr-x 7 root root     4096  8月 14 19:37 ../
-rw-r--r-- 1 root root 11109732  8月 14 18:43 cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb
drwxr-xr-x 2 root root     4096  8月 11 14:40 flannel文件包/
-rw-r--r-- 1 root root 29407504  8月 14 21:33 flannel文件包.zip
-rwxr-xr-x 1 root root      260  8月 14 20:28 images.sh*
root@master01:/opt/cri-docker-file# cd flannel文件包/
root@master01:/opt/cri-docker-file/flannel文件包# ll
总计 77740
drwxr-xr-x 2 root root     4096  8月 11 14:40 ./
drwxr-xr-x 3 root root     4096  8月 14 21:33 ../
-rw-r--r-- 1 root root 79586304  8月  7 16:16 flannel.tar
-rw-r--r-- 1 root root     4306  8月  8 16:00 kube-flannel.yml
#加载flannel镜像
root@master01:/opt/cri-docker-file/flannel文件包# docker load -i flannel.tar 
f1417ff83b31: Loading layer [==================================================>]  7.338MB/7.338MB
2854afd66708: Loading layer [==================================================>]  8.333MB/8.333MB
6b145d91eb99: Loading layer [==================================================>]  12.93MB/12.93MB
42afb1b70b53: Loading layer [==================================================>]  2.809MB/2.809MB
496739bd5d73: Loading layer [==================================================>]   39.8MB/39.8MB
404121ac6a23: Loading layer [==================================================>]  5.632kB/5.632kB
14cab617b8eb: Loading layer [==================================================>]  9.728kB/9.728kB
9f6021693062: Loading layer [==================================================>]  8.704kB/8.704kB
Loaded image: flannel/flannel:v0.22.3
7df5bd7bd262: Loading layer [==================================================>]  5.904MB/5.904MB
9332f71f5f3d: Loading layer [==================================================>]  2.416MB/2.416MB
Loaded image: flannel/flannel-cni-plugin:v1.2.0

至于kube-flannel.yml文件,主要关注的地方是镜像名程。如果是在flannel官网下载的yml文件要将其中的镜像信息改为本地加载的镜像名称,这里笔者的刚好一套就可以直接用了:

root@master01:/opt/cri-docker-file/flannel文件包# cat kube-flannel.yml 
---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    k8s-app: flannel
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "EnableNFTables": false,
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
    k8s-app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: flannel/flannel-cni-plugin:v1.2.0         #镜像1
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: flannel/flannel:v0.22.3                   #镜像2
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: flannel/flannel:v0.22.3                     #镜像2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate

完成后查看节点信息:

root@master01:/opt/cri-docker-file/flannel文件包# kubectl get nodes
NAME       STATUS     ROLES           AGE   VERSION
master01   Ready      control-plane   57m   v1.28.2
node01     NotReady   <none>          38m   v1.28.2

此时可以看到主节点已经好了,但是node仍然不对。那只好看一下是不是pod中有毛病了:

root@master01:~# kubectl get pods -n kube-system -o wide
NAME                               READY   STATUS              RESTARTS      AGE   IP              NODE       NOMINATED NODE   READINESS GATES
coredns-66f779496c-dp5b7           1/1     Running             1 (71m ago)   14h   10.244.0.4      master01   <none>           <none>
coredns-66f779496c-g5gc8           1/1     Running             1 (71m ago)   14h   10.244.0.5      master01   <none>           <none>
etcd-master01                      1/1     Running             1 (71m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-apiserver-master01            1/1     Running             1 (71m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-controller-manager-master01   1/1     Running             1 (71m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-proxy-9bb5m                   0/1     ContainerCreating   0             12h   192.168.1.201   node01     <none>           <none>
kube-proxy-kjv75                   1/1     Running             1 (71m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-scheduler-master01            1/1     Running             1 (71m ago)   14h   192.168.1.200   master01   <none>           <none>

果不其然,工作节点node01中kube-proxy-9bb5m这个创建了半天容器一直没解决,所以得看看具体问题是啥。这里可以直接在master01进行查看:

root@master01:~# kubectl describe pod kube-proxy-9bb5m -n kube-system
Name:                 kube-proxy-9bb5m
Namespace:            kube-system
Priority:             2000001000
Priority Class Name:  system-node-critical
Service Account:      kube-proxy
Node:                 node01/192.168.1.201
Start Time:           Wed, 14 Aug 2024 22:13:48 +0800
Labels:               controller-revision-hash=5794bbcc88
                      k8s-app=kube-proxy
                      pod-template-generation=1
Annotations:          <none>
Status:               Pending
IP:                   192.168.1.201
IPs:
  IP:           192.168.1.201
Controlled By:  DaemonSet/kube-proxy
Containers:
  kube-proxy:
    Container ID:  
    Image:         registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
    Image ID:      
    Port:          <none>
    Host Port:     <none>
    Command:
      /usr/local/bin/kube-proxy
      --config=/var/lib/kube-proxy/config.conf
      --hostname-override=$(NODE_NAME)
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:
      NODE_NAME:   (v1:spec.nodeName)
    Mounts:
      /lib/modules from lib-modules (ro)
      /run/xtables.lock from xtables-lock (rw)
      /var/lib/kube-proxy from kube-proxy (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-fnzdg (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  kube-proxy:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      kube-proxy
    Optional:  false
  xtables-lock:
    Type:          HostPath (bare host directory volume)
    Path:          /run/xtables.lock
    HostPathType:  FileOrCreate
  lib-modules:
    Type:          HostPath (bare host directory volume)
    Path:          /lib/modules
    HostPathType:  
  kube-api-access-fnzdg:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              kubernetes.io/os=linux
Tolerations:                 op=Exists
                             node.kubernetes.io/disk-pressure:NoSchedule op=Exists
                             node.kubernetes.io/memory-pressure:NoSchedule op=Exists
                             node.kubernetes.io/network-unavailable:NoSchedule op=Exists
                             node.kubernetes.io/not-ready:NoExecute op=Exists
                             node.kubernetes.io/pid-pressure:NoSchedule op=Exists
                             node.kubernetes.io/unreachable:NoExecute op=Exists
                             node.kubernetes.io/unschedulable:NoSchedule op=Exists
Events:
  Type     Reason                  Age                    From     Message
  ----     ------                  ----                   ----     -------
  Warning  FailedCreatePodSandBox  4m58s (x301 over 70m)  kubelet  Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory

或者在node01的系统日志上也能看得到:

[root@node01 ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since 四 2024-08-15 09:37:50 CST; 1h 17min ago
     Docs: https://kubernetes.io/docs/
 Main PID: 2275 (kubelet)
    Tasks: 11
   Memory: 59.2M
   CGroup: /system.slice/kubelet.service
           └─2275 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --contai...

8月 15 10:54:57 node01 kubelet[2275]: E0815 10:54:57.219471    2275 dns.go:284] "Could not open resolv conf file." err="open /run/systemd/resolve/resolv.conf: no such file or directory"
8月 15 10:54:57 node01 kubelet[2275]: E0815 10:54:57.219511    2275 kuberuntime_sandbox.go:45] "Failed to generate sandbox config for pod" err="open /run/systemd/resolve/re...proxy-9bb5m"
8月 15 10:54:57 node01 kubelet[2275]: E0815 10:54:57.219532    2275 kuberuntime_manager.go:1166] "CreatePodSandbox for pod failed" err="open /run/systemd/resolve/resolv.con...proxy-9bb5m"
8月 15 10:54:57 node01 kubelet[2275]: E0815 10:54:57.219579    2275 pod_workers.go:1300] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"kube-proxy-9bb5m_kube-s...
8月 15 10:54:58 node01 kubelet[2275]: E0815 10:54:58.153989    2275 kubelet.go:2855] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPl...initialized"
8月 15 10:54:59 node01 kubelet[2275]: E0815 10:54:59.219085    2275 dns.go:284] "Could not open resolv conf file." err="open /run/systemd/resolve/resolv.conf: no such file or directory"
8月 15 10:54:59 node01 kubelet[2275]: E0815 10:54:59.219112    2275 kuberuntime_sandbox.go:45] "Failed to generate sandbox config for pod" err="open /run/systemd/resolve/re...el-ds-dc9bc"
8月 15 10:54:59 node01 kubelet[2275]: E0815 10:54:59.219124    2275 kuberuntime_manager.go:1166] "CreatePodSandbox for pod failed" err="open /run/systemd/resolve/resolv.con...el-ds-dc9bc"
8月 15 10:54:59 node01 kubelet[2275]: E0815 10:54:59.219151    2275 pod_workers.go:1300] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"kube-flanne...annel-ds-dc9
8月 15 10:55:03 node01 kubelet[2275]: E0815 10:55:03.155793    2275 kubelet.go:2855] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPl...initialized"
Hint: Some lines were ellipsized, use -l to show in full.

open /run/systemd/resolve/resolv.conf: no such file or directory简单来说就是node01节点配置上少了个文件。这里我们先看一下master01上是否存在,node01上是否真的没有,毕竟master01上这个pod是好的。

root@master01:~# cat /run/systemd/resolve/resolv.conf 
# This is /run/systemd/resolve/resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# This file might be symlinked as /etc/resolv.conf. If you're looking at
# /etc/resolv.conf and seeing this text, you have followed the symlink.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs should typically not access this file directly, but only
# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a
# different way, replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 8.8.8.8
nameserver 114.114.114.114
search .

[root@node01 ~]# cd /run/systemd/resolve/
-bash: cd: /run/systemd/resolve/: 没有那个文件或目录

果不其然,master01上存在,然而node01的确缺少。因此我们把这个对应的文件从master01复制到node01即可。当然,在之前记得在node01上创建resolve目录。

root@master01:~# scp /run/systemd/resolve/resolv.conf root@192.168.1.201:/run/systemd/resolve/
root@192.168.1.201's password: 
resolv.conf                                                                                                                                               100%  809     1.0MB/s   00:00    

然后在node01上重启一下kubectl,再到master01上检查一下:

root@master01:~# kubectl get pods -n kube-system -o wide
NAME                               READY   STATUS    RESTARTS      AGE   IP              NODE       NOMINATED NODE   READINESS GATES
coredns-66f779496c-dp5b7           1/1     Running   1 (72m ago)   14h   10.244.0.4      master01   <none>           <none>
coredns-66f779496c-g5gc8           1/1     Running   1 (72m ago)   14h   10.244.0.5      master01   <none>           <none>
etcd-master01                      1/1     Running   1 (72m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-apiserver-master01            1/1     Running   1 (72m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-controller-manager-master01   1/1     Running   1 (72m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-proxy-9bb5m                   1/1     Running   0             12h   192.168.1.201   node01     <none>           <none>
kube-proxy-kjv75                   1/1     Running   1 (72m ago)   14h   192.168.1.200   master01   <none>           <none>
kube-scheduler-master01            1/1     Running   1 (72m ago)   14h   192.168.1.200   master01   <none>           <none>
root@master01:~# kubectl get nodes -o wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                 CONTAINER-RUNTIME
master01   Ready    control-plane   14h   v1.28.2   192.168.1.200   <none>        Ubuntu 22.04.4 LTS      6.5.0-44-generic               docker://26.1.4
node01     Ready    <none>          13h   v1.28.2   192.168.1.201   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4

此时,就基本搞定了。在这种安装组件的过程中,多多少少都会碰到这种缺少文件导致pod运行异常的问题,比如缺少flannel网段配置文件/run/flannel/subnet.env啥的,都算比较正常的,具体问题具体分析就好了。

如果实在有问题,咱们就reset重新来过,或者节点重新加入。这里笔者也顺带补充一下这部分内容。

k8s节点重新加入

如果node节点需要重新加入master。在node上没有pod运行的情况下,可以直接从master01删除node:

root@master01:/opt/cri-docker-file/flannel文件包# kubectl delete node node01
node "node01" deleted

如果有pod的话先通过kubectl drain pod_name --delete-local-data --force --ignore-daemonsets进行清除,然后在delete

然后在主节点上重新生成token(24h存放期,如果没过可以接着用)和hash值。

#存在就不用生成
root@master01:~# kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
uuyk4n.4uynbpkq9o4zmb4k   9h          2024-08-15T12:50:14Z   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
#过期就重新生成
root@master01:~# kubeadm token create
k85qvd.d4az6zu90xk8x2iy
#生成hash码
root@master01:~# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt \
| openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
342ca72d2d0a4ae23e0a122bd4406a76567471e298f27a67f877ee5189cd0c2a

然后在node中进行reset操作,接着重新节点添加操作即可:

[root@node01 cri-dockerd-file]#kubeadm reset --cri-socket unix:///run/cri-dockerd.sock
[root@node01 cri-dockerd-file]# kubeadm join 192.168.1.200:6443 --token k85qvd.d4az6zu90xk8x2iy         --discovery-token-ca-cert-hash 342ca72d2d0a4ae23e0a122bd4406a76567471e298f27a67f877ee5189cd0c2a --cri-socket unix:///run/cri-dockerd.sock

k8s命令补全 

[root@node01 cri-dockerd-file]#yum install -y bash-completion
[root@node01 cri-dockerd-file]#source /usr/share/bash-completion/bash_completion
[root@node01 cri-dockerd-file]#source <(kubectl completion bash)
[root@node01 cri-dockerd-file]#echo "source <(kubectl completion bash)" >> ~/.bashrc

六、kuboard安装

Kuboard 是一款专为 Kubernetes 设计的免费管理界面,兼容 Kubernetes 版本 1.13 及以上。Kuboard 每周发布一个 beta 版本,最长每月发布一个正式版本,经过两年的不断迭代和优化,已经具备多集群管理、权限管理、监控套件、日志套件等丰富的功能。结合已有或新建的代码仓库、镜像仓库、CI/CD工具等,可以便捷的搭建一个生产可用的 Kubernetes 容器云平台,轻松管理和运行云原生应用。可对比于docker与potainer-ce,k8s与kuboard。

特点

  • 多种认证方式 Kuboard 可以使用内建用户库、gitlab / github 单点登录或者 LDAP 用户库进行认证,避免管理员将 ServiceAccount 的 Token 分发给普通用户而造成的麻烦。使用内建用户库时,管理员可以配置用户的密码策略、密码过期时间等安全设置

  • 多集群管理 管理员可以将多个 Kubernetes 集群导入到 Kuboard 中,并且通过权限控制,将不同集群/名称空间的权限分配给指定的用户或用户组。

  • 微服务分层展示 在 Kuboard 的名称空间概要页中,以经典的微服务分层方式将工作负载划分到不同的分层,更加直观地展示微服务架构的结构,并且可以为每一个名称空间自定义名称空间布局。

  • 工作负载的直观展示 Kuboard 中将 Deployment 的历史版本、所属的 Pod 列表、Pod 的关联事件、容器信息合理地组织在同一个页面中,可以帮助用户最快速的诊断问题和执行各种相关操作。

  • 工作负载编辑 Kuboard 提供了图形化的工作负载编辑界面,用户无需陷入繁琐的 YAML 文件细节中,即可轻松完成对容器的编排任务。支持的 Kubernetes 对象类型包括:Node、Namespace、Deployment、StatefulSet、DaemonSet、Secret、ConfigMap、Service、Ingress、StorageClass、PersistentVolumeClaim、LimitRange、ResourceQuota、ServiceAccount、Role、RoleBinding、ClusterRole、ClusterRoleBinding、CustomResourceDefinition、CustomResource 等各类常用 Kubernetes 对象,

  • 存储类型支持 在 Kuboard 中,可以方便地对接 NFS、CephFS 等常用存储类型,并且支持对 CephFS 类型的存储卷声明执行扩容和快照操作。

  • 丰富的互操作性 可以提供许多通常只在 kubectl 命令行界面中才提供的互操作手段,例如: 1.Top Nodes / Top Pods 2.容器的日志、终端 3.容器的文件浏览器(支持从容器中下载文件、上传文件到容器) 4.KuboardProxy(在浏览器中就可以提供 kubectl proxy 的功能)

  • 套件扩展 1.资源层监控套件,基于 Prometheus / Grafana 提供 K8S 集群的监控能力,可以监控集群、节点、工作负载、容器组等各个级别对象的 CPU、内存、网络、磁盘等资源的使用情况; 2.日志聚合套件,基于 Grafana / Loki / Promtail 实现日志聚合; 3.存储卷浏览器,查看和操作存储卷中的内容;

  • 告警配置 可以通过界面直接配置资源层监控套件发送告警消息: 1.支持邮件、微信发送告警消息; 2.支持告警路由配置; 3.支持告警规则配置等;

  • 操作审计 Kuboard 支持操作审计的功能: 1.审计用户通过 Kuboard 界面和 Kuboard API 执行的操作; 2.自定义审计规则;

官方文档地址:Kuboard_Kubernetes教程_K8S安装_管理界面

安装文档地址:安装 Kubernetes 多集群管理工具 - Kuboard v3 | Kuboard

目前Kuboard兼容的版本如下:

Kubernetes 版本Kuboard 版本兼容性说明
v1.20v2.0.x😄已验证
v1.19v2.0.x😄已验证
v1.18v1.0.x, v2.0.x😄已验证
v1.17v1.0.x, v2.0.x😄已验证
v1.16v1.0.x, v2.0.x😄已验证
v1.15v1.0.x, v2.0.x😄已验证
v1.14v1.0.x, v2.0.x😄已验证
v1.13v1.0.x, v2.0.x😄已验证
v1.12v1.0.x, v2.0.x😐Kubernetes Api v1.12 不支持 dryRun, Kuboard 不支持 Kubernetes v1.12
v1.11v1.0.x, v2.0.x😐Kuboard 不支持 Kubernetes v1.11

同样部署方式支持Docker和Kubernetes,并且也有和gitlab、GitHub集成版本

  • Docker部署

  • Kubernetes部署

用户认证支持以下三种

  • 内置用户

  • gitlab

  • github

  • Ldap

Docker部署方式是可以和Kubernetes不在同一个节点上,Kubernetes就是在同一个节点进行部署。

目前官方推荐使用Docker部署,通过外网Kuboard链接到Kubernetes。并且使用内建用户的方式 安装 Kuboard v3 - 内建用户库 | Kuboard

这里我们可以直接用文档提供的Docker方式安装即可:

root@master01:~# docker run -d \
>   --restart=unless-stopped \
>   --name=kuboard \
>   -p 80:80/tcp \
>   -p 10081:10081/tcp \
> -e KUBOARD_ENDPOINT="http://192.168.1.200:80" \
> -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
> -v /root/kuboard-data:/data \
> swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
Unable to find image 'swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3' locally
v3: Pulling from kuboard/kuboard
39cf15d1b231: Pull complete 
4197a238162d: Pull complete 
e83aaaf7f4f0: Pull complete 
69eded4f5e9e: Pull complete 
5cb79ab2dc22: Pull complete 
a7745fd67ed7: Pull complete 
ecfb93335425: Pull complete 
3c13e870eea7: Pull complete 
ae3b6d8cfd32: Pull complete 
cc9c377553dd: Pull complete 
7dedf0c74438: Pull complete 
0f014a650b70: Pull complete 
2c49402c234e: Pull complete 
05af57acfdc7: Pull complete 
b19894fba874: Pull complete 
646d0de8a9ea: Pull complete 
adf5d015147e: Pull complete 
c055562938ef: Pull complete 
Digest: sha256:c5beac6f0e444e3807c989be7119eeb44fe73f9990ee2e6bfe65984287201663
Status: Downloaded newer image for swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
0175f17c66c5451fece609786500344e2375995ad23d4d0286cc9205774d58b1

 DANGER

  • KUBOARD_ENDPOINT 参数的作用是,让部署到 Kubernetes 中的 kuboard-agent 知道如何访问 Kuboard Server;

  • KUBOARD_ENDPOINT 中也可以使用外网 IP;

  • Kuboard 不需要和 K8S 在同一个网段,Kuboard Agent 甚至可以通过代理访问 Kuboard Server;

  • 建议在 KUBOARD_ENDPOINT 中使用域名;

  • 如果使用域名,必须能够通过 DNS 正确解析到该域名,如果直接在宿主机配置 /etc/hosts 文件,将不能正常运行;

参数解释

  • 建议将此命令保存为一个 shell 脚本,例如 start-kuboard.sh,后续升级 Kuboard 或恢复 Kuboard 时,需要通过此命令了解到最初安装 Kuboard 时所使用的参数;

  • 第 4 行,将 Kuboard Web 端口 80 映射到宿主机的 80 端口(您可以根据自己的情况选择宿主机的其他端口);

  • 第 5 行,将 Kuboard Agent Server 的端口 10081/tcp 映射到宿主机的 10081 端口(您可以根据自己的情况选择宿主机的其他端口);

  • 第 6 行,指定 KUBOARD_ENDPOINT 为 http://内网IP,如果后续修改此参数,需要将已导入的 Kubernetes 集群从 Kuboard 中删除,再重新导入;

  • 第 7 行,指定 KUBOARD_AGENT_SERVER 的端口为 10081,此参数与第 5 行中的宿主机端口应保持一致,修改此参数不会改变容器内监听的端口 10081,例如,如果第 5 行为 -p 30081:10081/tcp 则第 7 行应该修改为 -e KUBOARD_AGENT_SERVER_TCP_PORT="30081"

  • 第 8 行,将持久化数据 /data 目录映射到宿主机的 /root/kuboard-data 路径,请根据您自己的情况调整宿主机路径;

其他参数

  • 在启动命令行中增加环境变量 KUBOARD_ADMIN_DERAULT_PASSWORD,可以设置 admin 用户的初始默认密码。

在浏览器输入 http://your-host-ip:80 即可访问 Kuboard v3.x 的界面,登录方式:

  • 用户名: admin

  • 密 码: Kuboard123

然后就可以添加咱们的集群了:

目前支持3种方式添加集群:

  1. 创建token

  2. 填写kubeConfig

  3. 安装kuboard-agent

每种方式其中方式都写的很清楚了。这里笔者用KubeConfig方式添加:  

然后就搞定了。  

  

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐