尚硅谷k8s课堂随笔

第一部分 K8S基本概念

1. K8S概述和特性

  • K8S是谷歌在2014年开业的容器化集群管理系统

  • 使用k8s进行容器化应用部署

  • 使用k8s利于应用扩展

  • k8s目标实施让部署容器化应用更加简洁和高效

2. K8S架构组件

Master(主控节点)和 node (工作节点)

  1. master 组件

    • apiserver ---> 集群统一入口,以 restfull 方式,交给 etcd 存储

    • scheduler ---> 节点调度,选择node节点应用部署

    • controller-manager ---> 处理集群中常规后台任务,一个资源对应一个控制器

    • etcd ---> 存储系统,保存集群相关的数据

  2. 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 基础命令解释

create
通过文件名或标准输入创建资源

expose

将一个资源公开为一个新的 Service

run

在集群中运行一个特定的镜像

set

在对象上设置特定的功能

get

显示一个或多个资源

expian

文档参考资料

edit

使用默认的编辑器编辑一个资源

delete

通过文件名、标准输入、资源名称或标签选择器来删除资源

5.2 部署和集群管理命令解释

rollout
管理资源的发布

rolling-update

对给定的复制控制器滚动更新

scale

扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job

autoscale

创建一个自动选择扩容和缩容并设置Pod数量

certificate

修改证书资源

cluster-info

显示集群信息

top

显示资源(CPU/Memory/Storage)使用

cordon

标记节点不可调度

uncordon

标记节点可调度

drain

驱逐节点上的应用,准备下线维护

taint

修改节点 taint 标记

5.3 故障和调试命令解释

describe
显示特定资源或资源组的详细信息

logs

在一个Pod中打印一个容器日志。如果Pod只有一个容器,容器名称是可选的

attach

附加到一个运行的容器

exec

执行命令到容器

port-forward

转发一个或多个本地端口到一个pod

cp

拷贝文件或目录到容器中

auth

检查授权

5.4 其他命令解释

apply
通过文件名或标准输入对资源应用配置

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 服务器

服务器
IP(需联网)

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 服务器

服务器
IP(需联网)

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可以通过其他Pod的IP进行访问

1.3 Pod 生命周期和重启策略

Pod 状态
说明

Pending

API Server已经创建该Pod,但Pod中的一个或多个容器还没创建,包括镜像下载过程

Running

Pod内错有容器已创建,且至少一个容器处于运行状态、正在启动或正在重启

Completed

Pod内所有容器均成功执行退出,且不会重启

Faild

Pod内所有容器均已退出,但至少一个容器退出失败

Unknow

由于某种原因无法获取Pod状态,例如网络通信不畅

Pod 重启策略
说明

Always

当容器失效时,由kubelet自动重启该容器

OnFailure

当容器终止运行且退出码不为0,由kubelet自动重启该容器

Never

不论容器运行状态如何, kublete都不会重启该容器

Pod包含的容器数
Pod当前的状态
发生事件
Pod的结果状态

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中剔除

Probe 支持是三种检查方式
说明

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 流程

  1. 创建一个可用的NFS Serve

  2. 创建Service Account.这是用来管控NFS provisioner在k8s集群中运行的权限

  3. 创建StorageClass.负责建立PVC并调用NFS provisioner进行预定的工作,并让PV与PVC建立管理

  4. 创建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 集群

IP
主机名

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

配置 storageclassPod 测试

查看是否挂载:

验证:

​ - 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值为false

  • node.kubernetes.io/unreachable,节点控制器无法触及节点,对应节点状态ready值为Unknown

  • node.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