Istio 1.5部署,回归单体

前言

Istio 架构又换了,从 1.5 开始,把控制平面的所有组件组合并成一个单体结构叫 istiod,对于运维部署来说省去很大麻烦。Mixer 组件被移除,新版本的 HTTP 遥测默认基于 in-proxy Stats filter,同时可使用 WebAssembly 开发 in-proxy 扩展。

下面展示 Istio 架构图前世今生

前世

前世

今生

今生

环境要求 [1]

Kubernetes 版本支持

  • 按官方话来说,Istio 1.5 已在以下 Kubernetes 发布版本测试过:1.14, 1.15, 1.16。

Kubernetes Pod 和 Service 要求

作为 Istio 服务网格中的一部分,Kubernetes 集群中的 Pod 和 Service 必须满足以下要求:

  • 命名的服务端口: Service 的端口必须命名。端口名键值对必须按以下格式:name: <protocol>[-<suffix>]。更多说明请参看协议选择
  • Service 关联: 每个 Pod 必须至少属于一个 Kubernetes Service,不管这个 Pod 是否对外暴露端口。如果一个 Pod 同时属于多个 Kubernetes Service, 那么这些 Service 不能同时在一个端口号上使用不同的协议(比如:HTTP 和 TCP)。
  • 带有 app 和 version 标签(label) 的 Deployment: 我们建议显式地给 Deployment 加上 app 和 version 标签。给使用 Kubernetes Deployment 部署的 Pod 部署配置中增加这些标签,可以给 Istio 收集的指标和遥测信息中增加上下文信息。
    • app 标签:每个部署配置应该有一个不同的 app 标签并且该标签的值应该有一定意义。app label 用于在分布式追踪中添加上下文信息。
    • version 标签:这个标签用于在特定方式部署的应用中表示版本。
  • 应用 UID: 确保你的 Pod 不会以用户 ID(UID)为 1337 的用户运行应用。
  • NET_ADMIN 功能: 如果你的集群执行 Pod 安全策略,必须给 Pod 配置 NET_ADMIN 功能。如果你使用 Istio CNI 插件 可以不配置。要了解更多 NET_ADMIN 功能的知识,请查看所需的 Pod 功能

下载 Istio 1.15 版本

注意:Linux 操作系统

1.下载 Istio 1.15.1 安装包

$ cd /usr/local/src/
$ wget https://github.com/istio/istio/releases/download/1.5.1/istio-1.5.1-linux.tar.gz
$ tar xf istio-1.5.1-linux.tar.gz

2.切换 Istio 包所在目录

$ cd istio-1.5.1

安装目录包含如下内容:

  • install/kubernetes 目录下,有 Kubernetes 相关的 YAML 安装文件
  • samples/ 目录下,有示例应用程序
  • bin/ 目录下,包含 istioctl 的客户端文件。istioctl 工具用于手动注入 Envoy sidecar 代理。

3.将 istioctl 命令添加到环境变量中

# 在 ~/.bashrc 中添加一行
$ vim ~/.bashrc

PATH="$PATH:/usr/local/src/istio-1.5.1/bin"

# 应用生效
$ source ~/.bashrc

4.配置 istioctl 参数自动补全

$ vim ~/.bashrc

source /usr/local/src/istio-1.5.1/tools/istioctl.bash

# 应用生效
$ source ~/.bashrc

部署

istioctl 提供了多种安装配置文件,它们之间差异:

image

安装配置提要:

  • default 基础上开启 Grafanaistio-tracingkiali 附加组件
  • cni 配置关闭,但相关参数已配置
  • 全局禁用 TLS
  • Grafanaistio-tracingkialiprometheus 通过 istio-ingressgateway 暴露
  • 排除 192.168.16.0/20,192.168.32.0/20 k8s svc 和 k8s pod 两个网段
  • Ingress Gatewaypilot 开启2个pod(默认1个pod)
  • Pod 绑定节点标签 zone: sz
  • Ingress Gateway 使用 HostNetwork 模式暴露
  • overlays 字段用来修改对应组件的各个资源对象的 manifest
  • 调整 PDB 配置
  • 安装前需要创建 grafanakiali secret,用于登陆
  • Ingress Gateway 从安全的角度来考虑,不应该暴露那些不必要的端口,对于 Ingress Gateway 来说,只需要暴露 HTTP、HTTPS 和 metrics 端口就够了

配置 grafanakiali secret

创建 istio-system namespaces

$ kubectl create ns istio-system

配置 kiali secret

$ KIALI_USERNAME=$(echo -n 'admin' | base64)
$ KIALI_PASSPHRASE=$(echo -n 'admin' | base64)
$ NAMESPACE=istio-system

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: $NAMESPACE
  labels:
    app: kiali
type: Opaque
data:
  username: $KIALI_USERNAME
  passphrase: $KIALI_PASSPHRASE
