K8s Istio

常用命令:

1
2
3
4
#进入容器的一个网络空间,查看网络代理
ps aux|grep 容器名 #显示所有包含其他使用者的行程
nsenter -n --target <上一步的pid> #进入pid的网络空间
iptables -t nat -L #查看iptables规则

概念

  • Istio:开源的服务网格

  • Istio 由两个部分组成:控制平面和数据平面。

  • Istio 主要功能:流量管理、可观测性、安全性能

Istio组件

Components Description
istio-citadel 通过内置身份和凭证管理赋能强大的服务间和最终用户身份验证
istio-galley 代表其他的 Istio 控制平面组件,用来验证用户编写的 Istio API 配置
istio-ingressgateway 提供外网访问的网关
istio-pilot 为 Envoy Sidecar 提供服务发现功能
istio-policy 用于向 Envoy 提供准入策略控制,黑白名单控制,速率限制等相关策略
istio-sidecar-injector 为配置注入的pod自动注入 Sidecar
istio-telemetry 为 Envoy 提供了数据上报和日志搜集服务
jaeger-collector 收集sidecar的数据,Istio 里面 sidecar 就是 jaeger-agent
jaeger-collector-headless 收集 sidecar 的数据,Istio 里面 Sidecar 就是 jaeger-agent
jaeger-query 接收查询请求,然后从后端存储系统中检索 trace 并通过 UI 进行展示
jaeger-operator 负责创建 Jaeger 服务,并在配置更新时自动应用到 jaeger 服务

需要解决的问题

  1. 集群外的服务如何访问。
  2. 两个集群架构不一致,如何互相提供服务。

实战

kiali启用

服务=>Istio-system=>kiali=>更多操作=》编辑外网访问=〉NodePort,然后使用节点ip➕20001对应的NodePort进行访问。

多注册中心实现,修改注册中心(Istio文档)(最新版本移除了Consul

  1. 编辑istiod的配置文件,添加registries参数,该参数要读取的平台服务注册表的逗号分隔列表(从 {Kubernetes, Consul, Mock} 中选择一个或多个)(默认 [Kubernetes]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    kind: Deployment
    apiVersion: apps/v1
    metadata:
    name: istiod-1-6-10
    namespace: istio-system
    .....
    containers:
    - name: discovery
    image: 'registry.cn-beijing.aliyuncs.com/kubesphereio/pilot:1.6.10'
    args:
    - discovery
    - '--monitoringAddr=:15014'
    - '--registries=Kubernetes,Consul' #新加该参数
    - '--log_output_level=default:info'
    - '--domain'
    - cluster.local
    - '--trust-domain=cluster.local'
    - '--keepaliveMaxServerConnectionAge'
    - 30m
    .....

第三方注册中心集成到Isito

dubbo注册转istio(dubbo2istio)

如何将第三方服务中心注册集成到 Istio ?

Dubbo to Mesh 云原生架构改造方案解析

Pilot 服务模型源码分析

SpringCloud使用K8S(etcd)作为注册中心(Spring Cloud Kubernetes官方文档

SpringCloud project transformed into Spring Cloud Kubernetes project

替换eureka依赖为:

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client</artifactId>
<version>2.1.2</version>
</dependency>

Dubbo改造k8s云原生项目

Dubbo Mesh 总体架构

Dubbo 3.0云原生架构

Dubbo Sidecar Mesh(完全改造模型)

使用实战
  1. 消费者替换或添加dubbo依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>3.1.5</version>
    </dependency>
    <dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.20.3</version>
    </dependency>
    <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
    <version>3.1.5</version>
    <type>pom</type>
    <exclusions>
    <exclusion>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-all</artifactId>
    <version>1.31.1</version>
    </dependency>
  2. 添加提供者配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    server.port = 8081
    dubbo.application.name= exxk-provider
    dubbo.registry.address= N/A
    #传输协议tri、dubbo
    dubbo.protocol.name=tri
    dubbo.protocol.port=50052
    dubbo.application.qosEnable=true
    # 为了使 Kubernetes 集群能够正常访问到探针,需要开启 QOS 允许远程访问,此操作有可能带来安全风险,请仔细评估后再打开
    dubbo.application.qosAcceptForeignIp=true

Dubbo Proxyless Mesh(兼容模型)

自动注入Sidecar

请注意,区别于手动注入,自动注入发生在 Pod 层面。您将看不到 Deployment 本身有任何更改。取而代之,需要检查单独的 Pod(使用 kubectl describe)来查询被注入的代理。

1
2
3
kubectl label namespace exxk-lab istio-injection=enabled --overwrite #为exxk-lab命名空间添加标签就会开启自动注入,该功能开启只对新部署的pod生效,旧的需要重启
kubectl get namespace -L istio-injection #查看那些空间开启了自动注入
kubectl label namespace exxk-lab istio-injection- #删除istio-injection标签,禁用命名空间的注入

问题

  1. 自动注入未生效

    检查集群->容器足->kube-apiserver*->进入容器控制台->执行kube-apiserver -h | grep enable-admission-plugins

    查看NamespaceLifecycle,LimitRanger是否启用

    1
    2
    3
    4
    5
    #未启用执行下面启用命令,未实验
    kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
    #手动在deployment添加注解 sidecar.istio.io/inject: 'true' 即可生效产生istio-proxy容器
    annotations:
    sidecar.istio.io/inject: 'true'
  2. 开启mesh功能,会影响remote debug功能,idea提示如下错误

    1
    Unable to open debugger port (ip:5005): java.io.IOException "handshake failed - unrecognized message from target VM"

    代码会提示:

    1
    Debugger failed to attach: handshake failed - received >GET / HTTP/1.1< - expected >JDWP-Handshake<

    相关测试命令:jdb -attach ip:5005