初入 Envoy/Istio

由于要做 K8S 的 sidecar 扩展,而其实际是由 Envoy 来实现的。要将 Envoy 部署为 sidecar,需要先安装 Istio。

$ wget https://raw.githubusercontent.com/istio/istio/master/release/downloadIstioCandidate.sh
$ sh downloadIstioCandidate.sh

完成下载后,将得到一个 istio-1.8.1 目录,将目录内的 bin 目录加入到环境变量 PATH 中。注意,此处应当是全局的环境变量,因此可以考虑将 istio-1.8.1 目录整体移往 /opt,并且修改 /etc/profile 以加入环境变量。

然后执行命令安装 Istio,并开启自动注入:

$ istioctl install --set profile=demo -y
$ kubectl label namespace default istio-injection=enabled

部署完毕后,可以用以下命令来查看自动注入的启用情况:

$ kubectl get namespace -L istio-injection

按上一篇所说的,我们原本在 K8S 里有一个名为 sample-service 的 Pod,在注入开启后,我们需要重新部署之:

$ kubectl delete -f sample-service.yaml
$ kubectl create -f sample-service.yaml

完成后会发现,Pod 的 Ready 状态有所改变,在没有注入时,状态为 1/1,而开启注入后,状态为 2/2,此时即代表注入成功。


接着要打一个 Envoy 的镜象,在打镜象前,需要对 Envoy 作出配置,我们在这里简单的进行一个代理,将请求转发至 sample-service。先通过 kubectl describe pod sample-service 可以得知 Pod 的 IP,然后作出如下配置:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: 
      address: 127.0.0.1
      port_value: 9901
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: 
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route: 
                  cluster: sample-envoy-service
          http_filters:
          - name: envoy.router
  clusters:
  - name: sample-envoy-service
    connect_timeout: 30s
    type: STATIC
    lb_policy: ROUND_ROBIN
    hosts: 
    - socket_address: 
        address: 192.168.235.233
        port_value: 9001

需要注意的是,这里的 admin 相关的端口必须配置,因为内带了一个管理员工具,我们会需要访问到它。

然后写一个 Dockerfile 就可以打包镜象了:

FROM envoyproxy/envoy-dev:e98e41a8e168af7acae8079fc0cd68155f699aa3
COPY envoy.yaml /etc/envoy/envoy.yaml
$ sudo docker build -t envoy:v1 .

打完镜象后,将它运行起来即可:

$ sudo docker run -it -d --name envoy -p 9901:9901 -p 10000:10000 envoy:v1

完成后即可对 10000 端口发出请求:

$ curl 'http://0.0.0.0:10000'

即可以看到我们原本部署于 9001 端口上的内容了,即告代理成功。

对于外部的访问,也可以在浏览器下使用以下 URL:

http://10.211.55.16:10000

这样我们就不再需要开启 32001 端口来供外部访问了。


踩坑

第一次部署好 sample-service 服务后,跑起 Envoy 并在外部浏览器请求时,会出现一个异常,upstream connect error or disconnect/reset before headers. reset reason: connection termination,初看之下,就是请求在 header 被处理之前就挂了。那就要去查一下是否 header 里面有 Envoy 不支持的东西了。

经过排查,发现是我在 Ktor 内开启了 Compress 插件,并且未把 Accept-Encoding: gzip 加入响应头,而 Envoy 在转发时,默认将原始的响应头送出,因此在浏览器侧无法接受到 Accept-Encoding 的值,所以就没有进行解压而产生了异常。解决方法也很简单,就是在 Ktor 项目启动的时候,禁用 Compress:

fun Application.module() {
    installPlugin<K8sSampleSession>(
        useCompress = false,    // 此处禁用压缩
        sessionIdentifier = "SampleSession",
        headers = mapOf("X-Engine" to "Ktor")) { }
    routing {
        ... ...
    }
}

另外,上面说到了 admin 相关的端口配置,其实 Envoy 对 admin 提供了操作接口,需要进入容器来操作,如下:

$ sudo docker exec -it envoy sh
# curl 'http://0.0.0.0:9901/help'
# curl 'http://0.0.0.0:9901/stats'
# curl 'http://0.0.0.0:9901/server_info'

容器中可能没有 curl,在此情况下需要手动安装一下,apt update && apt install curl

最后,经张瑾大神的指点,才知道 Istio 是 Envoy 的上层实现,其实很多情况下,我们并没有必要直接使用 Envoy,而是在 Istio 上发挥就好了,下次再研究吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容