使用Istio进行多集群部署管理:单控制平面 Gateway 连接拓扑

头图.png

作者 | 王夕宁  阿里巴巴高级技术专家

导读:本文摘自于由阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实践》一书,讲述了如何使用 Istio 进行多集群部署管理来阐述服务网格对多云环境、多集群即混合部署的支持能力。

前文详情:
如何使用 Istio 进行多集群部署管理:单控制平面 VPN 连接拓扑

单控制平面拓扑下,多个 Kubernetes 集群共同使用在其中一个集群上运行的单个 Istio 控制平面。控制平面的 Pilot 管理本地和远程集群上的服务,并为所有集群配置 Envoy Sidecar 代理。

集群感知的服务路由

Istio 1.1 中引入了集群感知的服务路由能力,在单一控制平面拓扑配置下,使用 Istio 的 Split-horizon EDS(水平分割端点发现服务)功能可以通过其入口网关将服务请求路由到其他集群。基于请求源的位置,Istio 能够将请求路由到不同的端点。

在该配置中,从一个集群中的 Sidecar 代理到同一集群中的服务的请求仍然被转发到本地服务 IP。如果目标工作负载在其他集群中运行,则使用远程集群的网关 IP 来连接到该服务。

1.png
(集群感知的服务路由)

如图所示,主集群 cluster1 运行全套的 Istio 控制平面组件,同时集群 cluster2 仅运行 Istio Citadel、Sidecar Injector 和 Ingress 网关。不需要 VPN 连接,不同集群中的工作负载之间也不需要直接网络访问。

从共享的根 CA 为每个集群的 Citadel 生成中间 CA 证书,共享的根 CA 启用跨不同集群的双向 TLS 通信。为了便于说明,我们将 samples/certs 目录下 Istio 安装中提供的示例根 CA 证书用于两个集群。在实际部署中,你可能会为每个集群使用不同的 CA 证书,所有 CA 证书都由公共根 CA 签名。

在每个 Kubernetes 集群中(包括示例中的集群 cluster1 与 cluster2)使用以下命令为生成的 CA 证书创建 Kubernetes 密钥:

kubectl
create namespace istio-system
kubectl
create secret generic cacerts -n istio-system \--from-file=samples/certs/ca-cert.pem \--from-file=samples/certs/ca-key.pem \--from-file=samples/certs/root-cert.pem \--from-file=samples/certs/cert-chain.pem

Istio 控制平面组件

在部署全套 Istio 控制平面组件的集群 cluster1 中,按照以下步骤执行:

1.安装 Istio 的 CRD 并等待几秒钟,以便将它们提交给 Kubernetes API 服务器,如下所示:

for
i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i;
done

2.然后开始在集群 cluster1 中部署 Istio 控制平面。

如果 helm 依赖项缺失或者不是最新的,可以通过 helm dep update 来更新这些依赖项。需要注意的是,因为没有使用 istio-cni,可以暂时将其从依赖项 requirements.yaml 中去掉再执行更新操作。具体命令如下所示:

helm
template --name=istio --namespace=istio-system \
--set
global.mtls.enabled=true \
--set
security.selfSigned=false \
--set
global.controlPlaneSecurityEnabled=true \
--set
global.meshExpansion.enabled=true \
--set
global.meshNetworks.network2.endpoints[0].fromRegistry=n2-k8s-config \
--set
global.meshNetworks.network2.gateways[0].address=0.0.0.0 \
--set
global.meshNetworks.network2.gateways[0].port=15443 \
install/kubernetes/helm/istio
> ./istio-auth.yaml

请注意,网关地址设置为 0.0.0.0。这是一个临时占位符值,在集群 cluster2 部署之后将更新为其网关的公共 IP 值。

将 Istio 部署到 cluster1,如下所示:

kubectl
apply -f ./istio-auth.yaml

确保上述步骤在 Kubernetes 集群中执行成功。

3. 创建网关以访问远程服务,如下所示:

