Istio微服务架构初试

感谢

http://blog.csdn.net/qq_34463875/article/details/77866072

看了一些文档,有些半懂不懂,所以还是需要helloworld一下。因为istio需要kubernetes 1.7的环境,所以又把环境重新安装了一边,详情看随笔。

文章比较少,我也遇到不少问题,基本还是出于对一些东西的理解不够深刻,踩坑下来也算是学习啦。

重要事情先说一次

1.Kube-apiserver需要打开ServiceAccount配置

2.Kube-apiserver需要配置ServiceAccount

3.集群需要配置DNS

架构

先看一张Service Mesh的架构图

istio架构图

时间有限以后慢慢补充功能

安装

下载地址 https://github.com/istio/istio/releases

我下载的是0.1.6版本。 https://github.com/istio/istio/releases/download/0.1.6/istio-0.1.6-linux.tar.gz

解压,然后下载镜像,涉及镜像包括

  • istio/mixer:0.1.6
  • pilot:0.1.6
  • proxy_debug:0.1.6
  • istio-ca:0.1.6
[[email protected] ~]# docker images
REPOSITORY                                                               TAG                  IMAGE ID            CREATED             SIZE
docker.io/tomcat                                                         9.0-jre8             e882239f2a28        2 weeks ago         557.3 MB
docker.io/alpine                                                         latest               053cde6e8953        3 weeks ago         3.962 MB
registry.cn-hangzhou.aliyuncs.com/szss_k8s/k8s-dns-sidecar-amd64         1.14.5               fed89e8b4248        8 weeks ago         41.81 MB
registry.cn-hangzhou.aliyuncs.com/szss_k8s/k8s-dns-kube-dns-amd64        1.14.5               512cd7425a73        8 weeks ago         49.38 MB
registry.cn-hangzhou.aliyuncs.com/szss_k8s/k8s-dns-dnsmasq-nanny-amd64   1.14.5               459944ce8cc4        8 weeks ago         41.42 MB
gcr.io/google_containers/exechealthz                                     1.0                  82a141f5d06d        20 months ago       7.116 MB
gcr.io/google_containers/kube2sky                                        1.14                 a4892326f8cf        21 months ago       27.8 MB
gcr.io/google_containers/etcd-amd64                                      2.2.1                3ae398308ded        22 months ago       28.19 MB
gcr.io/google_containers/skydns                                          2015-10-13-8c72f8c   718809956625        2 years ago         40.55 MB
docker.io/kubernetes/pause                                               latest               f9d5de079539        3 years ago         239.8 kB
docker.io/istio/istio-ca                                                 0.1.6                c25b02aba82d        292 years ago       153.6 MB
docker.io/istio/mixer                                                    0.1.6                1f4a2ce90af6        292 years ago       158.9 MB
docker.io/istio/proxy_debug                                              0.1                  5623de9317ff        292 years ago       825 MB
docker.io/istio/proxy_debug                                              0.1.6                5623de9317ff        292 years ago       825 MB
docker.io/istio/pilot                                                    0.1.6                e0c24bd68c04        292 years ago       144.4 MB
docker.io/istio/init                                                     0.1                  0cbd83e9df59        292 years ago       119.3 MB

进入istio.yaml后先把pullPolicy给修改了

imagePullPolicy: IfNotPresent

然后运行

kubectl create     -f istio-rbac-beta.yaml

kubectl create     -f istio.yaml

此处遇到无数问题,都和环境不ready相关

1.Kube-apiserver需要打开ServiceAccount配置

2.Kube-apiserver需要配置ServiceAccount

3.集群需要配置DNS

运行起来后一看service

[[email protected] kubernetes]# kubectl get services
NAME            CLUSTER-IP       EXTERNAL-IP   PORT(S)                       AGE
helloworldsvc   10.254.145.112   <none>        8080/TCP                      47m
istio-egress    10.254.164.118   <none>        80/TCP                        14h
istio-ingress   10.254.234.8     <pending>     80:32031/TCP,443:32559/TCP    14h
istio-mixer     10.254.227.198   <none>        9091/TCP,9094/TCP,42422/TCP   14h
istio-pilot     10.254.15.121    <none>        8080/TCP,8081/TCP             14h
kubernetes      10.254.0.1       <none>        443/TCP                       1d
tool            10.254.87.52     <none>        8080/TCP                      44m

这个ingress服务一直处于pending状态,后来查了半天说和是否支持外部负载均衡有关,暂时不理。

准备测试应用

建立PV和PVC,初步设想是准备一个tomcat镜像,然后放上HelloWorld应用

