利用 istio 来对运行在 Kubernetes 上的微服务进行管理
尝试在一个准生产环境下,利用 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 文件:
- ./updateVersion.sh \
- -p 10.211.55.86:5000/istio,0.1.6 \
- -c 10.211.55.86:5000/istio,0.1.6 \
- -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。
- kubectl create \
- -f istio-rbac-beta.yaml
另外缺省的 ClusterRole 中缺乏对 Namespace 的权限,新版本已经修正,目前版本仍需添加:
- kind: ClusterRole
- apiVersion: rbac.authorization.k8s.io/v1beta1
- metadata:
- name: istio-pilot
- rules:
- - apiGroups: ["istio.io"]
- resources: ["istioconfigs", "istioconfigs.istio.io"]
- verbs: ["*"]
- - apiGroups: ["extensions"]
- resources: ["thirdpartyresources", "thirdpartyresources.extensions", "ingresses", "ingresses/status"]
- verbs: ["*"]
- - apiGroups: [""]
- resources: ["configmaps", "endpoints", "pods", "services"]
- verbs: ["*"]
- - apiGroups: [""]
- resources: ["namespaces", "nodes", "secrets"]
- verbs: ["get", "list", "watch"]
启动 istio 组件
- kubectl create \
- -f istio.yaml \
创建 PVC
- kind: PersistentVolumeClaim
- apiVersion: v1
- metadata:
- name: frontend-v1
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 1Gi
准备工作负载
这里我们使用官方的 PHP + Apache 镜像作为工作负载来进行下面的测试,例如我们准备好的 YAML 如下:
- kind: Deployment
- apiVersion: extensions/v1beta1
- metadata:
- name: frontend
- labels:
- name: frontend
- version: "1"
- spec:
- replicas: 1
- template:
- metadata:
- labels:
- name: frontend
- version: "1"
- spec:
- containers:
- - name: php
- image: 10.211.55.86:5000/php:7.1.7-apache
- ports:
- - containerPort: 80
- protocol: TCP
- volumeMounts:
- - name: wwwroot
- mountPath: /var/www/html
- env:
- - name: "SERVICE_VERSION"
- value: "1"
- volumes:
- - name: wwwroot
- persistentVolumeClaim:
- claimName: frontend-v1
服务定义:
- kind: Service
- apiVersion: v1
- metadata:
- name: svc-frontend
- labels:
- name: frontend
- version: "1"
- spec:
- type: NodePort
- ports:
- - protocol: TCP
- port: 80
- targetPort: 80
- nodePort: 32010
- selector:
- name: frontend
在 Web 目录中我们随便做了个index.php,用来展示当前所在 Pod 和环境变量中的服务版本号,备用。
Tips:一般这类测试,我都懒得重新做一个 Docker 镜像,一般是另外用一个 Pod 挂载同一个 PVC,直接编辑页面文件,或者使用kubectl cp命令进行拷贝。
index.php
- <?php
- header("Content-type: text/plain");
- echo "From: ".gethostname()."\n";
- echo "Version: ".$_ENV['SERVICE_VERSION']."\n";
delay.php
- <?php
- header("Content-type: text/plain");
- sleep(4);
- echo "\n-----------------------------\n";
- echo "\nFrom: ".gethostname()."\n";
- echo "Version: ".$_ENV['SERVICE_VERSION']."\n";
运行成功后,访问该服务的 nodePort,会看到相应的输出内容。
istio 的注入
首先用kubectl delete -f删除上文的服务和 Deployment。
上面为了测试方便,给 Service 使用了 NodePort 类型,这里我们去掉这一服务的 NodePort,用 ClusterIP 的形式运行:
- spec:
- ports:
- - protocol: TCP
- port: 80
- targetPort: 80
- selector:
- name: frontend
接下来进行注入操作
- istioctl kube-inject -f frontend-v1.yaml > frontend-v1-istio.yaml
观察注入操作会发现,其中多了一个 Sidecar Container(下面的 Image 节内容已经被我修改为本地私库):
- env:
- - name: POD_NAME
- valueFrom:
- fieldRef:
- fieldPath: metadata.name
- - name: POD_NAMESPACE
- valueFrom:
- fieldRef:
- fieldPath: metadata.namespace
- - name: POD_IP
- valueFrom:
- fieldRef:
- fieldPath: status.podIP
- image: 10.211.55.86:5000/istio/proxy_debug:0.1.6
- imagePullPolicy: Always
- name: proxy
- resources: {}
- securityContext:
- runAsUser: 1337
另外还在pod.beta.kubernetes.io/init-containers注解中进行了初始化:
- [{
- "args": ["-p", "15001", "-u", "1337"],
- "image": "10.211.55.86:5000/istio/init:0.1",
- "imagePullPolicy": "Always",
- "name": "init",
- "securityContext": {
- "capabilities": {
- "add": ["NET_ADMIN"]
- }
- }
- }, {
- "args": ["-c", "sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%t \u0026\u0026 ulimit -c unlimited"],
- "command": ["/bin/sh"],
- "image": "10.211.55.86:5000/alpine",
- "imagePullPolicy": "Always",
- "name": "enable-core-dump",
- "securityContext": {
- "privileged": true
- }
- }]
可以看到上面一共涉及三个镜像:
- docker.io/istio/proxy_debug:0.1
- docker.io/istio/init:0.1
- alpine
经过一番折腾:
- 原有 YAML
- 注入,生成新的 YAML
- 替换新 YAML 中的镜像地址
就把原有的容器应用封装成新的 istio 支持的微服务了。
准备测试素材
另外我们需要准备一个工具服务,用于在 shell 中进行测试:
- kind: Deployment
- apiVersion: extensions/v1beta1
- metadata:
- name: tool
- labels:
- name: tool
- version: "1"
- spec:
- replicas: 1
- template:
- metadata:
- labels:
- name: tool
- version: "1"
- spec:
- containers:
- - name: tool
- image: 10.211.55.86:5000/php:7.1.7-apache
- ports:
- - containerPort: 80
- protocol: TCP
- volumeMounts:
- - name: wwwroot
- mountPath: /var/www/html
- volumes:
- - name: wwwroot
- persistentVolumeClaim:
- claimName: frontend-v1
- ---
- kind: Service
- apiVersion: v1
- metadata:
- name: tool
- labels:
- name: tool
- spec:
- ports:
- - protocol: TCP
- port: 80
- targetPort: 80
- selector:
- name: tool
同样的,这里也需要执行istioctl kube-inject进行注入,运行之后,就得到一个运行于集群内部的 Linux Shell,istio 中的路由策略经常是客户端和服务器协同完成的,因此上客户和服务器的 Deployment 都需要进行注入操作。
K8S中文文档 docs.kubernetes.org.cn
转自:https://www.kubernetes.org.cn/2449.html
利用 istio 来对运行在 Kubernetes 上的微服务进行管理的更多相关文章
- 使用Netsil监控Kubernetes上的微服务
ubernetes是容器编排和调度领域的王者,它击败了竞争对手Docker Swarm和Apache Mesos,开启了闪耀的未来,微服务可以自修复,可以自动扩展,可以跨zone,region甚至跨云 ...
- 为什么 kubernetes 天然适合微服务
最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样.(可参考<容器平台选型的十大模式: ...
- Kubernetes才是微服务和DevOps的桥梁
一.从企业上云的三大架构看容器平台的三种视角 一切都从企业上云的三大架构开始. 如图所示,企业上的三大架构为IT架构,应用架构和数据架构,在不同的公司,不同的人,不同的角色,关注的重点不同. 对于大部 ...
- 为什么 kubernetes 天然适合微服务 (2)
此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 三.微服务化的十个设计要点 微服务有哪些要点呢?第一张图是 SpringCloud 的整个生态. 第二张图是微服 ...
- 为什么 kubernetes 天然适合微服务 (1)
此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发 ...
- 为什么 kubernetes 天然适合微服务 (3)
此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 四.Kubernetes 本身就是微服务架构 基于上面这十个设计要点,我们再回来看 Kubernetes,会发现 ...
- 使用 Nocalhost 开发 Rainbond 上的微服务应用
本文将介绍如何使用 Nocalhost 快速开发 Rainbond 上的微服务应用的开发流程以及实践操作步骤. Nocalhost 可以直接在 Kubernetes 中开发应用,Rainbond 可以 ...
- 在 Docker 上运行一个 RESTful 风格的微服务
tags: Microservice Restful Docker Author: Andy Ai Weibo:NinetyH GitHub: https://github.com/aiyanbo/d ...
- 使用Quarkus在Openshift上构建微服务的快速指南
在我的博客上,您有机会阅读了许多关于使用Spring Boot或Micronaut之类框架构建微服务的文章.这里将介绍另一个非常有趣的框架专门用于微服务体系结构,它越来越受到大家的关注– Quarku ...
随机推荐
- HDU 5371 Hotaru's problem Manacher+尺取法
题意:给你一个序列,求最长的两段回文子串,要求他们共用中间的一半. 思路:利用Manacher求出p[i]表示的当前位置的最长回文串长度,然后把每一个长度大于等于2的回文串的左区间和右区间分别放到两个 ...
- HDU 4359 Easy Tree DP? 组合数学+动归
题意:定义一种树,每个节点的权值都是20到2n-1,每个权值出现一次,每个节点的左子树的权值和小于右子树,除非只有一个子树.给你n和d,问有n个节点且恰好深度是d的这种树有多少种. 比赛的时候我没有做 ...
- ES6学习笔记(十)代理器Proxy
Java可以使用面向切面(AOP)的方法来实现某些统一的操作,比如某个操作的前置通知,后置通知等等,这种操作非常方便,其本质便是动态代理,JS的代理Proxy代理该如何使用呢? 某位大神的实现如下: ...
- java中TCP传输协议
class TcpClient { public static void main(String[] args) throws Exception { //创建client的socket服务,指定目的 ...
- 解决切换场景时NGUI图集资源未释放的问题
使用unity3d编辑器,在切换场景的时候.NGUI的图集没有释放造成内存不足游戏闪退的问题. 默认情况下,unity3d切换场景之后会释放不用的内存,即内部会调用Resources.UnloadUn ...
- js---跨域的问题
一:跨域一般的报错情况 一般来说,如果你在开发中需要进行跨域操作(从一个非同源网站发送请求获取数据),一般而言,你在浏览器控制台看到的结果为: 二:同源策略 说到跨域就不得不提“同源策略”. 那么, ...
- Fragment-传递参数
在关Fragment间参数的传递,有两种情况: 第一种情况:同一个container中不同fragment间的参数传递.这种情况一般发生在fragment跳转时,上一个Fragment将参数传递给下一 ...
- C#导出EXCEL(DataTable导出EXCEL)
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.I ...
- AtCoder Grand Contest 018 A - Getting Difference
A - Getting Difference Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement ...
- JAVA使用YUI压缩CSS/JS
前言 JS/CSS文件压缩我们经常会用到,可以在网上找在线压缩或者本地直接使用,我这里使用的是yahoo开源组件YUI Compressor.首先介绍一下YUI Compressor,它是一个用来压缩 ...