K8S搭建(centos)完整版

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


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


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

文章目录


一、环境准备

本文使用三台阿里云服务器,通过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
控制台节点master172.30.0.224k8s-master15G150G
工作节点worker1172.30.0.223k8s-worker115G150G
工作节点worker2172.30.0.222k8s-worker215G150G

4. 软件参数

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

软件software版本version作用function
Docker20.10.4作为k8s的容器运行时环境
Kubernetes1.23.0包含了kubectl、kubeadm、kubelet,是k8s所需的组件
Flannel0.24.0网络组件,构建pod之间建立连接互通

二、服务器设置

1. 基础参数查看

1.1 查看本机ip

ifconfig

1.2 查看系统参数

uname -a

1.3 查看内核参数

cat /proc/version

1.4 查看mac address和product_uuid

需要确保每个机器的mac地址和product_uuid唯一,如果不唯一,安装k8s可能会失败
mac address为软件地址
product_uuid为硬件地址
正常硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。
Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装 失败。
查看mac address

ip link

ifconfig -a

查看product_uuid

cat /sys/class/dmi/id/product_uuid

dmidecode -s system-uuid

1.5 主机参数查看

hostnamectl status

1.6 端口查看

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

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

work节点端口

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

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

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

2.1 防火墙关闭

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

systemctl status firewalld

执行命令后输出的内容如下则表示防火墙已关闭,即Active值为inactive(dead)
在这里插入图片描述
如未关闭则用以下命令关闭防火墙

systemctl disable --now firewalld

systemctl stop firewalld
systemctl disable firewalld

重启机器后生效

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

systemctl start firewalld
systemctl enable firewalld

2.2 交换内存swap分区关闭

kubelet 在 1.8 版本以后强制要求 swap 必须关闭。要不然kubelet 无法正常启动
当内存不够时,swap会使用硬盘块充当额外内存,硬盘io较内存差异较大,严重影响性能,故每个节点都需禁用
查看交换内存使用情况

swapon -s
sudo free -m

如果没被使用则swap那一行的值均为0
在这里插入图片描述

临时禁用Swap

sudo swapoff -a

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

sed -i 's/.*swap.*/#&/' /etc/fstab

或使用vim命令修改

vim /etc/fstab

重启机器后生效
swapoff命令只能临时禁用,重启后会失效
想要永久禁用,则需要用sed那行命令修改配置文件内容,修改/etc/fstab文件中的swap那一行,将其注释
但可能阿里云服务器与常规centos系统有所差异,查看fstab内容如下

cat /etc/fstab

在这里插入图片描述
此处看上去并无swap内容,暂时不管,接着进行

2.3 禁用SELinux

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

sestatus

在这里插入图片描述
如未关闭则执行以下命令关闭,将值设为disabled或permissive
临时关闭

setenforce 0

永久禁用

sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/seliux/config

sed -i 's/enforcing/disabled/' /etc/selinux/config

重启机器后生效

2.4 节点互通配置

2.4.1 修改主机名称

查看主机名称

cat /etc/hostname

或者

hostnamectl status

修改主机名称,使用以下命令
将master主节点命名为k8s-master、工作节点worker1命名为k8s-worker1、工作节点worker2命名为k8s-worker2
以master节点为例

hostnamectl set-hostname k8s-master

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

vim /etc/hostname

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

2.4.2 主机名与ip绑定

以master节点节点为例,其余两个节点相同操作
查看主机与ip配置信息

cat /etc/hosts

在这里插入图片描述
如本机ip已存在,则先删掉或注掉再进行添加,如上图最后一行
添加参数,将主机与ip绑定

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与名称参数填入

vim /etc/hosts

或者使用echo

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 时间同步设置

先查看同步状态

timedatectl status

在这里插入图片描述

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

如未同步,则执行以下命令设置
设置时区(上海时区)

timedatectl set-timezone Asia/Shanghai

设置时间同步

systemctl enable --now chronyd

systemctl start chronyd
systemctl enable chronyd

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

date

在这里插入图片描述

如果是本地创建的虚拟机则还需执行以下命令,如果是云服务器则可忽略
当前UTC时间写入硬件时钟

timedatectl set-local-rtc 0

重启系统时间服务

systemctl restart rsyslog && systemctl restart crond

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

将三台服务器互相加入可信列表,互信互通无障碍
在主节点master中生成ssh秘钥,分发到每个节点
生成ssh秘钥

ssh-keygen -t rsa

一路回车即可
输出如下
在这里插入图片描述
复制生成的秘钥(SHA开头的那一串)到各个节点的可信列表中

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状态

systemctl status docker

启动docker,

systemctl start docker

3. 配置docker

本篇仅配置cgroup驱动,其余不做配置
如需配置镜像加速,参考:配置阿里云镜像加速器
创建docker文件夹,-p参数表示如果存在则不创建