[[email protected] ~]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
    name: pv0003
spec:
    capacity:
      storage: 1Gi
    accessModes:
      - ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    hostPath:
      path: /webapps
[[email protected] ~]# cat pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: tomcatwebapp
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

关于HelloWorld应用

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"  import="java.net.InetAddress"   pageEncoding="utf-8"%>
<html>
 <body> This is a Helloworld test</body>
<%
    System.out.println("this is a session test!");

                     InetAddress addr = InetAddress.getLocalHost();
         out.println("HostAddress="+addr.getHostAddress());
         out.println("HostName="+addr.getHostName());   

         String version = System.getenv("SERVICE_VERSION");
         out.println("SERVICE_VERSION="+version);

    %>
</html>

建立第一个版本的rc-v1.yaml文件

[[email protected] ~]# cat rc-v1.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: helloworld-service
spec:
  replicas: 1
  template:
    metadata:
      labels:
        tomcat-app: "helloworld"
        version: "1"
    spec:
      containers:
      - name: tomcathelloworld
        image: docker.io/tomcat:9.0-jre8
        volumeMounts:
        - mountPath: "/usr/local/tomcat/webapps"
          name: mypd
        ports:
        - containerPort: 8080
        env:
        - name: "SERVICE_VERSION"
          value: "1"
      volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: tomcatwebapp

rc-service文件

[[email protected] ~]# cat rc-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: helloworldsvc
  labels:
    tomcat-app: helloworld
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    name: http
  selector:
    tomcat-app: helloworld

然后通过istioctl kube-inject注入

istioctl kube-inject -f  rc-v1.yaml > rc-v1-istio.yaml

注入后发现,多了一个Sidecar Container

[[email protected] ~]# cat rc-v1-istio.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  name: helloworld-service
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      annotations:
        alpha.istio.io/sidecar: injected
        alpha.istio.io/version: [email protected]16-04-build-12ac793f80be71-0.1.6-dab2033
        pod.beta.kubernetes.io/init-containers: ‘[{"args":["-p","15001","-u","1337"],"image":"docker.io/istio/init:0.1","imagePullPolicy":"IfNotPresent","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":"alpine","imagePullPolicy":"IfNotPresent","name":"enable-core-dump","securityContext":{"privileged":true}}]‘
      creationTimestamp: null
      labels:
        tomcat-app: helloworld
        version: "1"
    spec:
      containers:
      - env:
        - name: SERVICE_VERSION
          value: "1"
        image: docker.io/tomcat:9.0-jre8
        name: tomcathelloworld
        ports:
        - containerPort: 8080
        resources: {}
        volumeMounts:
        - mountPath: /usr/local/tomcat/webapps
          name: mypd
      - args:
        - proxy
        - sidecar
        - -v
        - "2"
        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: docker.io/istio/proxy_debug:0.1
        imagePullPolicy: IfNotPresent
        name: proxy
        resources: {}
        securityContext:
          runAsUser: 1337
      volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: tomcatwebapp
status: {}
---

inject之后又要下载几个镜像 :(

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

同时注意把imagePullPolicy改掉。。。。

再运行

kubectl create -f rc-v1-istio.yaml

此处又遇到无数坑

1.权限问题,需要在/etc/kubernetes/config下打开--allow-privileged,master和节点都需要打开

[[email protected] ~]# cat /etc/kubernetes/config
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
#   kube-apiserver.service
#   kube-controller-manager.service
#   kube-scheduler.service
#   kubelet.service
#   kube-proxy.service
# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=true"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.44.108:8080"

2.发现只要一加上 securityContext:          runAsUser: 1337 POD无论如何都不启动,去掉至少可以启动,一直在desired阶段,因为提示信息有限,比较烧脑,后发现需要修改APIServer中的配置,去掉--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ResourceQuota,ServiceAccount中的SecurityContextDeny

最后kube-apiserver配置为

[[email protected]er ~]# cat /etc/kubernetes/apiserver
###
# kubernetes system config
#
# The following values are used to configure the kube-apiserver
#

# The address on the local server to listen to.
KUBE_API_ADDRESS="--insecure-bind-address=192.168.44.108"

# The port on the local server to listen on.
# KUBE_API_PORT="--port=8080"

# Port minions listen on
# KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.44.108:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,SecurityContextDeny,ResourceQuota"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS="--secure-port=443 --client-ca-file=/srv/kubernetes/ca.crt --tls-cert-file=/srv/kubernetes/server.cert --tls-private-key-file=/srv/kubernetes/server.key"

好了,搞完能顺利启动。

再建立一个rc-v2.yaml

[[email protected] ~]# cat rc-v2.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: helloworld-service-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        tomcat-app: "helloworld"
        version: "2"
    spec:
      containers:
      - name: tomcathelloworld
        image: docker.io/tomcat:9.0-jre8
        volumeMounts:
        - mountPath: "/usr/local/tomcat/webapps"
          name: mypd
        ports:
        - containerPort: 8080
        env:
        - name: "SERVICE_VERSION"
          value: "2"
      volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: tomcatwebapp

tool.yaml,用于在服务网络中进行测试用.其实就是一个shell

[[email protected] ~]# cat tool.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tool
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: tool
        version: "1"
    spec:
      containers:
      - name: tool
        image: docker.io/tomcat:9.0-jre8
        volumeMounts:
        - mountPath: "/usr/local/tomcat/webapps"
          name: mypd
        ports:
        - containerPort: 8080
      volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: tomcatwebapp
---
apiVersion: v1
kind: Service
metadata:
  name: tool
  labels:
    name: tool
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    name: http
  selector:
    name: tool

两个都需要kube-inject并且通过apply进行部署。

最后结果

[[email protected] ~]# kubectl get pods
NAME                                     READY     STATUS    RESTARTS   AGE
helloworld-service-2437162702-x8w05      2/2       Running   0          1h
helloworld-service-v2-2637126738-s7l4s   2/2       Running   0          1h
istio-egress-2869428605-2ftgl            1/1       Running   2          14h
istio-ingress-1286550044-6g3vj           1/1       Running   2          14h
istio-mixer-765485573-23wc6              1/1       Running   2          14h
istio-pilot-1495912787-g5r9s             2/2       Running   4          14h
tool-185907110-fsr04                     2/2       Running   0          1h

流量分配

建立一个路由规则

istioctl create -f default.yaml

[[email protected] ~]# cat default.yaml
type: route-rule
name: helloworld-default
spec:
  destination: helloworldsvc.default.svc.cluster.local
  precedence: 1
  route:
  - tags:
      version: "2"
    weight: 10
  - tags:
      version: "1"
    weight: 90

也就是访问helloworldsvc,有90%的流量会访问到version 1的pod,而10%的流量会访问到version 2的节点

如何判断这个helloworldsvc确实是指到后端两个pod呢,可以通过下面命令确认

[[email protected] ~]# kubectl describe service helloworldsvc
Name:            helloworldsvc
Namespace:        default
Labels:            tomcat-app=helloworld
Annotations:        <none>
Selector:        tomcat-app=helloworld
Type:            ClusterIP
IP:            10.254.145.112
Port:            http    8080/TCP
Endpoints:        10.1.40.3:8080,10.1.40.7:8080
Session Affinity:    None
Events:            <none>

说明service和deployment的配置没有问题

进入到tools

[[email protected] ~]# kubectl exec -it tool-185907110-fsr04 bash
Defaulting container name to tool.
Use ‘kubectl describe pod/tool-185907110-fsr04‘ to see all of the containers in this pod.
[email protected]-185907110-fsr04:/usr/local/tomcat# 

运行

<usr/local/tomcat# curl helloworldsvc:8080/HelloWorld/index.jsp              

<html>
 <body> This is a Helloworld test</body>
HostAddress=10.1.40.3
HostName=helloworld-service-v2-2637126738-s7l4s
SERVICE_VERSION=2

这里又折腾很久,开始怎么都返回connection refuse,在pod中访问localhost通但curl ip不通,后来尝试采用不注入的tool发现没有问题,但并不进行流量控制,最后又切换会inject后的pod后居然发现能够联通了,解决方法是: 把inject的重新create一遍,同时把service又create一遍。

写个shell脚本

echo "for i in {1..100}
do
curl -s helloworldsvc:8080/HelloWorld/index.jsp | grep SERVICE_VERSION
done" > batch.sh

然后运行

然后通过grep统计验证流量分布

[email protected]185907110-fsr04:/usr/local/tomcat# ./batch.sh | grep 2 | wc -l
10
[email protected]-185907110-fsr04:/usr/local/tomcat# ./batch.sh | grep 1 | wc -l
90

未完待续。。。

 
时间: 2024-08-01 04:38:59

Istio微服务架构初试的相关文章

百度“百老汇”架构师深刻透视微服务架构

首先解释这个"百老汇"=百度老年架构师活动中心.......什么是微服务首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务.传统的WEB应用核心分为业务逻辑.适配器以及API或通过UI访问的WEB界面.业务逻辑定义业务流程.业务规则以及领域实体.适配器包括数据库访问组件.消息组件以及访问接口等.一个打车软件的架构图如下: 尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用.例如Java应用程序会被打包成WAR,部署在T

你真的理解微服务架构吗

什么是微服务 首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务. 传统的WEB应用核心分为业务逻辑.适配器以及API或通过UI访问的WEB界面.业务逻辑定义业务流程.业务规则以及领域实体.适配器包括数据库访问组件.消息组件以及访问接口等.一个打车软件的架构图如下: 尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用.例如Java应用程序会被打包成WAR,部署在Tomcat或者Jetty上. 这种单体应用比较适合于小项目,优点是

微服务架构下 Service Mesh 会是闪亮的明天吗?

7月7日,时速云企业级容器 PaaS 技术沙龙第 10 期在上海成功举办,时速云容器架构负责人魏巍为大家详细讲解了 Service Mesh 中代表性的实践方案.并以 Istio 为例详细讲解了 Service Mesh 中的技术关键点,包括 Istio 控制平面.Istio 数据平面等.以下内容根据魏巍分享整编,希望对大家了解 Service Mesh 有所帮助. 魏巍:大家下午好,刚才几位讲师讲了 K8S 的存储.PaaS 在企业的落地实践等,我们接下来要讲的是企业有了 PaaS 平台.并且

微服务架构之「 下一代微服务 Service Mesh 」

Service Mesh 被大家称为下一代的微服务,是微服务领域的一颗新星,被大家讨论的非常多. 我在大家的讨论中,还看到有人说 “目前的微服务架构我都没学会呢,现在又来一个下一代微服务,真学不动了”. 哈哈,没办法,互联网技术就是发展得这么快,这些技术其实也都是由于大家所在的公司业务规模和复杂度变大以后所推动出来的. 最开始 Service Mesh 的概念是由Buoyant公司在2016年提出.然后在随后几年,业内就围绕着 Service Mesh 思想探索出了各种实现,其中包括以 Link

微服务架构问题(Spring Cloud初步认知)

微服务架构问题 四个核心问题 1.服务如何去访问? 2.服务如何进行通信? 3.服务如何治理? 4.服务挂了怎么办? 在Java生态上,构建是基于SpringBoot,协调是基于SpringCloud, 以下所有架构,全部基于以上4个问题进行解决 1.netflix 一站式解决方案 1.Api网关,zuul组件 2.Feign---HttpClient---Http,同步并阻塞 3.服务注册和发现,Eureka 4.熔断机制,Hystrix 18年底,Netflix宣布无限期停止维护. 2.Ap

用友iuap云运维平台支持基于K8s的微服务架构

什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大.更实际的问题.该架构强调的一些准则:单一职责.协议轻量.进程隔离.数据分离.独立部署.按需伸缩. 什么是Kubernetes? Kubernetes是Google开源的容器集群管理系统,其提供应用部署.维护. 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能:

微服务架构

互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因,看看市场上曾经出现的服务架构:EJB.SCA.Dubbo等等,都比微服务先进,都比微服务功能完善,但它们都没有微服务这么深入民心,就是因为他们过于复杂.简单就是高科技,苹果手机据说专门有个团队研究如何能让用户更加简单的操作.大公司都是由小公司发展起来的,如果小公司在开始技术选型时感觉某个框架费时费力就不会选择,而小公司发展到大公司的过程,一般也伴随着系统不断优

深解微服务架构:从过去,到未来|架构(2015-07-15)

随着用户需求个性化.产品生命周期变短,微服务架构是未来软件软件架构朝着灵活性.扩展性.伸缩性以及高可用性发展的必然方向.同时,以Docker为代表的容器虚拟化技术的盛行,将大大降低微服务实施的成本,为微服务落地以及大规模使用提供了坚实的基础和保障. 微服务的诞生   微服务架构(Microservice Architect)是一种架构模式,它提倡将单块架构的应用划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟

.NET Core 实践:微服务架构的优点

微服务现在已经是各种互联网应用首选的云架构组件,无论是 BAT 还是 滴滴.美团 ,微服务都是重要的一环. 相对于微服务,传统应用架构有以下缺点: 1. 业务代码混杂,团队成员职责边界不清,团队协作体验不佳,开发效率低下. 传统应用架构中,各个业务模块代码都存在于同一个应用当中,各个业务模块之间交互逻辑复杂,代码统统混在一起,难免出现要去别人代码里改代码的情况 2. 代码耦合度高,日趋臃肿,难以重构,维护成本越来越高. 感受过被F12支配的恐惧吗? 3. 容错能力弱,单点故障引发全局崩溃. 4.