服务网格内部的 VirtualService 和 DestinationRule 配置深度解析

istio

1. 介绍

pilot 服务发现
kiali 控制面板
prometheus 监控
telemetry 遥测
gateway 网关
//todo

2. 安装

官方中文文档
https://preliminary.istio.io/zh/docs/setup/getting-started

2.1 在k8s中安装步骤

  1. 下载地址
    https://github.com/istio/istio/releases/
    或者直接curl下载
    curl -L https://istio.io/downloadIstio | sh -
    会将最新文档版本下载,这样直接下载时候,报403错误
    添加199.232.28.133 raw.githubusercontent.com至hosts文件

  2. 将 istioctl 客户端路径增加到 path 环境变量中
    export PATH=$PWD/bin:$PATH

  3. istioctl自动补全

cp tools/istioctl.bash ~/.istioctl.bash
source /root/.istioctl.bash
  1. 安装demo配置
istioctl manifest install --set profile=demo

验证

kubectl get svc -n istio-system

如果集群运行在一个不支持外部负载均衡器的环境中(例如:minikube),
istio-ingressgateway 的 EXTERNAL-IP 将显示为 状态。请使用服务的 NodePort 或 端口转发来访问网关
修改入口网关的服务类型为NodePort

kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec":{"type":"NodePort"}}'

至此基本结束

3. istioctl常用命令

  1. 查看版本信息
    istioctl version

  2. analyze
    istioctl analyze

  3. 查看profile list

[root@k8master istio-1.7.4]# istioctl profile list
Istio configuration profiles:
    remote
    default
    demo
    empty
    minimal
    preview
  1. 将profile导出为yaml文件
    istioctl profile dump demo > demo.yaml
    包含两部分
    components(组件) 和 addonComponents(插件)
    不同配置文件内容:
    https://preliminary.istio.io/latest/zh/docs/setup/additional-setup/config-profiles/

4. 注入inject

4.1 手动注入

# touch jiuxi-deployment.yaml
# kubectl create ns jiuxi-ns
# kubectl apply –f jiuxi-deployment.yaml –n jiuxi-ns
# istioctl kube-inject –f jiuxi-deployment.yaml –o jiuxi-deployment-inject.yaml
# istioctl kube-inject –f jiuxi-deployment.yaml | kubectl apply –f - -n jiuxi-ns

第4条命令没有注入,只是生成yaml文件,第5条命令实现注入

istioctl kube-inject -f jiuxi-deployment.yaml -o jiuxi-deployment-inject.yaml
查看生成的jiuxi-deployment-injet.yaml文件,可以看到:
(1) 多了一个initContainers
(2) 多了一个
image: docker.io/istio/proxyv2:1.7.4
name: istio-proxy
这样的container
  1. 注入之前
[root@k8master istio]# kubectl get pods -n jiuxi-ns
NAME                     READY   STATUS    RESTARTS   AGE
jiuxi-86b5bbbfc8-8qh5z   1/1     Running   0          4m51s
[root@k8master istio]# kubectl exec -it -n jiuxi-ns jiuxi-86b5bbbfc8-8qh5z sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro
/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 nginx: master process nginx -g daemon off;
    6 nginx     0:00 nginx: worker process
   32 root      0:00 sh
   38 root      0:00 ps -ef
[root@k8master istio]# kubectl exec -it -n jiuxi-ns jiuxi-86b5bbbfc8-8qh5z -c nginx -- ifconfig
eth0      Link encap:Ethernet  HWaddr 72:AE:6A:91:9F:D3
          inet addr:10.244.2.23  Bcast:10.244.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:213 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:37479 (36.6 KiB)  TX bytes:42 (42.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

执行:istioctl kube-inject –f jiuxi-deployment.yaml | kubectl apply –f - -n jiuxi-ns 注入之后:
在这里插入图片描述
注意:pod中的所有container在同一个网络空间
在这里插入图片描述

这个过程是:

  1. 会新建一个新的pod
  2. pod中initContainer会修改路由规则,把所有的流量都重定向
  3. 一个新的container: istio-proxy会启动两个服务,一个为envoy,一个pilot-agent
    pilot-agent负责调度envoy运行,及修改相关流控配置
    pilot-server监听api-server的变化
    当pilot-server监听到api-server的变化时,会同pilot-agent进行通信,再由pilot-agent配置管理envoy路由策略

4.2 自动注入

创建一个namespace, 给这个namespace打个标签, 设置为自动注入
当使用 kubectl apply 来部署应用时,如果 pod 启动在标有 istio-injection=enabled 的命名空间中,那么,Istio sidecar 注入器将自动注入 Envoy 容器到应用的 pod 中

$ kubectl label namespace <namespace> istio-injection=enabled
$ kubectl create -n <namespace> -f <your-app-spec>.yaml
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