小阿轩-yxKubernetes集群部署
Kubernetes 的基础概念
- 是谷歌以 Borg 为前身
- 基于谷歌15年的生产环境经验开源的一个项目
- 用于管理云平台中多个主机上的容器化应用
- 致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台
- 遵循主从式架构设计
- 组件可分为工作节点(Node)组件和控制平面组件
Kubernetes 控制平面
- 由各自的进程组成
- 每个组件都可以在单个节点上运行
- 也可以在支持高可用集群的多个节点上运行
Kubernetes Master
- 是集群的主要控制单元
- 用于管理工作负载并指导整个体系的通信
为什么需要 Kubernetes
疑问
- 有了 Docker 为什么还用 Kubernetes?
- 前期需要容器化的项目可能并不多,涉及的容器也并不多,此时基于 Docker 容器直接部署至宿主机也能实现基本的需求。
- 随着项目的增多,管理的容器也会增多,此时使用“裸容器”部署的方式管理起来就显得很吃力,并且随着业务量的增加,会明显体会到“裸容器”的不足。
裸容器的部分不足问题
- 宿主机宕机造成该宿主机上的容器不可用,且无法自动恢复
- 容器明明在运行,接口就是不通(健康检查做的不到位)
- 应用程序部署、回滚、扩缩容困难
- 成百上千的容器和涉及的端口难以维护
上面只是一些简单的问题,真正使用时还有很多其它的问题
Docker-compose、Docker-swarm 编排工具的功能和 Kubernetes 比还是相差很多,所以注定 Kubernetes 编排工具将成为主流的容器编排工具
对开发人员
除了生产环境,为了节省成本,开发、测试、预生产和生产环境都是隔离的
- 使用 Kubernetes 之后,开发人员和测试者直接在 Kubernetes 的 Dashboard 上找到对应的 namespace 即可定位到业务所在容器
- 然后可直接通过控制台查看到对应日志,大大降低操作时间
应用部署到 Kubernetes 之后
- 发布代码、回滚以及蓝绿、金丝雀变的简单可控,加快了业务代码的迭代速度,而且全程无需人工干预
- 生产环境可使用 jenkins、git 等工具进行发版和回滚等
使用服务网格后
- 开发人员在开发应用过程中无需关心代码网格部分,功能被网格实现
测试过程中
迁移至 Kubernetes 之前
- 可能同时存在多套环境,创建其它环境或临时环境以及测试环境需要运维人员或自行手动创建
迁移至 Kubernetes 之后
- 开发人员需要新的环境无需再找运维,只需在 jenkins 上点一下鼠标即可在 Kubernetes 集群上创建一套新的测试环境
对于运维人员
之前
- 工作会重复、繁琐
- 项目需要一套新测试环境,其它项目需要迁移测试环境至其它平台
传统架构
- 需要装系统、依赖环境、部署域名、开通权限
耗时,还会因为某些遗漏造成诸多问题
现在
- 可直接使用 Kubernetes 包管理工具
- 一键式部署一套新测试环境,甚至全程无需自己干预
- 开发人员通过 jenkins 或者自动化运维平台即可一键式创建,大大降低了运维成本
传统架构体系
业务故障因素
- 基础环境不一致
- 依赖不一致
- 端口冲突
- 服务器宕机
- 网络服务不可用
Kubernetes 中
- 使用 docker 镜像部署,Kubernetes 编排,所有依赖、基础都是一样
- 且环境自动化扩容、健康检查、容灾,恢复都是自动,大大减少了因基础问题引发的故障
- 收到严重告警信息时,kubernetes 已经自动恢复完成
没有使用 Kubernetes 时
- 业务应用扩缩容需要人工处理(采购服务器、上架到部署依赖环境,需要大量人力物力,过程中容易出问题),上架后还需要在前端负载均衡器添加该服务器
如今
- 利用 Kubernetes 弹性计算一键式扩缩容
- 大大提高了运维效率,而且节省了不少服务器资源,提高了资源利用率
反向代理配置方面
- 对 nginx 配置不熟悉,一些高级功能很难实现
- 在 Kubernetes 上利用 ingress 即可简单实现复杂的逻辑,不会再遇到 nginx 少加或多加一个斜杠的问题
负载均衡方面
之前
- 负载均衡是 nginx、LVS、Haproxy、F5等
- 云上可能是云服务商提供的负载均衡机制,每次添加删除节点时都要手动配置前端负载均衡,匹配后端节点
Kubernetes 编排服务
- 使用内部的 Service 即可实现自动管理节点,并且支持自动扩缩容
高可用方面
- Kubernetes 天生的高可用功能让运维人员释放了双手,无需再创建各类高可用工具及检测脚本
- Kubernetes 支持进程、接口级别的健康检查,如果发现接口超时或返回值不正确,会自动处理该问题
中间件搭建方面
- 根据定义好的资源文件,可实现秒级搭建各类中间件高可用集群,且支持一键式扩缩容,且大大减少了出错效率
应用端口方面
传统架构
- 一台服务器跑了多个进程,每个进程都有一个端口,配置端口还要考虑端口冲突问题,如果有防火墙还要配置防火墙
Kubernetes
- 端口统一管理、统一配置
- 每个应用的端口都可以设置成一样的
- 之后通过 Service 进行负载均衡,大大降低了端口管理的复杂度和端口冲突
Kubernetes 减少了工作复杂度,还减少了各种运维成本
Kubernetes 带来的挑战
- Kubernetes 从诞生至今,一路突飞猛进,在容器编排中成为最无可替代、不可撼动的佼佼者
- Kubernetes 的学习和使用始终是一个很大的难题
Kubernetes 架构解析
架构图
架构可简单分为
- 主(master)节点
- 从(worker/node)节点
- 数据库(ETCD)
主节点
- 为群集的控制单元
- 一般不会运行业务应用程序
主要包含组件
- Kube-APIServer
- Kube-ControllerManager
- Kube-Scheduler
从节点
- 为工作节点
- 也就是部署应用程序容器的节点
主要包含组件
- Kubelet
- Kube-Proxy
- 容器
如果 master 节点也要部署容器也会包含这两个组件
一个集群中可以有多个 ndoe 节点,用于保证集群容器的分布式部署,以保证业务的高可用性
也可以有很多 master 节点,之后通过一个负载均衡保证集群控制节点的高可用
master 节点的组件
- 是 Kubernetes 集群的控制节点
- 公司业务程序的容器不建议部署在 master 节点上,以免升级或维护时对业务造成影响
- 生产环境中不建议部署集群核心组件外的任何容器
- (在 kubernetes 安装方式下,系统组件以容器方式运行在 master 节点的宿主机上)
- (二进制安装方式下,系统组件以守护进程的方式运行,master 节点可以不运行任何容器)
API server
- 提供了集群网关
- 是整个集群的控制中枢
- 提供集群中各个模块之间的数据交换,并将集群信息存储到 ETCD 集群中
- 同时它也是集群管理、资源配额、提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查
- API 服务器公开 Kubernetes API。
- REST/kubect1 的入口点——它是 Kubernetes 控制平面的前端。
- 它跟踪所有集群组件的状态并管理它们之间的交互。
- 它旨在水平扩展。
- 它使用 YAML/JSON manifest 文件。
- 它验证和处理通过 API 发出的请求。
Scheduler
只要功能
- 资源调度
- 将 pod 调度到对应的主机上
- 依据请求资源的可用性、服务请求的质量等约束条件
- k8s 也支持用户自己提供的调度器
- 它将 pod 调度到工作节点。
- 它监视 api-server 以查找没有分配节点的新创建的 Pod,并选择一个健康的节点让它们运行。
- 如果没有合适的节点,则Pod 将处于挂起状态,直到出现这样一个健康的节点。
- 它监视 API Server 的新工作任务。
Controller Manager
- 负责维护集群状态
- 也执行 API 业务逻辑
k8s 默认提供的控制器有
- replication controller
- controller
- daemonset controller
作用
- 它监视它管理的对象的期望状态并通过 API 服务器监视它们的当前状态
- 采取纠正措施以确保当前状态与所需状态相同。
- 它是控制器的控制器。
- 它运行控制器进程。(从逻辑上讲,每个控制器都是一个单独的进程,但为了降低复杂性,它们都被编译成一个二进制文件并在单个进程中运行。)
ectd
- 用于可靠的存储集群的配置数据
- 是一种持久性、轻量型、分布式的键值数据存储组件
- 可理解为一种分布式的非关系型数据库
- 是集群的状态
- k8s 默认使用分布式的 etcd 集群整体存储用来实现发现服务和共享配置集群的所有状态都存储在 etcd 实例中,并具有监控的能力
- 因此当 etcd 中信息发生变化时,能够快速通知集群中相关的组件
作用
- 它是一个一致的、分布式的、高度可用的键值存储。
- 它是有状态的持久存储,用于存储所有 Kubernetes 集群数据(集群状态和配置)。
- 它是集群的真相来源。
- 它可以是控制平面的一部分,也可以在外部进行配置。
etcd 集群最少3个节点,容错点才会有1个。
3个节点和4个节点的容错能力是一样的,所以有时候保持奇数节点更好,从这里可以判断出我们在部署 k8s 的时候,至少有3个节点,才保证 etcd 有1个节点容错性。
etcd 的 Leader 选举和数据写入都需要半数以上的成员投票通过确认。
集群最好由奇数个成员组成,以确保集群内部一定能够产生多数投票通过的场景。
- 偶数个节点集群不可用风险更高,变现在选主(Leader 选举)过程中,有较大概率的等额选票,从而触发下一轮选举
- 偶数个节点集群在某些网络分割的场景下无法正常工作。当网络分割发生后,将集群节点对半分割开,形成脑裂
Node 节点包含的组件
Node 节点
- 也被称为 worker 节点
- 主要负责部署容器的主机
- 集群中每个节点都必须具备容器的 Runtime(运行时)
kubelet
- 作为守护进程运行在 Node 节点上
- 负责监听该节点上所有的 pod ,同时负责上报该节点上所有 pod 的运行状态,确保节点上的所有容器都能正常运行
- 当 Node 节点宕机或故障时,该节点上运行时 pod 会被自动转移到其它节点上
容器运行时
docker 引擎
- 是本地的容器运行时环境
- 负责镜像管理以及 pod 和容器的真正运行
- k8s 本身并不提供容器运行时环境,但提供了接口可以插入所选择的容器运行时环境
- 目前支持 Docker 和 rkt
作用
- 容器运行时是负责运行容器(在Pod 中)的软件。
- 为了运行容器,每个工作节点都有一个容器运行时引警。
- 它从容器镜像注册表(container image registry)中提取镜像并启动和停止容器。
Kubernetes 支持多种容器运行时
- Docker
- containerd
- CRI-O
- Kubernetes CRI(Container Runtime Interface,容器运行时接口)的任何实现
kubelet
- 是 node 节点上最主要的工作代理
- 用于汇报节点状态并负责维护 pod 的生命周期
- 也负责 volume(CVI)和网络(CNI)的管理
- 是 pod 和节点 API 主要实现者,负责驱动容器执行层
作为基本的执行单元
- pod 可以拥有多个容器和存储卷
- 能方便在每个容器中打包一个单一的应用,从而解耦了应用构建时和部署所关心的事项
- 方便在物理机或虚拟机之间进行迁移
作用
- 它是在集群中的每个节点上运行的代理。
- 它充当 API 服务器和节点之间的管道。
- 它确保容器在 Pod 中运行并且它们是健康的。
- 它实例化并执行 Pod。
- 它监视 API Server 的工作任务。
- 它从主节点那里得到指令并报告给主节点。
kube-proxy 代理
- 对抽象的应用地址访问
- 服务提供了一种访问一群 pod 的途径
- 负责为服务提供集群内部的服务发现和应用的负载均衡(通常利用 iptables 规则)实现服务到 pod 的路由和转发
作用
- 它是网络组件,在网络中起着至关重要的作用。
- 它管理 IP 转换和路由。
- 它是运行在集群中每个节点上的网络代理。
- 它维护节点上的网络规则。这些网络规则允许从集群内部或外部与Pod 进行网络通信它确保每个 Pod 获得唯一的 IP 地址。这使得 pod 中的所有容器共享一个 IP 成为可能。
- 它促进了 Kubernetes 网络服务和服务中所有 pod 的负载平衡。
- 它处理单个主机子网并确保服务可供外部各方使用。
kubernetes 网络插件
CNI(容器网络接口)
- 是一个云原生计算基金会项目
- 包含了一些规范和库
- 用于编写在Linux 容器中配置网络接口的一系列插件
- 只关注容器的网络连接,并在容器被删除时移除所分配的资源
Kubernetes 使用 CNI 作为网络提供商和 Kubernetes Pod 网络之间的接口。
- 此网络内每个节点一个子网,用于分配 ip 地址,配置 pod 时
- 节点上的网桥接口会为每个新容器分配一个地址
- 同一主机中的 pod 可以使用网桥通信
- 不同主机的 pod 流量封装在 udp 数据包中,路由到目的地
Flannel 网络
- 由 Coreosk 开发的一个项目
- 很多部署工具或者 k8s 的发行版都是默认安装
- flannel 是可以用集群现有的 etcd,利用 api 方式存储自身状态信息,不需要专门的数据存储,是配置第三层的ipv4 Overlay 网络
- 启动时可通过配置文件指定不同的后端进行通信,目前有三种 UDP、VXLAN、host-gatway(VXLAN是官方推荐,因性能良好,不需人工干预)(UDP、VXLAN基于三层网络即可实现)
Calico 网络
- 性能、灵活性都好备受欢迎
- 功能更加全面,不但具有提供主机和 pod 间网络通信功能,还有网络安全和管理功能
- 还能与服务网络技术 Istio 集成,能够更加清楚看到网络架构也能进行灵活的网络策略配置
- 不使用 Overlay 网络,配置在第三层网络
- 使用 BGP 路由协议在主机之间路由数据包,意味着不需要包装额外的封装层
- 主要在网络策略配置这一点,可以提高安全性和网络环境控制
集群规模较大,选择 calico 没错,提供长期支持
Kubeadm 快速安装 Kubernetes 集群
实验环境
- 采用 Kubeadm 方式安装 Kubernetes 集群
- 实验环境包括一台 master 节点,两台 node 节点
主机名 | IP 地址 | 操作系统 | 主要软件 |
k8s-master | 192.168.10.101 | CentOS7.9 两个 CPU | Docker CE,Kube-apiserver,Kube-controller-manager,Kube-scheduler,Kubelet,Etcd,Kube-proxy |
k8s-node01 | 192.168.10.102 | CentOS7.9 | Docker CE,Kubectl,Kube-proxy,Calico |
k8s-node02 | 192.168.10.103 | CentOS7.9 | Docker CE,Kubectl,Kube-proxy,Calico |
Kubernetes v1.23支持高达 500 节点
更准确的说,在使用 Kubernetes 时,应当遵循的准则
- 每个节点不要超过 110 个 Pod
- 集群不要超过 5000 节点
- 集群不要超过 150000 个Pod
- 不要超过 300000个Container
实验要求
- 通过 Kubeadm 实现快速部署 Kubernetes 集群
实现思路
- 部署三台主机的基础环境。
- 部署三台主机的 Docker 环境。
- 通过 Kubeadm 快速部署 Kubernetes 集群。
基础环境准备(此步骤在三个节点都执行)
- 正式开始部署 kubernetes 集群之前,先要进行如下准备工作。
- 基础环境相关配置操作在三台主机k8s-master、k8s-node01、k8s-node02 上都需要执行,以 k8s-master 主机进行操作演示
基础网络信息配置要求
- 依据案例环境为三台主机配置 IP 地址、网关、DNS 等基础信息,确保可连接互联网,推荐虚拟机使用 NAT 模式
- k8s-master 主机配置为 2核 4G,k8s-node 节点配置也是 2核 4G
恢复 docker 快照
配置 Kubernetes 集群(注意命令执行的节点)
配置三台主机的主机名
主机一
[root@localhost ~]# hostnamectl set-hostname k8s-master
[root@localhost ~]# bash
主机二
[root@localhost ~]# hostnamectl set-hostname k8s-node01
[root@localhost ~]# bash
主机三
[root@localhost ~]# hostnamectl set-hostname k8s-node02
[root@localhost ~]# bash
开启会话同步
在三台主机上绑定 hosts 文件
[root@k8s-master]# vim /etc/hosts
//添加地址
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02
关闭交换分区并设置永久关闭
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# vim /etc/fstab
//注释
#/dev/mapper/centos-swap swap swap defaults 0 0
配置 Kubernetes 的 YUM 源
[root@k8s-master ~]# cat <<EOF> /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
> enabled=1
> gpgcheck=0
> repo_gpgcheck=0
> gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg > https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
> EOF
清空一下 YUM 缓存
[root@k8s-master ~]# yum clean all
安装 Kubelet、Kubeadm 和 Kubectl
[root@k8s-master ~]# yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
- 如果在命令执行过程中出现索引 gPg 检査失败的情况,请使用 yum install -y --nogpgcheckkubelet-1.23.0 kubeadm-1.23.0 kubect1-1.23.0来安装,或者将gpgcheck=1 和repo_gpgcheck=1 设置为0
Kubelet 设置开机启动
[root@k8s-master ~]# systemctl enable kubelet
- kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。
生成初始化配置文件
- Kubeadm提供了很多配置项,Kubeadm配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。
- Kubeadm 配置内容是通过 kubeadm config 命令写入配置文件的。
[root@k8s-master ~]# kubeadm config print init-defaults >init-config.yaml
- kubeadm config 除了用于输出配置项到文件中,还提供了其他一些常用功能
- kubeadm config view:查看当前集群中的配置值。
- kubeadm config print join-defaults:输出 kubeadm join 默认参数文件的内容。
- kubeadm config images list:列出所需的镜像列表。
- kubeadm config images pull:拉取镜像到本地。
- kubeadm config upload from-flags:由配置参数生成 ConfigMap。
这里取消会话同步
修改初始化配置文件
[root@k8s-master ~]# vim init-config.yaml
apiVersion:kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token:abcdef.0123456789abcdef
ttl:24h0m0s
usages:
- signing
- authentication
kind: Initconfiguration
localAPIEndpoint:
//12行
advertiseAddress:192.168.10.101
bindPort:6443
nodeRegistration:
criSocket:/var/run/dockershim.sock
//17行
name:k8s-master
taints:null
---
apiServer:
timeoutForControlPlane:4m0s
apiVersion:kubeadm.k8s.io/v1beta3
certificatesDir:/etc/kubernetes/pki
clusterName:kubernetes
controllerManager:{}
dns :
type: CoreDNs
etcd:
local:
dataDir:/var/lib/etcd
//30行
imageRepository:registry.aliyuncs.com/google_containers
kind:clusterconfiguration
kubernetesVersion:v1.23.0
networking:
dnsDomain:cluster.local
servicesubnet:10.96.0.0/12
//36行
podsubnet: 10.244.0.0/16
scheduler:{}
1.24.0的版本中 apiVersion: kubeadm.k8s.io/v1beta2 被弃用
serviceSubnet
- 指定使用 ipvs 网络进行通信,ipvs 称之为 IP 虚拟服务器(IP Virtual Server,简写为 IPVS)。
- 是运行在 LVS 下的提供负载平衡功能的一种技术。
- 含义 IPVS 基本上是一种高效的Layer-4 交换机
podsubnet 10.244.0.0/16 参数需要和后文中 kube-flannel.yml 中的保持一致,否则,可能会使得 Node 间 cluster IP 不通。
默认情况下,每个节点会从 Podsubnet 中注册一个掩码长度为 24 的子网,然后该节点的所有 podip 地址都会从该子网中分配。
拉取所需镜像
如果地址无法解析,可以使用阿里的公共 DNS:223.5.5.5或223.6.6.6
[root@k8s-master ~]# kubeadm config images list --config init-config.yaml
将镜像通过 Xftp 上传至三台主机上
三台主机都导入镜像
主机一
[root@k8s-master ~]# cd images/
[root@k8s-master images]# bash imp_docker_img.sh
主机二
[root@k8s-node01 ~]# cd images/
[root@k8s-node01 images]# bash imp_docker_img.sh
主机三
[root@k8s-node02 ~]# cd images/
[root@k8s-node02 images]# bash imp_docker_img.sh
退出到主目录并初始化 k8s-master
master 节点最少需要2个CPU
[root@k8s-master images]# cd
[root@k8s-master ~]# kubeadm init --config=init-config.yaml
执行完该命令后一定记下最后生成的 token
- kubeadm join 192.168.10,101:6443 --token abcdef.0123456789abcdef--discovery-token-ca-cert-hash
- sha256:8b17b7d607ab7f79c2249c58d74525368bbb15ad884c365aaa1a968b9833d107
Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如 k8s-master 节点上査看节点信息都是“Not Ready”状态、Pod 的 CoreDNS 无法提供服务等。
将生成的 token 复制到 102和103 两个节点上
102
[root@k8s-node01 ~]# kubeadm join 192.168.10,101:6443 --token abcdef.0123456789abcdef--discovery-token-ca-cert-hash
sha256:8b17b7d607ab7f79c2249c58d74525368bbb15ad884c365aaa1a968b9833d107
103
[root@k8s-node02 ~]# kubeadm join 192.168.10,101:6443 --token abcdef.0123456789abcdef--discovery-token-ca-cert-hash
sha256:8b17b7d607ab7f79c2249c58d74525368bbb15ad884c365aaa1a968b9833d107
复制配置文件到用户的 home 目录(操作节点:k8s-master)
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g)$HOME/.kube/config
导出为全局变量
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
node 节点加入集群后查看节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plance,master 5m33s v1.23.0
k8s-node01 NotReady <none> 4m36s v1.23.0
k8s-node02 NotReady <none> 3m59s v1.23.0
查看 pod 运行状态
[root@k8s-master ~]# kubectl get pod -A
- 因为此时还没安装网络插件,coredns 无法获得解析的 IP,就会使得 coredns 处于 pending 状态
将 calico 资源清单上传至 master 节点
部署 calico 网络插件
[root@k8s-master ~]# kubectl apply -f calico.yaml
查看状态
[root@k8s-master ~]# kubectl get pod -A
查看节点状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plance,master 32m v1.23.0
k8s-node01 Ready <none> 31m v1.23.0
k8s-node02 Ready <none> 31m v1.23.0
Metrics-server 部署
- 是一种可扩展、高效的容器资源指标来源,适用于 Kubernetes 内置的自动缩放管道。
- 从 Kubelets 收集资源指标,并通过 Metrics API 将它们暴露在Kubernetes apiserver中,供 Horizontal Pod Autoscaler 和 Vertical Pod Autoscaler使用。
- 指标 API 也可以通过 访问 kubectl top,从而更容易调试自动缩放管道。
- 对集群和网络配置有特定的要求。
- 这些要求并不是所有集群分布的默认要求。
使用 Metrics server 之前,确保集群分布支持这些要求
- kube-apiserver 必须启用聚合层。
- 节点必须启用 webhook 身份验证和授权。
- Kubelet 证书需要由集群证书颁发机构签名(或通过传递--kubelet-insecure-tls 给Metrics Server 来禁用证书验证)注意这里是重点,如果本地没有签名需要传递 args:"--kubelet-insecure-tls"给Metrics server
- 容器运行时必须实现容器指标RPC(或具有cAdvisor 支持)
网络应支持以下通信
- 控制平面到指标服务器。控制平面节点需要到达 Metrics Server 的 pod IP 和端口 10250(或节点 IP 和自定义端口,如果 hostNetwork 已启用)
- 所有节点上的 Kubelet 的指标服务器。指标服务器需要到达节点地址和 Kubelet 端口。地址和端口在 Kubelet 中配置并作为 Node 对象的一部分发布。字段中的地女.status.addresses和口.status.daemonEndpoints.kubeletEndpoint.port(默认 10250)。MetricsServer 将根据kubelet-preferred-address-types命令行标志(InternalIP,ExternalIP,Hostname 清单中的默认值)提供的列表选择第一个节点地址
源码位置
- metrics-server 的 github 地址
https://github.com/kubernetes-sigs/metrics-server
版本对照
Metrics Server | Metrics API group/version | 支持k8s版本 |
0.6x | metrics.k8s.io/v1beta 1 | 1.19+ |
0.5x | metrics.k8s.io/v1beta 1 | *1.8+ |
0.4x | metrics.k8s.io/v1beta 1 | *1.8+ |
0.3x | metrics.k8s.io/v1beta 1 | 1.8-1.21 |
下载 Metrics-server 的 yaml 文件
wget
https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/com
将 components 文件上传至 master 节点
修改 yaml 文件并安装
[root@k8s-master ~]# vim components.yaml
spec:
containers:
- args:
//135行
- --kubelet-insecure-tls
- --cert-dir=/tmp
- -secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
//141行
image: registry.cn-hangzhou.aliyuncs.com/google containers/metrics-server:v0.6.3
- 如果已经修改就不用再改了
再次生成编排文件
[root@k8s-master ~]# kubectl create -f components.yaml
这一步会有延迟时间,要稍等几秒再查看
再次查看各节点信息
[root@k8s-master ~]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 99m 4% 1201Mi 31%
k8s-node01 57m 2% 1597Mi 42%
k8s-node02 37m 3% 616Mi 16%
Dashboard 部署
核心文件官方下载资源地址
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard
在 k8s 工作目录中创建 dashborad 工作目录
[root@k8s-master ~]# mkdir -p /opt/k8s/dashboard
进入目录
[root@k8s-master ~]# cd /opt/k8s/dashboard
将两个配置文件上传至 dashboard 目录中
上传之后查看
[root@k8s-master ~]# ls
dashboard-user.yaml dashboard.yaml
创建对应的资源
[root@k8s-master ~]# kubectl create -f .
- .:只要在当前目录下的文件就一次性全部创建
退出并查看面板程序状态
[root@k8s-master dashboard]# cd
[root@k8s-master ~]# kubectl get pod -A
查看端口号
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.98.201.22 <none> 443:30049/TCP 10m
自定义端口号
[root@k8s-master ~]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
//修改端口号
ports:
- nodePort: 31245
- 把端口号修改为统一的
查看端口号
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.98.201.22 <none> 443:31245/TCP 10m
用谷歌浏览器访问
- 192.168.10.101:31245
如果打不开
修改谷歌浏览器
- k8s 的 dashboard 采用的是自签名证书访问的,谷歌浏览器默认无法直接访问(其他浏览器可以,如火狐),需要修改谷歌浏览器启动文件,加入启动参数,忽略证书报错,用于解决无法访问dashboard 的问题。
修改方法
- 在桌面找到谷歌浏览器的快捷方式
- 右键属性
- 找到“快捷方式”选项卡
- 在目标栏添加参数:--test-type--ignore-certificate-errors(注意--前有空格)
获取登录令牌的信息
[root@k8s-master ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name:
admin-user-token-5vfk4
kube-systemNamespace:
Labels:
<none>
kubernetes.io/service-account.name: admin-userAnnotations:kubernetes.io/service-account.uid:fc2535ae-8760-4037-9026-966f03ab9bf9
Type:kubernetes.io/service-account-token
Data
===
ca.crt: 1363 bytes
namespace: 11 bytes
token:
eyJhbGciOiSUzl1NilslmtpZCl6lnVOMnhMdHFTRWxweUlfUm93VmhMZTVXZW1FXZFrTO?nQ0dTcE5uYjNWMifQ.eyJpc3MiOijrdwlcm5ldGVzL3NIcnZpY2VhY2Nvdw50liwia3VizXJu5c3RlbSlslmt1YmVybZXRlcy5pby9zZXJ2aWNIYWNmV0ZXMuaW8vc2VydmljZwFjY291bnCpbi11c2VyLXRva2\uLTV2Zms0liwia3ViZXJuZXRlcy5pby9zZXJ2aWNIYWNjb3VXJ2aWNILWFiY291bnQubmFtZSl6lmFkbWluLXVzZXliLCJrdwJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NIcnZpY2UtYWNib3Vudc51aWQi0jmYzl1MzVhZS04NzYWLTQWMzCtOTAyNi05NZmMDNhYjliZjkiCJzdWliOizeXN0ZW06c2VydmlizWFiy291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlci19.HSU1FeqY6pDVoXVIv4LU27TDhCYHM-FzGsGybYL5QPJ5-P0b3tQqUH9i3AQlisiGPB--jCFT5Cloh51n6ztklvjUm8Q4xj LQ20SFfWlFUnaZsaYTdD-RCldwh63UeOeXneOyfV7XkC7frbn6Va(pX362T FjgDkn04q1wtKZH5qR0mpL1dOjas50gnOSyBY0j-nSPrifhnNg3 GcDLE4LxjuzO1D1GNTEHZ6TojP) 5ZElMolaYJsVejn2slfeUQEWdiD5AHFZIRd4exODCHyUhRpzb9jO2rovN2lMgdE vxBtNgXp19evQB9AgZyMMSmu1Ch2C2UAi4NxjKW8HNA
令牌信息
- token:
- eyJhbGciOiSUzl1NilslmtpZCl6lnVOMnhMdHFTRWxweUlfUm93VmhMZTVXZW1FXZFrTO?nQ0dTcE5uYjNWMifQ.eyJpc3MiOijrdwlcm5ldGVzL3NIcnZpY2VhY2Nvdw50liwia3VizXJu5c3RlbSlslmt1YmVybZXRlcy5pby9zZXJ2aWNIYWNmV0ZXMuaW8vc2VydmljZwFjY291bnCpbi11c2VyLXRva2\uLTV2Zms0liwia3ViZXJuZXRlcy5pby9zZXJ2aWNIYWNjb3VXJ2aWNILWFiY291bnQubmFtZSl6lmFkbWluLXVzZXliLCJrdwJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NIcnZpY2UtYWNib3Vudc51aWQi0jmYzl1MzVhZS04NzYWLTQWMzCtOTAyNi05NZmMDNhYjliZjkiCJzdWliOizeXN0ZW06c2VydmlizWFiy291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlci19.HSU1FeqY6pDVoXVIv4LU27TDhCYHM-FzGsGybYL5QPJ5-P0b3tQqUH9i3AQlisiGPB--jCFT5Cloh51n6ztklvjUm8Q4xj LQ20SFfWlFUnaZsaYTdD-RCldwh63UeOeXneOyfV7XkC7frbn6Va(pX362T FjgDkn04q1wtKZH5qR0mpL1dOjas50gnOSyBY0j-nSPrifhnNg3 GcDLE4LxjuzO1D1GNTEHZ6TojP) 5ZElMolaYJsVejn2slfeUQEWdiD5AHFZIRd4exODCHyUhRpzb9jO2rovN2lMgdE vxBtNgXp19evQB9AgZyMMSmu1Ch2C2UAi4NxjKW8HNA
复制 token 并打开编辑器
[root@k8s-master ~]# vim token
//粘贴令牌
eyJhbGciOiSUzl1NilslmtpZCl6lnVOMnhMdHFTRWxweUlfUm93VmhMZTVXZW1FXZFrTO?nQ0dTcE5uYjNWMifQ.eyJpc3MiOijrdwlcm5ldGVzL3NIcnZpY2VhY2Nvdw50liwia3VizXJu5c3RlbSlslmt1YmVybZXRlcy5pby9zZXJ2aWNIYWNmV0ZXMuaW8vc2VydmljZwFjY291bnCpbi11c2VyLXRva2\uLTV2Zms0liwia3ViZXJuZXRlcy5pby9zZXJ2aWNIYWNjb3VXJ2aWNILWFiY291bnQubmFtZSl6lmFkbWluLXVzZXliLCJrdwJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NIcnZpY2UtYWNib3Vudc51aWQi0jmYzl1MzVhZS04NzYWLTQWMzCtOTAyNi05NZmMDNhYjliZjkiCJzdWliOizeXN0ZW06c2VydmlizWFiy291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlci19.HSU1FeqY6pDVoXVIv4LU27TDhCYHM-FzGsGybYL5QPJ5-P0b3tQqUH9i3AQlisiGPB--jCFT5Cloh51n6ztklvjUm8Q4xj LQ20SFfWlFUnaZsaYTdD-RCldwh63UeOeXneOyfV7XkC7frbn6Va(pX362T FjgDkn04q1wtKZH5qR0mpL1dOjas50gnOSyBY0j-nSPrifhnNg3 GcDLE4LxjuzO1D1GNTEHZ6TojP) 5ZElMolaYJsVejn2slfeUQEWdiD5AHFZIRd4exODCHyUhRpzb9jO2rovN2lMgdE vxBtNgXp19evQB9AgZyMMSmu1Ch2C2UAi4NxjKW8HNA
粘贴令牌登录
安装 helm 客户端
安装包下载地址
wget
https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz
将 helm 源码包上传至服务器
解压
[root@k8s-master ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz
进入目录并移动 helm
[root@k8s-master ~]# cd linux-amd64/
[root@k8s-master linux-amd64]# mv helm /usr/local/bin/
查看版本
[root@k8s-master ~]# helm version
version.BuildInfo{Version:"v3.9.4"GitCommit:"ee407bdf364942bcb8e8c665f82e15aa28009b71"GitTreestate:"clean"GoVersion:"go1.16.5"}
简化命令,设置别名
修改配置文件
[root@k8s-master ~]# vim .bashrc
//第8行添加
alias ku='kubectl'
让文件生效
[root@k8s-master ~]# source .bashrc
查看状态
[root@k8s-master ~]# ku get pod -A
重启验证平台是否有效
会有延迟,稍等几秒
[root@k8s-master ~]# ku get pod -A
- 最后要所有组件都显示 Running 为正常
- Kubernetes 要关机做快照
小阿轩-yxKubernetes集群部署