K8S搭建(centos)完整版

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


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


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

文章目录

  • 一、环境准备
    • [1. 服务器要求](#1. 服务器要求)
    • [2. 服务器参数](#2. 服务器参数)
    • [3. 服务器配置](#3. 服务器配置)
    • [4. 软件参数](#4. 软件参数)
  • 二、服务器设置
    • [1. 基础参数查看](#1. 基础参数查看)
      • [1.1 查看本机ip](#1.1 查看本机ip)
      • [1.2 查看系统参数](#1.2 查看系统参数)
      • [1.3 查看内核参数](#1.3 查看内核参数)
      • [1.4 查看mac address和product_uuid](#1.4 查看mac address和product_uuid)
      • [1.5 主机参数查看](#1.5 主机参数查看)
      • [1.6 端口查看](#1.6 端口查看)
    • [2. 基础参数设置(每个节点)](#2. 基础参数设置(每个节点))
      • [2.1 防火墙关闭](#2.1 防火墙关闭)
      • [2.2 交换内存swap分区关闭](#2.2 交换内存swap分区关闭)
      • [2.3 禁用SELinux](#2.3 禁用SELinux)
      • [2.4 节点互通配置](#2.4 节点互通配置)
        • [2.4.1 修改主机名称](#2.4.1 修改主机名称)
        • [2.4.2 主机名与ip绑定](#2.4.2 主机名与ip绑定)
      • [2.5 时间同步设置](#2.5 时间同步设置)
      • [2.6 可信列表配置(可跳过,本篇跳过)](#2.6 可信列表配置(可跳过,本篇跳过))
  • 三、安装Docker(每个节点)
    • [1. 卸载docker](#1. 卸载docker)
    • [2. 安装docker](#2. 安装docker)
    • [3. 配置docker](#3. 配置docker)
    • [4. 验证docker版本](#4. 验证docker版本)
    • [5. 用户组添加(可跳过,本篇跳过)](#5. 用户组添加(可跳过,本篇跳过))
    • [6 网络模块开机自动加载(可跳过,本篇执行)](#6 网络模块开机自动加载(可跳过,本篇执行))
    • [7. 使桥接流量对iptables可见(可跳过,本篇执行)](#7. 使桥接流量对iptables可见(可跳过,本篇执行))
  • 四、安装k8s(每个节点)
    • [1. 添加kubernetes的镜像仓库](#1. 添加kubernetes的镜像仓库)
    • [2. 安装k8s组件](#2. 安装k8s组件)
      • [2.1 指定版本安装(本篇执行)](#2.1 指定版本安装(本篇执行))
      • [2.2 默认安装最新版](#2.2 默认安装最新版)
    • [3. 设置开机自启](#3. 设置开机自启)
    • [4. 查看kubelet状态](#4. 查看kubelet状态)
    • [5. 版本验证](#5. 版本验证)
    • [6. 配置自动补全命令(可跳过,本篇未执行)](#6. 配置自动补全命令(可跳过,本篇未执行))
  • 五、初始化(master节点)
    • [1. 镜像预拉取](#1. 镜像预拉取)
      • [1.1 查看所需要镜像](#1.1 查看所需要镜像)
      • [1.2 查看镜像仓库地址中的版本列表](#1.2 查看镜像仓库地址中的版本列表)
      • [1.3 拉取镜像](#1.3 拉取镜像)
    • [2. 初始化操作](#2. 初始化操作)
    • [3. 重置kubeadm](#3. 重置kubeadm)
  • 六、搭建集群(master节点)
    • [1. 配置.kube](#1. 配置.kube)
    • [2. 配置.bash_profile](#2. 配置.bash_profile)
    • [3. 配置网络](#3. 配置网络)
      • [3.1 kube-flannel.yml](#3.1 kube-flannel.yml)
      • [3.2 网段确认](#3.2 网段确认)
      • [3.3 部署flannel](#3.3 部署flannel)
      • [3.4 查看kube-flannel服务状态](#3.4 查看kube-flannel服务状态)
    • [4. 查看kubernetes系统状态](#4. 查看kubernetes系统状态)
    • [5. 主节点状态获取](#5. 主节点状态获取)
    • [6. 集群节点查看](#6. 集群节点查看)
  • 七、节点加入集群
    • [1. 加入集群命令获取(主节点)](#1. 加入集群命令获取(主节点))
    • [2. 加入集群(从节点)](#2. 加入集群(从节点))
    • [3. 查看集群节点(主节点)](#3. 查看集群节点(主节点))
  • 八、从节点中使用kubectl命令(可选,本篇执行)
    • [1. 查看文件(主节点)](#1. 查看文件(主节点))
    • [2. 复制文件(主节点)](#2. 复制文件(主节点))
    • [3. 工作节点查看(从节点)](#3. 工作节点查看(从节点))
    • [4. 配置环境变量(从节点)](#4. 配置环境变量(从节点))
    • [5. 再次查看集群节点(从节点)](#5. 再次查看集群节点(从节点))
  • 九、集群节点的删除
    • [1. 释放节点(主节点)](#1. 释放节点(主节点))
    • [2. 删除节点(主节点)](#2. 删除节点(主节点))
    • [3. 重置配置(从节点)](#3. 重置配置(从节点))
    • [4. 删除文件(从节点)](#4. 删除文件(从节点))
  • 十、Dashboard配置(任意节点,自选,此部分无法实现,部署后无法登录)
    • [1. 部署KubePi](#1. 部署KubePi)
      • [1.1 拉取镜像](#1.1 拉取镜像)
      • [1.2 运行容器](#1.2 运行容器)
      • [1.3 查看容器](#1.3 查看容器)
    • [2. 登录KubePi服务](#2. 登录KubePi服务)
  • 十、Dashboard配置(主节点)
    • [1. 下载并安装dashboard](#1. 下载并安装dashboard)
    • [2. 添加用户](#2. 添加用户)
    • [3. 获取token](#3. 获取token)
    • [4. 访问dashboard(需要跳板机,不适用当前服务器环境)](#4. 访问dashboard(需要跳板机,不适用当前服务器环境))
    • [4. 访问dashboard](#4. 访问dashboard)
      • [4.1 查看端口](#4.1 查看端口)
      • [4.2 修改type的值](#4.2 修改type的值)
      • [4.3 再次查看端口](#4.3 再次查看端口)
      • [4.4 IP获取](#4.4 IP获取)
      • [4.5 访问dashboard](#4.5 访问dashboard)

一、环境准备

本文使用三台阿里云服务器,通过yum安装k8s

环境要求参考官网文档:kubernetes官网文档

1. 服务器要求

如自己本地虚拟机搭建,则要求如下:

  • 每台虚拟机运行内存不低于2G、cpu不低于两个、磁盘大小不低于20G
  • 每个节点之间网络互通,即ping成功
  • 主机名称、设备mac地址、产品id即product_uuid均唯一
  • 端口开放

后面会有命令进行验证

2. 服务器参数

阿里云服务器的系统选取为centos,因其使用yum作为软件管理包

由于服务器是阿里云官方自改的系统,所以查看到的系统内核参数并不是常见的参数

服务器参数 参数值
服务器类型名称 阿里云PAM服务器(Alibaba Cloud Privileged Access Management)
操作系统 Alibaba Cloud Linux 3 (Soaring Falcon)
系统内核版本 Linux 5.10.134-15.al8.x86_64

3. 服务器配置

本次使用的服务器配置如下:

节点 ip地址 hostname主机名 运行内存mem 磁盘内存disk
控制台节点master 172.30.0.224 k8s-master 15G 150G
工作节点worker1 172.30.0.223 k8s-worker1 15G 150G
工作节点worker2 172.30.0.222 k8s-worker2 15G 150G

4. 软件参数

软件方面,需要安装Docker和Kubernetes,以及网络组建Flannel

软件software 版本version 作用function
Docker 20.10.4 作为k8s的容器运行时环境
Kubernetes 1.23.0 包含了kubectl、kubeadm、kubelet,是k8s所需的组件
Flannel 0.24.0 网络组件,构建pod之间建立连接互通

二、服务器设置

1. 基础参数查看

1.1 查看本机ip

l 复制代码
ifconfig

1.2 查看系统参数

l 复制代码
uname -a

1.3 查看内核参数

l 复制代码
cat /proc/version

1.4 查看mac address和product_uuid

需要确保每个机器的mac地址和product_uuid唯一,如果不唯一,安装k8s可能会失败

mac address为软件地址

product_uuid为硬件地址

正常硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。

Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装 失败。

查看mac address

l 复制代码
ip link

l 复制代码
ifconfig -a

查看product_uuid

l 复制代码
cat /sys/class/dmi/id/product_uuid

l 复制代码
dmidecode -s system-uuid

1.5 主机参数查看

l 复制代码
hostnamectl status

1.6 端口查看

确保以下对应端口可用(没被别的程序占用)

master节点端口

协议 方向 端口(范围) 作用 使用者
TCP 入站 6443 kubernetes API server 所有组件
TCP 入站 10250 kubelet API kubelet、控制平面组件
TCP 入站 10251 kube-scheduler kube-scheduler
TCP 入站 10252 kube-controller-manager kube-controller-manager
TCP 入站 2379-2380 etcd 服务器客户端API

work节点端口

协议 方向 端口(范围) 作用 使用者
TCP 入站 10250 kubelet API kubelet、控制平面组件
TCP 入站 30000-32767 NodePort服务 所有组件

2. 基础参数设置(每个节点)

以下操作每个节点都要来一遍

2.1 防火墙关闭

为了能正常进行k8s的安装配置,建议关闭防火墙

查看防火墙状态

l 复制代码
systemctl status firewalld

执行命令后输出的内容如下则表示防火墙已关闭,即Active值为inactive(dead)

如未关闭则用以下命令关闭防火墙

l 复制代码
systemctl disable --now firewalld

l 复制代码
systemctl stop firewalld
systemctl disable firewalld

重启机器后生效

后续如需开启防火墙可用命令

l 复制代码
systemctl start firewalld
systemctl enable firewalld

2.2 交换内存swap分区关闭

kubelet 在 1.8 版本以后强制要求 swap 必须关闭。要不然kubelet 无法正常启动

当内存不够时,swap会使用硬盘块充当额外内存,硬盘io较内存差异较大,严重影响性能,故每个节点都需禁用

查看交换内存使用情况

l 复制代码
swapon -s
l 复制代码
sudo free -m

如果没被使用则swap那一行的值均为0

临时禁用Swap

l 复制代码
sudo swapoff -a

永久禁用swap,将fstab文件中的swap参数注释掉

l 复制代码
sed -i 's/.*swap.*/#&/' /etc/fstab

或使用vim命令修改

l 复制代码
vim /etc/fstab

重启机器后生效

swapoff命令只能临时禁用,重启后会失效

想要永久禁用,则需要用sed那行命令修改配置文件内容,修改/etc/fstab文件中的swap那一行,将其注释

但可能阿里云服务器与常规centos系统有所差异,查看fstab内容如下

l 复制代码
cat /etc/fstab

此处看上去并无swap内容,暂时不管,接着进行

2.3 禁用SELinux

kubelet挂载目录时会受SELinux影响,可能会报Permission denied

查看SELinux状态

l 复制代码
sestatus

如未关闭则执行以下命令关闭,将值设为disabled或permissive

临时关闭

l 复制代码
setenforce 0

永久禁用

l 复制代码
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/seliux/config

l 复制代码
sed -i 's/enforcing/disabled/' /etc/selinux/config

重启机器后生效

2.4 节点互通配置

2.4.1 修改主机名称

查看主机名称

l 复制代码
cat /etc/hostname

或者

l 复制代码
hostnamectl status

修改主机名称,使用以下命令

将master主节点命名为k8s-master、工作节点worker1命名为k8s-worker1、工作节点worker2命名为k8s-worker2

以master节点为例

l 复制代码
hostnamectl set-hostname k8s-master

或者使用vim进行修改文件内容

l 复制代码
vim /etc/hostname

针对服务器可以使用shutdown -r来安全重启机器,对于本地虚拟机则手动关机重启即可

2.4.2 主机名与ip绑定

以master节点节点为例,其余两个节点相同操作

查看主机与ip配置信息

l 复制代码
cat /etc/hosts

如本机ip已存在,则先删掉或注掉再进行添加,如上图最后一行

添加参数,将主机与ip绑定

l 复制代码
cat >> /etc/hosts <<EOF
172.30.0.224 k8s-master
172.30.0.223 k8s-worker1
172.30.0.222 k8s-worker2
EOF

或者使用vim命令修改文件,将ip与名称参数填入

l 复制代码
vim /etc/hosts

或者使用echo

l 复制代码
echo "172.30.0.224 k8s-master" >> /etc/hosts
echo "172.30.0.223 k8s-worker1" >> /etc/hosts
echo "172.30.0.222 k8s-worker2" >> /etc/hosts

添加后查看如下

2.5 时间同步设置

先查看同步状态

l 复制代码
timedatectl status
  • 时区参数
    Time zone: Asia/Shanghai(CST, +0800)
    Asia/Shanghai表示上海时区
  • 时钟是否同步参数
    System clock synchronized: yes
    yes为同步
  • 时钟同步服务是否开启
    NTP service: active
    active为已开启

如未同步,则执行以下命令设置

设置时区(上海时区)

l 复制代码
timedatectl set-timezone Asia/Shanghai

设置时间同步

l 复制代码
systemctl enable --now chronyd

l 复制代码
systemctl start chronyd
systemctl enable chronyd

然后输入date命令查看时间验证

l 复制代码
date

如果是本地创建的虚拟机则还需执行以下命令,如果是云服务器则可忽略

当前UTC时间写入硬件时钟

l 复制代码
timedatectl set-local-rtc 0

重启系统时间服务

l 复制代码
systemctl restart rsyslog && systemctl restart crond

2.6 可信列表配置(可跳过,本篇跳过)

将三台服务器互相加入可信列表,互信互通无障碍

在主节点master中生成ssh秘钥,分发到每个节点

生成ssh秘钥

l 复制代码
ssh-keygen -t rsa

一路回车即可

输出如下

复制生成的秘钥(SHA开头的那一串)到各个节点的可信列表中

l 复制代码
ssh-copy-id root@k8s-master
ssh-copy-id root@k8s-worker1
ssh-copy-id root@k8s-worker2

由于适应的是阿里云的服务器,已经有自己的秘钥,故无法覆盖重写,如遇此情况,可跳过该小节,无影响

三、安装Docker(每个节点)

以下操作每个节点都要来一遍

以下为运行时的小短文,可选读

为什么要安装docker:

k8s需要再每个pod中运行容器,所以需要容器运行时,k8s默认使用容器运行时接口(Container Runtime Interface,CRI)与所安装的容器运行时进行交互

在不指定运行时的情况下,kubeadm自动扫描一组Unix域套接字来判定系统已安装的运行时

容器运行时与其对应的套接字路径如下:

容器运行时 域套接字
Docker /var/run/dockershim.sock
containerd /run/containerd/containerd.sock
CRI-O /var/run/crio/crio.sock

如果同时安装了docker和containerd,优先选择docker,原因是docker附带了containerd。除此之外,只要安装docker,就会检测到docker和containerd,当安装了两个或者多个运行时的时候,kubeadm会报错并退出。kubelet通过内置dockershim CRI实现与docker集成。

当安装docker后,则域套接字只会保留一个containerd的,所以默认k8s也会使用containerd作为运行时

containerd是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。containerd可以在宿主机中管理完整的容器生命周期,包括容器镜像的传输和存储、容器的执行和管理、存储和网络等。

docker和containerd的对比:

containerd是从Docker中分离出来的一个项目,可以作为一个底层容器运行时,现在它成了Kubernete容器运行时更好的选择。

k8s移除dockershim集成,推荐使用containerd,其原因大致如下:

当使用docker作为容器运行时,kubelet需要先要通过 dockershim 去调用Docker,再通过Docker去调用containerd。

当使用containerd作为容器运行时,由于containerd内置了 CRI (Container Runtime Interface:容器运行时接口)插件,kubelet可以直接调用containerd。

docker为k8s提供运行时容器引擎,用来运行k8s相关容器

k8s的1.24版本之前,都集成了docker的运行时环境组件,故,只需安装docker,即可使用运行时环境运行k8s的容器组件

在k8s的1.24版本开始kubelet移除了自带的容器运行时的支持,1.24开始就需要自己安装额外的容器运行时支持

本篇k8s以1.23.0版本为例,只需安装docker即可

如非root用户下,需在命令前加sudo前缀获取权限,后续都是如此

本篇docker版本选取为当前最新版本24.0.7-1.el8

1. 卸载docker

参考:docker(yum)卸载

2. 安装docker

参考:docker(yum)安装

安装后,

查看docker状态

l 复制代码
systemctl status docker

启动docker,

l 复制代码
systemctl start docker

3. 配置docker

本篇仅配置cgroup驱动,其余不做配置

如需配置镜像加速,参考:配置阿里云镜像加速器

创建docker文件夹,-p参数表示如果存在则不创建

l 复制代码
mkdir -p /etc/docker

修改cgroup驱动为systemd,这是k8s官方推荐,且不使用这个后续可能会出现一些问题

l 复制代码
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

然后查看

l 复制代码
cat /etc/docker/daemon.json

也可用vim进行修改添加

重启docker,一定要重启docker,不重启这个配置无法生效会导致后续kubeadm初始化报错

l 复制代码
systemctl restart docker

最后设置docker开机自启动,立即生效

l 复制代码
systemctl enable --now docker

查看状态

l 复制代码
systemctl status docker

拓展(可跳过,本篇跳过):

除了修改驱动外,还可以添加其它参数来配置docker

如限制容器日志大小、修改存储类型、docker配置目录可修改等

l 复制代码
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": ["https://vj4iipoo.mirror.aliyuncs.com"],
  "data-root": "/data/docker"
}
EOF

其中最重要的就是cgroup驱动的修改,官方推荐使用systemd,具体原因可参考官网

4. 验证docker版本

查看docker版本信息

l 复制代码
docker -v
或
docker --version

查看docker详细信息

l 复制代码
docker info

5. 用户组添加(可跳过,本篇跳过)

如果使用的是非root用户,则可以执行以下操作将用户添加到docker组,后续使用docker相关命令无需加sudo前缀

当然也可以不配置,看你心情

添加用户到 docker 组

l 复制代码
usermod -aG docker <USERNAME> 

立即更新 docker 组,使之生效

l 复制代码
newgrp docker

6 网络模块开机自动加载(可跳过,本篇执行)

确保网络模块开机自动加载

执行命令

l 复制代码
lsmod | grep overlay
lsmod | grep br_netfilter

输出如下

若无输出或文件不存在则需创建文件如下

l 复制代码
cat > /etc/modules-load.d/docker.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

7. 使桥接流量对iptables可见(可跳过,本篇执行)

所有节点添加网络桥接过滤和地址转发功能

l 复制代码
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

执行命令,立即生效

l 复制代码
sysctl --system


验证是否生效,执行以下命令,返回1则表示生效

l 复制代码
sysctl -n net.bridge.bridge-nf-call-iptables
sysctl -n net.bridge.bridge-nf-call-ip6tables
sysctl -n net.ipv4.ip_forward

四、安装k8s(每个节点)

以下操作每个节点都要来一遍

理论上每个节点都安装kubeadm、kubectl、kubelet是没问题的

但有些人认为对于kubectl仅需在主节点master上安装即可,因为一般来说只会在master主节点操作命令

在主节点操作kubectl命令无需多余配置,但想在从节点操作命令,则需要在从节点也安装kubectl,且配置admin.conf文件

本篇文章以每个节点都需要安装kubectl并配置admin.conf来实现在每个节点上都可以操作kubectl命令

初始化失败需要执行kubeadm reset命令

1. 添加kubernetes的镜像仓库

添加国内的镜像源,此处为阿里云的kubernetes对应的镜像仓库(本篇执行第一个)

l 复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

l 复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

查看已添加的内容

l 复制代码
cat /etc/yum.repos.d/kubernetes.repo

更新yum资源包

l 复制代码
yum makecache

2. 安装k8s组件

安装kubeadm、kubectl、kubelet

kubeadm:用来初始化集群的指令。

kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

kubectl:用来与集群通信的命令行工具。

kubeadm 不能 帮你安装或者管理 kubelet 或 kubectl,所以你需要 确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。

2.1 指定版本安装(本篇执行)

l 复制代码
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

安装后输出如下,可看到最下面的五个组件已经安装完毕

2.2 默认安装最新版

如不指定版本则默认安装最新版本

l 复制代码
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库

3. 设置开机自启

安装完成后,设置开机自动启动,--now表示立即生效,不加则需重启后生效

l 复制代码
systemctl enable --now kubelet

4. 查看kubelet状态

l 复制代码
systemctl status kubelet

5. 版本验证

验证kubectl版本

l 复制代码
kubectl version

验证kubeadm版本

l 复制代码
yum info kubeadm

6. 配置自动补全命令(可跳过,本篇未执行)

安装bash自动补全插件

l 复制代码
yum install bash-completion -y

设置kubectl命令补全,下次login生效

l 复制代码
kubectl completion bash >/etc/bash_completion.d/kubectl

设置kubeadm命令补全,下次login生效

l 复制代码
kubeadm completion bash > /etc/bash_completion.d/kubeadm

五、初始化(master节点)

只在master节点(k8s-master)执行以下操作

1. 镜像预拉取

由于网络限制,k8s镜像拉取受限(要么无法访问,要么速度极慢),需将仓库地址设为国内的仓库地址或者dockerhub用户推送的地址

1.1 查看所需要镜像

加上版本号拉取对应版本

l 复制代码
kubeadm config images list --kubernetes-version v1.23.0

或这里不指定版本

l 复制代码
kubeadm config images list

1.2 查看镜像仓库地址中的版本列表

查看阿里云镜像仓库地址中的镜像列表

l 复制代码
kubeadm config images list  --image-repository registry.aliyuncs.com/google_containers

1.3 拉取镜像

拉起阿里云镜像仓库地址中的镜像,(当然也可以去docker官网拉取,需要确保docker配置了国内镜像地址)

l 复制代码
kubeadm config images pull  --image-repository registry.aliyuncs.com/google_containers

2. 初始化操作

初始化命令,执行相关参数,包含网络地址段和镜像地址

l 复制代码
kubeadm init \
  --apiserver-advertise-address=172.30.0.224 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all

--apiserver-advertise-address 集群通告地址(master 机器IP,这里用的万兆网)
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与上面安装的一致
--service-cidr 集群内部虚拟网络,Pod统一访问入口,可以不用更改,直接用上面的参数
--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致,可以不用更改,直接用上面的参数

初始化成功后会输出如下内容

后续会根据输出的命令进行操作

请先将最后一个命令即kubeadm join命令(包含一长串字符)的内容复制保存下来,后续会用

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 172.30.0.224:6443 --token 4uhwg7.ldccrwsxmplqahbc \
        --discovery-token-ca-cert-hash sha256:cf6e896414b3d3169774b38f435d7789a1466c83064c173fc56537ba7e949e81

注:在初始化之前,重启后kubelet会关闭切已被设置为自动重启,初始化之后查看状态才是激活运行状态

3. 重置kubeadm

如果初始化失败,或者需要重新初始化,可执行以下命令进行重置

重置adm

l 复制代码
kubeadm reset

移除相关文件

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

六、搭建集群(master节点)

根据第五步初始化完成后输出的内容进行集群创建,以下操作在主节点k8s-master上进行

1. 配置.kube

创建kube文件

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

将admin.conf文件复制到kube文件夹下的congfig

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

修改文件权限,从文件所有者修改为文件所有者所在的组中的其他用户,user-->group

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

2. 配置.bash_profile

编辑文件

l 复制代码
vim /root/.bash_profile

将以下内容加入(后两行内容可选,本篇加上)

l 复制代码
export KUBECONFIG=/etc/kubernetes/admin.conf
alias k=kubectl
source <(kubectl completion bash)

参数详情:
export KUBECONFIG=/etc/kubernetes/admin.conf超级用户变量配置
alias k=kubectl设置别名,可用k代替kubectl
source <(kubectl completion bash)设置kubectl命令补全功能

激活.bash_profile

l 复制代码
source /root/.bash_profile

3. 配置网络

在将节点加入集群之前需要先配置网络,这里配置的是Flannel

部署容器网络,CNI网络插件(在Master上执行,),这里使用Flannel实现。

拓展:

著名的CNI网络插件有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目

3.1 kube-flannel.yml

如未安装wget工具可先安装

l 复制代码
yum install -y wget

下载kube-flannel.yml(会下载到当前位置,可用ls查看)

l 复制代码
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

3.2 网段确认

查看配置文件kube-flannel.yml中net-config.json部分的参数

l 复制代码
cat kube-flannel.yml

往下翻找到net-config.json部分

确保Newwork参数的网段值与执行kubeadm init 输入的网段一致

l 复制代码
net-conf.json: |
  {
    "Network": "10.244.0.0/16",
    "Backend"": {
      "Type": "vxlan"
  }
}

如果不一致请使用vim命令手动修改一致即可

3.3 部署flannel

部署命令(如果部署的时候卡在pull镜像的时候,试一试手动用docker将镜像拉取下来):

l 复制代码
kubectl apply -f kube-flannel.yml

3.4 查看kube-flannel服务状态

确保flannel对应的pod状态为Running才可正常使用

查看所有pod状态,其中包含kube-flannel

l 复制代码
kubectl get pod --all-namespaces

确保所有容器正常运行,即Running状态

如果有容器没正常启动,可使用如下命令进行查看日志,然后百度搜索解决方案即可

l 复制代码
kubectl describe pod NAME -n NAMESPACE

NAME就是容器的全称,如kube-flannel-ds-67521

NAMESPACE就是容器的命名空间,如kube-flannel

4. 查看kubernetes系统状态

查看系统容器状态

l 复制代码
kubectl get pod -n kube-system

5. 主节点状态获取

l 复制代码
kubectl get cs

6. 集群节点查看

查看集群中的节点信息

l 复制代码
kubectl get nodes

目前节点只有k8s-master一个

七、节点加入集群

将每个从节点(工作节点)加入集群,以下操作在从节点(k8s-worker1、k8s-worker2)中执行

1. 加入集群命令获取(主节点)

注:此命令需在master主节点中执行

初始化完成后输出的join命令,即第五章第2节,将其复制下来

l 复制代码
kubeadm join 172.30.0.224:6443 --token 4uhwg7.ldccrwsxmplqahbc \
        --discovery-token-ca-cert-hash sha256:cf6e896414b3d3169774b38f435d7789a1466c83064c173fc56537ba7e949e81

注:token参数有效期24小时,过期则不可用请重新获取

如果忘记保存命令或者token过期,可通过以下命令重新生成加入集群的命令

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

每次获取的命令中token会变,但sha不会变

l 复制代码
kubeadm join 172.30.0.224:6443 --token p1cfv3.g2pftg0svd2aprgs --discovery-token-ca-cert-hash sha256:cf6e896414b3d3169774b38f435d7789a1466c83064c173fc56537ba7e949e81

2. 加入集群(从节点)

在工作节点中执行上面生成的join命令即可将工作节点添加到集群中,这里只以k8s-worker1节点为例,worker2操作相同

3. 查看集群节点(主节点)

在主节点k8s-master中查看集群

l 复制代码
kubectl get nodes

八、从节点中使用kubectl命令(可选,本篇执行)

此时在主节点中kubectl相关命令可正常使用,但在从节点中使用kubectl会报端口问题,如下

原因是从节点中没有admin.conf文件,此文件授权kubectl命令的使用

而该文件只有初始化时在主节点中生成了,从节点中并无,故需要将其复制到从节点并配置环境变量使之生效即可

1. 查看文件(主节点)

在主节点中查看admin.conf文件

l 复制代码
ls /etc/kubernetes/

2. 复制文件(主节点)

在主节点中执行命令,将admin.conf文件复制到从节点相同目录下

l 复制代码
sudo scp /etc/kubernetes/admin.conf root@k8s-worker1:/etc/kubernetes/

k8s-worker2执行相同操作

3. 工作节点查看(从节点)

到工作节点中查看文件是否已存在

l 复制代码
ls /etc/kubernetes

k8s-worker1中已存在admin.conf

k8s-worker2中已存在admin.conf

4. 配置环境变量(从节点)

到工作节点中配置环境变量,使admin.conf文件生效,以下命令k8s-worker1和k8s-worker2都执行一遍

l 复制代码
sudo vim  /etc/profile

将以下内容复制粘贴进去

l 复制代码
export KUBECONFIG=/etc/kubernetes/admin.conf

执行命令使环境变量生效

l 复制代码
source /etc/profile

5. 再次查看集群节点(从节点)

在从节点中使用kubectl命令查看集群节点

l 复制代码
kubectl get nodes

k8s-worker1可用

k8s-worker2可用

九、集群节点的删除

当集群中不再需要某个节点时,可用以下操作删除该节点

以k8s-worker2节点为例

1. 释放节点(主节点)

删除节点本地数据释放节点资源,命令如下

l 复制代码
kubectl drain k8s-worker2 --delete-local-data --force --ignore-daemonsets

k8s-worker2 为kubectl get nodes查询到的节点名称

2. 删除节点(主节点)

删除节点

l 复制代码
kubectl delete node k8s-worker2

3. 重置配置(从节点)

在所删除的节点k8s-worker2中执行命令重置k8s配置

l 复制代码
kubeadm reset

4. 删除文件(从节点)

在所删除的节点k8s-worker2中执行命令删除相关配置文件(k8s相关配置、flannel网络配置和网口)

l 复制代码
sudo rm -rf /etc/cni/net.d/
sudo rm -rf /root/.kube/config

删除CNI

l 复制代码
ifconfig cni0 down
home]# ip link delete cni0

删除fannel

l 复制代码
ifconfig flannel.1 down
ip link delete flannel.1

十、Dashboard配置(任意节点,自选,此部分无法实现,部署后无法登录)

使用Kubepi进行k8s集群的日常管理

拓展:

Kubepi是一个简单高效的k8s集群图形化管理工具,方便日常管理K8S集群,高效快速的查询日志定位问题的工具

1. 部署KubePi

https://zhuanlan.zhihu.com/p/627310856?utm_id=0

部署的位置可选任意节点,本篇以k8s-worker1节点部署为例

到k8s-worker1节点中操作

1.1 拉取镜像

将kubepi的镜像拉取到节点

l 复制代码
sudo docker pull kubeoperator/kubepi-server

1.2 运行容器

运行容器以开启服务

l 复制代码
sudo docker run --privileged -itd --restart=unless-stopped --name dashboard_kubepi \
-v /home/docker-mount/kubepi/:/var/lib/kubepi/ -p 8000:80 kubeoperator/kubepi-server

1.3 查看容器

查看运行的容器,kubepi-server容器已运行

l 复制代码
sudo docker ps

2. 登录KubePi服务

根据服务所在节点的ip和运行容器时的映射端口登录

如本篇在k8s-worker2上部署的kubepi,k8s-worker2的ip为172.30.0.223

故登录地址为:

h 复制代码
http://172.30.0.223:8000

默认用户名为admin

默认密码为kubepi

十、Dashboard配置(主节点)

使用dashboard作为可视化界面管理k8s集群

1. 下载并安装dashboard

在主节点k8s-master中下载dashboard的配置文件安装dashboard

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

2. 添加用户

创建用户文件dash.yml

l 复制代码
vim dash-user.yml

然后将以下内容复制到文件中

yaml 复制代码
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

如果上方的文件内容复制后格式发生变化,建议将格式手动校准,不然可能应用时会报错

应用文件,生效

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

3. 获取token

访问所需的token用以下命令生成

l 复制代码
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

或用以下命令,不过下方这个命令的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}}"

token内容:

text 复制代码
eyJhbGciOiJSUzI1NiIsImtpZCI6Im1MSmVsZGdNWlBaLVlMM180eXp3WXpuMDhOZ1YzV0s2RUNEYzJzT0R0QWsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWh0Nm5wIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJjMjg3OTIwZi1iYjMzLTQxNzQtOWE4NS1kYTJjODAzYzhhZTYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.dNKHA0x-Vh8i31USt-IhP5PNRnghpCEVrnw6EoL_L1I_Xt2pPQ40kGoAA3WRjKOr6RzxhiYIbx2Jfnd8aZpgo6RgFNzjKHXtk7h2zJ2RjZ8yuEk8RmpzpZqbOc_qBCeuNG9h5gL_xDOGa7zyg6CMkm7yuTI7rYjhMwapIw_SrdMYaQsZqj3BE0nIfiFzBHdp4y10Tukk4K2hE74FobHqyHyQp3exrz8SbGsCW7sw4Bun6-CAhRlwHiy5LoYoVSj-cuVldCmhD9jdNzeD0b3KsOmcGXnDTVxBqcH_u3OoMriRVQ-KCNfixnb9_x43G94NqvW6CKuA0x1ac520Cv6oUw

4. 访问dashboard(需要跳板机,不适用当前服务器环境)

因为本篇为生产环境搭建,所以使用代理方式访问,不暴露ip和端口

参考:https://segmentfault.com/a/1190000023130407

k8s-master主节点上启动kube-proxy

l 复制代码
kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

本地跳板机

4. 访问dashboard

4.1 查看端口

首先查看dashboard服务的端口

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

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

此时只有443,且只能集群内部访问,由于三台服务器均为server版,只有黑窗口,无法访问可视化界面

故需要将其端口映射到别的端口,并将权限改为其他地址可访问

4.2 修改type的值

修改service的type为NodePort,暴露到外部进行访问

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

找到如图位置,将type的值改为NodePort

4.3 再次查看端口

然后再次查看端口,可以看到端口号已经被映射到新的端口,32353

4.4 IP获取

获取服务所在的节点的IP地址

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

如图可知服务运行在k8s-worker2节点上,ifconfig命令查看该节点的ip该节点的ip,为172.30.0.222

4.5 访问dashboard

根据以上查询到的端口号和服务运行所在节点的ip地址

访问dashboard的地址为ip+端口号

https://172.30.0.222:32353

注:一定要加上https://前缀,不然可能只会返回一串字符Client sent an HTTP request to an HTTP server.

访问链接后提示您的连接不是私密连接,可选高级,然后继续前往连接即可

出现如下界面

将token复制粘贴进去

登录成功后可正常使用

在集群中找到Nodes可查看集群节点相关信息


感谢阅读,祝君暴富!

相关推荐
小电玩5 分钟前
JAVA SE8
java·开发语言
路溪非溪18 分钟前
Linux内核启动流程
linux·运维·服务器
努力的布布24 分钟前
Spring源码-从源码层面讲解声明式事务的运行流程
java·spring
程序员大金30 分钟前
基于SpringBoot的旅游管理系统
java·vue.js·spring boot·后端·mysql·spring·旅游
小丁爱养花31 分钟前
记忆化搜索专题——算法简介&力扣实战应用
java·开发语言·算法·leetcode·深度优先
大汉堡~37 分钟前
代理模式-动态代理
java·代理模式
anddddoooo39 分钟前
vulnhub(11):derpnstink(hydra爆破用户名和密码、验证的文件上传)
linux·运维·服务器·安全·web安全·网络安全
爱上语文42 分钟前
Springboot三层架构
java·开发语言·spring boot·spring·架构
Xinan_____43 分钟前
Linux——k8s认识
linux·运维·kubernetes
loveLifeLoveCoding1 小时前
Java List sort() 排序
java·开发语言