当前位置: 首页 > web >正文

搭建K8s集群平台(详细版)

项目背景知识

系统需求

  • 某企业需要使用docker容器技术搭建k8s容器编排工具来管理所有的容器,由于业务量较大所以使用集群技术实现

docker概述

  • Docker是基于Go语言实现的云开源项目。

  • Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

k8s概述

概念
  • kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写,名字起源于希腊语,含义是 舵手领航员向导。Google于2014年将Brog系统开源为Kubernetes

  • k8s是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

组成
  • 一个kubernetes集群主要是由控制节点(master)工作节点(node)构成,每个节点上都会安装不同的组件

  • master:集群的控制平面,负责集群的决策

    • ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

    • Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

    • ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

    • Etcd :负责存储集群中各种资源对象的信息

  • node:集群的数据平面,负责为容器提供运行环境

    • kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理

    • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)

    • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡

分层架构

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

  • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等

  • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

集群规划
  • kubernetes集群大体上分为两类:一主多从多主多从

    • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境

    • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

 K8s常用名词感念

  • Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

  • Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的

  • Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

  • Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

  • Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

  • Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

  • NameSpace:命名空间,用来隔离pod的运行环境

k8s常用命令

集群信息查询

kubectl  version: 查看集群的版本信息
kubectl  api-versions: 输出一系列的 API 组及其对应的版本号
kubectl  api-resources:输出服务端 API 支持的资源类型
kubectl  cluster-info: 查看集群信息
kubectl  cluster-info dump: 查看集群更详细的信息

 资源详细信息查看

kubectl  describe  <资源类型,如:deployments>  <资源名称>: 查看特定资源的详细信息
kubectl  -n  <命名空间>  describe  pod  <pod-name>: 查看指定命名空间下指定 pod 的详细信息,加-o wide参数显示详细信息
kubectl  describe  nodes:显示集群节点资源: CPU、GPU、内存的使用情况以及标签;nodes 后可加具体节点名

 资源创建

kubectl  apply  -f <文件名>: 更新资源&创建资源(推荐)
kubectl  create  -f <文件名>: 创建资源
kubectl  create  -f.: 创建当前目录下的所有 yaml 资源
kubectl  create  -f./app1.yaml -f./app2.yaml: 批量创建资

资源删除

kubectl  delete  pod  <pod-name>: 删除指定 pod
kubectl  delete  service  <service-name>: 删除指定 service
kubectl  delete  <资源类型>  <资源名称>: 删除指定资源
kubectl  delete  -f./pod.json: 删除 pod.json 文件中定义的类型和名称的 pod
kubectl  delete  pods  --all  -n  <命名空间>: 删除指定命令空间下所有的 pod;pods 改为 services 即为删除所有的 services
kubectl  delete  pod  <pod-name>  -n <命令空间>  --force  --grace-period=0: 强制删除 pod
kubectl  delete  pods  <pod-name>  -n  <命名空间>: 静态 POD 直接删除,非静态 POD 重启
kubectl  delete  pods,services  -l  name=<标签名>: 删除指定标签 pod 和 serivce;加--include-uninitialized(含尚未初始化)

 资源扩缩容

kubectl  scale  <资源类型,如 rc>  <资源名称,如 rc-nginx-2>  --replicas=5扩展副本数到 5
kubectl  scale  rc  rc-nginx-2 —replicas=3: 副本数缩减到 3
kubectl  autoscale  deployment  my-app  --min=3  --max=10: 自动扩缩容 my-app 的部署,指定副本范围在 3~10
注:--cpu-percent=80:上条命令结尾增加此参数,代表当 CPU 使用率达到 80% 时触发以上自动扩缩容操作

资源使用情况查询

kubectl  top  node  k8s-node: 显示节点(k8s-node)资源的使用情况
kubectl  top  node: 显示集群所有节点的资源的使用情况
kubectl  top  pod  -n  logging: 显示指定命名空间(如,logging)的 pod 的资源的使用情况

 资源注解更新

