在CSDN学Golang云原生(服务网格istio)

一,在Kubernetes上部署istio

在Kubernetes上部署istio,可以按照以下步骤进行:

  1. 安装Istio

使用以下命令从Istio官网下载最新版本的Istio:

curl -L https://istio.io/downloadIstio | ISTIO_VERSION= sh -

其中,是要安装的Istio版本号。

将下载的文件解压到本地目录:

tar xzf istio--linux-amd64.tar.gz

进入解压后的目录:

cd istio-

然后,安装Istio CRDs(Custom Resource Definitions):

kubectl apply -f manifests/crds.yaml

最后,安装Istio组件和示例应用程序:

kubectl apply -f manifests/
  1. 部署应用程序

将Golang云原生应用程序打包成Docker镜像,并上传至Docker Hub等容器镜像仓库。然后,在Kubernetes中创建Deployment和Service资源对象来部署该应用程序。

例如,可以使用类似以下的YAML配置文件来创建Deployment和Service资源对象:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3 # 副本数为3个,可根据实际情况调整。
  selector:
    matchLabels:
      app: myapp-label # 标签名称为myapp-label。
  template:
    metadata:
      labels:
        app: myapp-label # 标签名称为myapp-label。
    spec:
      containers:
        - name: myapp-container
          image: :
          ports:
            - containerPort: 8080 # 应用程序监听的端口号为8080。

---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp-label # 标签名称为myapp-label。
  ports:
    - name: http-port
      port: 80 # 访问服务时使用的端口号。
      targetPort: 8080 # 实际转发到容器中的端口号是8080。

其中,分别是应用程序打包成Docker镜像后的名称和标签。

  1. 部署istio sidecar

在部署Istio sidecar之前,需要将应用程序所在的命名空间进行标记。例如:

kubectl label namespace  istio-injection=enabled

其中,是应用程序所在的命名空间。

然后,在部署应用程序时,Istio sidecar会自动注入到该应用程序中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  template:
    metadata:
      labels:
        app: myapp-label # 标签名称为myapp-label。
    spec:
      containers:
        - name: myapp-container
          image: :
          ports:
            - containerPort: 8080 # 应用程序监听的端口号为8080。
  1. 配置Istio流量管理

在Kubernetes中,可以通过创建Gateway和VirtualService资源对象来配置Istio流量管理。例如:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myapp-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - "myapp.example.com" # 访问该应用程序使用的域名或IP地址。
      port:
        name: http-port
        number: 80 # 访问服务时使用的端口号。

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp-virtualservice
spec:
  hosts:
    - "myapp.example.com" # 访问该应用程序使用的域名或IP地址。
  gateways:
    - myapp-gateway # 关联上述定义的Gateway对象。
  http:
    - route:
        - destination:
            host: myapp-service # 关联上述定义的Service对象。
            port:
              number: 80 # 实际访问容器中应用程序所使用的端口号是80。

其中,myapp.example.com是访问该应用程序使用的域名或IP地址。

  1. 验证部署结果

完成以上步骤后,即可访问部署好的Golang云原生应用程序,并通过Istio Dashboard等工具查看其监控信息。

二,istio流量管理实践

使用Istio进行流量管理,可以按照以下步骤进行:

  1. 部署示例应用程序

在Kubernetes中部署示例应用程序。例如,可以使用类似以下的YAML配置文件来创建Deployment和Service资源对象:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3 # 副本数为3个,可根据实际情况调整。
  selector:
    matchLabels:
      app: myapp-label # 标签名称为myapp-label。
  template:
    metadata:
      labels:
        app: myapp-label # 标签名称为myapp-label。
    spec:
      containers:
        - name: myapp-container
          image: :
          ports:
            - containerPort: 8080 # 应用程序监听的端口号为8080。

---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp-label # 标签名称为myapp-label。
  ports:
    - name: http-port
      port: 80 # 访问服务时使用的端口号。
      targetPort: 8080 # 实际转发到容器中的端口号是8080。

其中,分别是应用程序打包成Docker镜像后的名称和标签。

  1. 创建Gateway和VirtualService资源对象

创建Gateway和VirtualService资源对象来配置Istio流量管理。例如:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myapp-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - "myapp.example.com" # 访问该应用程序使用的域名或IP地址。
      port:
        name: http-port
        number: 80 # 访问服务时使用的端口号。

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp-virtualservice
spec:
  hosts:
    - "myapp.example.com" # 访问该应用程序使用的域名或IP地址。
  gateways:
    - myapp-gateway # 关联上述定义的Gateway对象。
  http:
    - route:
        - destination:
            host: myapp-service # 关联上述定义的Service对象。
            port:
              number: 80 # 实际访问容器中应用程序所使用的端口号是80。