kubectl
create -f - <<EOF
apiVersion:
networking.istio.io/v1alpha3
kind:
Gateway
metadata:name: cluster-aware-gatewaynamespace: istio-system
spec:selector:istio: ingressgatewayservers:- port:number: 15443name: tlsprotocol: TLStls:mode: AUTO_PASSTHROUGHhosts:- "*"
EOF

上述网关配置了一个专用端口 15443 用来将传入流量传递到请求的 SNI 标头中指定的目标服务,从源服务到目标服务一直使用双向 TLS 连接。

请注意虽然该网关定义应用于集群 cluster1,但因为两个集群都与同一个 Pilot 进行通信,此网关实例同样也适用于集群 cluster2。

istio-remote 组件

在另一集群 cluster2 中部署 istio-remote 组件,按照以下步骤执行:

1.首先获取集群 cluster1 的入口网关地址,如下所示:

export
LOCAL_GW_ADDR=$(kubectl get svc --selector=app=istio-ingressgateway \-n istio-system -o
jsonpath="{.items[0].status.loadBalancer.ingress[0].ip}")

通过执行以下命令,使用 Helm 创建 Istio remote 部署 YAML 文件:

helm
template --name istio-remote --namespace=istio-system \
--values
install/kubernetes/helm/istio/values-istio-remote.yaml \
--set
global.mtls.enabled=true \
--set
gateways.enabled=true \
--set
security.selfSigned=false \
--set
global.controlPlaneSecurityEnabled=true \
--set
global.createRemoteSvcEndpoints=true \
--set
global.remotePilotCreateSvcEndpoint=true \
--set
global.remotePilotAddress=${LOCAL_GW_ADDR} \
--set
global.remotePolicyAddress=${LOCAL_GW_ADDR} \
--set
global.remoteTelemetryAddress=${LOCAL_GW_ADDR} \
--set
gateways.istio-ingressgateway.env.ISTIO_META_NETWORK="network2" \
--set
global.network="network2" \
install/kubernetes/helm/istio
> istio-remote-auth.yaml

2. 将 Istio remote 组件部署到 cluster2,如下所示:

kubectl
apply -f ./istio-remote-auth.yaml

确保上述步骤在 Kubernetes 集群中执行成功。

3.更新集群 cluster1 的配置项 istio,获取集群 cluster2 的入口网关地址,如下所示:

export
REMOTE_GW_ADDR=$(kubectl get --context=$CTX_REMOTE svc --selector=app=
istio-ingressgateway
-n istio-system -o jsonpath="{.items[0].status.loadBalancer.ingress
[0].ip}")

在集群 cluster1 中编辑命名空间 istio-system 下的配置项 istio,替换 network2 的网关地址,从 0.0.0.0 变成集群 cluster2 的入口网关地址 ${REMOTE_GW_ADDR}。保存后,Pilot 将自动读取更新的网络配置。

4.创建集群 cluster2 的 Kubeconfig。通过以下命令,在集群 cluster2 上创建服务账号 istio-multi 的 Kubeconfig,并保存为文件 n2-k8s-config:

CLUSTER_NAME="cluster2"
SERVER=$(kubectl
config view --minify=true -o "jsonpath={.clusters[].cluster.server}")
SECRET_NAME=$(kubectl
get sa istio-multi -n istio-system -o jsonpath='{.secrets[].name}')
CA_DATA=$(kubectl
get secret ${SECRET_NAME} -n istio-system -o
"jsonpath={.data['ca\.crt']}")
TOKEN=$(kubectl
get secret ${SECRET_NAME} -n istio-system -o
"jsonpath={.data['token']}" | base64 --decode)
cat
<<EOF > n2-k8s-config
apiVersion:
v1
kind:
Config
clusters:- cluster:certificate-authority-data: ${CA_DATA}server: ${SERVER}name: ${CLUSTER_NAME}
contexts:- context:cluster: ${CLUSTER_NAME}user: ${CLUSTER_NAME}name: ${CLUSTER_NAME}
current-context:
${CLUSTER_NAME}
users:- name: ${CLUSTER_NAME}user:token: ${TOKEN}
EOF

