尝试在一个准生产环境下,利用 istio 来对运行在 Kubernetes 上的微服务进行管理。

这一篇是第一篇,将一些主要的坑和环境准备工作。

内容较多,因此无法写成手把手教程,希望读者有一定 Kubernetes 的操作基础。

准备镜像

初始运行需要的镜像包括以下几个:

  • istio/mixer:0.1.6
  • pilot:0.1.6
  • proxy_debug:0.1.6
  • istio-ca:0.1.6

首先要解决的自然还是镜像的存放问题,官方在源码中提供了很方便的工具,用来根据模板生成在 Kubernetes 中运行 istio 的 YAML 文件:

  1. ./updateVersion.sh \
  2. -p 10.211.55.86:5000/istio,0.1.6 \
  3. -c 10.211.55.86:5000/istio,0.1.6 \
  4. -x 10.211.55.86:5000/istio,0.1.6

这一脚本在源码的 install 目录下。

Kubernetes 环境

这里我们使用的集群大概情况是:

  • 1.7.1 版本的 Kubernetes
  • 开启了 RBAC
  • 预备使用的命名空间为:default
  • PVC 自动供给
  • 无互联网连接
  • 具有自己的私库

启动 istio

RBAC 相关

首先,install 目录中提供的 rbac 文件授权范围不足,所以需要手工编辑istio-rbac-beta.yaml,把其中的几个 RoleBinding,改为 ClusterRoleBinding。

  1. kubectl create \
  2. -f istio-rbac-beta.yaml

另外缺省的 ClusterRole 中缺乏对 Namespace 的权限,新版本已经修正,目前版本仍需添加:

  1. kind: ClusterRole
  2. apiVersion: rbac.authorization.k8s.io/v1beta1
  3. metadata:
  4. name: istio-pilot
  5. rules:
  6. - apiGroups: ["istio.io"]
  7. resources: ["istioconfigs", "istioconfigs.istio.io"]
  8. verbs: ["*"]
  9. - apiGroups: ["extensions"]
  10. resources: ["thirdpartyresources", "thirdpartyresources.extensions", "ingresses", "ingresses/status"]
  11. verbs: ["*"]
  12. - apiGroups: [""]
  13. resources: ["configmaps", "endpoints", "pods", "services"]
  14. verbs: ["*"]
  15. - apiGroups: [""]
  16. resources: ["namespaces", "nodes", "secrets"]
  17. verbs: ["get", "list", "watch"]

启动 istio 组件

  1. kubectl create \
  2. -f istio.yaml \

创建 PVC

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: frontend-v1
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. resources:
  9. requests:
  10. storage: 1Gi

准备工作负载

这里我们使用官方的 PHP + Apache 镜像作为工作负载来进行下面的测试,例如我们准备好的 YAML 如下:

Deployment

  1. kind: Deployment
  2. apiVersion: extensions/v1beta1
  3. metadata:
  4. name: frontend
  5. labels:
  6. name: frontend
  7. version: "1"
  8. spec:
  9. replicas: 1
  10. template:
  11. metadata:
  12. labels:
  13. name: frontend
  14. version: "1"
  15. spec:
  16. containers:
  17. - name: php
  18. image: 10.211.55.86:5000/php:7.1.7-apache
  19. ports:
  20. - containerPort: 80
  21. protocol: TCP
  22. volumeMounts:
  23. - name: wwwroot
  24. mountPath: /var/www/html
  25. env:
  26. - name: "SERVICE_VERSION"
  27. value: "1"
  28. volumes:
  29. - name: wwwroot
  30. persistentVolumeClaim:
  31. claimName: frontend-v1

服务定义:

  1. kind: Service
  2. apiVersion: v1
  3. metadata:
  4. name: svc-frontend
  5. labels:
  6. name: frontend
  7. version: "1"
  8. spec:
  9. type: NodePort
  10. ports:
  11. - protocol: TCP
  12. port: 80
  13. targetPort: 80
  14. nodePort: 32010
  15. selector:
  16. name: frontend

在 Web 目录中我们随便做了个index.php,用来展示当前所在 Pod 和环境变量中的服务版本号,备用。

Tips:一般这类测试,我都懒得重新做一个 Docker 镜像,一般是另外用一个 Pod 挂载同一个 PVC,直接编辑页面文件,或者使用kubectl cp命令进行拷贝。

index.php

  1. <?php
  2. header("Content-type: text/plain");
  3. echo "From: ".gethostname()."\n";
  4. echo "Version: ".$_ENV['SERVICE_VERSION']."\n";