其中,myapp.example.com是访问该应用程序使用的域名或IP地址。

  1. 配置Istio流量规则

配置Istio流量规则来控制如何将流量路由到不同版本、环境和地理位置等目标。例如:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: myapp-destinationrule
spec:
  host: myapp-service # 目标主机为myapp-service Service对象名称。
  subsets:

    - name: v1-subset # 将所有标签为version=v1的Pod分配给v1-subset。
      labels:
        version: v1

    - name: v2-subset # 将所有标签为version=v2的Pod分配给v2-subset。
      labels:
        version: v2

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp-virtualservice
spec:
  hosts:
    - "myapp.example.com" # 访问该应用程序使用的域名或IP地址。
  gateways:
    - myapp-gateway # 关联上述定义的Gateway对象。
  http:
    - route:

        - destination:
            host: myapp-service # 关联上述定义的Service对象。

          weight: 100 # 所有流量都路由到v1版本,权重为100%。

        - destination:
            host: myapp-service # 关联上述定义的Service对象。
            subset: v2-subset

          weight: 0 # 所有流量都不路由到v2版本,权重为0%。

其中,DestinationRule用于配置目标主机和子集信息,而VirtualService则用于配置如何将流量路由到这些目标主机和子集。在以上示例中,将所有流量都路由到v1版本,并且不进行负载均衡;而对于v2版本,则将其权重设置为0%,表示不进行任何访问。

  1. 验证部署结果

完成以上步骤后,即可验证Istio流量管理是否生效。可以通过Istio Dashboard等工具查看监控信息,或者直接访问应用程序的域名或IP地址进行验证。

Golang云原生学习路线图、教学视频、文档资料、面试题资料(资料包括C/C++、K8s、golang项目实战、gRPC、Docker、DevOps等)免费分享 有需要的可以加qun:793221798领取

三,istio安全配置实践

使用Istio进行安全配置,可以按照以下步骤进行:

  1. 部署示例应用程序

在Kubernetes中部署示例应用程序。例如,可以使用类似以下的YAML配置文件来创建Deployment和Service资源对象:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3 # 副本数为3个,可根据实际情况调整。
  selector:
    matchLabels:
      app: myapp-label # 标签名称为myapp-label。
  template:
    metadata:
      labels:
        app: myapp-label # 标签名称为myapp-label。
    spec:
      containers:
        - name: myapp-container
          image: :
          ports:
            - containerPort: 8080 # 应用程序监听的端口号为8080。

---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp-label # 标签名称为myapp-label。
  ports:
    - name: http-port
      port: 80 # 访问服务时使用的端口号。
      targetPort: 8080 # 实际转发到容器中的端口号是8080。

其中,分别是应用程序打包成Docker镜像后的名称和标签。

  1. 创建Gateway和VirtualService资源对象

创建Gateway和VirtualService资源对象来配置Istio流量管理。例如:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myapp-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - "myapp.example.com" # 访问该应用程序使用的域名或IP地址。
      port:
        name: http-port
        number: 80 # 访问服务时使用的端口号。

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp-virtualservice
spec:
  hosts:
    - "myapp.example.com" # 访问该应用程序使用的域名或IP地址。
  gateways:
    - myapp-gateway # 关联上述定义的Gateway对象。
  http:
    - route:
        - destination:
            host: myapp-service # 关联上述定义的Service对象。
            port:
              number: 80 # 实际访问容器中应用程序所使用的端口号是80。

其中,myapp.example.com是访问该应用程序使用的域名或IP地址。

  1. 配置Istio安全规则

配置Istio安全规则来保护和控制对应用程序进行访问。例如:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: myapp-authorizationpolicy
spec:

  selector:

    matchLabels:

      app: myapp-label

      version: v1

      env: prod

  action : ALLOW

其中,AuthorizationPolicy可以设置在集群范围、命名空间范围或者单个服务范围内,并且可以根据标签选择器匹配目标对象。在以上示例中,对于标签为app=myapp-labelversion=v1env=prod的Pod进行访问控制,允许所有操作。

  1. 验证部署结果

完成以上步骤后,即可验证Istio安全配置是否生效。可以通过Istio Dashboard等工具查看监控信息,或者直接访问应用程序的域名或IP地址进行验证。注意,在实际生产环境中,需要根据实际情况调整安全策略和权限规则。

四,使用Prometheus进行生产规模的监控

