IaaS

Openstack on Kubernetes, Hybrid混合云: VM, Container, Bare metal. 公有云, 私有云基础设施自动化部署, IAC(Infrastructure as Code)基础设施即代码.

PaaS

多集群Kubernetes容器管理平台, Kata container安全容器Secure Container. Kubevirt虚拟机编排.

DevOps

开发全流程生命周期管理: GitLab, Jenkins, GitLab Runner, Sonar, Harbor, Helm, Kubernetes, jira, wiki.

MLOps

算法模型生命周期管理: 开发, 训练, 超参数调优, 发布, 推理服务.

Logging

集中的日志查看, ELK, EFK, Grafana Loki.

Monitoring

高可用IaaS, PaaS, Application指标监控, 链路跟踪, 分布式监控数据存储.

关注我们

方案咨询,项目合作,技术交流.

订阅

博客文章

云上的知识 —— Openstack, Kubernetes, DevOps, MLOps, 机器学习, 安全, 监控, 日志等

Kubernetes容器存储接口CSI插件controller

SuKai 在 August 29, 2022

前面文章介绍了CSI插件node-agent组件,node-agent主要实现了需要在主机节点上才能进行的操作功能,包含了LVMNode, LVMVolume, LVMSnapshot三个自定义资源控制器和NodeServer接口服务。那么LVMVolume,LVMSnapshot这些自定义资源又是由谁创建的呢?今天我们一起看一下OpenEBS LVM存储插件的Controller部分,了解Controller如何被编排调度系统Container Orchestration system(CO)侧Kubernetes调用,Controller又如何创建自定义资源给Node-Agent调谐的。 之前我们了解到CO侧Kubernetes开发了一系列组件如external-provisioner,external-attacher,external-snapshotter,external-resizer,这些组件通过Sidecar的方式和Plugin插件驱动侧一起运行,直接调用插件Controller的gRPC服务,实现存储卷的管理。下面我们来看一下Controller的接口服务。 Controller Interface包括以下方法 // ControllerServer is the server API for Controller service. type ControllerServer interface { // 创建存储卷,创建自定义资源LVMVolume实例 CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error) // 删除存储卷,删除LVMVolume实例 DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error) // 挂接存储卷到指定节点,因为LVM是本地设备,末实现 ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error) // 卸载存储卷,末实现 ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error) // 验证是否支持存储卷访问模式,比如支持单/多机读写,Read-Write-Once ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error) // 列出所有的存储卷,末实现 ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error) // 返回指定节点的容量信息,可用存储空间 GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error) // 返回controller支持的功能,比如创建/删除存储卷,扩展存储卷,创建删除快照,获取容量 ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error) // 创建指定存储卷快照 CreateSnapshot(context.

继续阅读

Kubernetes容器存储接口CSI插件node-agent

SuKai 在 August 26, 2022