kubectl  annotate  pods  <pod-name>  description='my frontend': 更新 pod,设置其注解description的值为my fronten

 容器操作

kubectl  -n <命名空间>  exec  -it  <Pod 名称>  -- bash: 登录容器的命令
kubectl  -n <命名空间>  cp  /opt/sql  <Pod 名称>:/tmp/: 复制本机/opt/sql 路径下的文件到 pod 的 /tmp/路径下
kubectl  -n  <命名空间>  cp  <Pod 名称>:/tmp/app_bak  ./mysql_bak/: 复制 Pod 内app_bak路径所有文件到本地 mysql_bak 路径

回滚和历史查看

cat  pod.json  |  kubectl apply -f -: 将控制台输入的 JSON 配置应用到 Pod
kubectl  rollout  history  deployment  nginx-deployment: 查看修订版本的历史记录
kubectl  rollout  undo  deployment  nginx-deployment  --to-revision=1: 如果不加 –to-revision=版本号,会回退到上一个版本

资源配额与限制查看

kubectl  describe  quota: 查看集群的资源配额
kubectl  describe  limitrange: 查看集群的资源限制

 日志查看

kubectl  logs  -f  <Pod 名称>  -n  <命名空间>: 查看指定 Pod 的日志
kubectl  logs  --tail=10  <Pod 名称>: 查看指定 pod 的最后 10 行日志
kubectl  logs  <Pod 名称>  -n  <命名空间>  |  grep 关键字:根据关键字查看日志

 节点与标签操作

kubectl  get  nodes  --show-labels: 查看所有节点和 label
kubectl  label  nodes  <节点名>  <标签键>=<标签名>: 给节点增加标签
kubectl  label  nodes  <节点名>  <标签键>-: 给节点去掉(删除)标签
kubectl  taint  nodes  <节点名>  <标签键>=true:NoSchedule: 给节点增加污点
kubectl  taint  nodes  <节点名>  <标签键>:NoSchedule-: 给节点去掉(删除)污点
kubectl  taint  nodes  --all  <标签键>:NoSchedule-: 删除所有节点的指导标签 

服务编辑

 kubectl  edit  svc/docker-registry: 编辑名为 docker-registry 的 service

 资源列表查看

kubectl  get  pods  -A: 查看所有的 pod
kubectl  get  pods  -n  <命名空间>: 查看特定命名空间下的 Pod 列表
kubectl  get  po -A|grep -Ev '1/1|2/2|3/3|4/4|Com': 查看异常 pod 的列表
kubectl  get  pods  -o  wide  |  grep  <需查询 pod 的关键字>: 查询包含特定关键字的 Pod,并且输出详细信息
kubectl  get  namespaces: 查看命名空间列表
kubectl  get  nodes: 查看节点列表,加上--show-labels查看label,可以加上 -o wide 查看 IP
kubectl  get  services: 查看集群中服务的状态
kubectl  get  statefulset: 查看 statefulset 列表,中间件与底座大量使用该类型控制器
kubectl  get  daemonset: 查看 daemonset 列表,基础组件大量使用该类型控制器
kubectl  get  deployments: 查看 deployment 列表,大部分组件使用该类型控制器
kubectl  get  svc: 查看服务列表,可指定参数 -A 参看所有命名空间中的服务
kubectl  get  ingress -A: 查看域名列表,指定参数 -A 参看所有命名空间中的对外域名列表
kubectl  get  crd -A: 查看自定义资源列表
kubectl  get  networkpolicies: 查看集群的网络策略
kubectl  get  storageclass: 查看集群的存储类

 资源格式信息获取

kubectl  get  <资源类型,如 deployment>  <资源名称,如 my-deployment>  -o  yaml: 获取指定 namespace 的 yaml 格式格式信息
kubectl  get  <资源类型,如 deployment>  <资源名称,如 my-deployment>  -o  json:获取指定 namespace 的 json 格式信息

 节点调度管理

