目录

实现思路

需要扩展的类型

核心代码

KubernetesApiGroup

KubernetesKind

KubernetesKindProperties

KubernetesHandler

效果图:

deploy

patch

更复杂的类型


Spinnaker的clouddriver对kubernetes支持本质是将UI入参转化到代码最终转换成本地kuber命令来实现的,因为其是通过“白名单”的策略来实现的,所以对k8s的支持比较有限,不在白名单内的资源类型是无法被spinnaker执行的。像Istio这么火的云原生技术竟然在spinnaker体系中应用不起来,这是不能容忍的,所以经过对clouddriver代码的研究终于找到了破解之法。

实现思路

既然是“白名单”策略,那我们就按照clouddriver框架仿照其它资源把该实现的接口和方法实现掉好了。

需要扩展的类型

先看下跟spinnaker有关涉及到的istio类型吧。

其中绿色部分跟部署计算节点相关,这部分spinnaker已经很完美的实现了,我们需要解决的是入口蓝色部分和网格内流量调度黄色部分,因为这些部分是我们自动化发布流程金丝雀部分需要用到的。

核心代码

spinnaker中对于k8s的支持核心有4个类:KubernetesApiGroup、KubernetesKind、KubernetesKindProperties、KubernetesHandler

KubernetesApiGroup

Spinnaker中支持的k8sAPIGroup的白名单,所以为了支持istio我们需要添加

public static final KubernetesApiGroup NETWORKING_ISTIO_IO = new KubernetesApiGroup("networking.istio.io");

KubernetesKind

Spinnaker中支持的k8s资源类型的白名单,如果manifest的kind不在这个白名单中spinnaker是无法管理的。

  private static KubernetesKind createWithAlias(String name, @Nullable String alias, @Nullable KubernetesApiGroup apiGroup) {KubernetesKind kind = new KubernetesKind(name, apiGroup);aliasMap.put(kind, kind);if (alias != null) {aliasMap.put(new KubernetesKind(alias, apiGroup), kind);}return kind;}

Kind有3个属性,第一个对应资源类型也就是manifest中的kind;第二个是别名,非必填;第三个是api组,对应前面的KubernetesApiGroup
这里我们需要补充spinnaker中用到的3个跟istio相关的kind:

  public static final KubernetesKind VIRTUAL_SERVICE =createWithAlias("virtualService", null, KubernetesApiGroup.NETWORKING_ISTIO_IO);public static final KubernetesKind DESTINATION_RULE =createWithAlias("destinationRule", null, KubernetesApiGroup.NETWORKING_ISTIO_IO);public static final KubernetesKind GATEWAY =createWithAlias("gateway", null, KubernetesApiGroup.NETWORKING_ISTIO_IO);

KubernetesKindProperties

类型相关的配置

  private KubernetesKindProperties(KubernetesKind kubernetesKind, boolean isNamespaced, boolean hasClusterRelationship) {this.kubernetesKind = kubernetesKind;this.isNamespaced = isNamespaced;this.hasClusterRelationship = hasClusterRelationship;}

kubernetesKind对应前面的KubernetesKind;isNamespaced表示资源是否受命名空间的隔离约束,除开高级的管理资源类型基本都是false;hasClusterRelationship这个没看明道,我看现在的类型都是false。
这里我们需要补充istio相关的kindProperties:

new KubernetesKindProperties(KubernetesKind.GATEWAY, true, false),
new KubernetesKindProperties(KubernetesKind.DESTINATION_RULE, true, false),
new KubernetesKindProperties(KubernetesKind.VIRTUAL_SERVICE, true, false),

KubernetesHandler

对每种kind的自定义部分,每个kind必须配备一个handler,以KubernetesVirtualServiceHandler为例:

package com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler;import com.netflix.spinnaker.clouddriver.kubernetes.description.SpinnakerKind;
import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.agent.KubernetesCoreCachingAgent;
import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.agent.KubernetesV2CachingAgentFactory;
import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesKind;
import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest;
import com.netflix.spinnaker.clouddriver.kubernetes.v2.model.Manifest;
import org.springframework.stereotype.Component;import javax.annotation.Nonnull;@Component
public class KubernetesVirtualServiceHandler extends KubernetesHandler {@Overridepublic int deployPriority() {return DeployPriority.MOUNTABLE_DATA_PRIORITY.getValue();}@Nonnull@Overridepublic KubernetesKind kind() {return KubernetesKind.VIRTUAL_SERVICE;}@Overridepublic boolean versioned() {return false;}@Nonnull@Overridepublic SpinnakerKind spinnakerKind() {return SpinnakerKind.CONFIGS;}@Overridepublic Manifest.Status status(KubernetesManifest manifest) {return Manifest.Status.defaultStatus();}@Overrideprotected KubernetesV2CachingAgentFactory cachingAgentFactory() {return KubernetesCoreCachingAgent::new;}
}

deployPriority()定义kind执行时的优先级,因为istio相关的都属于配置类的,所以我们可以参考configMap的优先级。
versioned()定义kind执行时是否有版本的概念,方便历史记录管理和回滚。
spinnakerKind()定义的是在spinnaker中的归类,用于前端deck加载,像pod定义成instance、ingress定义成loadBalancer,istio中如果不做展示可以把资源定义成config,如果前端要看到他们的关联关系就要严格按照spinnaker的类型来定义了。

  INSTANCES("instances"),CONFIGS("configs"),SERVER_GROUPS("serverGroups"),LOAD_BALANCERS("loadBalancers"),SECURITY_GROUPS("securityGroups"),SERVER_GROUP_MANAGERS("serverGroupManagers"),UNCLASSIFIED("unclassified");

status(KubernetesManifest manifest)和cachingAgentFactory()我们也沿用configMap的,主要用于状态判断和缓存管理。