mkdir -p /etc/docker

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

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

在这里插入图片描述
然后查看

cat /etc/docker/daemon.json

在这里插入图片描述
也可用vim进行修改添加
在这里插入图片描述
重启docker,一定要重启docker,不重启这个配置无法生效会导致后续kubeadm初始化报错

systemctl restart docker

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

systemctl enable --now docker

查看状态

systemctl status docker

拓展(可跳过,本篇跳过):
除了修改驱动外,还可以添加其它参数来配置docker
如限制容器日志大小、修改存储类型、docker配置目录可修改等

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版本信息

docker -v
或
docker --version

查看docker详细信息

docker info

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

如果使用的是非root用户,则可以执行以下操作将用户添加到docker组,后续使用docker相关命令无需加sudo前缀
当然也可以不配置,看你心情

添加用户到 docker 组

usermod -aG docker <USERNAME> 

立即更新 docker 组,使之生效

newgrp docker

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

确保网络模块开机自动加载
执行命令

lsmod | grep overlay
lsmod | grep br_netfilter

输出如下
在这里插入图片描述

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

cat > /etc/modules-load.d/docker.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

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

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

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

在这里插入图片描述

执行命令,立即生效

sysctl --system

在这里插入图片描述
在这里插入图片描述

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

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对应的镜像仓库(本篇执行第一个)

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

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

在这里插入图片描述

查看已添加的内容

cat /etc/yum.repos.d/kubernetes.repo

在这里插入图片描述

更新yum资源包

yum makecache

在这里插入图片描述

2. 安装k8s组件

安装kubeadm、kubectl、kubelet

kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。
kubeadm 不能 帮你安装或者管理 kubelet 或 kubectl,所以你需要 确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。

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

yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

安装后输出如下,可看到最下面的五个组件已经安装完毕
在这里插入图片描述

2.2 默认安装最新版

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

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

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

3. 设置开机自启

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

systemctl enable --now kubelet

在这里插入图片描述

4. 查看kubelet状态

systemctl status kubelet

在这里插入图片描述

5. 版本验证

验证kubectl版本

kubectl version

在这里插入图片描述

验证kubeadm版本

yum info kubeadm

在这里插入图片描述

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

安装bash自动补全插件

yum install bash-completion -y

在这里插入图片描述

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

kubectl completion bash >/etc/bash_completion.d/kubectl

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

kubeadm completion bash > /etc/bash_completion.d/kubeadm

五、初始化(master节点)

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

1. 镜像预拉取

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

1.1 查看所需要镜像

加上版本号拉取对应版本

kubeadm config images list --kubernetes-version v1.23.0

在这里插入图片描述

或这里不指定版本

kubeadm config images list

在这里插入图片描述

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

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

kubeadm config images list  --image-repository registry.aliyuncs.com/google_containers

在这里插入图片描述

1.3 拉取镜像

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

kubeadm config images pull  --image-repository registry.aliyuncs.com/google_containers

在这里插入图片描述

2. 初始化操作

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

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命令(包含一长串字符)的内容复制保存下来,后续会用

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

kubeadm reset

移除相关文件