kubectl  cordon  k8s-node: 标记 k8s-node 节点不可调度
kubectl  uncordon  k8s-node: 标记 k8s-node 节点可调度
kubectl  drain  k8s-node: 排除 k8s-node 节点,准备进行维护

kuboard

官网:Kuboard_Kubernetes教程_K8S安装_管理界面
概述

  • Kuboard 是一款免费的 Kubernetes 管理工具,提供了丰富的功能,结合已有或新建的代码仓库、镜像仓库、CI/CD工具等,可以便捷的搭建一个生产可用的 Kubernetes 容器云平台,轻松管理和运行云原生应用。

  • 使用 Kuboard 直接安装到现有的 Kubernetes 集群,通过 Kuboard 提供的 Kubernetes RBAC 管理界面,将 Kubernetes 提供的能力开放给您的开发/测试团队。

软硬件环境清单

  • 架构:使用kubeadm实现k8s+docker+cri-dockerd实现集群部署

  • 使用三台虚拟机实现

任务清单

系统环境搭建

对每台机器进行Centos7.9系统的安装、

初始化系统

  • 关闭swap、防火墙、selinux

  • 设置主机名等

  • 域名映射

时间同步设置

升级系统软件及内核

k8s环境准备

  • 配置k8s镜像源

  • 为所有节点安装Docker并配置

  • 安装kubeadm、kubelet和kubectl

配置集群

  • 主节点上使用kubeadm init 初始化

  • 置网络插件

  • 添加加剩余节点

配置可视化工具

服务测试

实验步骤

系统环境搭建

安装Centos7.9

  • 三台主机都需安装

  • 操作系统环境:CPU(2C) 内存(4G) 硬盘(20G)

  • 语言选择:中文简体

  • 软件选择:基础设施服务器

  • 分区选择:自动分区

  • 注意:过程略

配置静态

  • 三台主机的IP地址:192.168.194.200

  •                                  192.168.194.201

  •                                 192.168.194.202

  • 子网掩码:255.255.255.0

  • 默认网关:192.168.194.2

  • DNS: 223.5.5.5

  • 三台主机都需重启网络服务

k8s-master:
root@localhost ~]# vi  /etc/sysconfig/network-scripts/ifcfg-ens33TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=50925408-dc19-4417-adbb-1d68c8ea78a0
DEVICE=ens33
ONBOOT=yes
IPADDR="192.168.194.200"
NETMASK="255.255.255.0" 
GATEWAY="192.168.194.2" 
DNS1="114.114.114.114" 
TYPE=Ethernetroot@localhost ~]# systemctl restart network

k8s-node1:
root@localhost ~]# vi  /etc/sysconfig/network-scripts/ifcfg-ens33TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=50925408-dc19-4417-adbb-1d68c8ea78a0
DEVICE=ens33
ONBOOT=yes
IPADDR="192.168.194.201"
NETMASK="255.255.255.0" 
GATEWAY="192.168.194.2" 
DNS1="114.114.114.114" 
TYPE=Ethernetroot@localhost ~]# systemctl restart network
 k8s-node2:
root@localhost ~]# vi  /etc/sysconfig/network-scripts/ifcfg-ens33TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=50925408-dc19-4417-adbb-1d68c8ea78a0
DEVICE=ens33
ONBOOT=yes
IPADDR="192.168.194.202"
NETMASK="255.255.255.0" 
GATEWAY="192.168.194.2" 
DNS1="114.114.114.114" 
TYPE=Ethernetroot@localhost ~]# systemctl restart network

关闭安全软件

三台主机都需执行(步骤一样,其他两台主机就不详细写了)

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# vi /etc/selinux/config
SELINUX=disabled

 关闭swap空间

三台主机都需执行(步骤一样,其他两台主机就不详细写了)

