service mesh istio-0.8安装测试

作者: 647f379ea944 | 来源:发表于2018-08-12 09:26 被阅读0次

    简介

    istio是一个service mesh开源实现,由Google/IBM/Lyft共同开发。与之类似的还有conduit,但是功能不如istio丰富稳定。架构图如下:

    image

    istio-0.8版本是第一个长期支持版本,相对于之前的版本配置改动较大。

    安装

    # 去下面的地址下载压缩包
    # https://github.com/istio/istio/releases
    wget https://github.com/istio/istio/releases/download/0.8.0/istio-0.8.0-linux.tar.gz
    tar xf istio-0.8.0-linux.tar.gz
    
    # 使用官方的安装脚本安装
    curl -L https://git.io/getLatestIstio | sh -
    
    # 安装配置环境变量
    mv istio-0.8.0 /usr/local/
    ln -sv /usr/local/istio-0.8.0 /usr/local/istio
    echo 'export PATH=/usr/local/istio/bin:$PATH' > /etc/profile.d/istio.sh
    source /etc/profile.d/istio.sh
    istioctl version
    
    # 如果环境不是云环境,不支持LoadBalancer
    # 作如下修改,使得 ingressgateway 监听在80和443端口
    # 修改使用主机端口映射
    # 使用此修改版本之后,每台机器只能运行单个实例
    # 大概在2661行左右
    cd /usr/local/istio
    cp install/kubernetes/istio-demo.yaml install/kubernetes/istio-demo.yaml.ori
    vim install/kubernetes/istio-demo.yaml
    ...
    # Source: istio/charts/ingressgateway/templates/deployment.yaml
    apiVersion: extensions/v1beta1
    # kind: Deployment
    # 使用DaemonSet部署方式
    kind: DaemonSet
    metadata:
      name: istio-ingressgateway
      namespace: istio-system
      labels:
        app: ingressgateway
        chart: ingressgateway-0.8.0
        release: RELEASE-NAME
        heritage: Tiller
        istio: ingressgateway
    spec:
      # DaemonSet不支持replicas
      # replicas: 
      template:
        metadata:
          labels:
            istio: ingressgateway
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          serviceAccountName: istio-ingressgateway-service-account
          containers:
            - name: ingressgateway
              image: "docker.io/istio/proxyv2:0.8.0"
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 80
                  #主机80端口映射
                  hostPort: 80
                - containerPort: 443
                  #主机443端口映射
                  hostPort: 443
                - containerPort: 31400
                  #主机443端口映射
                  hostPort: 31400
    ...
    
    # 由于镜像问题,提前拉取镜像
    # 在所有节点上执行如下命令输出的命令
    # 可能会失败,需要多次执行
    image=$(grep 'quay.io/coreos/hyperkube' install/kubernetes/istio-demo.yaml | head -1 | awk '{print $2}' | tr -d '"')
    echo "docker pull $image"
    
    # 以下两种选择一种安装方式
    # 安装不使用认证(不使用tls)
    kubectl apply -f install/kubernetes/istio-demo.yaml
    
    # 安装使用认证(使用tls)
    kubectl apply -f install/kubernetes/istio-demo-auth.yaml
    
    # 查看状态
    kubectl get svc -n istio-system
    kubectl get pods -n istio-system
    
    # 访问测试
    nodeName=$(kubectl get no | grep '<none>' | head -1 | awk '{print $1}')
    nodeIP=$(ping -c 1 $nodeName | grep PING | awk '{print $3}' | tr -d '()')
    echo "curl -I http://$nodeIP"
    

    注意

    istio-0.8.0 默认已经开启了自动注入功能以及其他日志监控和追踪的相关组件如

    • istio-tracing
    • istio-telemetry
    • grafana
    • prometheus
    • servicegraph

    启用自动注入 sidecar

    • 不开启自动注入部署应用需要使用如下方式的命令

      kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)

    • 开启自动注入后,使用正常命令即可部署应用

      kubectl apply -f samples/bookinfo/kube/bookinfo.yaml

    # istio-0.8.0默认已经开启了自动注入功能
    
    # k8s 1.9 及之后的版本才能使用自动注入功能
    # 查看是否支持
    kubectl api-versions | grep admissionregistration
    
    # 除了要满足以上条件外还需要检查kube-apiserver启动的参数
    # k8s 1.9 版本要确保 --admission-control 里有 MutatingAdmissionWebhook,ValidatingAdmissionWebhook
    # k8s 1.9 之后的版本要确保 --enable-admission-plugins 里有MutatingAdmissionWebhook,ValidatingAdmissionWebhook
    
    # 测试自动注入
    # 创建
    kubectl apply -f samples/sleep/sleep.yaml 
    kubectl get deployment -o wide
    kubectl get pod
    
    # 设置 default namespace 开启自动注入
    kubectl label namespace default istio-injection=enabled
    kubectl get namespace -L istio-injection
    
    # 删除创建的pod,等待重建
    kubectl delete pod $(kubectl get pod | grep sleep | cut -d ' ' -f 1)
    
    # 查看重建后的pod
    # 查看是否有istio-proxy容器
    kubectl get pod
    kubectl describe pod $(kubectl get pod | grep sleep | cut -d ' ' -f 1)
    
    # 清理
    kubectl delete -f samples/sleep/sleep.yaml 
    
    # 关闭自动注入
    kubectl label namespace default istio-injection-
    
    # 关闭部分pod的自动注入功能
    ...
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
    ...
    

    部署官方测试用例

    # 启动(未开启自动注入)
    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)
    
    # 启动(已开启自动注入)
    kubectl apply -f samples/bookinfo/kube/bookinfo.yaml
    
    # 创建gateway
    istioctl create -f samples/bookinfo/routing/bookinfo-gateway.yaml
    
    # 查看状态
    kubectl get services
    kubectl get pods
    istioctl get gateway
    

    访问测试

    # 命令行访问测试
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}')
    NODE_NAME=$(kubectl get no | grep '<none>' | head -1 | awk '{print $1}')
    NODE_IP=$(ping -c 1 $NODE_NAME | grep PING | awk '{print $3}' | tr -d '()')
    export GATEWAY_URL=$NODE_IP:$INGRESS_PORT
    echo $GATEWAY_URL
    
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
    # 浏览器访问测试
    echo "http://${GATEWAY_URL}/productpage"
    
    # 使用daemonset方式部署可以使用如下方式访问
    # 11.11.11.112为其中一个node节点的ip
    curl http://11.11.11.112/productpage
    

    清理

    # 清理官方用例
    samples/bookinfo/kube/cleanup.sh
    
    # 清理istio
    kubectl delete -f install/kubernetes/istio-demo.yaml
    # kubectl delete -f install/kubernetes/istio-demo-auth.yaml
    

    参考文档

    相关文章

      网友评论

        本文标题:service mesh istio-0.8安装测试

        本文链接:https://www.haomeiwen.com/subject/gstsbftx.html