5.将集群 cluster2 加入到 Istio 控制平面。

在集群 clusterl 执行以下命令,将上述生成的集群 cluster2 的 kubeconfig 添加到集群 cluster1 的 secret 中,执行这些命令后,集群 cluster1 中的 Istio Pilot 将开始监听集群 cluster2 的服务和实例,就像监听集群 cluster1 中的服务与实例一样:

kubectl
create secret generic n2-k8s-secret --from-file n2-k8s-config -n istio-system
kubectl
label secret n2-k8s-secret istio/multiCluster=true -n istio-system

部署示例应用

为了演示跨集群访问,在第一个 Kubernetes 集群 cluster1 中部署 sleep 应用服务和版本 v1 的 helloworld 服务,在第二个集群 cluster2 中部署版本 v2 的 helloworld 服务,然后验证 sleep 应用是否可以调用本地或者远程集群的 helloworld 服务。

1.部署 sleep 和版本 v1 的 helloworld 服务到第一个集群 cluster1 中,执行如下命令:

kubectl
create namespace app1
kubectl
label namespace app1 istio-injection=enabled
kubectl
apply -n app1 -f samples/sleep/sleep.yaml
kubectl
apply -n app1 -f samples/helloworld/service.yaml
kubectl
apply -n app1 -f samples/helloworld/helloworld.yaml -l version=v1
export
SLEEP_POD=$(kubectl get -n app1 pod -l app=sleep -o
jsonpath={.items..metadata.name})

2.部署版本 v2 的 helloworld 服务到第二个集群 cluster2 中,执行如下命令:

kubectl
create namespace app1
kubectl
label namespace app1 istio-injection=enabled
kubectl
apply -n app1 -f samples/helloworld/service.yaml
kubectl
apply -n app1 -f samples/helloworld/helloworld.yaml -l version=v2

3.登录到命名空间 istio-system 下的 istio-pilot 容器中,运行 curl localhost:8080/v1/registration | grep helloworld -A 11 -B 2 命令,如果得到如下类似的结果就说明版本 v1 与 v2 的 helloworld 服务都已经注册到 Istio 控制平面中了:

微信图片_20200428144254.jpg

4.验证在集群 cluster1 中的 sleep 服务是否可以正常调用本地或者远程集群的 helloworld 服务,在集群 cluster1 下执行如下命令:

kubectl
exec -it -n app1 $SLEEP_POD sh

2.png

登录到容器中,运行 curl helloworld.app1:5000/hello。

如果设置正确,则在返回的调用结果中可以看到两个版本的 helloworld 服务,同时可以通过查看 sleep 容器组中的 istio-proxy 容器日志来验证访问的端点 IP 地址,返回结果如下所示:

3.png

《Istio服务网格技术解析与实战》读者可免费体验 ASM 产品进行学习!点击了解阿里云服务网格产品 ASM:www.aliyun.com/product/servicemesh

作者简介

王夕宁 阿里云高级技术专家,阿里云服务网格产品 ASM 及 Istio on Kubernetes 技术负责人,专注于 Kubernetes、云原生、服务网格等领域。曾在 IBM 中国开发中心工作,担任过专利技术评审委员会主席,拥有 40 多项相关领域的国际技术专利。《Istio 服务网格解析与实战》一书由其撰写,详细介绍了 Istio 的基本原理与开发实战,包含大量精选案例和参考代码可以下载,可快速入门 Istio 开发。Gartner 认为,2020 年服务网格将成为所有领先的容器管理系统的标配技术。本书适合所有对微服务和云原生感兴趣的读者,推荐大家对本书进行深入的阅读。

课程推荐

为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。

点击即可免费观看课程:https://developer.aliyun.com/learning/roadmap/serverless

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何轻松学习 Kubernetes?