[root@localhost ~]# swapoff  -a
[root@localhost ~]# sed  -i  '/swap/ s/^/#/'  /etc/fstab

记得重启一下

域名映射

三台主机都需执行(步骤一样,其他两台主机就不详细写了)

cat << EOF >> /etc/hosts
192.168.194.200 k8s-master
192.168.194.201 k8s-node1
192.168.194.202 k8s-node2
EOF

下载升级软件

三台主机都需执行(步骤一样,其他两台主机就不详细写了)

* 这里yum源出现了问题看后面我是怎么解决的*

[root@localhost ~]# yum  install  chrony  vim  tree  net-tools  wget -y
[root@localhost ~]# yum  update -y# 使用xftp上传新内核kernelkernel-ml-5.10.48
[root@localhost ~]# yum  install  kernel-ml-5.10.48-1.el7.x86_64.rpm -y# 设置grub2默认引导为0
[root@ocalhost ~]# grub2-set-default  0# 重新生成grub2引导文件
[root@ocalhost  ~]# grub2-mkconfig  -o  /boot/grub2/grub.cfg

设置主机名

三台主机各自执行

[root@localhost ~]# hostnamectl  set-hostname  k8s-master
[root@localhost ~]# hostnamectl  set-hostname  k8s-node1
[root@localhost ~]# hostnamectl  set-hostname  k8s-node2[root@localhost ~]# reboot# 重启后,需要验证内核是否为更新对应的版本
[root@k8s-node2 ~]# uname -r
5.10.48-1.el7.x86_64

调整内核参数

三台主机都需执行(步骤一样,其他两台主机就不详细写了)

修改linux的内核参数,添加网桥过滤和地址转发功能

vim /etc/sysctl.d/k8s.conf
# 编辑/etc/sysctl.d/k8s.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0

# 重新加载配置
sysctl -p /etc/sysctl.d/k8s.conf# 确认网桥转发已经是1
sysctl net.bridge.bridge-nf-call-iptables
# 显示结果:net.bridge.bridge-nf-call-iptables = 1

  • 配置ipvs功能,在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的,两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

# 1 安装ipset和ipvsadm
yum install ipset ipvsadm -y#如果下载有问题,记得重新建yum源,删掉之前的,再进行yum clean all   yum  makecache # 2 添加需要加载的模块写入脚本文件
cat << EOF >  /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF# 3 为脚本文件添加执行权限
chmod  +x  /etc/sysconfig/modules/ipvs.modules# 4 执行脚本文件
/bin/bash  /etc/sysconfig/modules/ipvs.modules# 5 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

设置时间同步

# 修改配置文件
vim /etc/chrony.conf    
server ntp1.aliyun.com iburst# 启动chronyd服务
systemctl enable  --now  chronyddate

k8s环境准备

安装docker

  • 三台主机都需要安装(步骤一样,其他两台主机就不详细写了)

  • 配置docker源

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install docker-ce -y
  • 配置镜像加速器及Cgroup Driver(再华为云里找到自己的镜像加速器)

vim /etc/docker/daemon.json      # 添加如下
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": 	[ "https://09e875b18c194781aed5c5b7b32c7255.mirror.swr.myhuaweicloud.com",  "https://docker.1ms.run","https://docker.1panel.live/"]
}

# 启动并开机启动
systemctl  enable  --now dockerdocker info

安装cri-dockerd

  • 三台主机都需安装(步骤一样,其他两台主机就不详细写了)

  • 作用:Docker与Kubernetes通信的中间程序

  • K8s的1.24版本以后移除了docker-shim,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合,为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI的规范,从而能够让Kubernetes基于CRI控制Docker ,所以想在K8s的1.24版本及以后的版本中使用docker,需要安装cri-dockerd,然后K8s集群通过cri-dockerd联系到docker(注意每个节点都要安装)

  • 项目地址:https://github.com/Mirantis/cri-dockerd/releases

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2-3.el7.x86_64.rpmrpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm# 注意:若下载超时,可使用xftp上传本地安装包 (建议用xftp上传)