使用Prometheus进行生产规模的监控,可以按照以下步骤进行:

  1. 安装和配置Prometheus

安装并配置Prometheus服务器。例如,在Kubernetes中部署一个Prometheus实例,并将其配置为收集指定名称空间中所有Pod的指标数据:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus-server
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin # 授予Prometheus访问全部资源的权限。
subjects:
- kind: ServiceAccount
  name: prometheus-server # 将Prometheus服务帐户与角色绑定。
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: prometheus-deployment
spec:
  replicas: 1 # 可根据实际情况调整副本数。
  selector:
    matchLabels:
      app: prometheus-server # 指定应用程序标签为prometheus-server。
  template:
    metadata:
      labels:
        app: prometheus-server # 指定应用程序标签为prometheus-server。
    spec:

      serviceAccountName : prometheus-server

      containers:

        - name : prometheus

          image : quay.io/prometheus/prometheu

          args :

            - "--config.file=/etc/prometheu/prometheu.yml"

          ports :

            - containerPort :9090

          volumeMounts :

            - mountPath : /etc/prometheus

              name : config-volume

      volumes :

        - name : config-volume

          configMap :

            name : prometheus-server-configmap

---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-service
spec:
  type: NodePort # 可以根据实际情况调整暴露方式。
  selector:
    app: prometheus-server # 指定应用程序标签为prometheus-server。
  ports:
    - port: 9090 # Prometheus服务器的监听端口号。
      targetPort: 9090 # 实际转发到容器中的端口号是9090。

其中,prometheus-server-configmap是一个配置映射,包含了Prometheus的配置文件。例如:

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-server-configmap
data:
  prometheu.yml: |
    global:

      scrape_interval :15s

    scrape_configs :

      - job_name : "kubernetes-pods"

        kubernetes_sd_configs:

          - role: pod

        relabel_configs:

          - source_labels : [__meta_kubernetes_pod_label_app]

            regex : myapp-label

            action : keep
  1. 部署示例应用程序和Exporter组件

在Kubernetes中部署示例应用程序,并且使用Exporter组件将其指标数据暴露给Prometheus服务器。例如,可以使用以下YAML配置文件创建Deployment和Service资源对象:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3 # 副本数为3个,可根据实际情况调整。
  selector:
    matchLabels:
      app: myapp-label # 标签名称为myapp-label。
  template:
    metadata:
      labels:
        app: myapp-label # 标签名称为myapp-label。
    spec:
      containers:
        - name: myapp-container
          image: :
          ports:
            - containerPort: 8080 # 应用程序监听的端口号为8080。

---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp-label # 标签名称为myapp-label。
  ports:
    - name: http-port
      port: 80 # 访问服务时使用的端口号。
      targetPort: 8080 # 实际转发到容器中的端口号是8080。

其中,分别是应用程序打包成Docker镜像后的名称和标签。

接下来,部署一个Prometheus Exporter组件。例如,在Kubernetes中使用以下YAML配置文件创建Deployment和Service资源对象:

apiVersion : apps/v1

kind : Deployment

metadata :

name : prometheus-exporter-deployment

spec :

replicas : 1

selector :

matchLabels :

name : prometheus-exporter

template :

metadata :

labels :

name : prometheus-exporter

spec:

containers:

- name : prometheus-exporter

image : quay.io/prometheus/node_exporte:v0.18.1

ports:

- containerPort :9100

resources:

requests :

cpu : "100m"

memory : "100Mi"

limits :

cpu : "200m"

memory : "200Mi"

其中,node_exporter:v0.18.1是一个Prometheus Exporter组件镜像,可以将主机的指标数据暴露给Prometheus服务器。

  1. 配置Prometheus规则

配置Prometheus规则来定义需要监控的指标。例如:

groups:

- name: myapp-rules

  rules:

    - alert: HighRequestLatency

      expr: job:request_latency_seconds_mean5m{job="myapp"} > 0.5

      for: 10s

      labels:

        severity: warning

      annotations:

        summary: High request latency on {{ $labels.instance }}

        description: "{{ $labels.instance }} has a request latency above 0.5 seconds ({{ printf "%.2f" $value }}s)"

其中,request_latency_seconds_mean_5m{job="myapp"}是示例应用程序中请求延迟的平均值。

  1. 验证部署结果

完成以上步骤后,即可验证Prometheus是否正确地收集和显示各种指标数据。可以通过Prometheus Web UI等工具查看监控信息,并且根据实际情况调整监控策略和报警规则。

你可能感兴趣的:(云原生,golang,istio)