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 |
---|---|---|---|---|
控制台节点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
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 | 入站 | 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的安装配置,建议关闭防火墙
查看防火墙状态
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
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可查看集群节点相关信息
感谢阅读,祝君暴富!