Kubernetes CSI插件包含两部分:controller, node-agent。今天我们一起来看一下OpenEBS的LVM存储插件,了解OpenEBS如何实现Kubernetes使用LVM逻辑卷存储数据的。LVM逻辑卷管理(Logical Volume Manager),建立在硬盘和分区之上的一个逻辑层,提高磁盘分区管理的灵活性。Kubernetes可以利用LVM本地磁盘提高存储性能,LVM具备快照功能,为KubeVirt虚拟机提供了基于Copy-On-Write的精简配置存储,是一个非常不错的轻量级超融合解决方案。 本文将包含以下几个部分:LVM基本概念,node-agent包含组件,node-agent代码实现。 LVM基本概念 PV物理卷(physical volume),LVM的基本存储逻辑块,一个PV对应一个硬盘或者硬盘分区。VG卷组(Volume Group)由物理卷组成。LV逻辑卷(Logical Volume),建立在卷组之上,一个卷组可以创建多个逻辑卷,一个逻辑卷对应一个卷组。 LVM卷快照(snapshot)用于从文件系统的时间点视图创建备份。从快照备份文件系统,卷本身供用户使用,快照最初包含自身相关的一些元数据,不包含源逻辑卷的实际数据。快照使用写时复制技术Copy-On-Write(COW)在原始数据块的数据发生更改时,复制源块中数据进行更改。 LVM精简卷Thin Provisioned Logical Volumes,精简配置逻辑卷对存储资源进行按需动态分配,即对存储进行了虚拟化管理。在卷组上建立精简池Thin Pool,在精简池上创建精简卷Thin Volume。 node-agent组件 node-agent包含:三个自定义资源控制器,一个gRPC服务。 gRPC服务 Kubelet调用node-agent的gRPC服务接口,将存储卷挂载到本机目录,kubelet创建容器时将目录文件挂载到容器。 NodeServer接口如下: type NodeServer interface { // 挂载存储卷到临时目录 NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error) // 从临时目录卸载存储卷 NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error) // 发布存储卷,LVM逻辑卷挂载到对应主机指定目录。 NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) // 取消发布存储卷,卸载对应主机上的LVM逻辑卷。 NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) // 返回存储卷统计信息,容量,inodes。 NodeGetVolumeStats(context.Context, *NodeGetVolumeStatsRequest) (*NodeGetVolumeStatsResponse, error) // 扩展存储卷容量。 NodeExpandVolume(context.Context, *NodeExpandVolumeRequest) (*NodeExpandVolumeResponse, error) // 返回主机节点支持的能力,比如支持存储卷扩展,存储卷数据统计。 NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error) // 返回主机节点信息,主要是Label标签里的拓扑信息。 NodeGetInfo(context.

继续阅读

Kubernetes如何使用不同厂商存储

SuKai 在 August 23, 2022

今天我们一起来看一下Kubernetes如何使用不同厂商存储的,了解一下CSI基本的概念。 基本概念 CSI 容器存储接口Container Storage Interface规范,定义了一个行业标准,使用存储厂商开发的插件可以在多个容器编排系统运行。 PV 持久卷PersistentVolume,Kubernetes集群中的一块存储卷,提供给Pod容器存储数据,通过卷插件(provisioner)来管理,拥有独立于Pod的生命周期。 PVC 持久卷声明PersistentVolumeClaim,用户对存储的资源请求声明。 StorageClass 存储类,集群中可以提供的存储类型。管理员可以创建不同的存储类来对应不同的存储资源,卷插件和策略。 Porvisioner 卷插件根据资料请求信息完成存储设备的卷资源操作。 dynamic provisioning 动态卷配置,基于StorageClass的自动化存储资源的生命周期管理,按用户需求自动动态创建和调整存储资源,用户无需过多关注存储的管理。 下面我们一起来看一下,如何使用动态卷配置。 动态卷配置流程 1,创建一个StorageClass,指定卷插件,回收策略,存储卷绑定模式。 2,用户创建一个PVC持久卷声明,指定卷使用的存储类,读写模式,资源大小,卷类型。 3,卷插件创建持久卷。 4,Kubernetes绑定持久卷和持久卷声明。 5,容器启动时,挂载到容器中使用。 使用示例 创建CSIDriver 创建一个CSI存储插件,当我们的插件注册时会使用相同的名称,Kubernetes的组件根据名称调用插件服务。 --- # Create the CSI Driver object apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: local.csi.sukai.io spec: # do not require volumeattachment attachRequired: false podInfoOnMount: true storageCapacity: true 创建StorageClass 指定provisioner为local.csi.sukai.io apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: openebs-lvmsc allowVolumeExpansion: true parameters: volgroup: "lvmvg" provisioner: local.csi.sukai.io 默认的回收策略为Delete删除策略,当与PV绑定的PVC被删除的时候,删除PV存储资源。另一种策略为Retain保留策略。持久卷绑定模式为Immediate即刻绑定,立即创建持久卷并将其绑定到持久卷声明。WaitForFirstConsumer为首次使用时绑定,第一次被容器组使用时,才创建持久卷,并将其绑定到持久卷声明。

继续阅读

云平台厂商如何避免IP进入垃圾邮件黑名单

SuKai 在 July 16, 2022

各大邮件服务商都有严格的反垃圾邮件规则,一旦IP或者域名进入了垃圾邮件黑名单,那么各大厂商都会拒收来自这个IP或者域名的所有邮件,并且只有解决掉垃圾邮件问题才能从黑名单中移除,无法申诉黑名单例外。所以几乎所有云平台厂商都默认禁止使用云平台的IP向外发送邮件,业务需要时可以申请并遵守协议才开放有限的IP发送邮件。那么有什么技术解决方案,满足用户发送邮件的需求呢?一些云平台厂商提供了SMTP中继服务,用户可将邮件通过云平台的中继服务器代发邮件,中继服务器在进行垃圾邮件过滤后再转发出去。 下面我们看一下如何使用Postfix搭建邮件中继服务器,搭建邮件中继服务器过程如下: 1,生成TLS证书,SMTP使用安全连接传输邮件。 2,安装Postfix,提供邮件发送服务。 3,安装dovecot,用于Postfix的SMTP服务认证smtp-auth。 4,安装spamassassin,用于垃圾邮件扫描。 5,用户配置路由,使用中继服务器发送邮件。 基本概念 Smarthost/SMTP relay SMTP是简单邮件发送协议简称,SMTP relay,SMTP中继,SMTP relay提供邮件代发服务,用户的邮件服务器通过配置,将邮件发送到SMTP relay服务器,SMTP relay服务器将邮件发送到目的邮件服务器。Smarthost也是SMTP relay服务,smarthost需要认证才能使用代发服务,面向部分特定用户。中继服务器一般只提供SMTP发送邮件服务,不提供IMAP/POP3邮箱服务。 SASL Simple Authentication and Security Layer, 简单验证和安全层,SASL为应用程序和共享库的开发者提供了用于验证、数据完整性检查和加密的机制。SASL特别适用于使用SMTP、IMAP应用程序,SMTP、IMAP这些协议全都支持SASL。SASL对用户使用两个重要的标识符,验证ID(authid)用于验证用户的用户ID,授予用户系统访问权限。授权ID(userid)用于检查是否允许用户使用特定选项。SASL客户端和服务器应用程序协商SASL机制和安全级别,双方协商验证机制后,交换验证数据进行验证。 SMTP over SSL/TLS SSL(Secure Socket Layer)是加密传输层,TLS(Transport Layer Security)是SSL的升级版,提供更好的安全性和性能。STARTTLS是升级非安全连接为安全连接的协议,当服务端支持时,客户端和服务端协商将已经建立的连接升级到SSL加密。 设置主机名和DNS DNS中添加主机名解析,同时在域名的SPF记录中添加允许这台中继服务器发送邮件。 # 主机名配置FQDN域名 root@mx1:~# vi /etc/hostname mx1.primebooksnepal.com # 在DNS上添加A记录解析主机名 root@mx1:~# dig mx1.primebooksnepal.com +short 220.182.46.201 root@mx1:~# dig txt primebooksnepal.com +short "v=spf1 +a +mx +ip4:103.98.131.78 +ip4:220.182.46.201 include:_spf.google.com -all" "google-site-verification=z0qEJnwgxS04QWO_g_jlKLQCDKeqskPgMddZ39HI8-c" root@mx1:~# 安装Let’s encrypt 通过DNS认证方式生成SSL证书,CA证书 /etc/letsencrypt/live/mx1.primebooksnepal.com/fullchain.pem,私有key /etc/letsencrypt/live/mx1.primebooksnepal.com/key.pem。certbot会自动创建任务进行证书更新。 root@mx1:~# apt install certbot root@mx1:~# certbot certonly --manual --rsa-key-size 4096 --agree-tos --preferred-challenges dns -d mx1.

继续阅读