配置服务并启动

# 修改启动文件 /usr/lib/systemd/system/cri-docker.servicevim /usr/lib/systemd/system/cri-docker.service   # 修改ExecStart=改行值
...
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d
...

# 启动cri-docker
systemctl  daemon-reload
systemctl  enable  --now  cri-docker
systemctl  status cri-docker

安装k8s

  • 三台主机都需安装(步骤一样,其他两台主机就不详细写了)

  • 配置阿里源

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

  • 安装k8s工具

    • kubeadm:用于初始化集群,并配置集群所需的组件并生成对应的安全证书和令牌;

    • kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;

    • kubectl:用于管理k8集群的一个命令行工具;

yum  install  kubelet-1.28.0  kubeadm-1.28.0  kubectl-1.28.0  -y# 设置kubelet开机启动,注意:不需要直启动,初始化过程会启动
systemctl enable kubelet
  • 注意:建议此处每台主机制作一次快照

**配置以上命令可以先配置好一台主机,其他两台可以克隆**修改主机名,打开nmtui修改IP,先撤销后激活

集群搭建

k8s-master节点初始化

[root@k8s-master ~]# kubeadm init --kubernetes-version=v1.28.0 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.200 --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers# 显示结果,初始化需要拉取镜像,耗时较长,请等待.....
[init] Using Kubernetes version: v1.28.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.194.200]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.194.200 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.194.200 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 11.008400 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-master as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node k8s-master as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: n00yuj.vt34dvytdpihts1p
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxyYour Kubernetes control-plane has initialized successfully!   #成功To start using your cluster, you need to run the following as a regular user:
# 普通账户执行:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:
# root账户执行: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.194.200:6443 --token n00yuj.vt34dvytdpihts1p \--discovery-token-ca-cert-hash sha256:3e6263b7fe647fc87858f99d3232cedc69295bc77664429781c5513667b58e7d 

注意:说明不用执行

k8s-master节点配置认证文件

  • 根据初始化的提示完成认证

  • 若当前为root账户,则使用下列命令配置认证

[root@k8s-master ~]# vim /etc/profile
# 在最底部增加新的环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf[root@k8s-master ~]# source /etc/profile

node节点加入集群

根据初始化的信息提示,使用下面命令加入集群

[root@k8s-node1 ~]# kubeadm join 192.168.194.200:6443 --token n00yuj.vt34dvytdpihts1p \
> --discovery-token-ca-cert-hash sha256:3e6263b7fe647fc87858f99d3232cedc69295bc77664429781c5513667b58e7d --cri-socket unix:///var/run/cri-dockerd.sock

[root@k8s-node2 ~]# kubeadm join 192.168.194.200:6443 --token n00yuj.vt34dvytdpihts1p \
> --discovery-token-ca-cert-hash sha256:3e6263b7fe647fc87858f99d3232cedc69295bc77664429781c5513667b58e7d --cri-socket unix:///var/run/cri-dockerd.sock

使用kubectl工具查看节点状态

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES           AGE     VERSION
k8s-master   NotReady   control-plane   43m     v1.28.0
k8s-node1    NotReady   <none>          6m57s   v1.28.0
k8s-node2    NotReady   <none>          6m48s   v1.28.0

# 注:由于网络插件还没有部署,节点会处于"NotReady"状态

# 修改2个woker节点的标签名

kubectl label node k8s-node1 node-role.kubernetes.io/worker=worker 
kubectl label node k8s-node2 node-role.kubernetes.io/worker=worker 

配置calico网络插件