作者 | 声东 阿里巴巴技术专家 <关注阿里巴巴云原生公众号&#xff0c;回复 排查 即可下载电子书> 导读&#xff1a;《深入浅出 Kubernetes》一书共汇集 12 篇技术文章&#xff0c;帮助你一次搞懂 6 个核心原理&#xff0c;吃透基础理论&#xff0c;一次学会 6 个典型问…

JavaScript 常用代码整理

目录 1.获取浏览器Cookie的值2. 颜色RGB转十六进制3. 复制到剪贴板4. 检查日期是否合法5. 查找日期位于一年中的第几天6. 英文字符串首字母大写7. 计算2个日期之间相差多少天8. 清除全部Cookie9. 生成随机十六进制颜色10. 数组去重11. 从 URL 获取查询参数12. 时间处理13. 校验…

《阿里云互联网多媒体存储解决方案蓝皮书》震撼上线!

前言 中国互联网从1994年正式接入国际网络至今&#xff0c;以非凡的力量改变了世界&#xff0c;重新塑造了商业、政治、社会&#xff0c;甚至改变了全球几十亿的人的生活。 中国互联网络信息中心&#xff08;CNNIC&#xff09;第45次《中国互联网络发展状况统计报告》中显示&a…

都在说实时数据架构,你了解多少?

作者&#xff1a;刘大龙唯品会 随着互联网的发展进入下半场&#xff0c;数据的时效性对企业的精细化运营越来越重要&#xff0c; 商场如战场&#xff0c;在每天产生的海量数据中&#xff0c;如何能实时有效的挖掘出有价值的信息&#xff0c; 对企业的决策运营策略调整有很大帮…

阿里巴巴自研代码管理平台技术解密

【以下为分享实录&#xff0c;有删节】 阿里巴巴为什么要自研代码管理平台 也许你会问&#xff1a;为什么阿里巴巴要重新做一套代码管理平台&#xff0c;继续用GitLab版本不是挺好的吗&#xff1f;接下来从我个人的角度在这里尝试进行解答。 由于历史原因&#xff0c;在阿里…

Excel VBA 怎样为 inputBox 输入框设置星号掩码-密码屏蔽输入框

目录 1. InputBox 的 API 常量2. InputBox 密码屏蔽3. 调用示例1. InputBox 的 API 常量 #If VBA7 ThenPrivate Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, _ByVa

自研云原生数据仓库AnalyticDB再破权威评测TPC-DS世界纪录

北京时间 2020/5/4 青年节&#xff0c;TPC&#xff08;全球最知名非盈利的数据管理系统评测基准标准化组织&#xff09;官网正式上线AnalyticDB TPC-DS成绩&#xff0c;AnalyticDB通过严苛的TPC-DS全流程测试&#xff0c;性能QphDS分数为14895566&#xff0c;性价比分数为0.08C…

VBA MultiPage 循环多页控件

目录 1. 最简单的循环2. 利用变量来记住最后一个可见页面3. 用 For 循环查找隐藏的 Page4. 将下一页设置为可见,并在将焦点设置到此页时将焦点设置为可见5. 实例1. 最简单的循环 For Each pg In Me.MultiPage1.PagesIf pg.Visible = False Then 要执行的程序 End If

春雷响,万物生,云分期百万补贴助力企业复苏

企业如何实现数字化转型&#xff0c;完成业务的线上化升级&#xff0c;是后疫情时代每一家企业必须思考的问题。而对其中的中、小微企业来说&#xff0c;一次性上云成本高预算不足、短时间资金流周转难更是成为困扰企业的首要问题。 云分期 - 在线分期、缓解资金压力、让资金周…

开放计算中国社区技术峰会举行,开放开源加速产业创新

11月13日&#xff0c;开放计算中国社区技术峰会&#xff08;第二届OCP China Day&#xff09;在北京举行&#xff0c;超过600多名IT工程师和数据中心从业者参加了此次大会&#xff0c;来自Facebook、Intel、微软、浪潮、百度、腾讯、阿里、NVIDIA、诺基亚、中国移动、希捷、燧原…

