尚硅谷k8s课堂随笔
第一部分 K8S基本概念
1. K8S概述和特性
K8S是谷歌在2014年开业的容器化集群管理系统
使用k8s进行容器化应用部署
使用k8s利于应用扩展
k8s目标实施让部署容器化应用更加简洁和高效
2. K8S架构组件
Master(主控节点)和 node (工作节点)
master 组件
apiserver ---> 集群统一入口,以 restfull 方式,交给 etcd 存储
scheduler ---> 节点调度,选择node节点应用部署
controller-manager ---> 处理集群中常规后台任务,一个资源对应一个控制器
etcd ---> 存储系统,保存集群相关的数据
node组件
kubelet ---> master 派到 node 节点代理,管理本机容器
kube-proxy ---> 提供网络代理,负载均衡等操作
3. K8S核心概念
- Pod
最小的部署单元
一组容器的集合
共享网络
生命周期是短暂的
- controller
确保预期的pod副本数量
无状态应用部署
有状态应用部署
确保所有的 node 运行同一个 pod
一次性任务和定时任务
- Service
定义一组 pod 的访问规则
4. 集群 YML 文件详解
4.1 YAML 基本语法
使用空格做为缩进
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
低版本缩进时不允许使用 Tab 键,只允许使用空格
使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
4.2 支持的数据结构
对象; 键值对集合 -----( 映射/哈希/字典)
数组; 序列 ?列表
纯量( scalars ), 不可分的值
4.3 资源清单表述方法
4.3-1 YAML 必须存在的属性
version
String
api版本,目前v1, 可用kubect api-version查看
kind
String
定的资源类型和角色: 比如 Pod
metadata
Object
元数据对象,固定值 metadata
metadata.name
String
元数据对象名字
metadata.namespace
String
元数据命名空间
Spec
Object
详细定义对象,固定值写Spec
spec.containers[]
list
这是Spec对象的容器列表定义,是个列表
spec.containers[].name
String
定义容器的名字
spec.containers[].image
String
定义要用到的镜像名称
4.3-2 YAML Spec 主要对象
spec.containers[].imagePullPolicy
String
默认 Always; 定义镜像拉取策略,有Always(总是)、Never(使用本地)、IfNotPresent(如果本地没有就拉取);
spec.containers[].command[]
List
指定容器启动命令,可指定多个,不指定默认使用容器打包的启动命令
spec.containers[].args[]
List
指定容器启动参数,可指定多个
spec.containers[].workingDir
List
指定容器的工作目录
spec.containers[].volumeMounts[]
List
指定容器内部的存储卷配置
spec.containers[].valumeMounts[].name
String
指定可以被容器挂载的存储卷名称
spec.containers[].valumeMounts[].mountPath
String
指定可以被容器挂载的容器卷的路径
spec.containers[].valumeMounts[].readOnly
String
设置存储卷路径的读写模式,true或者false,默认为读写模式
spec.containers[].ports[]
List
指定容器需要用到的端口列表
spec.containers[].ports[].name
String
指定端口名称
spec.containers[].ports[].containerPort
String
指定容器需要监听的端口号
spec.containers[].ports.hostPort
String
指定容器所在主机需要监听的端口号,默认和 containerPort相同,如果设置了hostport,同一台主机无法启动相同副本,会冲突
spec.containers[].ports[].protocol
String
指定端口协议,TCP/UDP,默认TCP
spec.containers[].env[]
List
指定容器运行时需设置的环境变量列表
spec.containers[].env[].name
String
指定环境变量名称
spec.containers[].env[].value
String
指定环境变量值
spec.containers[].resources
Object
指定资源限制和资源请求的值(资源上限)
spec.containers[].resources.limits
Object
指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpu
String
指定CPU限制,单位 core 数,将用于 --cpu-shares 参数
spec.containers[].resources.limits.memory
String
指定MEM内存限制,单位 MIB,GIB
spec.containers[].resources.requests
String
指定容器启动和调度室的限制设置
spec.containers[].resources.requests.cpu
String
CPU请求,单位 core 数,容器启动时初始化可用数量
spec.containers[].resources.requests.memory
String
内存请求,单位MIB,GIB,容器启动时初始化可用数量
4.3-3 YAML 额外的参数
spec.restarPolicy
String
定义Pod重启策略,可以选择值为Always、OnFailure,默认为Always. Always: Pod一旦终止运行,将重启它。 2.OnFilure ,只有Pod以非零退出码终止时,重启,否则,不重启。 3. Never: Pod终止后,将退出码报告给Mater,不会重启改Pod
spec.nodeSelector
Object
定义Node的Label过滤标签,以key:value格式指定
spec.imagePullSecrets
Object
定义pull镜像是使用secrets名称,以name:secretKey格式指定
spec.hostNetwork
Boolean
定义是否使用主机忘了默认,默认值false,设置true表示使用宿主机忘了,不适用docker网桥,同时设置true将无法在一台宿主机上启动第二个副本
4.3-4 举例说明
5. kubectl 命令集合
5.1 基础命令解释
expose
将一个资源公开为一个新的 Service
run
在集群中运行一个特定的镜像
set
在对象上设置特定的功能
get
显示一个或多个资源
expian
文档参考资料
edit
使用默认的编辑器编辑一个资源
delete
通过文件名、标准输入、资源名称或标签选择器来删除资源
5.2 部署和集群管理命令解释
rolling-update
对给定的复制控制器滚动更新
scale
扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job
autoscale
创建一个自动选择扩容和缩容并设置Pod数量
certificate
修改证书资源
cluster-info
显示集群信息
top
显示资源(CPU/Memory/Storage)使用
cordon
标记节点不可调度
uncordon
标记节点可调度
drain
驱逐节点上的应用,准备下线维护
taint
修改节点 taint 标记
5.3 故障和调试命令解释
logs
在一个Pod中打印一个容器日志。如果Pod只有一个容器,容器名称是可选的
attach
附加到一个运行的容器
exec
执行命令到容器
port-forward
转发一个或多个本地端口到一个pod
cp
拷贝文件或目录到容器中
auth
检查授权
5.4 其他命令解释
patch
使用补丁修改、更新资源的字段
replace
通过文件名或标准输入替换一个资源
convert
不同的API版本直接转换配置文件
label
更新资源上的标签
annotate
更新资源上的注释
completion
用于实现kubectl工具自动补全
api-version
打印受支持的API版本
config
修改kubeconfig文件(用户访问API,比如配置认证信息)
plugin
运行一个命令行插件
version
打印客户端和服务版本信息
help
帮助
5.5 如何跨省编写 yaml 文件
1、第一种 使用 kubectl create 命令生成 yaml 文件
2、第二中 使用 **kubectl get ** 命令导出yaml文件 ; <适用于已有部署集>
第二部分 搭建K8S集群
方法一:使用 kubeadm方式搭建k8s集群
1. 三台 Centos7.x 服务器
k8s-master
192.168.1.134
k8s-node01
192.168.1.135
k8s-node02
192.168.1.136
2. 所有节点初始化操作
3. 所有节点安装程序包
所有节点:docker 、kubelet 、kubeam 、kubctl
3.1 安装 Docker
3.2 添加阿里云YUM软件源
3.3 安装kubeadm,kubelet和kubectl
4. Master 集群初始化
kubeadm init命令
5. Node 节点添加到当前集群中
6.所有节点配置网络插件
7. 测试kubernetes集群
方法二:二进制方式
1. 三台 Centos7.x 服务器
k8s-master
192.168.1.134
k8s-node01
192.168.1.135
k8s-node02
192.168.1.136
2. 所有节点初始化操作
3. 准备 cfssl 证书生成工具
3.1 创建工作目录
3.2 创建生成 Etcd Ca 证书配置
3.3 创建 ETCD Server申请文件
3.4 生成 Etcd HTTPS证书
3.5 创建生成 kube-apiserver 配置
3.6 创建 kube-apiserver 证书申请文件
3.7 生成 kube-apiserver HTTPS 证书
4. 部署Etcd集群
4.1 下载安装包
4.2 拷贝刚才生成的证书
4.3 创建 etcd配置文件
4.4 使用Systemd管理 etcd
4.5 拷贝文件到 Node 节点
4.6 启动 etcd
4.7 检查服务是否正常
5. 安装 Docker
所有节点上
5.1 下载源码包
5.2 Systemd 管理 docker
5.3 加速镜像
5.4 开机自启
6. 部署 Master Node
下载地址: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md
这里使用版本: v1.18.3 , 下载 server 包,里面啥都有
安装 master 必须组件
6.1 下载二进制包
6.2 启用 TLS Bootstrapping 机制
6.3 部署 kube-apiserver
参数详解: –logtostderr:启用日志 —v:日志等级 –log-dir:日志目录 –etcd-servers:etcd集群地址 –bind-address:监听地址 –secure-port:https安全端口 –advertise-address:集群通告地址 –allow-privileged:启用授权 –service-cluster-ip-range:Service虚拟IP地址段 –enable-admission-plugins:准入控制模块 –authorization-mode:认证授权,启用RBAC授权和节点自管理 –enable-bootstrap-token-auth:启用TLS bootstrap机制 –token-auth-file:bootstrap token文件 –service-node-port-range:Service nodeport类型默认分配端口范围 –kubelet-client-xxx:apiserver访问kubelet客户端证书 –tls-xxx-file:apiserver https证书 –etcd-xxxfile:连接Etcd集群证书 –audit-log-xxx:审计日志
6.4 部署kube-controller-manager
–master:通过本地非安全本地端口8080连接apiserver。 –leader-elect:当该组件启动多个时,自动选举(HA) –cluster-signing-cert-file/–cluster-signing-key-file:自动为kubelet颁发证书的CA,与apiserver保持一致
6.5 部署kube-scheduler
7. 部署Worker Node
下面还是在 Master 上操作,即同时作为 Worker Node
7.1 创建工作目录并拷贝二进制文件
7.2 部署 kubelet
7.3 部署kube-proxy
7.4 部署CNI网络
部署
授权 apiserver 访问 kubelet
7.5 增加Worker Node
第三部分 K8S核心技术
Pod
控制器
储存
Sservice
调度器
安全机制RBAC
包管理工具 Helm等等
1. Pod
1.1 Pod 基本概念
最小部署单元
包含多个容器(一组容器的集合)
一个pod中容器共享网络命名空间
pod是短暂的
1.2 Pod 实现机制
共享网络: 通过Pause容器,把其他业务容器加入到Pansu容器里,让所有业务容器在同一个命名空间中,实现网络共享
共享存储: 引入数据卷 Volumn,使用数据卷进行持久化存储
资源共享
一个pod中多个容器共享存储和网络
生命周期短暂
若Pod节点发生故障,那么该Pod会调度到其他节点,是一个全新的Pod,跟之前的pod无关联
平坦的网络
所有Pod都在同一共享网络地址空间中,每个Pod可以通过其他Pod的IP进行访问
1.3 Pod 生命周期和重启策略
Pending
API Server已经创建该Pod,但Pod中的一个或多个容器还没创建,包括镜像下载过程
Running
Pod内错有容器已创建,且至少一个容器处于运行状态、正在启动或正在重启
Completed
Pod内所有容器均成功执行退出,且不会重启
Faild
Pod内所有容器均已退出,但至少一个容器退出失败
Unknow
由于某种原因无法获取Pod状态,例如网络通信不畅
Always
当容器失效时,由kubelet自动重启该容器
OnFailure
当容器终止运行且退出码不为0,由kubelet自动重启该容器
Never
不论容器运行状态如何, kublete都不会重启该容器
RestartPolicy=Always
RestartPolicy=OnFailure
RestartPolicy=Never
包含一个容器
Running
容器成功退出
Running
Successded
Successded
包含一个容器
Running
容器失败退出
Running
Running
Failure
包含两个容器
Running
1个容器失败退出
Running
Running
Running
包含两个容器
Running
容器被OOM杀掉
Running
Running
Failure
1.4 Pod 资源配置
requests:需求,最低保障;
limits:限制,硬限制; 超过被杀死
1.5 Pod 健康检查
livenessProbe (存活检查)
如果检查失败,将杀死容器,根据Pod的 restartPolicy 来操作
readlinessProbe (就绪检查)
如果检查失败, Kubernetes会把Pod从 service endpoint中剔除
httpget
发送HTTP请求,返回200·400范围状态码为成功
exec
执行Shell命令返回状态码是0为成功
tcpSocket
发起 Tcp Socket 建立成功
1.6 Pod 创建流程
- 1、 kubect 向 Apiserver 发送创建Pod请求 - 2、Api server 收到请求,生成 YAML 文件,并把YAML信息写入 Etcd 中 - 3、 Scheduler 调度器通过Apiserver 读取 Etcd 信息进行判断,如果是NUll,使用调度算法,分配到资源利用少的节点上,并把更新信息写入 Etcd内, - 4、Node 节点上 的 kubelet 会不停的请求 apiserver,读取Etcd数据,如果编号和自己的相同,则调用 dcokerApi,创建容器
1.7 Pod 调度(节点亲和)
- 硬亲和性: 约束条件必须满足 - 软亲和性: 尝试满足,不保证
支持常用操作符: In NotIn Exists Gt Lt DoesNotExists
影响调度的属性
Pod 资源限制对Pod调用产生影响 ( 设置资源限制过大,会找不到足够资源的node节点)
节点选择器标签影响 Pod 调度 (只可调用到指定标签的节点)
1.8 Pod 调度(节点污点)
使用场景
专用节点
配置特点、硬件特点
基于 Taint 驱逐
污点值 <常用于master节点> - Noschedule 一定不被调度 - PreferNoSchedule 尽量不被调度 - NoExecute 不会调度,并且驱逐已有的 Pod
污点容忍
比如某个节点节点被标记为了污点节点,要想 pod 能够调度到 master 节点去,这个该怎么办?```
2. Controller
2.1 什么是 Controller?
在集群上管理和运行容器的对象,俗称控制器
2.2 Pod 与 Controller 关系?
Pod 是通过 Controller 实现应用的运维,比如伸缩、滚动升级等等
2.3 Deployment 控制器应用场景
部署无状态应用
管理 Pod 与 ReplicaSet
部署,滚动升级等功能
------- 主要应用场景: web服务、微服务
2.4 Yaml 文件字段说明
2.5 Deployment 控制器部署应用
2.6 应用升级回滚和弹性伸缩
3. Service
服务发现
3.1 Service 存在意义
防止与 Pod 的是失联
定义一组Pod 的访问策略 (相当于负载均衡器)
3.2 Service 和 Pod 关系
- Pod 类似架构中的 后端服务器, Service 相当于架构中的虚拟 VIP,通过Service实现负载均衡
- Pod 与 Service 根据 Label 和 selector 标签选择器建立关联
3.3 Servier 类型
1、ClusterIP: 集群内部使用
2、NodePort: 对外访问应用
3、LoadBalancor: 对外访问应用使用,公有云
4. 无状态和有状态
4-1 无状态
认为Pod 都是一样的
没有顺序要求
不用考虑在哪个 node 运行
随意进行伸缩和扩展
4-2 有状态
用于无状态的特点
会让每个Pod独立,保持 Pod 启动顺序和唯一性
唯一的网络标识符,持久存储
有序,比如mysql主从
4-3 部署有状态应用
无头Service
ClusterIP: none # 通过YAML文件设置 ClusterIP 为 None
SatefulSet 部署有状态应用
kind: StatefulSet # 通过YAML文件设置 kind 为 StatefulSet
- 能保证每个 Pod 名称唯一性
注意: deployment 和 SatefulSet 区别:<唯一标识不同>
deployment : 根据主机名 + 安装一定规则生成域名 SatefulSet: 根据主机名称.service名称.名称空间.svc.cluster.local
3.4-4 DaemonSet 守护进程
在每个node上运行一个pod, 新加入的 node 也同样运行这个pod
例如: 在每个 node 节点上安装数据采集工具
5 计划任务
5.1 一次性任务
5.2 定时任务
6. Secret
6.1 Secret存在意义
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露 到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用
作用: 加密数据存在 etcd 里面, 让 Pod 容器以挂载 Volume 方式镜像访问
场景: 凭证
6.2 Secret 有三种类型
Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
Opaque : base64 编码格式的 Secret,用来存储密码、密钥等
kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息
6.2-1 Service Account
6.2-2 Opaque Secret
1. 编写一个 secret 对象
2. 将 Secret 挂载到Volume中
3. 将 Secret 设置为环境变量
缺点: 环境变量读取 Secret 很方便,但无法支撑Secret动态更新。
6.2-3 dockerconfigjson
kubernetes.io/dockerconfigjson 用于存储 docker registry 的认证信息.
6.3 ConfigMap
作用: 存储不加密数据到 etcd, 让Pod以变量或者Volume挂载到容器中 场景: 配置文件
6.3-1 Pod 使用 ConfigMap 方式?
将ConfigMap中的数据设置为环境变量
将ConfigMap中的数据设置为命令行参数
使用Volume将ConfigMap作为文件或目录挂载
注意: - ConfigMap必须在Pod使用它之前创建 - 使用envFrom时,将会自动忽略无效的键 - Pod只能使用同一个命名空间的ConfigMap
6.3-2 创建ConfigMap两种方式
方式(1):命令行方式
方式(2):YMAL文件方式
创建pod yaml文件
创建资源服务
7. 集群安全机制
7.1 概述
RBAC 实现机制:基于角色的访问控制
大白话: 白名单机制,想让他具备什么权限,就先创建某个角色Role,然后定制rules,再将某个用户user与role绑定,bind得到这种绑定关系为RoleBind
- Role 权限的集合 - ClusterRole 集群角色 - RoleBinding 角色绑定 - ClusterRoleBinding 集群角色绑定
8. helm
8.1 Helm 安装<包管理工具>
helm:一个命令行客户端工具,主要用于 Kubernetes 应用 chart 的创建、打包、发 布和管理。
Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在 k8s 中创建出真实运行的资源对象。
helm 配置国内 chart 仓库 微软仓库: http://mirror.azure.cn/kubernetes/charts 阿里云仓库: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 官方仓库: https://hub.kubeapps.com/charts/incubator
create
创建一个chart 并指定名字
dependency
管理 chart 依赖
get
下载一个release.可用子命令: all 、hooks、manifest、notes、values
history
获取 release 历史
install
安装一个 chart
list
列出 release
package
将 chart 目录打包到 chart 存档文件中
pull
从远程仓库下载 chart 并解压到本地
repo
添加,列出,移除,更新和索引chart仓库:可用子命令add, index, list, remove, update
rollback
从之前版本回滚
search
根据关键字搜索chart。可用子命令: all, repo
show
查看chart想想信息,可用子命令:all,chart,readme,values
status
显示已命名版本的状态
template
本地呈现摸版
uninstall
卸载一个 release
upgrade
更新一个 release
version
查看helm客户端版本
8.2 使用 chart 部署一个应用
9. Ingress
9.1 概述
9.2 工作原理
9.3 部署Ingress 两种方式
下载部署文件
方式一:Nodeport方式
mandatory.yaml 中的镜像可修改成国内镜像: 例如: - registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64 - registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller
helm 创建工作环境
depoyment.yaml
service.yaml
Ingress.yaml
helm 部署
方式二:deamonset方式
deamonset方式与nodeport方式只有一处不同,只修改mandatory.yaml,而且,service-nodeport.yaml也不用配置,其他不用修改,访问的时候,直接域名访问,不用加nodeport。
9. Yaml格式的pod定义文件完整内容
10. NFS
10.1 服务端
10.2 客户端
11. StorageClass
11.1 流程
创建一个可用的NFS Serve
创建Service Account.这是用来管控NFS provisioner在k8s集群中运行的权限
创建StorageClass.负责建立PVC并调用NFS provisioner进行预定的工作,并让PV与PVC建立管理
创建NFS provisioner.有两个功能,一个是在NFS共享目录下创建挂载点(volume),另一个则是建了PV并将PV与NFS的挂载点建立关联
11.2 访问模式和回收策略
访问模式
回收策略
状态
11.3 NFS 静态方式 PV
集群管理员创建多个PV,它们携带着真实存储的详细信息,这些存储对于集群用户是可用的。它们存在于Kubernetes API中,并可用于存储使用。
11.4 NFS 动态方式 PV
当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于StorageClass。
参考: https://www.jianshu.com/p/15260a66cd41
11.4-1 创建RBAC授权
11.4-2 创建 Storageclass
11.4-3 创建nfs-client-provisioner自动配置程序,以便自动创建持久卷(PV)
自动创建的 PV 以 {namespace}-${pvcName}-${pvName} 的命名格式创建在 NFS 上 当这个 PV 被回收后会以 archieved-{namespace}-${pvcName}-${pvName} 的命名格式存在 NFS 服务器上
11.4-4 创建一个有状态应用
查看 Pod/PV/PVC
11.4-5 破坏性测试
11.4-6 结束语
可以看到, statefulset 控制器通过固定的 pod 创建顺序可以确保 pod 之间的拓扑关系一直处于稳定不变的状态,通过 nfs-client-provisioner 自动创建和每个 pod 有固定对应关系的远程存储卷,确保 pod 重建后数据不会丢失。
第四部分 部署统一日志管理
第五部分 部署性能监控平台
第六部分 搭建高可用的K8S集群
第七部分 K8S集群部署项目
第八部分 Ceph 集群
192.168.110.59
cephnode01
192.168.110.62
cephnode02
192.168.110.64
cephnode03
1、Cepy-deploy 部署
1、初始化(所有主机)
2、主机免密
3、创建一个my-cluster目录,所有命令在此目录下进行(文件位置和名字可以随意)
4、创建一个Ceph集群,(hosts里的解析名和主机名一定要想相同,否则报错)
5、安装Ceph软件(每个节点执行)
6、初始化,并生成monitor检测集群所使用的的秘钥
7、安装Ceph CLI,方便执行一些管理命令
8、配置mgr,用于管理集群
9、部署rgw
10、部署MDS(CephFS)
11、添加osd
12、检查集群健康(node1)
2、ceph.conf
1、该配置文件采用init文件语法,#和;为注释,ceph集群在启动的时候会按照顺序加载所有的conf配置文件。 配置文件分为以下几大块配置。
2、配置文件可以从多个地方进行顺序加载,如果冲突将使用最新加载的配置,其加载顺序为。
3、配置文件还可以使用一些元变量应用到配置文件,如。
4、ceph.conf详细参数
扩展群集
启动并运行基本群集后,下一步是展开群集。添加Ceph元数据服务器node1。然后添加Ceph Monitor和Ceph Manager node2,node3以提高可靠性和可用性。添加元数据服务器:配置MDS服务(NODE1)要使用CephFS,您至少需要一个元数据服务器。执行以下操作以创建元数据服务器:
添加监视器
Ceph存储集群需要至少运行一个Ceph Monitor和Ceph Manager。为了实现高可用性,Ceph存储集群通常运行多个Ceph监视器,因此单个Ceph监视器的故障不会导致Ceph存储集群崩溃。Ceph使用Paxos算法,该算法需要大多数监视器(即,大于N / 2,其中N是监视器的数量)才能形成法定人数。虽然这不是必需的,但监视器的数量往往更好。
添加管理员
Ceph Manager守护进程以活动/备用模式运行。部署其他管理器守护程序可确保在一个守护程序或主机发生故障时,另一个守护程序或主机可以在不中断服务的情况下接管。
配置DashBoard
常用命令整理
创建 Pool 池
为 池 启用ceph应用,并指定池类型
查看所有池, 或者命令: rados lspools
查看所有池的详细信息
修改池名字
设置 池 配额,限制对象数量
设置 池 配额,限制容量数量
取消配额,max_objects 一样
查看池 状态,
创建一个块设备
查看池中,有哪些块设备
查看块设备详细信息
查看池使用情况
查看集群空间使用情况
### 查看池属性
对接 k8s 集群:Rbd 持久化存储 <已验证>
准备工作: 创建pod时,kubelet需要使用rbd命令去检测和挂载pv对应的ceph image,所以要在所有的worker节点安装ceph客户端ceph-common。 将ceph的ceph.client.admin.keyring和ceph.conf文件拷贝到master的/etc/ceph目录下
1、Ceph集群中,创建一个 pool 池,为后面k8s接入使用
2、首先得在kubernetes集群中安装 rbd-provisioner,github仓库链接https://github.com/kubernetes-incubator/external-storage
3、创建storageclass
创建secret保存client.admin和client.kube用户的key,client.admin和client.kube用户的secret可以放在kube-system namespace,但如果其他namespace需要使用ceph rbd的dynamic provisioning功能的话,要在相应的namespace创建secret来保存client.kube用户key信息
其他设置和普通的ceph rbd StorageClass一致,但provisioner需要设置为**
ceph.com/rbd**,不是默认的kubernetes.io/rbd,这样rbd的请求将由rbd-provisioner来处理;考虑到兼容性,建议尽量关闭rbd image feature,并且kubelet节点的ceph-common版本尽量和ceph服务器端保持一致;
4、测试ceph rbd自动分配
在kube-system和default namespace分别创建pod,通过启动一个busybox实例,将ceph rbd镜像挂载到
/usr/share/busybox;
检查pv和pvc的创建状态,是否都已经创建;
在ceph服务器上,检查rbd镜像创建情况和镜像的信息;
检查busybox内的文件系统挂载和使用情况,确认能正常工作;
测试删除pod能否自动删除pv和pvc,生产环境中谨慎,设置好回收策略;
ceph服务器上的rbd image也已清除,自动回收成功;
总结大部分情况下,我们无需使用rbd provisioner来提供ceph rbd的dynamic provisioning能力。经测试,在OpenShift、Rancher、SUSE CaaS以及本Handbook的二进制文件方式部署,在安装好ceph-common软件包的情况下,定义StorageClass时使用
kubernetes.io/rbd即可正常使用ceph rbd provisioning功能。参考: https://jimmysong.io/kubernetes-handbook/practice/rbd-provisioner.html
对接k8s集群: Cephfs 持久化存储 <已验证>
准备工作所以work节点:
# 官方没有cephfs动态卷支持, 使用社区提供的cephfs-provisioner
配置 storageclass 及 Pod 测试
查看是否挂载:
验证:
- provisioner 该字段指定使用存储卷类型为 kubernetes.io/rbd,注意 kubernetes.io/ 开头为 k8s 内部支持的存储提供者,不同的存储卷提供者类型这里要修改成对应的值。 - adminId | userId 这里需要指定两种 Ceph 角色 admin 和其他 user,admin 角色默认已经有了,其他 user 可以去 Ceph 集群创建一个并赋对应权限值,如果不创建,也可以都指定为 admin。 - adminSecretName 为上边创建的 Ceph 管理员 admin 使用的 ceph-secret-admin。 - adminSecretNamespace 管理员 secret 使用的命名空间,默认 default,如果修改为其他的话,需要修改 ceph-secret- admin.yaml 增加 namespace: other-namespace。
第九部分 常见问题
技巧:无法删除 PV,PVC ?
技巧: 无法删除 Pod ?
技巧: kubeadm 如何删除节点?
技巧:如何重启Pod?
Deployment 方式下重启 Pod
使用 YAML 文件重启Pod
莫名被打上污点?
此外,kubernetes 1.6引入了对节点问题的展示.也就是说当满足了特定条件,节点控制器会自动为符合条件的节点添加taint,以下是一些内置的taint
node.kubernetes.io/not-ready,节点还没有准备好,对应节点状态
Ready值为falsenode.kubernetes.io/unreachable,节点控制器无法触及节点,对应节点状态
ready值为Unknownnode.kubernetes.io/out-of-disk,磁盘空间不足
node.kubernetes.io/memory-pressure,节点存在内存压力
node.kubernetes.io/disk-pressure,节点磁盘存在压力
node.kubernetes.io/network-unavailable,节点网络不可用
node.kubernetes.io/unschedulable,节点不可被调度
node.cloudprovider.kubernetes.io/uninitialized
kubeadm安装的K8s忘记了token或者token过期了怎么办?
例如: 主机名:k8s-master IP地址: 192.168.1.136 端口号: 6443
k8s忘记token?
token过期怎么加入k8s集群?
k8s.v1.20 NFS 无法动态创建pvc,Pending状态
Using Kubernetes v1.20.0, getting "unexpected error getting claim reference: selfLink was empty, can't make reference" #25
首先nfs正常状态下,并且可以挂载
必须添加 --feature-gates=RemoveSelfLink=false 在 /etc/kubernetes/manifests/kube-apiserver.yaml 文件内
Last updated