EOF

配置 grafana secret

$ GRAFANA_USERNAME=$(echo -n 'admin' | base64)
$ GRAFANA_PASSPHRASE=$(echo -n 'admin' | base64)
$ NAMESPACE=istio-system

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: grafana
  namespace: $NAMESPACE
  labels:
    app: grafana
type: Opaque
data:
  username: $GRAFANA_USERNAME
  passphrase: $GRAFANA_PASSPHRASE
EOF

推荐使用 Operator 方式进行部署,这里使用 default 配置部署(default 也是用于生产环境)

创建 Istio Operator yaml 配置

$ vim istio-1.5.1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-1.5.1-controlplane
spec:
  hub: docker.io/istio
  profile: default # 使用默认配置
  tag: 1.5.1

  addonComponents:
    grafana:
      enabled: true # 默认 false
      k8s:
        replicaCount: 1
    kiali:
      enabled: true # 默认 false
      k8s:
        replicaCount: 1
    prometheus:
      enabled: true # 默认 true
      k8s:
        replicaCount: 1
    tracing:
      enabled: true # 默认 false

  values:
    global:
      imagePullPolicy: IfNotPresent # 镜像拉取策略
      mtls:
        enabled: false # 全局禁用安全性
      defaultResources: # 声明默认容器资源
        requests:
          cpu: 30m
          memory: 50Mi
      proxy:
        accessLogFile: "/dev/stdout"
        includeIPRanges: 192.168.16.0/20,192.168.32.0/20
        autoInject: disabled # 是否开启自动注入功能,取值enabled则该pods只要没有被注解为sidecar.istio.io/inject: "false",就会自动注入。如果取值为disabled,则需要为pod设置注解sidecar.istio.io/inject: "true"才会进行注入
        clusterDomain: cluster.local # 集群DNS域
        resources:
          requests:
            cpu: 30m # 默认 100m
            memory: 50Mi # 默认 128Mi
          limits:
            cpu: 400m # 默认 2000m
            memory: 500Mi # 默认 1024Mi
      proxy_init:
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 30m # 默认 10m
            memory: 50Mi # 默认 10Mi
    sidecarInjectorWebhook:
      enableNamespacesByDefault: false # 变量为true,就会为所有命名空间开启自动注入功能。如果赋值为false,则只有标签为istio-injection的命名空间才会开启自动注入功能
      rewriteAppHTTPProbe: false # 如果是 true,webhook 或 istioctl injector 将为活性健康检查重写 PodSpec 以重定向请求到 sidecar。这使得即使在启用 mTLS 时,活性检查也可以工作
    cni:
      excludeNamespaces: # 开启cni功能时,下面namespaces被排除
        - istio-system
        - kube-system
        - monitoring
        - kube-node-lease
        - kube-public
        - kubernetes-dashboard
        - ingress-nginx
      logLevel: info
    pilot:
      autoscaleEnabled: true
      autoscaleMax: 5
      autoscaleMin: 1
      cpu:
        targetAverageUtilization: 80
    prometheus:
      contextPath: /prometheus # 默认 /prometheus
      hub: docker.io/prom
      resources: # 默认无限制
        requests:
          cpu: 30m
          memory: 50Mi
        limits:
          cpu: 500m
          memory: 1024Mi
      nodeSelector:
        zone: "sz"
      retention: 7d # 默认 6h
      scrapeInterval: 15s
      security:
        enabled: true
      tag: v2.15.1
    grafana:
      contextPath: /grafana  # 默认 /grafana
      accessMode: ReadWriteMany
      image:
        repository: grafana/grafana
        tag: 6.5.2
      resources:
        requests:
          cpu: 30m
          memory: 50Mi
        limits:
          cpu: 300m
          memory: 500Mi
      nodeSelector:
        zone: "sz"
      security: # 默认关闭认证
        enabled: true # 默认 false
        passphraseKey: passphrase # 首先创建 grafana secret
        secretName: grafana
        usernameKey: username # 首先创建 grafana secret
    kiali:
      contextPath: /kiali  # 默认 /kiali
      createDemoSecret: false
      dashboard:
        grafanaInClusterURL: http://grafana.example.com # 默认 http://grafana:3000
        jaegerInClusterURL: http://tracing.example.com # 默认 http://tracing/jaeger
        passphraseKey: passphrase # 首先创建 kiali secret
        secretName: kiali
        usernameKey: username # 首先创建 kiali secret
        viewOnlyMode: false
      hub: kiali  # 默认 quay.io/kiali
      resources:
        limits:
          cpu: 300m
          memory: 900Mi
        requests:
          cpu: 30m
          memory: 50Mi
      nodeSelector:
        zone: "sz"
      tag: v1.14
    tracing:
      provider: jaeger # 选择跟踪服务
      jaeger:
        accessMode: ReadWriteMany
        hub: docker.io/jaegertracing
        tag: "1.16"
        resources:
          limits:
            cpu: 300m
            memory: 900Mi
          requests:
            cpu: 30m
            memory: 100Mi
      nodeSelector:
        zone: "sz"
      opencensus:
        exporters:
          stackdriver:
            enable_tracing: true
        hub: docker.io/omnition
        resources:
          limits:
            cpu: "1"
            memory: 2Gi
          requests:
            cpu: 100m # 默认 200m
            memory: 300Mi # 默认 400Mi
        tag: 0.1.9
      zipkin:
        hub: docker.io/openzipkin
        javaOptsHeap: 700
        maxSpans: 500000
        node:
          cpus: 2
        resources:
          limits:
            cpu: 300m
            memory: 900Mi
          requests:
            cpu: 30m # 默认 150m
            memory: 100Mi # 默认 900Mi
        tag: 2.14.2

  components:
    cni:
      enabled: false # 默认不启用cni功能
    ingressGateways:
    - enabled: true
      k8s:
        hpaSpec:
          minReplicas: 2 # 默认最小为1个pod
        service:
          type: ClusterIP # 默认类型为 LoadBalancer
        resources:
          limits:
            cpu: 1000m # 默认 2000m
            memory: 1024Mi # 默认 1024Mi
          requests:
            cpu: 100m # 默认 100m
            memory: 128Mi # 默认 128Mi
        strategy:
          rollingUpdate:
            maxSurge: 100%
            maxUnavailable: 25%
        nodeSelector:
          zone: "sz"
        overlays:
        - apiVersion: apps/v1 # 使用 hostNetwork 模式暴露 ingressGateways
          kind: Deployment
          name: istio-ingressgateway
          patches:
          - path: spec.template.spec.hostNetwork
            value:
              true
          - path: spec.template.spec.dnsPolicy
            value:
              ClusterFirstWithHostNet
        - apiVersion: v1 # 从安全的角度来考虑,不应该暴露那些不必要的端口,对于 Ingress Gateway 来说,只需要暴露 HTTP、HTTPS 和 metrics 端口就够了
          kind: Service
          name: istio-ingressgateway
          patches:
          - path: spec.ports
            value:
            - name: status-port
              port: 15020
              targetPort: 15020
            - name: http2
              port: 80
              targetPort: 80
            - name: https
              port: 443
              targetPort: 443
    pilot:
      enabled: true
      k8s:
        hpaSpec:
          minReplicas: 2 # 默认最小为1个pod
        resources:
          limits:
            cpu: 1000m # 默认不限制
            memory: 1024Mi # 默认不限制
          requests:
            cpu: 100m # 默认 500m
            memory: 300Mi # 默认 2048Mi
        strategy:
          rollingUpdate:
            maxSurge: 100%
            maxUnavailable: 25%
        nodeSelector:
          zone: "sz"
        overlays: # 调整PDB配置
        - apiVersion: policy/v1beta1
          kind: PodDisruptionBudget
          name: istiod
          patches:
          - path: spec.selector.matchLabels
            value:
              app: istiod
              istio: pilot

