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

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

集群感知的服务路由

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

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

image.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 集群中执行成功。

  1. 创建网关以访问远程服务,如下所示:
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 控制平面中了:
image.png

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

kubectl exec -it -n app1 $SLEEP_POD sh

image.png

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

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

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

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

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

相关文章

javamail “535 5.7.3 Authentication unsuccessful“ 问题排查

有一家odm的服务器用Javamail发邮件的时候报错 Authentication unsuccessful 其他的有些又是正常的网上查了一下解决方法如下JavaMailSenderImpl认证异常了,出现:javax.mail.AuthenticationFailedException: failed to connect的异常, 将JAVAMAIL的DEBUG日志打开,通过propert…

智能制造的灾备问题如何解决?

提起压力、温度校准行业会让大部分非专业人士感到陌生。但实际上&#xff0c;在我们的日常生活中&#xff0c;很多设备都是需要经过压力检测、温度检测、过程信号检测合格之后才正式投放市场使用的&#xff0c; 北京康斯特仪表科技股份有限公司&#xff08;以下简称康斯特&…

计算机硬件基础-存取方式

顺序存取 对数据的访问必须按特定的线性顺序进行&#xff1b; 直接存取 直接存储使用一个共享的读写装置对所有的数据进行访问&#xff0c;每个数据块都有唯一地址标志&#xff0c;读写装置可以直接移动到数据块所在位置访问&#xff0c;但对于数据块内的内容&#xff0c;采…

疫情下开源数据库逆势增长,新基建下国产数据库迎机遇

2020年5月DB-Engines 数据库流行度排行大家都看了吗&#xff1f; 虽然 Top 10 与上月没有任何变化&#xff0c;但仔细观察本月的排行榜&#xff0c;Oracle 较上月几乎持平&#xff0c;仅微涨 0.02 分&#xff1b;相较而言&#xff0c;MySQL 增长明显&#xff0c;达到 14.29 分…

寻找长沙“科技之星”,CSDN星城大巡礼

2020年&#xff0c;长沙市委主要领导发出“软件产业再出发”的号召&#xff0c;并颁布了软件三年行动计划。今年5月&#xff0c;CSDN作为专业的IT社区&#xff0c;与长沙高新区签约&#xff0c;将全国总部落户长沙&#xff0c;这一战略决策&#xff0c;让CSDN与长沙的联结进一步…

分布式任务调度平台一站式讲解

文章目录一、传统的定时任务1. 传统的定时任务存在那些缺点2. 分布式任务调度3. 定时任务集群幂等性问题二、传统定时任务的实现方案2.1. 多线程2.2. TimeTask2.3. 线程池2.4. SpringBoot注解形式2.5. 基于Quartz三、常⻅分布式定时任务3.1. Quartz3.2. TBSchedule3.3. Elastic…

数据库系统 - 范式

第一范式 关系模式R中&#xff0c;当且仅当所有域只包含原子值&#xff0c;即每个分量都是不可分割的数据项&#xff1b; 第二范式 当且仅当R满足第一范式&#xff0c;且主键为多个属性值组成&#xff0c;且每个非主属性都完全依赖主键&#xff1b; 第三范式 当且仅当R满足…

全球CT影像20秒诊断,阿里云为新冠AI辅助诊断系统加速

新冠病毒全球爆发 2020年注定是不平凡的一年&#xff0c;新型冠状病毒肆虐全球&#xff0c;对于每个人来说都是一场灾难。 根据丁香园统计的数据&#xff0c;截止到2020年5月29日&#xff0c;全球新冠&#xff08;COVID-19&#xff09;累计确诊病例5,593,631人&#xff0c;累计…

麒麟信安操作系统:挖掘场景,与云俱进 ——携手openEuler赋能关键行业应用

12月24日&#xff0c;由中国电子技术标准化研究院、中国软件行业协会、绿色计算产业联盟主办&#xff0c;华为、飞腾、麒麟信安等操作系统厂商协办的操作系统产业峰会在北京成功举行。湖南麒麟信安科技股份有限公司作为华为重点邀请的四家openEuler商业发行版企业代表&#xff…

template might not exist or might not be accessible by any of the configured

我在后台返回json串&#xff0c;但是在前台进行接收的时候&#xff0c;出现thymeleaf无法解析&#xff0c;前台接收不到后台传来的信息。所以前台报500。 问题解决&#xff1a;将Controller更改为RestController即可解决

软考 - 可靠性和可用性

可靠性 系统在给定时间间隔内和给定条件下无失效运行的效率&#xff1b; 可用性 软件特定使用环境下为特定用户提供特定功能时具有的有效性&#xff1b;

IDEA中导入VUE后,JS文件爆红解决办法

原因&#xff1a;可能是js版本不兼容的问题&#xff0c;修改如下图: 点击File–>settings&#xff0c;搜索&#xff1a;JavaScript&#xff0c;如图修改

软考 - 图

文章目录1.图的分类1.1.强连通图1.2.完全图2.存储结构2.1.邻接矩阵表示法&#xff1a;2.2.邻接链表表示法&#xff1a;3.图的遍历3.1.深度优先遍历3.2.广度优先遍历4.最小生成树4.1.普里姆算法&#xff1a;4.2.克鲁斯卡尔算法&#xff1a;5.AVO网络、AOE网络1.图的分类 1.1.强…

带你一文看懂 Blockchain + NoSQL数据库

来源 | Tyler Mitchell译者 | 火火酱&#xff0c;责编 | Carol图源 | CSDN下载自视觉中国NoSQL数据库和现代区块链分类账都受益于一套共同的原则。由于其二者平台可以相互补充&#xff0c;因此当它们服务于同一应用程序时&#xff0c;能够配合完成多种工作。在本文中&#xff0…

来,一起“八卦”一下数据湖

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

mybatisplus代码生成器3.5.2

Mybatis-plus最新代码生成器&#xff08;3.5.1&#xff09;的使用 mybatis-plus 代码生成器&#xff08;3.5.2&#xff09; Autowiredprivate CodeGeneratorMapper codeGeneratorMapper;//ip地址private String DB_URL "";//用户名private String DB_USERNAME &q…

从OpenKruise用户疑问开始理解K8s资源更新机制

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 背景 OpenKruise 是阿里云开源的大规模应用自动化管理引擎&#xff0c;在功能上对标了 Kubernetes 原生的 Deployment / Sta…

软考-信息安全

文章目录对称加密&#xff08;私钥加密&#xff09;非对称加密&#xff08;公钥加密&#xff09;信息摘要、数字信封、数字签名、数字证书安全协议网络攻击入侵检测计算机病毒防火墙对称加密&#xff08;私钥加密&#xff09; 加密、解密用同一个密钥&#xff1b;适用于大消息…

学霸的奇葩选择,成功不仅靠运气,对话阿里云MVP黄胜蓝

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 为了逃避高考&#xff0c;他凭借NOIP一等奖成功保送武大&#xff1b;大学时就负责校园门户网站的运维工作&…

CSDN湘苗培优|保持热情,告别平庸

湘苗培优招生进行中在培优中&#xff0c;遇见更好的自己——CSDN高校俱乐部CSDN湘苗培优随着我国信息产业飞速发展&#xff0c;通过常规灌输式培养出来的学员已经不能够满足企业要求。企业更缺乏的是具备自主学习能力、具备综合解决问题能力的高素质技术人才。高素质技术人才需…