[root@k8s-master ~]# wget  https://docs.projectcalico.org/manifests/calico.yaml# 修改配置
[root@master ~]# vim calico.yaml 
...- name: CALICO_IPV4POOL_CIDR           # 去掉注释value: "10.244.0.0/16"               # 去掉注释,修改。# Cluster type to identify the deployment type- name: CLUSTER_TYPEvalue: "k8s,bgp"
# 下方熙增新增2行- name: IP_AUTODETECTION_METHODvalue: "interface=ens32"           # 修改为k8s-master的真实网卡名- name: CALICO_IPV4POOL_IPIPvalue: "Never"                    # 修改为Never# 注意:使用空格作为间隔符,不要用tab键

[root@k8s-master ~]# kubectl apply -f calico.yaml    # 应用配置poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created

查看node状态

[root@k8s-master ~]# kubectl get node
NAME         STATUS   ROLES           AGE    VERSION
k8s-master   Ready    control-plane   109m   v1.28.0
k8s-node1    Ready    <none>          72m    v1.28.0
k8s-node2    Ready    <none>          72m    v1.28.0
# 注意:若出现NotReady,需要等待片刻在重新查看(1分钟左右)

[root@k8s-master ~]# kubectl get node  -o wide
NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP       EXTERNAL-IP        CONTAINER-RUNTIME
k8s-master   Ready    control-plane   41m   v1.28.0   192.168.194.200   <none>        64   docker://26.1.4
k8s-node1    Ready    worker          27m   v1.28.0   192.168.194.201   <none>        64   docker://26.1.4
k8s-node2    Ready    worker          24m   v1.28.0   192.168.194.202   <none>        64   docker://26.1.4

[root@k8s-master ~]# kubectl get pods -n kube-system
# 注意 READY列都是1 表示以启动NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-658d97c59c-kfpt4   1/1     Running   0             5m28s
calico-node-5jgz4                          1/1     Running   0             5m28s
calico-node-ntgq5                          1/1     Running   0             5m28s
calico-node-p428l                          1/1     Running   0             5m28s
coredns-66f779496c-qjgzk                   1/1     Running   0             43m
coredns-66f779496c-qnkm9                   1/1     Running   0             43m
etcd-k8s-master                            1/1     Running   0             43m
kube-apiserver-k8s-master                  1/1     Running   0             43m
kube-controller-manager-k8s-master         1/1     Running   2 (43m ago)   43m
kube-proxy-bx5zk                           1/1     Running   0             29m
kube-proxy-pppg9                           1/1     Running   0             26m
kube-proxy-vjr4s                           1/1     Running   0             43m
kube-scheduler-k8s-master                  1/1     Running   2 (43m ago)   43m
[root@k8s-master ~]# 

设置kubectl命令自动补全(选做)
[root@k8s-master ~]# yum install  bash-completion  -y
[root@k8s-master ~]# source  /usr/share/bash-completion/bash_completion
[root@k8s-master ~]# source <(kubectl completion bash)
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

安装可视化平台

使用docker安装

[root@k8s-master ~]# docker run -d  --restart=unless-stopped  --name=kuboard  -p 2728:80/tcp  -p 10081:10081/tcp  -e KUBOARD_ENDPOINT="http://192.168.194.200:2728"  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081"  -v /root/kuboard-data:/data  eipwork/kuboard:v3# 注意:
# -p 2728:80/tcp \                 # 宿主机端口可以修改为任意未使用端口
# -e KUBOARD_ENDPOINT="http://192.168.88.200:2728" \  # 改为k8s-master的ip

浏览器访问并配置

  • 打开浏览器输入:http://192.168.194.200:2728

  • 登录

    • 账户:admin

    • 密码:Kuboard123

  • 添加集群:

    • 输入名称:k8s-yh (不能有中文)

    • 描述:测试

    • 点击复制按钮,将脚本内容粘贴到k8s-master端后复制红色字段内容在粘贴回浏览器页面的Token对话框中

    • Apiserver 地址:https://192.168.194.200:6443 (替换为你的k8s-master的ip)

    • 点击确定

选择访问集群所使用的身份 

完成 

服务部署