部署 Istio

$ istioctl manifest apply -f istio-1.5.1.yaml

设置 Grafanaistio-tracingkialiprometheus 通过 istio-ingressgateway 暴露

$ vim istio-addon-components-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-addon-components-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "grafana.example.com"
    - "tracing.example.com"
    - "kiali.example.com"
    - "prometheus.example.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istio-grafana
  namespace: istio-system
spec:
  hosts:
  - "grafana.example.com"
  gateways:
  - istio-addon-components-gateway
  http:
  - route:
    - destination:
        host: grafana
        port:
          number: 3000
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istio-tracing
  namespace: istio-system
spec:
  hosts:
  - "tracing.example.com"
  gateways:
  - istio-addon-components-gateway
  http:
  - route:
    - destination:
        host: tracing
        port:
          number: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istio-kiali
  namespace: istio-system
spec:
  hosts:
  - "kiali.example.com"
  gateways:
  - istio-addon-components-gateway
  http:
  - route:
    - destination:
        host: kiali
        port:
          number: 20001
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istio-prometheus
  namespace: istio-system
spec:
  hosts:
  - "prometheus.example.com"
  gateways:
  - istio-addon-components-gateway
  http:
  - route:
    - destination:
        host: prometheus
        port:
          number: 9090

部署 Grafanaistio-tracingkialiprometheus 服务 Gateway 和 VirtualService

$ kubectl apply -f istio-addon-components-gateway.yaml

部署完成后,查看各组件状态:

$ kubectl get svc,pod,hpa,pdb,Gateway,VirtualService -n istio-system
image

参考链接

本文由 YP小站 发布!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容