k8s搭建(详细演示完整一篇)

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

文章目录

  • 一、环境准备
    • [1. 系统类型](#1. 系统类型)
    • [2. 系统要求](#2. 系统要求)
    • [3. 系统配置](#3. 系统配置)
  • 二、Docker安装
    • [1. 安装Docker](#1. 安装Docker)
      • [1.1 更新安装包](#1.1 更新安装包)
      • [1.2 安装依赖](#1.2 安装依赖)
      • [1.3 获取证书](#1.3 获取证书)
      • [1.4 添加仓库](#1.4 添加仓库)
      • [1.5 再次更新安装包](#1.5 再次更新安装包)
      • [1.6 安装docker](#1.6 安装docker)
    • [2. 配置镜像加速器(不配也行,建议配一下)](#2. 配置镜像加速器(不配也行,建议配一下))
    • [3. 开启Docker](#3. 开启Docker)
      • [3.1 查看docker状态](#3.1 查看docker状态)
      • [3.2 重启docker](#3.2 重启docker)
      • [3.3 开机自启](#3.3 开机自启)
  • 三、K8S组件安装
    • [1. 组件介绍](#1. 组件介绍)
    • [2. 再次确保关闭ufw和swap](#2. 再次确保关闭ufw和swap)
      • [2.1 关闭防火墙](#2.1 关闭防火墙)
      • [2.2 查看防火墙状态](#2.2 查看防火墙状态)
      • [2.3 查看交换内存](#2.3 查看交换内存)
      • [2.4 关闭交换内存](#2.4 关闭交换内存)
    • [3. 组件安装(kubelet、kubectl、kubeadm)](#3. 组件安装(kubelet、kubectl、kubeadm))
      • [3.1 使用阿里云镜像仓库安装(推荐)](#3.1 使用阿里云镜像仓库安装(推荐))
        • [3.1.1 更新apt](#3.1.1 更新apt)
        • [3.1.2 安装工具](#3.1.2 安装工具)
        • [3.1.3 签名秘钥](#3.1.3 签名秘钥)
        • [3.1.4 添加k8s的apt仓库](#3.1.4 添加k8s的apt仓库)
        • [3.1.5 再次更新apt包](#3.1.5 再次更新apt包)
        • [3.1.6 安装组件(两种方式)](#3.1.6 安装组件(两种方式))
          • [3.1.6.1 指定版本安装(推荐)](#3.1.6.1 指定版本安装(推荐))
          • [3.1.6.2 不指定版本安装(不推荐,因为版本默认最新,容易报错)](#3.1.6.2 不指定版本安装(不推荐,因为版本默认最新,容易报错))
      • [3.2 脚本方式安装](#3.2 脚本方式安装)
      • [3.3 使用官网仓库安装(此路不通请跳过此步,可能是应为在创建虚拟机的时候使用的是阿里云的仓库,相关配置有点问题,如果想用该步骤进行安装,需要自己重新自定义安装虚拟机后进行尝试)](#3.3 使用官网仓库安装(此路不通请跳过此步,可能是应为在创建虚拟机的时候使用的是阿里云的仓库,相关配置有点问题,如果想用该步骤进行安装,需要自己重新自定义安装虚拟机后进行尝试))
    • [4. 修改cgroups](#4. 修改cgroups)
  • 四、根据主节点克隆两个WORKER节点
    • [1. 克隆K8S-WORKER1](#1. 克隆K8S-WORKER1)
    • [2. 克隆K8S-WORKER2](#2. 克隆K8S-WORKER2)
    • [3. 修改主机名称](#3. 修改主机名称)
    • [4. 修改IP](#4. 修改IP)
    • [5. 激活IP](#5. 激活IP)
  • 五、创建集群
    • [1. putty连接虚拟机](#1. putty连接虚拟机)
    • [2. 初始化](#2. 初始化)
      • [2.1 查看kubernetes版本信息](#2.1 查看kubernetes版本信息)
      • [2.2 执行初始化命令](#2.2 执行初始化命令)
      • [2.4 报错处理(无报错可以跳过此步)](#2.4 报错处理(无报错可以跳过此步))
        • [2.4.1 报错排查](#2.4.1 报错排查)
        • [2.4.2 重置adm](#2.4.2 重置adm)
    • [3. 配置.kube](#3. 配置.kube)
    • [4. calico网络配置](#4. calico网络配置)
      • [4.1 calico网络配置简单命令(推荐)](#4.1 calico网络配置简单命令(推荐))
      • [4.2 根据calico官网命令配置(不一定好用,但可一试)](#4.2 根据calico官网命令配置(不一定好用,但可一试))
    • [5. 集群节点查看](#5. 集群节点查看)
    • [6. 集群添加节点](#6. 集群添加节点)
      • [6.1 重新生成加入节点的命令](#6.1 重新生成加入节点的命令)
      • [6.2 将worker1节点加入集群](#6.2 将worker1节点加入集群)
      • [6.3 将worker2节点加入集群](#6.3 将worker2节点加入集群)
      • 补:hosts配置
      • [6.4 查看已加入集群的节点](#6.4 查看已加入集群的节点)
  • 六、dashboard配置
    • [1. 安装dashboard](#1. 安装dashboard)
    • [2. dashboard端口设置及获取](#2. dashboard端口设置及获取)
      • [2.1 type类型](#2.1 type类型)
      • [2.2 获取端口号](#2.2 获取端口号)
    • [3. 创建dashboard访问账号](#3. 创建dashboard访问账号)
    • [4. 获取dashboard的访问token](#4. 获取dashboard的访问token)
    • 5.访问dashboard
      • [5.1 端口查看](#5.1 端口查看)
      • [5.2 ip查看](#5.2 ip查看)
      • [5.3 访问地址](#5.3 访问地址)

一、环境准备

1. 系统类型

linux系统安装:ubuntu22.04.3

2. 系统要求

cpu至少两个

每个cpu至少分配一个内核

运行内存至少2G

磁盘存储20G

3. 系统配置

创建服务器并设置系统参数等

参考文章:VMware安装ubuntu系统22.04.3版本

根据上面这篇文章创建的虚拟机,即使换了网络也不会改变ip地址,自己的电脑可以切换WiFi,连接虚拟机的ip地址不变

强烈建议使用VMware来安装系统,在后续的每一阶段的操作都可以生成快照,
并即使回退到想要的位置,相当于是操作失误了或者出现问题可以回到没出问题之前的位置,真的很方便,节省时间,
virtualbox不知道有没有,至少我之前用的时候没发现他有这个功能

二、Docker安装

1. 安装Docker

安装docker的目的是为了为k8s提供运行时容器引擎,即containerd

所以此步骤的主要目的是安装containerd
注: kubernets 自v 1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。docker中包含了 containerd 。

containerd是一个CRI(Container Runtime Interface)组件,在容器运行时调用containerd组件来创建、运行、销毁容器等

1.1 更新安装包

l 复制代码
sudo apt-get update

1.2 安装依赖

l 复制代码
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

1.3 获取证书

l 复制代码
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

1.4 添加仓库

l 复制代码
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

1.5 再次更新安装包

l 复制代码
sudo apt update

1.6 安装docker

l 复制代码
sudo apt-get -y install docker-ce

2. 配置镜像加速器(不配也行,建议配一下)

参考:配置阿里云容器镜像加速

3. 开启Docker

3.1 查看docker状态

l 复制代码
systemctl status docker

3.2 重启docker

l 复制代码
sudo systemctl restart docker

3.3 开机自启

l 复制代码
sudo systemctl enable docker

l 复制代码
sudo systemctl enable docker.service

三、K8S组件安装

1. 组件介绍

安装k8s的三个组件kubelet、kubeadm、kubectl
kubelet 运行在Cluster所有节点上,负责启动Pod和容器
kubeadm 用于初始化Cluster
kubectl 是Kubernetes命令行工具。通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

2. 再次确保关闭ufw和swap

再检查一下防火墙和交换内存,确保关闭

2.1 关闭防火墙

请参考小短文:正确关闭ubuntu防火墙

l 复制代码
systemctl stop ufw
l 复制代码
sudo ufw disable

2.2 查看防火墙状态

l 复制代码
sudo ufw status

l 复制代码
systemctl status ufw.service

最好两条命令都查看一下,确保关闭,不然后续出了问题不一定会想到这里

如果是inactive则表示已关闭

2.3 查看交换内存

l 复制代码
sudo free -m

2.4 关闭交换内存

(只能暂时关闭,重启后则会失效)

l 复制代码
sudo swapoff -a

再执行以下命令则会永久关闭

(修改文件内容,注释掉swap)

l 复制代码
sudo vim /etc/fstab

i进入编辑

在swap那行行首加#注释掉

esc退出编辑
shift+zz保存退出

然后查看修改后的内容

l 复制代码
cat /etc/fstab

3. 组件安装(kubelet、kubectl、kubeadm)

这里尝试了两种方式,一种是阿里云的镜像地址进行安装,一种是用官网的地址进行安装

3.1 使用阿里云镜像仓库安装(推荐)

3.1.1 更新apt

更新安装包

l 复制代码
sudo apt-get update
3.1.2 安装工具

(前面安装docker的时候安装过这些则不需要再次安装)

l 复制代码
sudo apt-get install -y apt-transport-https ca-certificates curl
3.1.3 签名秘钥

下载k8s软件包仓库的公共签名秘钥

l 复制代码
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
3.1.4 添加k8s的apt仓库

添加适合k8s的apt仓库

l 复制代码
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"

注:这里的地址必须是http,不可以用https,我这里用了https后报错,改成了http后正常,原因暂不知晓"

3.1.5 再次更新apt包
l 复制代码
sudo apt-get update
3.1.6 安装组件(两种方式)

一种是指定版本,一种是不指定版本
注意:阿里云的地址与官网的版本存在延时性,官网的比较新的小版本阿里云上可能没有,此时官网最新版为1.28.4,阿里云最新版为1.28.2

3.1.6.1 指定版本安装(推荐)

阿里云镜像地址中最新的版本为1.28.2-00

此处以1.22.9-00为例

查看版本是否存在

l 复制代码
sudo apt-cache madison kubelet kubectl kubeadm | grep '1.22.9-00' 

指定版本进行安装

l 复制代码
sudo apt install -y kubelet=1.22.9-00 kubectl=1.22.9-00 kubeadm=1.22.9-00

安装成功打印的后半部分内容如下,其中也可以看到三个组件的版本号

标记指定软件包为保留,阻止更新

l 复制代码
sudo apt-mark hold kubelet kubeadm kubectl
3.1.6.2 不指定版本安装(不推荐,因为版本默认最新,容易报错)

不指定版本时,默认安装最新版

因用的是阿里云的地址,所以最新版是阿里云地址的最新版,不是官网的最新版

l 复制代码
sudo apt install -y kubelet kubectl kubeadm

安装完成后的后半部分内容如下

标记指定软件包为保留,阻止更新

l 复制代码
sudo apt-mark hold kubelet kubeadm kubectl

3.2 脚本方式安装

3.1的安装步骤相当多,如果嫌麻烦可写成一个脚本文件进行执行,简单快捷

创建文件夹k8s,创建后的文件夹在当前路径下

l 复制代码
sudo mkdir k8s

可用sudo ls命令查看

l 复制代码
sudo ls

在k8s文件夹中创建脚本文件installKube.sh

vim命令进入即创建

l 复制代码
sudo vim k8s/installKube.sh

将以下内容复制(内容为3.1的全部命令集合),然后鼠标右键粘贴进去(这种粘贴方式的前提是使用putty连接服务器后在putty的窗口操作,在虚拟机窗口是粘贴不了的,除非有其他粘贴配置)

l 复制代码
#!/bin/bash
sudo apt update && sudo apt install apt-transport-https ca-certificates curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
sudo apt update
sudo apt-cache madison kubelet kubectl kubeadm | grep '1.22.9-00' 
sudo apt install -y kubelet=1.22.9-00 kubectl=1.22.9-00 kubeadm=1.22.9-00
sudo apt-mark hold kubelet kubeadm kubectl

然后shift+zz保存退出

可用cat命令查看

l 复制代码
sudo cat k8s/installKube.sh

运行脚本执行命令进行安装

l 复制代码
sh k8s/installKube.sh

安装完成如下,一气呵成

3.3 使用官网仓库安装(此路不通请跳过此步,可能是应为在创建虚拟机的时候使用的是阿里云的仓库,相关配置有点问题,如果想用该步骤进行安装,需要自己重新自定义安装虚拟机后进行尝试)

官网或者阿里云二选一操作即可

更新安装包

l 复制代码
sudo apt update

安装工具(若前面安装docker时安装过了,可不执行此命令)

l 复制代码
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

下载k8s软件包仓库的公共签名秘钥,同一个签名秘钥适用于所有仓库,可忽略URL中的版本信息

l 复制代码
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmour -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

添加适合k8s的apt仓库,需要其他版本可更换v1.28为所需版本

l 复制代码
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
l 复制代码
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] http://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

注:要升级 kubectl 到别的次要版本,你需要先升级 /etc/apt/sources.list.d/kubernetes.list 中的版本, 再运行 apt-get update 和 apt-get upgrade。 更详细的步骤可以在更改 Kubernetes 软件包仓库中找到。

再次更新安装包

l 复制代码
sudo apt update

安装组件

l 复制代码
sudo apt install -y kubelet kubeadm kubectl 

保留版本

l 复制代码
sudo apt-mark hold kubelet kubeadm kubectl

注:apt-mark的作用是用户将软件包标记为自动安装,或者取消标记为自动安装 hold选项用于将软件包标记为保留,以防止软件包被自动安装、升级或删除 此处主要为了防止kubelet等组件自动升级

sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

4. 修改cgroups

和配置镜像加速器那个步骤相同,在/etc/docker/daemon.json文件中添加exec-opts参数

l 复制代码
sudo vim /etc/docker/daemon.json

或者将原内容删除,复制完整的内容后直接复制
i-->进入编辑模式将以下exec-opts部分加入,加入后如下

l 复制代码
{
	"exec-opts":[
		"native.cgroupdriver=systemd"
	],
	"registry-mirrors":["https://vj4iipoo.mirror.aliyuncs.com"]
}

esc-->shift+zz

重新加载生效

重启docker

l 复制代码
systemctl restart docker

重启kubelet

l 复制代码
systemctl restart kubelet

修改cgroup管理器的原因:

linux中的ubuntu、debian、centos7使用的是systemd初始化系统,systemd有自己的cgroup管理器

容器运行时和kubelet使用的是另一个cgroup管理器

也就是说linux系统的cgroup管理和kubelet的cgroup管理器是两个不一样,系统中存在两种资源分配视图

当系统资源(如cpu、内存等)不足时,操作系统的进程会不稳定

四、根据主节点克隆两个WORKER节点

通过上面的K8S-MASTER虚拟机克隆创建worker1和worker2两个节点

克隆后的worker1、worker2虚拟机登录的账号密码和master的一样

1. 克隆K8S-WORKER1

将K8S-MASTER虚拟机关机,然后右键K8S-MASTER虚拟机---管理---克隆

下一步---虚拟机中的当前状态---下一步---创建链接克隆---下一步

为虚拟机起名K8S-WORKER1

选择存储位置

完成---关闭

2. 克隆K8S-WORKER2

按照以上步骤克隆K8S-WORKER2节点

3. 修改主机名称

此时只能在虚拟机窗口进行操作

修改worker1和worker2的主机名称hostname

登录worker1

账号libai

密码123456

此时可以看到主机名还是K8S-MASTER

可使用命令

l 复制代码
hostnamectl set-hostname K8S-WORKER1

查看修改后的结果

l 复制代码
cat /etc/hostname

对worker2进行相同操作,将worker2的主机名称改为K8S-WORKER2

4. 修改IP

修改worker1和worker2的ip地址(因为克隆后的两台虚拟机ip与被克隆的master主机ip相同,可根据自己的主机ip进行第四段+1进行修改两个worker节点的ip)

打开虚拟机K8S-WORKER1

输入命令查看ip信息

l 复制代码
cat /etc/netplan/00-installer-config.yaml

可以看到master节点的主机ip信息

我的主节点master的ip为192.168.193.128/24

现在将worker1的ip地址改为192.168.193.129/24

命令如下

l 复制代码
sudo vim /etc/netplan/00-installer-config.yaml

输入i进入编辑模式

修改后按esc退出编辑模式,按shift+zz快捷保存退出

再用cat命令查看修改后内容:::

l 复制代码
cat /etc/netplan/00-installer-config.yaml

相同操作,将worker2的ip改为192.168.193.130/24

三台虚拟机的ip如下:

master 192.168.193.128/24

worker1 192.168.193.129/24

worker2 192.168.193.130/24

5. 激活IP

修改ip后需要激活才可用

使用命令

l 复制代码
sudo netplan apply

该命令需要等几分钟左右生效,可以多等一会,然后使用putty远程连接ip地址,连上则说明激活成功

五、创建集群

1. putty连接虚拟机

putty连接服务器指南

开启之前配置好的三台虚拟机

使用putty连接三台虚拟机,在putty窗口进行操作

2. 初始化

在主节点K8S-MASTER上操作

2.1 查看kubernetes版本信息

这里用命令查看

l 复制代码
kubectl version

输出的信息中包含版本信息

版本号为1.22.9

2.2 执行初始化命令

l 复制代码
sudo kubeadm init \
  --kubernetes-version=v1.22.9 \
  --image-repository registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.24.0.0/16 \
  --ignore-preflight-errors=Swap

参数解释:
--image-repository string 指定从什么位置来拉取镜像(1.13版本才有的)

默认值是k8s.gcr.io,改为国内镜像地址:registry.aliyuncs.com/google_containers
--kubernetes-version string: 指定kubenets版本号
--pod-network-cidr 指定 Pod 网络的范围。

Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。(说明在集群中将会使用10.244.0.0这个网段下面的所有ip地址,比如将tomcat部署在10.244.144.198这个地址,然后再master节点使用curl 10.244.144.198就可以返回tomcat的界面)
--ignore-preflight-errors=all 忽略预检报错内容,指定所有(自己猜的)
注:kubeadm 不支持将没有 --control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群。

这里有个地方我记录一下

初始化开始的时候会提示一个警告信息如下

[警告系统验证]:此Docker版本不在已验证版本列表中:24.0.7。最新验证版本:20.10

因为安装的docker是最新版本,而安装的kube版本为旧版本1.22.9,所以可能有点小问题,但是他是警告不是报错,所以暂时不管他

初始化完成后,出现类似如下内容,表示初始化成功

l 复制代码
......
......
......
此处省略若干行

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.193.128:6443 --token 1cd07a.h2z8wrgngllonwjt \
        --discovery-token-ca-cert-hash sha256:0cc0df38925079b35a0e45e0c43f50f62dc7b3aad2e8414177a18f613c44c9fb
libai@k8s-master:~$

截图如下

仔细阅读初始化成功后的输出信息,也就是上面这部分内容(可以将两个红框中的命令鼠标左键选中后右键粘贴出来,备用)
1的位置大致就是说你想要用你的集群的话,就必须以非root用户来执行红框里的mkdir等三个命令
2的位置就是说你想要别的节点加入集群就执行红框里的kubeadm join命令就行(该命令一定要复制下来记住,待会加入节点要用,当然,忘了也没关系,可以重新生成新的)

具体操作请跳到第2.5小节开始

后续发现初始化完成后在docker中也有体现,使用docker命令查看容器,可发现有以下这些容器正在运行

l 复制代码
sudo docker ps

输出如下,都是跟k8s相关的容器

l 复制代码
CONTAINER ID   IMAGE                                               COMMAND                  CREATED      STATUS      PORTS     NAMES
a2aa58b36373   58b185b3a4da                                        "/usr/local/bin/kube..."   2 days ago   Up 2 days             k8s_kube-proxy_kube-proxy-8x77k_kube-system_23d83fd9-e960-4883-9396-41b1fe735b8d_0
fce3b3b130c6   registry.aliyuncs.com/google_containers/pause:3.5   "/pause"                 2 days ago   Up 2 days             k8s_POD_kube-proxy-8x77k_kube-system_23d83fd9-e960-4883-9396-41b1fe735b8d_0
ce279ba96039   08a5810c8d30                                        "kube-apiserver --ad..."   2 days ago   Up 2 days             k8s_kube-apiserver_kube-apiserver-k8s-master_kube-system_cfc7886a5b41691c59cfc56d5b4a2a56_0
544d55e5b55c   03e6595ccb65                                        "kube-controller-man..."   2 days ago   Up 2 days             k8s_kube-controller-manager_kube-controller-manager-k8s-master_kube-system_d702eaa5f3d835c50f8950a583c0f987_0
7ab0d649ad91   a709e983ff7e                                        "kube-scheduler --au..."   2 days ago   Up 2 days             k8s_kube-scheduler_kube-scheduler-k8s-master_kube-system_943ba9c025cdbb070d1589a0a2b66128_0
0d58002ebf3d   004811815584                                        "etcd --advertise-cl..."   2 days ago   Up 2 days             k8s_etcd_etcd-k8s-master_kube-system_0257569b7767afe4e6a429c33d65f7e5_0
6129f538f4ff   registry.aliyuncs.com/google_containers/pause:3.5   "/pause"                 2 days ago   Up 2 days             k8s_POD_kube-apiserver-k8s-master_kube-system_cfc7886a5b41691c59cfc56d5b4a2a56_0
b23f5021a220   registry.aliyuncs.com/google_containers/pause:3.5   "/pause"                 2 days ago   Up 2 days             k8s_POD_etcd-k8s-master_kube-system_0257569b7767afe4e6a429c33d65f7e5_0
248a476aa076   registry.aliyuncs.com/google_containers/pause:3.5   "/pause"                 2 days ago   Up 2 days             k8s_POD_kube-scheduler-k8s-master_kube-system_943ba9c025cdbb070d1589a0a2b66128_0
43e71eca317d   registry.aliyuncs.com/google_containers/pause:3.5   "/pause"                 2 days ago   Up 2 days             k8s_POD_kube-controller-manager-k8s-master_kube-system_d702eaa5f3d835c50f8950a583c0f987_0

2.4 报错处理(无报错可以跳过此步)

2.4.1 报错排查

如果初始化报错,则需要排查问题

问题大概有以下几个方面,可以参考并尝试

  • 版本小于1.24.0
    确认下载的kubelet、kubeadm、kubectl的版本小于1.24.0的,因为从1.24.0开始kube移除了docker作为容器运行时的功能,需要单独安装containerd并开启containerd的运行时功能
  • ufw inactive(dead)
    防火墙确认关闭
    检查状态命令为systemctl status ufw
    先执行关闭命令为sudo stop ufw然后禁用systemctl ufw disable
  • swap off
    交换内存确认关闭
    查看命令cat /etc/fstab
    先执行 临时关闭命令sudo swapoff -a
    再执行永久关闭命令sudo vim /etc/fstab,注释掉swap那行
  • cgroup systemd
    cgroup管理器确认已修改为systemd
    查看命令cat /etc/docker/daemon.json
    如果没有如下exec-opts的systemd设置参数,则用vim命令添加
l 复制代码
{
	"exec-opts":[
		"native.cgroupdriver=systemd"
	],
	"registry-mirrors":["https://vj4iipoo.mirror.aliyuncs.com"]
}

exec-opts为cgroup管理器的指定参数设置
registry-mirrors为镜像加速地址(请设置自己的)

2.4.2 重置adm

报错排查完之后,需要重置adm后才能再次进行初始化,执行两个命令如下

重置adm

l 复制代码
sudo kubeadm reset

删除相关文件

l 复制代码
sudo rm -fr ~/.kube/  /etc/kubernetes/* var/lib/etcd/*

3. 配置.kube

根据初始化完成后输出信息的命令进行操作如下

创建.kube文件夹

l 复制代码
sudo mkdir -p $HOME/.kube

将admin.conf文件内容复制到.kube的config文件中

l 复制代码
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

将文件的所有权限从文件所有者修改到到所有者所在的组的其他用户(user->group)

l 复制代码
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4. calico网络配置

calico介绍参考:k8s之calico网络

calico是pod之间实现互连的网络技术,因为每个pod之间需要实现隔离,有需要互连,有别的方案,但是他们都有些弊端

calico是专门为适应容器环境来设计的,目前的最优选

部署一个pod网络到集群中

以下配置calico的两种方式二选一,推荐第一种

4.1 calico网络配置简单命令(推荐)

获取calico.yaml文件资源

l 复制代码
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O

应用到kubectl中

l 复制代码
sudo kubectl apply -f calico.yaml

4.2 根据calico官网命令配置(不一定好用,但可一试)

直接跳转到Quickstart for Calico on Kubernetes进行安装calico

或者根据以下指示去找到安装文档位置

通过初始化完成输出的内容中的网址https://kubernetes.io/docs/concepts/cluster-administration/addons/进入k8s官网文档

在该网页中的Networking and Network Policy部分找到Calico并点击Calico跳转到Calico官网

点击Get started找到TIGERA的官网
https://docs.tigera.io/calico/latest/about

在该网页下方找到install calico部分

选择Quickstart for Calico on Kubernetes

根据Install Calico部分安装colico

命令如下

安装calico 的操作资源(执行命令报错请参考:资源获取报错解决

l 复制代码
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml

安装calico 的自定义资源文件

l 复制代码
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml
l 复制代码
watch kubectl get pods -n calico-system
l 复制代码
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
l 复制代码
kubectl get nodes -o wide

5. 集群节点查看

查看集群节点

l 复制代码
kubectl get nodes

l 复制代码
kubectl get nodes -o wide

6. 集群添加节点

master初始化完成时输出的命令如下

鼠标左键将命令选中即可复制,直接到其他节点鼠标右键即可粘贴

l 复制代码
sudo kubeadm join 192.168.193.128:6443 --token 1cd07a.h2z8wrgngllonwjt \
        --discovery-token-ca-cert-hash sha256:0cc0df38925079b35a0e45e0c43f50f62dc7b3aad2e8414177a18f613c44c9fb



sudo kubeadm join 192.168.193.128:6443 --token vn3qhk.zazsy00qnx5zpejb --discovery-token-ca-cert-hash sha256:0cc0df38925079b35a0e45e0c43f50f62dc7b3aad2e8414177a18f613c44c9fb

参数:

join后跟的是master节点IP地址和端口

--token 后的参数为临时令牌,会过期

--discovery-token-ca-cert-hash
注:加入集群的命令中的token24小时后会过期,过期后需要重新再主节点执行命令生成新的token

6.1 重新生成加入节点的命令

如果忘了这个添加节点的join命令,可以在主节点master用以下命令重新生成新的

l 复制代码
kubeadm token create --print-join-command

然后将得到的命令加上sudo前缀即可到工作节点执行

6.2 将worker1节点加入集群

在K8S-WORKER1节点中执行生成的join命令即可将节点添加到集群中(用你自己生成的命令)

l 复制代码
sudo kubeadm join 192.168.193.128:6443 --token vn3qhk.zazsy00qnx5zpejb --discovery-token-ca-cert-hash sha256:0cc0df38925079b35a0e45e0c43f50f62dc7b3aad2e8414177a18f613c44c9fb

没报错继续下一步,如果报错了,参考文章解决:添加节点到集群时报错处理

6.3 将worker2节点加入集群

在K8S-WORKER2节点中执行相同的命令将worker2节点加入结群

l 复制代码
sudo kubeadm join 192.168.193.128:6443 --token vn3qhk.zazsy00qnx5zpejb --discovery-token-ca-cert-hash sha256:0cc0df38925079b35a0e45e0c43f50f62dc7b3aad2e8414177a18f613c44c9fb

补:hosts配置

将所有的节点的ip对应的名称,添加到每个节点的hosts中

master节点操作如下

l 复制代码
sudo vim /etc/hosts

进入vim界面按i进入编辑,将原有ip注释掉

将以下复制后右键粘贴到vim中,按esc退出编辑后shift+zz保存退出

l 复制代码
192.168.193.128 k8s-master
192.168.193.129 k8s-worker1
192.168.193.130 k8s-worker2

重启虚拟机后生效

查看

l 复制代码
cat /etc/hosts

在worker1和worker2节点分别执行以上操作修改hosts

对worker1和worker2节点操作,修改hostname全改为小写

l 复制代码
hostnamectl set-hostname k8s-worker1
l 复制代码
hostnamectl set-hostname k8s-worker2

6.4 查看已加入集群的节点

在主节点master中执行命令查看集群中节点信息

l 复制代码
kubectl get nodes

然后到工作节点中使用该命令查看集群

报错如下

l 复制代码
The connection to the server localhost:8080 was refused - did you specify the right host or port?

截图如下

原因是kubectl命令使用时需要用到kubernetes中的admin.conf文件

而此文件只有master节点初始化后生成了,工作节点并没有这个文件

解决方法就是将文件从主节点复制到从节点中,再在从节点中配置环境变量生效后即可

请参考:k8s从节点查看集群报错解决

有点套娃的意思,别笑

解决之后如下

到此k8s的安装配置就完成了,接下来就是如何使用,通过可视化工具dashboard,请接着看

六、dashboard配置

在此之前请再次检查防火墙,我这里又去看了下防火墙,又打开了,不知为何故,然后再次关闭后才进行以下操作

1. 安装dashboard

在主节点master中配置dashboard

l 复制代码
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

结果如下,表示安装完成(如果失败,可参考文章使用本地创建文件的方式解决:k8s安装配置dashboard)

2. dashboard端口设置及获取

2.1 type类型

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部

l 复制代码
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard

或者

l 复制代码
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

将type对应的参数修改为NodePort
i-->修改-->esc-->shift+zz

2.2 获取端口号

获取访问端口(后续用于访问dashboard的端口号)

l 复制代码
kubectl get svc -A |grep kubernetes-dashboard

就是下图NodePort对应的端口号,即红框中的部分

3. 创建dashboard访问账号

创建dash.yaml文件

l 复制代码
sudo vim dash.yaml

将以下内容复制(注,文本中的namespace参数与后续操作命令有关,需要注意)

l 复制代码
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

右键将复制的内容粘贴进dash.yaml文件

shift++zz保存退出

应用dash.yaml文件

l 复制代码
kubectl apply -f dash.yaml

应用成功后输出如下

如出现报错Unable to connect to the server: net/http: request canceled (Client.Timeout exceeded while awaiting headers)

可参考解决

4. 获取dashboard的访问token

获取token

l 复制代码
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

获取内容如下,其中最后一行为换行包含用户名@主机名libai@k8s-master

访问token为红框内部分

鼠标左键选中红框内部分,即可将内容复制保存,如下

以下为粘贴的token内容

eyJhbGciOiJSUzI1NiIsImtpZCI6ImRFNzN5YTZIV050Tzl5WGJPcldXdDJVWUh0dEpIM0xXS1ZVVVBOdHVSQVkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTd0ejZiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJlYWQzZjdhOC0yNDZhLTRlMGUtODczZS01NjY4MzI4ZTA4MDAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.NYt1tvFiHylHBpJ37MUbz88UwzWh87azJPpS_yjSrNPVpeLILIkexLk3Vl_d-Cqqz58KtzWamDHU2DcXhcoVFnlxLSoY0py2Qr1Uq-_F1sKxW_hZtrIV9FMGCeun-Y-a7DtP4R6Vq8E6NErRblw9vEA3sCa0vDcGqLPCVIyEY9NJTi2rrKBovH0OEWEwM0PboLgQB1AG2x12JbFCa8AQz_12mI61F0Ysxhoznb3FimSAYGqJ3TNzQzIh3cEgpxNaOeKWIsWLOEQzSeTSE_1W4blfNxw20XM6Gg1oA_1elLtvj4eNrP8Hj-99QPhJquFDSmBDeuOz7WXJSZqSXM2Xew

也可通过命令查看证书token

l 复制代码
kubectl describe secret -n kubernetes-dashboard

5.访问dashboard

5.1 端口查看

l 复制代码
kubectl get svc -n kubernetes-dashboard

或者

l 复制代码
kubectl get service kubernetes-dashboard -n kubernetes-dashboard


5.2 ip查看

查看dashboard服务运行在哪个节点上

l 复制代码
kubectl get pods -n kubernetes-dashboard -o wide

精准查询kubernetes-dashboard

l 复制代码
kubectl get pods -n kubernetes-dashboard -o wide | grep kubernetes-dashboard

或者模糊查询含有dashboard字段的服务

l 复制代码
kubectl get pods -n kubernetes-dashboard -o wide | grep dashboard

可以看到kubernetes-dashboard服务在k8s-worker2节点中

我们到worker2节点使用ifconfig查看ip地址为192.168.193.130

5.3 访问地址

故访问地址为

https://192.168.193.130:30919

访问警告,点开高级

选择继续前往连接

将之前复制的token粘贴进去,登录
登录后即可正常使用k8s的dashboard界面

在集群中可以查看我们的节点及命名空间

注意的点:

  • 每次重启虚拟机后,防火墙自动开启,需要执行命令关闭systemctl stop ufw
  • 每次重启后,需要等几分钟后k8s的相关服务才会启动完成,才可以查看
    可能时间比较久,如果查看到pods状态如下,可再等等

    然后会慢慢变好

    最后恢复正常
  • 访问dashboard的ip是kubernetes-dashboard所在的节点ip并不一定是master节点,所以需要先查看在那个节点上,再用对应的节点ip与端口进行访问

感谢阅读,祝君暴富!

相关推荐
为什么这亚子39 分钟前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
ZHOU西口2 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
牛角上的男孩3 小时前
Istio Gateway发布服务
云原生·gateway·istio
JuiceFS4 小时前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
景天科技苑5 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge6 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇6 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试8 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!14 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis17 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab