前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >istio在vm上的流量治理

istio在vm上的流量治理

作者头像
有点技术
发布2020-11-25 12:22:08
2.2K1
发布2020-11-25 12:22:08
举报
文章被收录于专栏:有点技术有点技术

先决条件

•虚拟机两台

第一台作为k8s 部署istio,第二台作为vm,系统为centos8,centos 7要升级glibc 麻烦的很,第二台通过静态路由访问 k8s内部的pod,

本环境:

代码语言:javascript
复制
vm1: 192.168.8.131vm1上k8s pod cird: 10.201.0.0/24vm2: 192.168.8.170vm2添加静态路由:route add -net 10.201.0.0 gw 192.168.8.131 netmask 255.255.255.0

•1.16以上k8s•k8s apiserver 开启服务账户卷投影

代码语言:javascript
复制
    - --service-account-api-audiences=api,istio-ca    - --service-account-issuer=kubernetes.default.svc    - --service-account-signing-key-file=/etc/kubernetes/pki/sa.key

•设置环境变量VM_APP,WORK_DIR,VM_NAMESPACE,和SERVICE_ACCOUNT

代码语言:javascript
复制
#VM_APP: 该虚拟机将运行的服务名称#VM_NAMESPACE: 服务命名空间名称#WORK_DIR:工作目录#SERVICE_ACCOUNT 用于该虚拟机的k8s serviceaccount名称cat vm.envexport VM_APP=testexport VM_NAMESPACE=testexport WORK_DIR=./testexport SERVICE_ACCOUNT=test. vm.env

•创建工作目录

代码语言:javascript
复制
mkdir -p "${WORK_DIR}"

安装Istio控制面板

•安装Istio。

代码语言:javascript
复制
 istioctl install --set profile=demo  --set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE='\"true\"'

在部署的时间有些问题,pod的pilot-agent不能正常的识别ISTIO_META_DNS_CAPTURE导致没有开启dns解析,感觉是字符拼接的问题,也可能是姿势不对 手动导出 istioctl manifest generate --set profile=demo --set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE=\'true\' > config.yaml 然后修改 ISTIO_META_DNS_CAPTURE: "true"

•部署东西向网关

在本示例中将直接将虚拟机连接pod IP不需要部署

代码语言:javascript
复制
samples/multicluster/gen-eastwest-gateway.sh --single-cluster | istioctl install -y -f -

•使用提供的示例配置暴露控制平面

代码语言:javascript
复制
kubectl apply -f samples/multicluster/expose-istiod.yaml

配置虚拟机名称空间

•创建将托管虚拟机的名称空间:

代码语言:javascript
复制
kubectl create namespace "${VM_NAMESPACE}"

•为虚拟机创建一个服务帐户:

代码语言:javascript
复制
kubectl create serviceaccount "${SERVICE_ACCOUNT}" -n "${VM_NAMESPACE}"

创建文件以传输到虚拟机

•为vm创建WorkloadGroup模板

WorkloadGroup是1.8新加的CRD,用于描述工作负载实例的集合。它提供了一个规范,工作负载实例可用于引导其代理,包括元数据和身份。它仅旨在与非k8s工作负载(例如虚拟机)一起使用,并且旨在模仿现有的用于Kubernetes工作负载的Sidecar注入和部署规范模型,以引导Istio代理。

代码语言:javascript
复制
istioctl x workload group create --name "${VM_APP}" --namespace "${VM_NAMESPACE}" --labels app="${VM_APP}" --serviceAccount "${SERVICE_ACCOUNT}" > workloadgroup.yaml

•使用istioctl x workload entry命令生成虚拟机安装所需要的文件:

代码语言:javascript
复制
istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}"#cluster.env:包含标识哪些名称空间,服务帐户,网络CIDR和(可选)要捕获的入站端口的元数据。#istio-token:用于从CA获取证书的Kubernetes令牌。#mesh.yaml:提供其他Istio元数据,包括网络名称,信任域和其他值。#root-cert.pem:用于认证的根证书。#hosts:绑定istiod的host

配置虚拟机

在要添加到Istio网格的虚拟机上运行以下命令:

•将workdir内容发送到虚拟机。在选择安全传输这些文件的方式时,应考虑您的信息安全策略。为了方便起见,将所有必需的文件传输到虚拟机中"${HOME}"目录。•在以下位置安装根证书/etc/certs:

代码语言:javascript
复制
sudo mkdir -p /etc/certssudo cp "${HOME}"/root-cert.pem /etc/certs/root-cert.pem

•在/var/run/secrets/tokens以下位置安装令牌:

代码语言:javascript
复制
sudo  mkdir -p /var/run/secrets/tokenssudo cp "${HOME}"/istio-token /var/run/secrets/tokens/istio-token

•安装包含Istio虚拟机集成运行时的软件包:

代码语言:javascript
复制
curl -LO https://storage.googleapis.com/istio-release/releases/1.8.0/rpm/istio-sidecar.rpmsudo yum install -y istio-sidecar.rpm

•在/var/lib/istio/envoy/目录中安装cluster.env

代码语言:javascript
复制
sudo cp "${HOME}"/cluster.env /var/lib/istio/envoy/cluster.env

•将网格配置安装到/etc/istio/config/mesh:

代码语言:javascript
复制
sudo cp "${HOME}"/mesh.yaml /etc/istio/config/mesh

•将istiod主机添加到/etc/hosts:

这里我们没有外部lb不需要设置

代码语言:javascript
复制
sudo sh -c 'cat $(eval echo ~$SUDO_USER)/hosts >> /etc/hosts'

查看itiod的IP并绑定host

代码语言:javascript
复制
10.201.0.14 istiod.istio-system.svc

•修改权限:

代码语言:javascript
复制
sudo mkdir -p /etc/istio/proxysudo chown -R istio-proxy /var/lib/istio /etc/certs /etc/istio/proxy /etc/istio/config /var/run/secrets /etc/certs/root-cert.pem

在虚拟机中启动Istio

启动Istio代理:

代码语言:javascript
复制
systemctl start istio

验证Istio是否成功工作

•检查登录/var/log/istio/istio.log。您应该看到类似于以下内容的条目:

代码语言:javascript
复制
[root@worker ~]# tail -f  /var/log/istio/istio.log2020-11-21T04:27:44.248846Z    info    sds    resource:default pushed key/cert pair to proxy2020-11-21T04:33:30.756067Z    info    xdsproxy    disconnected from XDS server: istiod.istio-system.svc:150122020-11-21T04:33:31.285240Z    info    xdsproxy    Envoy ADS stream established2020-11-21T04:33:31.285453Z    info    xdsproxy    connecting to upstream XDS server: istiod.istio-system.svc:150122020-11-21T04:38:48.670065Z    info    xdsproxy    disconnected from XDS server: istiod.istio-system.svc:150122020-11-21T04:38:49.105717Z    info    xdsproxy    Envoy ADS stream established2020-11-21T04:38:49.105884Z    info    xdsproxy    connecting to upstream XDS server: istiod.istio-system.svc:150122020-11-21T04:54:00.782318Z    info    xdsproxy    disconnected from XDS server: istiod.istio-system.svc:150122020-11-21T04:54:01.037151Z    info    xdsproxy    Envoy ADS stream established2020-11-21T04:54:01.037506Z    info    xdsproxy    connecting to upstream XDS server: istiod.istio-system.svc:15012

•创建一个命名空间以部署基于Pod的服务:

代码语言:javascript
复制
kubectl create namespace samplekubectl label namespace sample istio-injection=enabled

•部署HelloWorld服务:

代码语言:javascript
复制
kubectl apply -f samples/helloworld/helloworld.yaml -n sample

将请求从您的虚拟机发送到服务:

代码语言:javascript
复制
[root@worker ~]# curl helloworld.sample.svc:5000/helloHello version: v2, instance: helloworld-v2-54df5f84b-tts2z[root@worker ~]# curl helloworld.sample.svc:5000/helloHello version: v1, instance: helloworld-v1-776f57d5f6-f72k9

在k8s内部访问vm服务

创建workloadentry 和service

代码语言:javascript
复制
apiVersion: networking.istio.io/v1beta1kind: WorkloadEntrymetadata:  name: test-vm-2  namespace: testspec:  serviceAccount: test  address: 192.168.8.170  labels:    app: test    instance-id: vm2---apiVersion: v1kind: Servicemetadata:  name: test  namespace: test  labels:    app: testspec:  ports:  - port: 80    name: http-vm    targetPort: 80  selector:    app: test

在vm上启动一个http server

代码语言:javascript
复制
python3 -m http.server 80

测试

代码语言:javascript
复制
kubectl exec -it helloworld-v1-776f57d5f6-nhmbc -n sample -- curl test.test.svc.cluster.localDefaulting container name to helloworld.Use 'kubectl describe pod/helloworld-v1-776f57d5f6-nhmbc -n sample' to see all of the containers in this pod.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Directory listing for /</title></head><body><h1>Directory listing for /</h1><hr><ul><li><a href="cluster.env">cluster.env</a></li>...</ul><hr></body></html>

原理概述

从上面我们可以看到vm上已经可以方便的访问k8s内部的服务,首先我们开启了1.8中ISTIO_META_DNS_CAPTURE功能,实现pilot-agent实现dns解析的功能,pilot-agent监听15053 udp/tcp端口,iptables将53的dns请求重定向到pilot-agent,规则如下:

代码语言:javascript
复制
-A POSTROUTING -p udp -m udp --dport 15053 -j SNAT --to-source 127.0.0.1-A POSTROUTING -p udp -m udp --dport 15053 -j SNAT --to-source 127.0.0.1-A POSTROUTING -p udp -m udp --dport 15053 -j SNAT --to-source 127.0.0.1-A OUTPUT -p udp -m udp --dport 53 -m owner --uid-owner 991 -j RETURN-A OUTPUT -p udp -m udp --dport 53 -m owner --gid-owner 991 -j RETURN-A OUTPUT -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.1:15053-A OUTPUT -p udp -m udp --dport 53 -m owner --uid-owner 991 -j RETURN-A OUTPUT -p udp -m udp --dport 53 -m owner --gid-owner 991 -j RETURN-A OUTPUT -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.1:15053-A OUTPUT -p udp -m udp --dport 53 -m owner --uid-owner 991 -j RETURN-A OUTPUT -p udp -m udp --dport 53 -m owner --gid-owner 991 -j RETURN-A OUTPUT -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.1:15053-A ISTIO_REDIRECT -p tcp -m tcp --dport 53 -j REDIRECT --to-ports 15053

ISTIO_META_DNS_CAPTURE正常只能影响k8s上管理的pod,但是在cluster.env中,通过ISTIO_META_DNS_CAPTURE=true开启了vm上pilot-agent的该功能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先决条件
  • 安装Istio控制面板
  • 配置虚拟机名称空间
  • 创建文件以传输到虚拟机
  • 配置虚拟机
  • 在虚拟机中启动Istio
  • 验证Istio是否成功工作
  • 在k8s内部访问vm服务
    • 在vm上启动一个http server
      • 测试
      • 原理概述
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档