共享存储原理
PVC消费PV资源
StorageClass 标识一类特殊属性的存储,可动态按需分配
PV
k8s支持的PV常用的有:CethFS,FC,Flocker,Glusterfs,HostPath,iSCSI,Local,NFS,RBD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: v1 kind: PersistentVolume metadata: name: block-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce # ReadOnlyMany ReadWriteMany persistentVolumeReclaimPolicy: Retain #回收策略 #storageClassName: xxx 具有特定类别的PV只能与请求了该类别的PVC绑定 volumeMode: Block # 默认 Filesystem fc: targetWWNs: ["50060e8f322"] lun: 0 readOnly: false #mountOptions: # 挂载参数 #nodeAffinity: # 节点亲和性 限制只能通过这些Node访问 |
CephFS:ReadWriteOnce ReadOnlyMany ReadWriteMany
Glusterfs: ReadWriteOnce ReadOnlyMany ReadWriteMany
NFS: ReadWriteOnce ReadOnlyMany ReadWriteMany
RBD:ReadWriteOnce ReadOnlyMany
PV生命周期
- Available 可用状态,未与某个PVC绑定
- Bound 已与某个PVC绑定
- Rleased 绑定的PVC已删除,资源已释放但没有被集群回收
- Failed 自动资源回收失败
PVC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi storageClassName: slow #若值填空,则只能选择未设定class的pv与之匹配和绑定 selector: # 下面两个标签条件需要同时满足 matchLabels: release: "stable" matchExpressions: - {key: environment, operator: In, values: [dev]} |
前提条件
admission-control 中添加 DefaultStorageClass
设置默认StorageClass
annotation "storageclass.kubernetes.io/is-default-class=true"
# 查看
kubectl get sc #(default)
PV和PVC受限于Namespace
若资源供应采用动态模式,如果PVC有设置selector,那么系统将无法为其供应任何存储资源
在动态供应模式下,PV默认回收策略是 Delete ,若需要保留PV,则在动态绑定成功后,手动将回收策略改为 Retain
k8s提供静态和动态两种资源供应方式,供应结果就是生成PV
PVC可以声明Class为"",表明禁止使用动态模式
多个Pod可以挂载同一个PVC
StorageClass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: kubernetes.io/glusterfs parameters: resturl: "http://127.0.0.1:8081" clusterid: "xxxxxx" restauthenabled: "true" #是否启用安全机制 restuser: "admin" secreNamespace: "default" secretName: "heketi-secret" gidMin: "40000" gidMax: "50000" volumetype: "replicate:3" # disperse:4:2 数据4份冗余2份 ;none |
GlusterFS 实践
1、在需使用glusterfs的节点上安装客户端
yum install glusterfs glustfs-fuse
kube-apiserver 启动参数 --allow-privileged=true
# 在需要部署glusterfs管理服务的节点上打标签
kubectl label node xxxx storagenode=glusterfs
2、创建glusterfs管理服务容器集群
以DaemonSet方式部署
编排文件 page 552(525)
3、创建Heketi服务
创建一个sa
编排文件 page 556(528)
4、为Heketi设置GlusterFS集群
topology.json
hekiti-cli topology load --json=topology.json
hekiti-cli topology info
5、定义storageclass
6、定义PVC
7、pod使用PVC的存储资源
1 2 3 4 |
volumes: - name: gluster-volume persistentVolumeClaim: claimName: pvc-gluster-heketi |
CSI存储机制
存储提供方代码与k8s代码彻底解耦,部署也与k8s核心组件分离,更加安全可靠
包括两种组件:CSI Controller 和 CSI Node
CSI Controller提供存储服务视角对存储资源和存储卷进行管理和操作,建议部署为单实例pod
CSI Node对主机上的volume进行管理和操作,建议部署为daemonset
--feature-gates=VolumeSnapshotDataSource=true,CSINodeInfo=true,CSIDriverRegistry=true
CSI已经可用于生产了
如 Alicloud Elastic Block Storage,Alicloud Elastic File System,Alicloud OSS,CephFS,GlusterFS,RBD
详见 https://kubernetes-csi.github.io/docs/drivers.html
存储卷快照功能 Volume Snapshots
1 2 3 4 5 6 7 8 9 |
apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata; name: xxxx spec: snapshotClassName: csi-hostpath-snapclass source: name: pvc-test kind: PersistentVolumeClaim |
kubernetes 开发指南
k8s api官方文档:https://kubernetes.io/docs/reference
k8s 1.13及之前的版本可开启Swagger文档
kube-apiserver 启动参数 --enable-swagger-ui=true
访问地址: http://<master-ip>:<master-port>/swagger-ui/
resourceVersion 资源的内部版本号的字符串,可用它判断资源是否改变
status.phase 描述对象所处的生命周期,包括 Pending,Running,Active,Terminated
k8s从1.14开始,使用 OpenAPI 格式对API进行查询
访问地址: http://<master-ip>:<master-port>/openapi/v2
可以查看所有接口方法,请求参数,响应等内容
api版本
v1 GA稳定版本
alpha 实验性版本,对旧版本,可直接废弃
beta 预发布版本
api组
核心组,如v1
apiVersion: $GROUP_NAME/$VERSION 如,apps/v1beta1
启用哪些分组需要在api server启动参数中设置
PUT 更新或创建资源
PATCH 修改资源的某个指定的域
观察者模式API接口
GET /watch/<资源名复数格式>
GET /watch/<资源名复数格式>/<name>
随着时间变化,不断接收一连串的json对象,这些对象记录了资源的变化
API返回状态码
使用api替换对象
在替换对象前,先获取该资源的json对象,然后在该json对象的基础上修改要替换的部分
官方客户端库
https://github.com/kubernetes/client-go/
社区客户端库
https://github.com/ericchiang/k8s
Kubernetes API 扩展
两种扩展API的机制
- 使用CRD,无须编写额外的API Server,只需定义CRD,并提供一个CRD控制器就可以通过API管理自定义资源对象
- 使用API聚合,需编写额外的API Server,要求用户自行处理多个API版本的支持
使用CRD扩展API
CRD是一段声明,用于定义自定义资源对象
CRD Controller 实现对CRD对象的管理
开发示例:
https://github.com/kubernetes/sample-controller
https://github.com/kubernetes/sample-controller/blob/master/docs/controller-client-go.md
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: virtualservices.networking.istio.io annotations: "helm.sh/hook": crd-install labels: app: istio-pilot spec: group: networking.istio.io #映射到/apis/的下一级目录,如 /apis/networking.istio.io scope: Namespaced #生效范围 Namespaced 和 Cluster versions: #支持的版本 如/apis/networking.istio.io/v1alpha3 - name: v1alpha3 #版本名称 served: true #是否启用 storage: true #是否进行存储,只能有一个版本设置为 true names: #CRD的名称 包括单数、复数、kind、所属组等 kind: VirtualService #CRD资源类型名驼峰式命名,首字母需大写 listKind: VirtualServiceList #CRD列表,<kind>List格式 singular: virtualservice #单数形式,全部小写 plural: virtualservices #复数形式,全部小写 categories: #CRD所属的资源组列表 - istio-io - networking-istio-io # 创建后,可通过 /apis/networking.istio.io/v1alpha3/namespaces/<namespace>/virtualservices/ 管理 |
1 2 3 4 5 6 7 |
#基于CRD的定义创建资源对象 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: xxx spec: ... spec中可设置的参数由开发者自定义,由CRD控制器进行解析和处理 |
# 使用
kubectl get virtualservice
kubectl get istio-io #也可通过CRD的categories进行查询
CRD高级特性
subresources子资源,校验机制validation,自定义查看CRD时需要显示的列,finalizer预删除钩子
subresources子资源
status,启用/status路径,值来自CRD的。status字段,要求CRD控制器能设置和更新这个字段的值
scale,启用/scale路径,支持通过hap与CRD进行交互,通过kubectl scale可实现扩容和缩容,要求CRD支持多副本运行
1 2 3 4 5 6 7 |
spec: subresources: status: {} scale: specReplicasPath: .spec.replicas #用户期望的副本数的json路径 statusReplicasPath: .status.replicas #获取当前副本数的json路径 labelSelectorPath: .status.labelSelector #获取标签选择器的json路径 |
CRD校验Validation
kube-apiserver开启 --feature-gates=CustomResourceValidation=true 开关
1 2 3 4 5 6 7 8 9 10 11 12 13 |
spec: validation: openAPIV3Schema: properties: spec: properties: cronSpec: #要校验的字段 type: string pattern: '^(\d+|\*)(/\d+)?(\s+|\*)(/\d+){4}$' replicas: #要校验的字段 type: integer minimum: 1 maximum: 10 |
自定义查看CRD时需要显示的列
kubectl get 时显示的列
1 2 3 4 5 6 |
spec: additionalPrinterColumns: - name: Spec type: string description: xxxxxxxxx JSONPath: .spec.cronSpec #定义数据源 |
Finalizer预删除钩子方法
Finalizer设置的方法在删除CRD资源对象时进行调用,以实现CRD资源的清理工作
1 2 3 |
metadata: finalizers: - <url> |
API聚合机制
将用户扩展的API注册到kube-apiserver上,仍然通过 API Server对新的API进行访问和操作
kube-apiserver启动参数 认证相关的参数
注册自定义APIService资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: apiregistration.k8s.io/v1beta1 kind: APIService metadata: name: xxx spec: service: name: custom-metrics-server #服务名 namespace: custom-metrics group: custom.metrics.k8s.io #组名 version: v1beta1 #版本号 /apis/custom.metrics.k8s.io/v1beta1 insecureSkipTLSVerify: true groupPriorityMinimum: 100 versionPriority: 100 #发往/apis/custom.metrics.k8s.io/v1beta1的访问会被api聚合层代理转发到 custom-metrics-server.custom-metrics.svc上 |
部署自定义api服务,需要遵循k8s规范
https://github.com/kubernetes/sample-apiserver
metrics server的示例:page 656 (629)
转载请注明:轻风博客 » kubernetes权威指南笔记(三)