delay.php

  1. <?php
  2. header("Content-type: text/plain");
  3. sleep(4);
  4. echo "\n-----------------------------\n";
  5. echo "\nFrom: ".gethostname()."\n";
  6. echo "Version: ".$_ENV['SERVICE_VERSION']."\n";

运行成功后,访问该服务的 nodePort,会看到相应的输出内容。

istio 的注入

首先用kubectl delete -f删除上文的服务和 Deployment。

上面为了测试方便,给 Service 使用了 NodePort 类型,这里我们去掉这一服务的 NodePort,用 ClusterIP 的形式运行:

  1. spec:
  2. ports:
  3. - protocol: TCP
  4. port: 80
  5. targetPort: 80
  6. selector:
  7. name: frontend

接下来进行注入操作

  1. istioctl kube-inject -f frontend-v1.yaml > frontend-v1-istio.yaml

观察注入操作会发现,其中多了一个 Sidecar Container(下面的 Image 节内容已经被我修改为本地私库):

  1. env:
  2. - name: POD_NAME
  3. valueFrom:
  4. fieldRef:
  5. fieldPath: metadata.name
  6. - name: POD_NAMESPACE
  7. valueFrom:
  8. fieldRef:
  9. fieldPath: metadata.namespace
  10. - name: POD_IP
  11. valueFrom:
  12. fieldRef:
  13. fieldPath: status.podIP
  14. image: 10.211.55.86:5000/istio/proxy_debug:0.1.6
  15. imagePullPolicy: Always
  16. name: proxy
  17. resources: {}
  18. securityContext:
  19. runAsUser: 1337

另外还在pod.beta.kubernetes.io/init-containers注解中进行了初始化:

  1. [{
  2. "args": ["-p", "15001", "-u", "1337"],
  3. "image": "10.211.55.86:5000/istio/init:0.1",
  4. "imagePullPolicy": "Always",
  5. "name": "init",
  6. "securityContext": {
  7. "capabilities": {
  8. "add": ["NET_ADMIN"]
  9. }
  10. }
  11. }, {
  12. "args": ["-c", "sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%t \u0026\u0026 ulimit -c unlimited"],
  13. "command": ["/bin/sh"],
  14. "image": "10.211.55.86:5000/alpine",
  15. "imagePullPolicy": "Always",
  16. "name": "enable-core-dump",
  17. "securityContext": {
  18. "privileged": true
  19. }
  20. }]

可以看到上面一共涉及三个镜像:

  • docker.io/istio/proxy_debug:0.1
  • docker.io/istio/init:0.1
  • alpine

经过一番折腾:

  1. 原有 YAML
  2. 注入,生成新的 YAML
  3. 替换新 YAML 中的镜像地址

就把原有的容器应用封装成新的 istio 支持的微服务了。

准备测试素材

另外我们需要准备一个工具服务,用于在 shell 中进行测试:

  1. kind: Deployment
  2. apiVersion: extensions/v1beta1
  3. metadata:
  4. name: tool
  5. labels:
  6. name: tool
  7. version: "1"
  8. spec:
  9. replicas: 1
  10. template:
  11. metadata:
  12. labels:
  13. name: tool
  14. version: "1"
  15. spec:
  16. containers:
  17. - name: tool
  18. image: 10.211.55.86:5000/php:7.1.7-apache
  19. ports:
  20. - containerPort: 80
  21. protocol: TCP
  22. volumeMounts:
  23. - name: wwwroot
  24. mountPath: /var/www/html
  25. volumes:
  26. - name: wwwroot
  27. persistentVolumeClaim:
  28. claimName: frontend-v1
  29. ---
  30. kind: Service
  31. apiVersion: v1
  32. metadata:
  33. name: tool
  34. labels:
  35. name: tool
  36. spec:
  37. ports:
  38. - protocol: TCP
  39. port: 80
  40. targetPort: 80
  41. selector:
  42. name: tool

同样的,这里也需要执行istioctl kube-inject进行注入,运行之后,就得到一个运行于集群内部的 Linux Shell,istio 中的路由策略经常是客户端和服务器协同完成的,因此上客户和服务器的 Deployment 都需要进行注入操作。

K8S中文文档  docs.kubernetes.org.cn

转自:https://www.kubernetes.org.cn/2449.html