部署nginx服务

执行下列命令

[root@k8s-master ~]# kubectl create deployment nginx --image=nginx:latest
deployment.apps/nginx created
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

查看

[root@k8s-master ~]# kubectl get service   # 注意nginx映射端口
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP  PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>       443/TCP        15m
nginx        NodePort    10.103.128.155 <none>       80:30274/TCP   5m46s[root@k8s-master ~]# kubectl get pods  -o wide   # 服务部署在k8s-node2上
NAME                     READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
nginx-56fcf95486-p95wx   1/1     Running   0          6m4s   10.244.169.128   k8s-node2   <none>           <none>

访问:浏览器输入 http://192.168.194.200:30125

kuboard中查看

安装监控套件

  • 点击:==安装metrics-server==

  • Metrics Server 是集群级别的资源利用率数据的聚合器。从 Kubelets收集资源指标,并通过 Metrics API 在 Kubernetes apiserver 中公开它们,以供 Horizontal Pod Autoscaler 和Vertical Pod Autoscaler 使用

一直点击下一步直到确定

点击应用

进行测试:再刷新一下网页 

[root@k8s-master ~]# kubectl top nodes
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master   524m         13%    2151Mi          56%       
k8s-node1    180m         9%     877Mi           23%       
k8s-node2    201m         10%    974Mi           25%       
[root@k8s-master ~]# 

安装pod监控曲线面板

以nginx的pod为例,点击==安装metrics-scraper==按钮

选择镜像库后确定(选第二个) 

多进行刷新

完成界面 

项目完成!!!

做项目中出现的问题以及解决方案

 问题1:集群K8S时端口号被占用。

解决方案:找到被占用的端口号和与之对应对应的进程,杀死进程,重新集群。

问题2:出现以下问题是yum源有问题。


解决方案:按照我给出的命令进行更换yum源,其中CentOs-7.repo在官网找,并下载,用xftp传进来。

一些常见的问题总结 

网络插件

镜像无法下拉 

 

http://www.xdnf.cn/news/14403.html

相关文章:

  • SQL Server 2025 预览版发布:AI深度集成、开发者体验飞跃与混合云新篇章
  • Java对象中的MarkWord
  • 【大厂机试题解法笔记】字符串加密
  • java 设计模式_行为型_18解释器模式
  • 【MySQL】TencentOS 安装登录MySQL
  • 【Flutter】解决小米澎湃系统迷你窗口、缩小窗口后界面空白问题
  • 电阻篇---常见作用
  • Rviz2中,在rviz和launch文件中都需要配置urdf文件,二者作用上的区别?
  • hot100 -- 13.堆系列
  • MongoDB使用安全的sha256认证
  • 【Elasticsearch】文档(二):更新
  • FPGA中的DMA技术
  • 制作微PE U盘后电脑多出300M盘符(EFI分区)无法隐藏的解决过程
  • Vue3 Pinia Store 生命周期管理
  • 前端开发面试题总结-vue2框架篇(二)
  • 国产替代新标杆|盟接之桥EDI软件让中国制造连接世界更安全、更简单、更有底气
  • AI for Science:智能科技如何重塑科学研究
  • 机器能做科学家吗?一场关于开放式科研的 AI 革命
  • 人工智能嵌入公共服务治理的风险挑战(三)
  • day31 文件的规范拆分和写法
  • 多线程与多进程技术全景对比
  • 平均数与倍数
  • 地理空间视角下的 SIR 传染病模型模拟与可视化
  • ObservedV2装饰器和Trace装饰器
  • 浏览器拨打电话 nginx代理wss (mod_cti基于FreeSWITCH)
  • 山东大学软件学院创新项目实训开发日志——第十六周
  • 【Python打卡Day40】训练与测试的规范写法 @浙大疏锦行
  • LeCun破局:大模型与人类思考的本质分野
  • 快速学习GO语言总结
  • JNDI注入入门