效果图:

deploy

执行结果

patch

patch时需要注意因为istio是CRD实现的,默认的type(strategic)会报错,所以patch时type要选择merge

更复杂的类型

很幸运istio的这些KubernetesKind不需要关心执行结果,像deployment这样的就复杂多了,因为spinnaker不仅需要关心kuber apply命令的结果,还需要去判断有没有达到预期。

private Status status(V1Deployment deployment) {V1DeploymentStatus status = deployment.getStatus();if (status == null) {return Status.noneReported();}if (!generationMatches(deployment, status)) {return Status.defaultStatus().unstable(UnstableReason.OLD_GENERATION.getMessage());}List<V1DeploymentCondition> conditions =Optional.ofNullable(status.getConditions()).orElse(ImmutableList.of());Status result = Status.defaultStatus();getPausedReason(conditions).ifPresent(result::paused);getUnavailableReason(conditions).ifPresent(reason -> result.unstable(reason).unavailable(reason));getFailedReason(conditions).ifPresent(result::failed);checkReplicaCounts(deployment, status).ifPresent(reason -> result.unstable(reason.getMessage()));return result;}注意checkReplicaCounts()这个地方就是去检查有没有开出理想中的pod数量。

Spinnaker的Clouddriver如何支持Istio相关推荐

  1. Nacos 1.1.4 发布,业界率先支持 Istio MCP 协议

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! Nacos 是阿里巴巴开源的服务发现与配置管理项目,本次 ...

  2. K8s集成实战-使用spinnaker进行自动化部署

    1 spinnaker概述和选型 1.1 概述 1.1.1 主要功能 Spinnaker是一个开源的多云持续交付平台,提供快速.可靠.稳定的软件变更服务.主要包含两类功能:集群管理和部署管理 1.1. ...

  3. 深入浅出Istio:Service mesh快速入门与实践-读书笔记(By GisonWin)

    01 服务网格历史 (以后补充) 02 服务网格的基本特性 连接 微服务错综复杂,要完成其业务目标,连接问题是首要问题.连接存在于所有服务的整个lifcecycle中,用于维持服务的运行. 安全 保障 ...

  4. 深度剖析Service Mesh服务网格新生代Istio

    作者简介:敖小剑,十五年软件开发经验,微服务专家,专注于基础架构,Cloud Native拥护者,敏捷实践者.曾在亚信.爱立信.唯品会和ppmoney任职, 现任数人云资深架构师,本文由数人云独家授权 ...

  5. [转载] 什么是istio 官网内容

    网址:https://preliminary.istio.io/zh/docs/concepts/what-is-istio/ mark 一下 1.0 昨天刚发布. 2018.7.31 Istio 是 ...

  6. Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...

    Istio Gateway提供多个自定义入口网关的支持能力,通过开放一系列端口用于承载网格边缘的进入连接,同时可以使用不同loadbalancer来隔离不同的入口流量.cert-manager可用于使 ...

  7. Istio 1.5 发布——拥抱变化,爱上单体

    北京时间 2020 年 3 月 6 日凌晨,我们期待已久的 Istio 1.5 发布了,发布公告见 https://istio.io/news/releases/1.5.x/announcing-1. ...

  8. 万字长文|深度剖析Service Mesh服务网格新生代Istio

    Service Mesh新秀,初出茅庐便声势浩荡,前有Google,IBM和Lyft倾情奉献,后有业界大佬俯首膜拜,这就是今天将要介绍的主角,扛起Service Mesh大旗,掀起新一轮微服务开发浪潮 ...

  9. 小米正式开源 Istio 管理面板 Naftis

    百度智能云 云生态狂欢季 热门云产品1折起>>>   近年来服务网格(Service Mesh)已成为各大公司关注重点,各大公司纷纷开始调研 Service Mesh 相关架构.作为 ...

最新文章

  1. 【高并发】你敢信??HashMap竟然干掉了CPU!!
  2. Raspberry学习——raspberry pi 3 截图及查看
  3. 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
  4. html5 canvas获取坐标,HTML5 canvas坐标
  5. 日期与时间(C/C++)
  6. python小工具自动审单录凭证_跟着老板工作了二十年,最近来了个新员工然后我被开除了...
  7. 河北省能力计算机提升培训,基于教师工作坊的河北省教师信息技术应用能力提升三位一体培训模式研究...
  8. 【Flink】No tests found matching Method xx from org.junit.internal.requests.ClassRequest
  9. java类加载器分类_Java 类加载器的种类
  10. wait与notify
  11. convolutional pose machines
  12. 作为技术人为什么想创业
  13. todo elk搭建日志系统
  14. 编码器及编码器在SMART200中的使用
  15. Unity Behavior Designer(行为树)Abort Type(中断类型)
  16. python 答题辅助_如何在百万英雄直播答题中使用Python辅助?
  17. ‘connector.type‘ expects ‘filesystem‘, but is ‘kafka‘
  18. 中国极地考察船“雪龙”号前往南极中山站
  19. Windows 清理磁盘
  20. 微信小程序实现短信认证功能

热门文章

  1. mybatis详解(全)
  2. 通俗易懂的告诉你CPU和GPU的区别
  3. python中将一个列表赋值给另一个列表
  4. 计算机在科技英语翻译中起的作用,四字词语在科技英语翻译中的应用解析
  5. qt connect函数_小白学QT 使用VS 给 qt 添加信号槽
  6. jquery双重循环
  7. flyme android os 耗电,国内手机OS流畅度排行榜:Flyme第一,MIUI倒数
  8. 杭州应届生php平均薪资,杭州应届生起薪平均值4275元 排非一线城市之首
  9. 常见排序算法详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序)
  10. 微信小程序 无限formId 无限发送模板消息 保存formId