利用 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 ...
随机推荐
- 网络协议 4 - 交换机与 VLAN
上一次,我们通过公司需求,认识了如何通过物理层和链路层组建一个公司局域网.今天,我们切换到复杂点的办公室场景. 在这个场景里,就不像在大学教室那样,搞几根网线,拉一拉,扯一扯就可以了.一个办公 ...
- "getElementsByClassName is not a function" 报错原因
element.getElementsByClassName(""): 返回的含有该类的子元素数组,除了子元素以外的后代元素是获取不到的.要遍历使用,或者.element.getE ...
- 【Henu ACM Round #13 F】Fibonacci-ish
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举序列的头两个数字是什么 O(N^2) 然后头两个数字确定之后. f[3],f[4]..就确定了 只需查看f[3],f[4]..是 ...
- 发送邮件被退回,提示: Helo command rejected: Invalid name 错误
我自己配置的 postfix + dovecot server, 配置了outlook 后, 相同的账号. 在有的电脑上能收发成功, 在有的电脑上发送邮件就出现退信.提示 Helo command r ...
- POJ 1466 Girls and Boys (匈牙利算法 最大独立集)
Girls and Boys Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10912 Accepted: 4887 D ...
- OL记载Arcgis Server切片
概述: 本文讲述怎样在OpenLayers中调用Arcgis Server切片并显示. 思路: 在OpenLayers中载入Arcgis Server切片用XYZ图层,Arcgis Server的切片 ...
- hq-源码编译
这里编译整个项目的基本格式是 ./mk + 平台名 +项目名_客户名 +mmm +new 例如 ./mk hq6735_65c_b1k_l1 al811_doov mmm new 编译单个模块 ./m ...
- 43.安装npm及cnpm(Windows)
转自:https://www.cnblogs.com/yominhi/p/7039795.html [工具官网] Node.js : http://nodejs.cn/ 淘宝NPM: https:// ...
- Http1.1和http2.0
HTTP2.0 最近在读一本书叫<web性能权威指南>谷歌公司高性能团队核心成员的权威之作. 一直听说HTTP2.0,对此也仅仅是耳闻,没有具体研读过,这次正好有两个篇章,分别讲HTTP1 ...
- 基于Linux平台Softimage XSI 演示
2009年底上映的<阿凡达>是电影特效的巅峰之作,就在本月初上映的变形金刚3每次观看之后看得眼花缭乱总能让我热血沸腾,要是自己能做出那样的特效该多好,Linux下研究Maya已经有一段日 ...