K8s Istio
常用命令:
1 | #进入容器的一个网络空间,查看网络代理 |
概念
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 服务 |
需要解决的问题
- 集群外的服务如何访问。
- 两个集群架构不一致,如何互相提供服务。
实战
kiali启用
在服务=>Istio-system=>kiali=>更多操作=》编辑外网访问=〉NodePort
,然后使用节点ip➕20001对应的NodePort进行访问。
多注册中心实现,修改注册中心(Istio文档)(最新版本移除了Consul
)
编辑
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
20kind: 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
SpringCloud使用K8S(etcd)作为注册中心(Spring Cloud Kubernetes官方文档)
SpringCloud project transformed into Spring Cloud Kubernetes project
替换eureka依赖为:
1 | <dependency> |
Dubbo改造k8s云原生项目
Dubbo Mesh 总体架构
Dubbo Sidecar Mesh(完全改造模型)
使用实战
消费者替换或添加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>添加提供者配置
1
2
3
4
5
6
7
8
9server.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 | kubectl label namespace exxk-lab istio-injection=enabled --overwrite #为exxk-lab命名空间添加标签就会开启自动注入,该功能开启只对新部署的pod生效,旧的需要重启 |
问题
自动注入未生效
检查
集群
->容器足
->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'开启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