利用 istio 来对运行在 Kubernetes 上的微服务进行管理的更多相关文章

  1. 使用Netsil监控Kubernetes上的微服务

    ubernetes是容器编排和调度领域的王者,它击败了竞争对手Docker Swarm和Apache Mesos,开启了闪耀的未来,微服务可以自修复,可以自动扩展,可以跨zone,region甚至跨云 ...

  2. 为什么 kubernetes 天然适合微服务

    最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样.(可参考<容器平台选型的十大模式: ...

  3. Kubernetes才是微服务和DevOps的桥梁

    一.从企业上云的三大架构看容器平台的三种视角 一切都从企业上云的三大架构开始. 如图所示,企业上的三大架构为IT架构,应用架构和数据架构,在不同的公司,不同的人,不同的角色,关注的重点不同. 对于大部 ...

  4. 为什么 kubernetes 天然适合微服务 (2)

    此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 三.微服务化的十个设计要点 微服务有哪些要点呢?第一张图是 SpringCloud 的整个生态. 第二张图是微服 ...

  5. 为什么 kubernetes 天然适合微服务 (1)

    此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发 ...

  6. 为什么 kubernetes 天然适合微服务 (3)

    此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 四.Kubernetes 本身就是微服务架构 基于上面这十个设计要点,我们再回来看 Kubernetes,会发现 ...

  7. 使用 Nocalhost 开发 Rainbond 上的微服务应用

    本文将介绍如何使用 Nocalhost 快速开发 Rainbond 上的微服务应用的开发流程以及实践操作步骤. Nocalhost 可以直接在 Kubernetes 中开发应用,Rainbond 可以 ...

  8. 在 Docker 上运行一个 RESTful 风格的微服务

    tags: Microservice Restful Docker Author: Andy Ai Weibo:NinetyH GitHub: https://github.com/aiyanbo/d ...

  9. 使用Quarkus在Openshift上构建微服务的快速指南

    在我的博客上,您有机会阅读了许多关于使用Spring Boot或Micronaut之类框架构建微服务的文章.这里将介绍另一个非常有趣的框架专门用于微服务体系结构,它越来越受到大家的关注– Quarku ...

随机推荐

  1. HDU 5371 Hotaru's problem Manacher+尺取法

    题意:给你一个序列,求最长的两段回文子串,要求他们共用中间的一半. 思路:利用Manacher求出p[i]表示的当前位置的最长回文串长度,然后把每一个长度大于等于2的回文串的左区间和右区间分别放到两个 ...

  2. HDU 4359 Easy Tree DP? 组合数学+动归

    题意:定义一种树,每个节点的权值都是20到2n-1,每个权值出现一次,每个节点的左子树的权值和小于右子树,除非只有一个子树.给你n和d,问有n个节点且恰好深度是d的这种树有多少种. 比赛的时候我没有做 ...

  3. ES6学习笔记(十)代理器Proxy

    Java可以使用面向切面(AOP)的方法来实现某些统一的操作,比如某个操作的前置通知,后置通知等等,这种操作非常方便,其本质便是动态代理,JS的代理Proxy代理该如何使用呢? 某位大神的实现如下: ...

  4. java中TCP传输协议

    class TcpClient { public static void main(String[] args) throws Exception { //创建client的socket服务,指定目的 ...

  5. 解决切换场景时NGUI图集资源未释放的问题

    使用unity3d编辑器,在切换场景的时候.NGUI的图集没有释放造成内存不足游戏闪退的问题. 默认情况下,unity3d切换场景之后会释放不用的内存,即内部会调用Resources.UnloadUn ...

  6. js---跨域的问题

    一:跨域一般的报错情况  一般来说,如果你在开发中需要进行跨域操作(从一个非同源网站发送请求获取数据),一般而言,你在浏览器控制台看到的结果为: 二:同源策略 说到跨域就不得不提“同源策略”. 那么, ...

  7. Fragment-传递参数

    在关Fragment间参数的传递,有两种情况: 第一种情况:同一个container中不同fragment间的参数传递.这种情况一般发生在fragment跳转时,上一个Fragment将参数传递给下一 ...

  8. C#导出EXCEL(DataTable导出EXCEL)

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.I ...

  9. AtCoder Grand Contest 018 A - Getting Difference

    A - Getting Difference Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement ...

  10. JAVA使用YUI压缩CSS/JS

    前言 JS/CSS文件压缩我们经常会用到,可以在网上找在线压缩或者本地直接使用,我这里使用的是yahoo开源组件YUI Compressor.首先介绍一下YUI Compressor,它是一个用来压缩 ...