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

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

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

文章目录

一、环境准备1. 服务器要求2. 服务器参数3. 服务器配置4. 软件参数

二、服务器设置1. 基础参数查看1.1 查看本机ip1.2 查看系统参数1.3 查看内核参数1.4 查看mac address和product_uuid1.5 主机参数查看1.6 端口查看

2. 基础参数设置(每个节点)2.1 防火墙关闭2.2 交换内存swap分区关闭2.3 禁用SELinux2.4 节点互通配置2.4.1 修改主机名称2.4.2 主机名与ip绑定

2.5 时间同步设置2.6 可信列表配置(可跳过,本篇跳过)

三、安装Docker(每个节点)1. 卸载docker2. 安装docker3. 配置docker4. 验证docker版本5. 用户组添加(可跳过,本篇跳过)6 网络模块开机自动加载(可跳过,本篇执行)7. 使桥接流量对iptables可见(可跳过,本篇执行)

四、安装k8s(每个节点)1. 添加kubernetes的镜像仓库2. 安装k8s组件2.1 指定版本安装(本篇执行)2.2 默认安装最新版

3. 设置开机自启4. 查看kubelet状态5. 版本验证6. 配置自动补全命令(可跳过,本篇未执行)

五、初始化(master节点)1. 镜像预拉取1.1 查看所需要镜像1.2 查看镜像仓库地址中的版本列表1.3 拉取镜像

2. 初始化操作3. 重置kubeadm

六、搭建集群(master节点)1. 配置.kube2. 配置.bash_profile3. 配置网络3.1 kube-flannel.yml3.2 网段确认3.3 部署flannel3.4 查看kube-flannel服务状态

4. 查看kubernetes系统状态5. 主节点状态获取6. 集群节点查看

七、节点加入集群1. 加入集群命令获取(主节点)2. 加入集群(从节点)3. 查看集群节点(主节点)

八、从节点中使用kubectl命令(可选,本篇执行)1. 查看文件(主节点)2. 复制文件(主节点)3. 工作节点查看(从节点)4. 配置环境变量(从节点)5. 再次查看集群节点(从节点)

九、集群节点的删除1. 释放节点(主节点)2. 删除节点(主节点)3. 重置配置(从节点)4. 删除文件(从节点)

十、Dashboard配置(任意节点,自选,此部分无法实现,部署后无法登录)1. 部署KubePi1.1 拉取镜像1.2 运行容器1.3 查看容器

2. 登录KubePi服务

十、Dashboard配置(主节点)1. 下载并安装dashboard2. 添加用户3. 获取token4. 访问dashboard(需要跳板机,不适用当前服务器环境)4. 访问dashboard4.1 查看端口4.2 修改type的值4.3 再次查看端口4.4 IP获取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控制台节点master172.30.0.224k8s-master15G150G工作节点worker1172.30.0.223k8s-worker115G150G工作节点worker2172.30.0.222k8s-worker215G150G

4. 软件参数

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

软件software版本version作用functionDocker20.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-schedulerTCP入站10252kube-controller-managerkube-controller-managerTCP入站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 <

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.sockcontainerd/run/containerd/containerd.sockCRI-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 <

{

"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 <

{

"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

立即更新 docker 组,使之生效

newgrp docker

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

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

lsmod | grep overlay

lsmod | grep br_netfilter

输出如下

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

cat > /etc/modules-load.d/docker.conf <

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可查看集群节点相关信息

感谢阅读,祝君暴富!

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: