zoukankan      html  css  js  c++  java
  • 服务网格Istio入门-详细记录Kubernetes安装Istio并使用

    我最新最全的文章都在 南瓜慢说 www.pkslow.com ,文章更新也只在官网,欢迎大家来喝茶~~

    1 服务网格Istio

    Istio是开源的Service Mesh实现,一般用于Kubernetes集群容器中的连接、监控和保护。它的核心特性有:

    • 流量管理
      • 通过简单配置实现服务之间的流量;
      • 简化服务级属性如熔断、超时、重试;
      • 支持A/B测试、金丝雀发布等。
    • 安全
      • 通信层面的安全控制;
      • 开发人员只需要专注于应用程序开发。
    • 可观察性
      • Metrics;
      • Logging;
      • Tracing。
    • 平台支持
      • Kubernetes;
      • 各种云平台。

    Istio的架构分为数据平台和控制平面,数据平面通过Sidecar代理工作,如下:

    2 Kubernetes安装istio

    2.1 创建服务器

    为了避免出现镜像下载慢或无法下载的问题,我们使用阿里云香港的服务器来做示例。为了省钱,我使用的是抢占式实例,8CPU 16GB内存,大概是0.28/小时,用完即删就可以了。

    • CPU:8核

    • 内存:16GB

    • 系统:Ubuntu 20.04 64位

    • 价格:0.28/时

    • 分配公网IP:是

    • 带宽计费模式:按使用流量

    • 带宽峰值:最大

    测试登陆如下:

    ssh root@xx.xxx.xxx.xxx
    
    $ free -h
                  total        used        free      shared  buff/cache   available
    Mem:           15Gi       153Mi        15Gi       2.0Mi       325Mi        15Gi
    

    正常连接,可以开始使用了。

    2.2 安装Kubernetes

    我这里不打算创建一个Kubernetes集群,所以只用了一台机,如果有兴趣的可查看之间的文章《详细记录用kubeadm在Ubuntu上安装Kubernetes集群》。

    这里通过minikube来启动kubernetes,我们一步一步来安装吧:

    # 必要的更新
    $ apt-get update -y
    $ apt-get upgrade -y
    
    # 下载kubectl命令行工具
    $ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    
    # 执行权限
    $ chmod a+x kubectl
    $ mv ./kubectl /usr/local/bin/kubectl
    
    # 安装Docker
    $ apt-get install -y docker.io
    
    # 检测Docker安装情况
    $ docker --version
    Docker version 20.10.7, build 20.10.7-0ubuntu1~20.04.1
    
    # 下载minikube
    $ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    
    # 执行权限
    $ chmod +x minikube
    $ mv minikube /usr/local/bin
    
    # 安装conntrack依赖
    $ apt-get install -y conntrack
    
    # 启动kubernetes,需要等待一小段时间,因为要下载镜像,启动kubernetes
    $ minikube start --driver=none
    
    # 检测启动成功
    kubectl version
    Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
    Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:53:14Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}
    

    我们看到对应的Pod也起来了:

    2.3 安装istio

    安装完Istio后,我们就可以开始安装Istio了,过程如下:

    # 下载安装包:
    $ curl -L https://istio.io/downloadIstio | sh -
    
    # 添加到Path
    $ export PATH="$PATH:/root/istio-1.10.3/bin"
    
    # 检测是否可以正常安装
    $ istioctl x precheck
    ✔ No issues found when checking the cluster. Istio is safe to install or upgrade!
    
    # 执行安装
    $ istioctl install
    

    安装成功后,会出现如下界面:

    查看命名空间,会多出一个istio-system:

    3 使用istio

    我们通过安装官方的示例来看如何使用。先要给对应的命令空间加标签,这样istio才会识别,才会注入代理:

    $ kubectl label namespace default istio-injection=enabled
    

    接着我们安装对应的示例代码:

    kubectl apply -f istio-1.10.3/samples/bookinfo/platform/kube/bookinfo.yaml
    

    可以看到所有应用都起来了,而且每个Pod是有两个Container的:

    为了更好地监控我们的应用,我们来添加一些组件或插件:

    $ kubectl apply -f istio-1.10.3/samples/addons
    

    这样,我们就多了许多新的组件,如Grafana、Jaeger、Kiali、Prometheus等:

    我们以Kiali以例,暴露服务出来,来看看它给我们带来了什么:

    # 添加NodePort
    $ kubectl expose deployment kiali --type=NodePort --name=kiali-nodeport -n istio-system
    
    # 找到对应的端口
    kubectl get service -n istio-system | grep kiali
    
    # 在其它外部访问,注意IP为服务器的公网IP
    $ curl 47.242.151.110:31015
    <a href="/kiali/">Found</a>.
    

    打开:http://47.242.151.110:31015/kiali ,不要用Chrome打开,对于非https的网页,Chrome会打开失败。我用Safari可以正常打开:

    我们来模拟一些请求:

    kubectl get svc
    NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   10.101.63.99     <none>        9080/TCP   77m
    kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    132m
    productpage   ClusterIP   10.110.126.60    <none>        9080/TCP   77m
    ratings       ClusterIP   10.104.252.123   <none>        9080/TCP   77m
    reviews       ClusterIP   10.104.41.104    <none>        9080/TCP   77m
    
    # 循环发送请求
    for i in $(seq 1 100); do curl -s -o /dev/null "http://10.101.63.99:9080"; done
    for i in $(seq 1 100); do curl -s -o /dev/null "http://10.110.126.60:9080"; done
    for i in $(seq 1 100); do curl -s -o /dev/null "http://10.104.252.123:9080"; done
    for i in $(seq 1 100); do curl -s -o /dev/null "http://10.104.41.104:9080"; done
    
    

    查看Graph,就可以看到一些请求的线,红色是失败的,绿色是健康正常的:

    当然还有其它更多的功能,这里就不一一讲解了。

    4 总结

    这篇为入门体验,以后更多细节我们再一一道来吧。

  • 相关阅读:
    kubernetes 节点数据彻底清理脚本
    多es 集群数据迁移方案
    .Net Framework各版本微软技术支持及到期日期
    etcd raft 处理流程图系列3-wal的读写
    etcd raft 处理流程图系列2-transport
    etcd raft 处理流程图系列1-raftexample
    一种分布式预写日志系统
    自适应软件缓存管理
    require/import路径中的叹号是什么?
    理解原型链
  • 原文地址:https://www.cnblogs.com/larrydpk/p/15116902.html
Copyright © 2011-2022 走看看