用 Excel+VBA 与 SQL Server 数据库交互

Sub Test()Dim i As Integer, j As Integer, sht As WorksheetDim cn As New ADODB.ConnectionDim rs As New ADODB.RecordsetDim strCn As

【开发者成长】喧哗的背后:Serverless 的挑战

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 导读&#xff1a;本文作者作为阿里集团 Serverless 研发运维平台负责人&#xff0c;从应用架构的角度去分析 Serverless 为何…

VBA IsNull 应用 - 捕获错误并查找未填充的值

目录 前言一、什么是Null二、哪些数据类型可以为空?三、使用 IsNull 捕获未填充的值四、用 IsNull 捕捉数据变化五、使用 IsNull 捕获错误六、总结七 补充:Null 强制转换为空字符窜前言 作为开发人员,流畅运行的程序是我们的最终目标。 如果我们可以编写一个宏,使程序以最少…

赋能尖端科技 推进智能布局 |《HPC高性能计算数据存储解决方案蓝皮书》正式发布

前言 提到尖端科技&#xff0c;不免联想到人工智能、自动驾驶、量子计算机等&#xff0c;这些借电影大片走进大众的视野&#xff0c;如今却逐步实现新兴领域&#xff0c;科技飞速发展造就了如梦似幻“破次元壁”的相遇&#xff0c;促成每一次不真实的相遇的是技术领域的革新&a…

大神们都是如何在时间序列中进行特征提取的?看完就懂了!

作者 |Sharmistha Chatterjee翻译 | 火火酱~&#xff0c;责编 | 晋兆雨出品 | CSDN云计算头图 | 付费下载于视觉中国介绍现在&#xff0c;对于各类机构而言&#xff0c;需要收集的数据越来越多&#xff0c;并且时常需要检测不寻常或异常的时间序列。例如&#xff0c;雅虎就拥有…

CenterOS 服务器之MySQL卸载与安装,并远程连接

目录一、彻底卸载 MySQL&#xff08;不保留数据&#xff09;二、安装 MySQL一、彻底卸载 MySQL&#xff08;不保留数据&#xff09; 若之前装过MySQL&#xff0c;需先删除再进行安装&#xff1a; 查找已经安装的mysql&#xff1a; rpm -qa | grep -i mysql删除MySQL&#xff1…

石锤!谷歌排名第一的编程语言,死磕这点,程序员都收益

日本最大的证券公司之一野村证券首席数字官马修汉普森&#xff0c;在Quant Conference上发表讲话&#xff1a;“用Excel的人越来越少&#xff0c;大家都在码Python代码。”甚至直接说&#xff1a;“Python已经取代了Excel。”事实上&#xff0c;为了追求更高的效率和质量&#…

Excel VBA 编程技巧系列(一)替换字符串、加解密字符串和等待外部程序完成

目录 1. 执行多个字符串替换2. 退出当前程序并让 VBA 代码等待该外部应用程序完成3. 加、解密码字符串1. 执行多个字符串替换 如何轻松执行多个字符串替换? 当用唯一的字符串去替换一个或多个字符串时的,VBA 替换功能非常好用。但是,如果您有一个包含多个特定字符的字符串…

赠书 | 华为数据底座的整体架构与建设策略

作者 | 华为公司数据管理责编 | 晋兆雨头图 | 付费下载于视觉中国*文末有赠书在从信息化向数字化转型的过程中&#xff0c;企业积累了海量的数据&#xff0c;并且还在爆发式地增长。数据很多&#xff0c;但真正能产生价值的数据却很少。数据普遍存在分散、不拉通的问题&#xf…

Serverless 服务选型

综述 近两年来&#xff0c;Serverless 概念在开发者中交流的越来越多&#xff0c;实践、服务、产品层出不穷。 Serverless 的主题分享呈现爆发趋势&#xff0c;如在云原生领域颇具影响力的 KubeCon&CloudNativeCon 会议中&#xff0c;关于 Serverless 的主题&#xff0c;20…