业务系统迁移
Harbor介绍
- Harbor Registry(又称 Harbor 云原生制品仓库或 Harbor 镜像仓库)由 VMware 公司中国研发中心云原生实验室原创,并于 2016 年 3 月开源。Harbor 在 Docker Distribution的基础上增加了企业用户必需的权限控制、镜像签名、安全漏洞扫描和远程复制等重要功能,还提供了图形管理界面及面向国内用户的中文支持,开源后迅速在中国开发者和用户社区流行,成为中国云原生用户的主流容器镜像仓库。
- Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。
harbor的功能
- 云原生注册表:支持容器镜像和Helm图表,Harbor 充当云原生环境(如容器运行时和编排平台)的注册表。
- 基于角色的访问控制:用户通过“项目”访问不同的存储库,用户可以对项目下的图像或 Helm 图表具有不同的权限。
- 基于策略的复制:可以使用过滤器(存储库、标签和标签)基于策略在多个注册表实例之间复制(同步)图像和图表。如果遇到任何错误,Harbor 会自动重试复制。这可用于辅助负载平衡、实现高可用性以及促进混合和多云场景中的多数据中心部署。
- 漏洞扫描:Harbor 定期扫描映像以查找漏洞,并进行策略检查以防止部署易受攻击的映像。 LDAP/AD
- 支持:Harbor 与现有的企业 LDAP/AD 集成以进行用户身份验证和管理,并支持将 LDAP 组导入 Harbor,然后可以授予特定项目的权限。
- OIDC 支持:Harbor 利用 OpenID Connect (OIDC) 来验证由外部授权服务器或身份提供者认证的用户的身份。可以启用单点登录以登录到 Harbor 门户。
- 图像删除和垃圾收集:系统管理员可以运行垃圾收集作业,以便可以删除图像(悬空清单和未引用的 blob)并定期释放它们的空间。
- Notary:支持使用 Docker Content Trust(利用 Notary)对容器镜像进行签名,以保证真实性和出处。此外,还可以激活防止部署未签名映像的策略。
- 图形用户门户:用户可以轻松浏览、搜索存储库和管理项目。
- 审计:通过日志跟踪对存储库的所有操作。
- RESTful API:提供 RESTful API 是为了方便管理操作,并且易于用于与外部系统集成。嵌入式 Swagger UI 可用于探索和测试 API。
- 易于部署:Harbor 可以通过 Docker compose 以及 Helm Chart 进行部署,最近还添加了一个 Harbor Operator。
kubernetes服务发现的三大场景
- 集群内部的服务的服务发现、访问
- 集群内访问集群外的服务
- 集群外访问集群内部的服务
ingress
- Kubernetes 暴露服务的方式:
- NodePort:后期维护困难,不支持虚拟路径
- LoadBlancer:需要云厂商支持,有局限性
- ClusterIP:只能在集群内部访问
- Ingress:灵活,无依赖
前三种方式都是在service的维度提供的,service的作用体现在两个方面,对集群内部它不断跟踪pod变化,更新endpoint中对应的pod的对象,提供IP不断变化的pod的服务发现机制;对集群外部,它类似负载均衡器,可以在集群内外对pod进行访问。但是单独使用service暴露服务的方式,在实际生产环境中不太适应。 而ingress相当于service的service,可以将外部请求通过不同规则的筛选后转发到不同的service
-
ingress与ingress-controller
- ingress是k8s中的一个api对象,一般用yaml配置。作用是定义请求转发的规则,可以理解为配置模板或者配置文件。
- ingress-controller是具体实现反向代理及负载均衡的程序,通过对ingress中定义的规则进行解析,根据其规则来实现转发。
- ingress-controller并不是k8s自带的组件,实际上它只是一个统称,用户可以选择不同的ingress-controller来实现功能。其中由k8s官方维护的是nginx-ingress。
-
配置方式
- Deployment+LoadBalancer模式的Service
- 如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露
- Deployment+NodePort模式的Service
- 同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
- NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响
- DaemonSet+HostNetwork+nodeSelector
- 用DaemonSet结合nodeselector来部署ingress-controller到特定的node上(也可结合affinity亲和性部署到多个节点),然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。比较适合大并发的生产环境使用。
- Deployment+LoadBalancer模式的Service