个人博客原文:http://www.lampnick.com/php/913

本文目标

  • 部署一个多集群的共享的istio服务网格
  • 部署一套基于grpc的服务
  • 对grpc服务进行流量管理

架构图如下

前提条件

  • 两个或多个kubernetes集群,版本为1.14,1.15,1.16,1.17
  • 有k8s管理员权限
  • 两个k8s集群(分别称为主集群prod和私有集群private),以下简称prod,private
  • 注意:主集群prod必须要能访问私有集群private的Kubernetes API Server

开始配置集群

安装集群1(主集群prod)
  • 部署Istio
1. 下载istio发行版(https://storage.googleapis.com/istio-release/releases/1.4.3/istio-1.4.3-linux.tar.gz)
2.解压
3.切换到istio-1.4.3目录
4.部署
[root@master /root]# kubectl create ns istio-system
[root@master /root]# 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
[root@master /root]# istioctl manifest apply -f install/kubernetes/operator/examples/multicluster/values-istio-multicluster-primary.yaml
等待k8s中的Istio pods就绪:
[root@master /root]# kubectl get pods -nistio-system
NAME                                      READY   STATUS    RESTARTS   AGE
istio-citadel-856b4c8cbb-ch777            1/1     Running   0          4d3h
istio-galley-fd9694b9c-8nk58              2/2     Running   0          4d3h
istio-ingressgateway-66f89856c8-b4lhn     1/1     Running   0          4d3h
istio-pilot-5c68bb85df-rfssq              2/2     Running   0          4d3h
istio-policy-587798bdcc-dtrvh             2/2     Running   0          4d3h
istio-sidecar-injector-7dd87d7989-slnml   1/1     Running   0          4d3h
istio-telemetry-75c64d988b-mnnzn          2/2     Running   0          4d3h
prometheus-66c5887c86-jl46f               1/1     Running   0          4d3h
#注意网关地址设置为 0.0.0.0。这些是临时的占位值,在后面集群部署后,将被更新为两个集群的网关公网IP。
  • 创建一个 ingress 网关访问 private集群的服务:
[root@master /root]# kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: cluster-aware-gatewaynamespace: istio-system
spec:selector:istio: ingressgatewayservers:- port:number: 443name: tlsprotocol: TLStls:mode: AUTO_PASSTHROUGHhosts:- "*.local"
EOF

本例 Gateway 配置 443 端口来将流经的入口流量导向请求 SNI 头中指明的目标服务,其中 SNI 的顶级域名为 local(譬如:Kubernetes DNS域名)。 从源至目标 sidecar,始终使用双向 TLS 连接。

尽管应用于主集群,该网关实例也会影响 private集群,因为两个集群通过同一个 Pilot 通信。

  • 确定主集群的ingress IP和端口。

    • 按照确定ingress IP和端口中的说明,设置环境变量 INGRESS_HOST 及 SECURE_INGRESS_PORT。
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
    export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
    export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
    
    • 打印 INGRESS_HOST 及 SECURE_INGRESS_PORT:
    [root@master /root]# echo The ingress gateway of cluster1: address=$INGRESS_HOST, port=$SECURE_INGRESS_PORT
    The ingress gateway of cluster1: address=10.10.8.39, port=31216
    
    • 更新网格网络配置中的网关地址。编辑 istio ConfigMap:
    [root@master /root]# kubectl edit cm -n istio-system istio
    第一个地方:
    120行 meshNetworks: |-
    121     # Network config
    122     networks:
    123       network1:
    124         endpoints:
    125         - fromRegistry: Kubernetes
    126         gateways:
    127         - address: 10.10.8.39
    128           port: 31216
    第二个地方:
    154行   meshNetworks:
    155       networks:
    156         network1:
    157           endpoints:
    158           - fromRegistry: Kubernetes
    159           gateways:
    160           - address: 10.10.8.39
    161             port: 31216
    

    将网关地址和 network1 的端口分别更新为 cluster1 的 ingress 主机和端口,然后保存并退出。注意该地址在配置文件中出现两次,第二次位于 values.yaml: 下方。 一旦保存,Pilot 将自动读取更新后的网络配置。

    • 输出主集群的网关地址(部署私有集群private时会用):
    [root@master /root]# kubectl get svc --selector=app=istio-ingressgateway  -n istio-system -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    10.10.8.39
    

    该命令将网关地址设置为网关的公共 IP 并显示。若负载均衡配置没有设置 IP 地址,命令将执行失败。DNS 域名支持尚未实现,亟待解决。如果没有LoadBalancer,可参考这个文章 http://www.lampnick.com/php/910

安装集群2(私有集群private)
  • 部署 Istio:
将主集群下载的istio-1.4.3文件复制到这台机器并解压,进入istio-1.4.3目录执行如下命令
[root@master ~]# export MASTER_GW_ADDR=10.10.8.39#主集群获取到的
[root@master ~]# kubectl create ns istio-system
[root@master ~]# 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
[root@master ~]# CLUSTER_NAME=$(kubectl config view --minify=true -o jsonpath='{.clusters[].name}')
[root@master ~]# istioctl manifest apply \--set profile=remote \--set values.global.mtls.enabled=true \--set values.gateways.enabled=true \--set values.security.selfSigned=false \--set values.global.createRemoteSvcEndpoints=true \--set values.global.remotePilotCreateSvcEndpoint=true \--set values.global.remotePilotAddress=${MASTER_GW_ADDR} \--set values.global.remotePolicyAddress=${MASTER_GW_ADDR} \--set values.global.remoteTelemetryAddress=${MASTER_GW_ADDR} \--set values.gateways.istio-ingressgateway.env.ISTIO_META_NETWORK="network2" \--set values.global.network="network2" \--set values.global.multiCluster.clusterName=${CLUSTER_NAME} \--set autoInjection.enabled=true

等待 cluster2 中的 Istio pods 就绪,istio-ingressgateway 除外。

[root@master ~]# kubectl get pods -n istio-system -l istio!=ingressgateway
NAME                                      READY   STATUS    RESTARTS   AGE
istio-citadel-64d4866c95-tnjtf            1/1     Running   0          4d
istio-sidecar-injector-75ff97b4d8-5tf4j   1/1     Running   0          4d

istio-ingressgateway目前无法就绪,直到在主集群prod的Istio控制面板中配置好 watch private cluster。

  • 确定集群的ingress IP和端口。

    • 按照确定ingress IP和端口中的说明,设置环境变量 INGRESS_HOST 及 SECURE_INGRESS_PORT。

      export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
      export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
      export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
      export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
      
      • 打印 INGRESS_HOST 及 SECURE_INGRESS_PORT:
      [root@master ~]# echo The ingress gateway of cluster1: address=$INGRESS_HOST, port=$SECURE_INGRESS_PORT
      The ingress gateway of cluster1: address=10.5.24.224, port=32483
      
  • 在主集群中更新网格网络配置中的网关地址。编辑 istio ConfigMap:
特别注意:这一步是在主集群prod中执行
[root@master /root]# kubectl edit cm -n istio-system istio
第一个地方:
129行     network2:
130         endpoints:
131         - fromRegistry: n2-k8s-config
132         gateways:
133         - address: 10.5.24.224
134           port: 32483
第二个地方:
162行      network2:
163           endpoints:
164           - fromRegistry: n2-k8s-config
165           gateways:
166           - address: 10.5.24.224
167             port: 32483

将 network2 的网关地址和端口分别更新为 private集群 的 ingress 主机和端口,然后保存并退出。注意该地址在配置文件中出现两次,第二次位于 values.yaml: 下方。一旦保存,Pilot 将自动读取更新后的网络配置。

  • 准备环境变量,构建服务账户 istio-reader-service-account 的配置文件 n2-k8s-config:
CLUSTER_NAME=$(kubectl config view --minify=true -o jsonpath='{.clusters[].name}')
SERVER=$(kubectl config view --minify=true -o jsonpath='{.clusters[].cluster.server}')
SECRET_NAME=$(kubectl get sa istio-reader-service-account -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)
  • 在工作目录中创建文件n2-k8s-config
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
  • 将上面创建的n2-k8s-config复制到主集群prod
在主集群prod上监听私有集群private
  • 执行下面命令,添加并标记私有集群private的secret。 执行完这些命令,主集群prod中的Istio Pilot将开始 watching私有集群private 的服务和实例,如同对待主集群prod一样。
[root@master /root]# kubectl create secret generic n2-k8s-secret --from-file n2-k8s-config -n istio-system
[root@master /root]# kubectl label secret n2-k8s-secret istio/multiCluster=true -n istio-system
  • 等待私有集群private中的istio-ingressgateway就绪:
[root@master ~]# kubectl get pods -n istio-system -l istio=ingressgateway
NAME                                    READY   STATUS    RESTARTS   AGE
istio-ingressgateway-5fb99d5694-dpqc5   1/1     Running   0          4d

现在,主集群prod和私有集群private均已安装完成,可以部署gRPC服务。

  • 参考文档

    • https://istio.io/docs/setup/install/multicluster/shared-gateways/

部署grpc服务及实现根据header进行分流

主集群prod上执行应用如下yaml
  • kubectl apply -f .
-rw-r--r-- 1 root root  940 Feb 26 20:05 mycaller-deploy.yaml
-rw-r--r-- 1 root root  275 Feb 27 18:09 mycaller-destinationrule.yaml
-rw-r--r-- 1 root root  228 Feb 28 10:28 mycaller-service.yaml
-rw-r--r-- 1 root root  215 Feb 27 18:09 mycaller-virtualservice.yaml
-rw-r--r-- 1 root root 1.1K Feb 28 15:53 myresponser-deploy-v1.yaml
-rw-r--r-- 1 root root  284 Feb 28 12:12 myresponser-destinationrule-v1-v2.yaml
-rw-r--r-- 1 root root  237 Feb 28 16:09 myresponser-service.yaml
-rw-r--r-- 1 root root  262 Feb 28 12:44 myresponser-virtualservice-type-all-v2.yaml
-rw-r--r-- 1 root root  406 Mar  2 10:57 myresponser-virtualservice-type-v1-v2.yaml
-rw-r--r-- 1 root root 1.6K Feb 28 09:27 sleep.yaml
私有集群private上执行应用如下yaml
  • kubectl apply -f .
-rw-r--r-- 1 root root 1048 Feb 28 16:04 myresponser-deploy-v2.yaml
-rw-r--r-- 1 root root  237 Feb 28 16:10 myresponser-service.yaml
效果如下
[root@master /root]# kubectl exec -it -c sleep $(kubectl get pod  -l app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl "mycaller.default:59130/testCaller/GetHello?type=1&orgcode=private&port=53605"
{"res":"[2020-03-03 09:09:59] responser version:private, hostname:myresponser-v2-67d7f6d7f4-6fctl, req:1, orgcode:private"}[root@master /root]# kubectl exec -it -c sleep $(kubectl get pod  -l app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl "mycaller.default:59130/testCaller/GetHello?type=1&orgcode=private&port=53605"
{"res":"[2020-03-03 09:10:04] responser version:private, hostname:myresponser-v2-67d7f6d7f4-6fctl, req:1, orgcode:private"}[root@master /root]# kubectl exec -it -c sleep $(kubectl get pod  -l app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl "mycaller.default:59130/testCaller/GetHello?type=1&orgcode=private&port=53605"
{"res":"[2020-03-03 09:10:07] responser version:private, hostname:myresponser-v2-67d7f6d7f4-6fctl, req:1, orgcode:private"}[root@master /root]# kubectl exec -it -c sleep $(kubectl get pod  -l app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl "mycaller.default:59130/testCaller/GetHello?type=1&orgcode=&port=53605"
{"res":"[2020-03-03 09:10:16] responser version:prod, hostname:myresponser-v1-6b9f79c64d-fwl79, req:1, orgcode:prod"}[root@master /root]# kubectl exec -it -c sleep $(kubectl get pod  -l app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl "mycaller.default:59130/testCaller/GetHello?type=1&orgcode=ttt&port=53605"
{"res":"[2020-03-03 09:10:23] responser version:prod, hostname:myresponser-v1-6b9f79c64d-fwl79, req:1, orgcode:ttt"}[root@master /root]# kubectl exec -it -c sleep $(kubectl get pod  -l app=sleep -o jsonpath='{.items[0].metadata.name}') -- curl "mycaller.default:59130/testCaller/GetHello?type=1&orgcode=prod&port=53605"
{"res":"[2020-03-03 09:10:30] responser version:prod, hostname:myresponser-v1-6b9f79c64d-fwl79, req:1, orgcode:prod"}

k8s多集群搭建istio共享控制平面(多网络)及部署grpc服务分流实践相关推荐

  1. Rancher+K8S+Docker集群搭建

    Rancher+K8S+Docker集群搭建 Ubuntu安装 准备工作:准备VMware+Ubuntu(ubuntu-18.04.5-live-server-amd64.iso) 1.1 虚拟机安装 ...

  2. k8s简单集群搭建和应用(包括虚拟机的开启)①

    1.三台虚拟机搭建 开三台虚拟机.使用Centos7 系统,网络模式使用NAT模式(校园网应该是用不了桥接模式) 在虚拟机里设置主机名 #依次设置主机名 hostnamectl set-hostnam ...

  3. Kubernetes(k8s)集群搭建,完整无坑,不需要科学上网~

    文章目录 写在前面 一.准备三个centos7虚拟机 1.创建Vagrantfile 2.启动三台虚拟机 3.配置centos7支持ssh登录(所有机器) 4.修改 linux 的 yum 源(所有机 ...

  4. k8s docker集群搭建

    一.Kubernetes系列之介绍篇 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 ...

  5. k8s的集群搭建前的相关操作--必看

    文章目录 1. 搭建k8s环境平台的规划 单master集群 多master集群 2. 服务器硬件配置要求 1)硬件要求 3.搭建k8s集群部署方式 4. 部署环境搭建 a. 环境准备要求: b. 三 ...

  6. 全面上手K8S从集群搭建到实现容器编排

    身为让容器应用实现大规模工业生产的一大功臣,过去几年,Kubernetes  势头迅猛,BAT.京东.美团.字节都走上了全域容器化部署以及云原生架构的康庄大道. 而作为支撑阿里万亿级应用背后的核心,阿 ...

  7. 使用国内的镜像源搭建 kubernetes(k8s)集群

    概述 老话说的好:努力学习,提高自己,让自己知道的比别人多,了解的别人多. 言归正传,之前我们聊了 Docker,随着业务的不断扩大,Docker 容器不断增多,物理机也不断增多,此时我们会发现,登录 ...

  8. 银河麒麟高级服务器操作系统V10上安装k8s单机集群

    前言 本文介绍银河麒麟高级服务器操作系统V10上安装部署k8s单机集群及一些基础的kubectl指令 本文涉及部署脚本主要源自基于https://github.com/easzlab/kubeasz在 ...

  9. SequoiaDB集群搭建(单机模式)

    由于操作数据库实例,独立模式不支持,好像只能部署集群模式,那就部署一个单机版的集群. 首先是安装SequoiaDB,官网连接数据库安装_安装部署_文档中心_SequoiaDB巨杉数据库 照着装就行.( ...

最新文章

  1. 【OpenCV 4开发详解】Sobel算子
  2. 放心,GPT-3 不会“杀死”编程
  3. Android六边形图像
  4. [css] 行内元素和块级元素有什么区别,如何相互转换?
  5. layui 数据表格代码
  6. Java Persistence with MyBatis 3(中国版)
  7. 华为手机 APP被杀_华为手机服务APP将全新改版 三大升级体验更加出色
  8. Address already in use: bind 端口被占用的解决办法
  9. 软件工程 第六章 编码与测试
  10. 小飞侠淘试用免费领取系统-永久免费的试用领取网站开源程序!
  11. Excel怎么设置单元格的边框
  12. MFC学习之路(五)让人菊花一紧的错误
  13. tilera netlib应用层协议栈-IP层实现方式
  14. word怎么添加水印 word添加水印后为什么看不见
  15. 告别“浮云” 享用云计算服务优势
  16. SQL查询优化方法 提高SQL查询效率 数据库的哪些字段适合添加索引
  17. c/c++中的内存分配器
  18. java_系列3_数组
  19. python德巴赫猜想_python实现哥德巴赫猜想(任何大于或者等于6的整数都可以写成2个素数之和)...
  20. 神策数据王乾:微信生态与小程序发展趋势洞察

热门文章

  1. 移动端浏览器预览word、excel、ppt
  2. python | 基础学习(一)了解Bug、pycharm、变量、程序的三大流程(顺序、if、while)、运算符、快捷键
  3. LA 4513 Stammering Aliens
  4. 64位系统office Excel 2007导入oracle数据库出错问题解决
  5. php微信开源框架,SOPHP免费微信开源框架 php版 v4.5
  6. IDC发布2020年中国电子签名软件市场份额
  7. 解决 Rsync chown/chgrp 错误
  8. Visual Studio 和 .NET Framework 词汇表
  9. Shell之sed命令
  10. 太阳直射点纬度计算公式_高中地理——每日讲1题(太阳直射点、太阳高度角、地方时)...