sudo rm -fr ~/.kube/  /etc/kubernetes/* var/lib/etcd/*

六、搭建集群(master节点)

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

1. 配置.kube

创建kube文件

mkdir -p $HOME/.kube

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

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

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

sudo chown $(id -u):$(id -g) $HOME/.kube/config

在这里插入图片描述

2. 配置.bash_profile

编辑文件

vim /root/.bash_profile

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

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

source /root/.bash_profile

在这里插入图片描述

3. 配置网络

在将节点加入集群之前需要先配置网络,这里配置的是Flannel
部署容器网络,CNI网络插件(在Master上执行,),这里使用Flannel实现。
拓展:
著名的CNI网络插件有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目

3.1 kube-flannel.yml

如未安装wget工具可先安装

yum install -y wget

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

wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

在这里插入图片描述

3.2 网段确认

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

cat kube-flannel.yml

往下翻找到net-config.json部分
确保Newwork参数的网段值与执行kubeadm init 输入的网段一致

net-conf.json: |
  {
    "Network": "10.244.0.0/16",
    "Backend"": {
      "Type": "vxlan"
  }
}

在这里插入图片描述
如果不一致请使用vim命令手动修改一致即可

3.3 部署flannel

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

kubectl apply -f kube-flannel.yml

在这里插入图片描述

3.4 查看kube-flannel服务状态

确保flannel对应的pod状态为Running才可正常使用
查看所有pod状态,其中包含kube-flannel

kubectl get pod --all-namespaces

在这里插入图片描述
确保所有容器正常运行,即Running状态
如果有容器没正常启动,可使用如下命令进行查看日志,然后百度搜索解决方案即可

kubectl describe pod NAME -n NAMESPACE

NAME就是容器的全称,如kube-flannel-ds-67521
NAMESPACE就是容器的命名空间,如kube-flannel

4. 查看kubernetes系统状态

查看系统容器状态

kubectl get pod -n kube-system

在这里插入图片描述

5. 主节点状态获取

kubectl get cs

在这里插入图片描述

6. 集群节点查看

查看集群中的节点信息

kubectl get nodes

在这里插入图片描述
目前节点只有k8s-master一个

七、节点加入集群

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

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

注:此命令需在master主节点中执行
初始化完成后输出的join命令,即第五章第2节,将其复制下来

kubeadm join 172.30.0.224:6443 --token 4uhwg7.ldccrwsxmplqahbc \
        --discovery-token-ca-cert-hash sha256:cf6e896414b3d3169774b38f435d7789a1466c83064c173fc56537ba7e949e81

注:token参数有效期24小时,过期则不可用请重新获取
如果忘记保存命令或者token过期,可通过以下命令重新生成加入集群的命令

kubeadm token create --print-join-command

每次获取的命令中token会变,但sha不会变
在这里插入图片描述

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中查看集群

kubectl get nodes

在这里插入图片描述

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

此时在主节点中kubectl相关命令可正常使用,但在从节点中使用kubectl会报端口问题,如下
在这里插入图片描述
原因是从节点中没有admin.conf文件,此文件授权kubectl命令的使用
而该文件只有初始化时在主节点中生成了,从节点中并无,故需要将其复制到从节点并配置环境变量使之生效即可

1. 查看文件(主节点)

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

ls /etc/kubernetes/

在这里插入图片描述

2. 复制文件(主节点)

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

sudo scp /etc/kubernetes/admin.conf root@k8s-worker1:/etc/kubernetes/

k8s-worker2执行相同操作
在这里插入图片描述

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

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

ls /etc/kubernetes

k8s-worker1中已存在admin.conf
在这里插入图片描述
k8s-worker2中已存在admin.conf
在这里插入图片描述

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

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

sudo vim  /etc/profile

将以下内容复制粘贴进去

export KUBECONFIG=/etc/kubernetes/admin.conf

在这里插入图片描述
执行命令使环境变量生效

source /etc/profile

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

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

kubectl get nodes

k8s-worker1可用
在这里插入图片描述
k8s-worker2可用
在这里插入图片描述

九、集群节点的删除

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

1. 释放节点(主节点)

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

kubectl drain k8s-worker2 --delete-local-data --force --ignore-daemonsets

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

2. 删除节点(主节点)

删除节点

kubectl delete node k8s-worker2

3. 重置配置(从节点)

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

kubeadm reset

4. 删除文件(从节点)

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

sudo rm -rf /etc/cni/net.d/
sudo rm -rf /root/.kube/config

删除CNI

ifconfig cni0 down
home]# ip link delete cni0

删除fannel

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的镜像拉取到节点

sudo docker pull kubeoperator/kubepi-server

在这里插入图片描述

1.2 运行容器

运行容器以开启服务

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容器已运行

sudo docker ps

在这里插入图片描述

2. 登录KubePi服务

根据服务所在节点的ip和运行容器时的映射端口登录
如本篇在k8s-worker2上部署的kubepi,k8s-worker2的ip为172.30.0.223
故登录地址为:

http://172.30.0.223:8000

默认用户名为admin
默认密码为kubepi

十、Dashboard配置(主节点)

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

1. 下载并安装dashboard

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

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

在这里插入图片描述

2. 添加用户

创建用户文件dash.yml

vim dash-user.yml

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

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

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

kubectl apply -f dash-user.yaml

在这里插入图片描述

3. 获取token

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

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

在这里插入图片描述
或用以下命令,不过下方这个命令的token内容与用户名挤在一起,还是用上面那个命令吧

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内容:

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

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

本地跳板机

4. 访问dashboard

4.1 查看端口

首先查看dashboard服务的端口

kubectl get svc -n kubernetes-dashboard

kubectl get service kubernetes-dashboard -n kubernetes-dashboard

在这里插入图片描述
此时只有443,且只能集群内部访问,由于三台服务器均为server版,只有黑窗口,无法访问可视化界面
故需要将其端口映射到别的端口,并将权限改为其他地址可访问

4.2 修改type的值

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

kubectl -n kubernetes-dashboard edit service kubernetes-dashboard

在这里插入图片描述
找到如图位置,将type的值改为NodePort

4.3 再次查看端口

然后再次查看端口,可以看到端口号已经被映射到新的端口,32353
在这里插入图片描述

4.4 IP获取

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

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可查看集群节点相关信息
在这里插入图片描述


感谢阅读,祝君暴富!