# helm

## 使用helm安装istio

创建命名空间

```
kubectl create namespace istio-system
```

安装Istio基础资源chart

```
helm install --namespace istio-system istio-base manifests/charts/base
```

安装istiod

```
helm install --namespace istio-system istiod manifests/charts/istio-control/istio-discovery \
    --set global.hub="docker.io/istio" --set global.tag="1.8.0"
```

安装ingressgateway

```
helm install --namespace istio-system istio-ingress manifests/charts/gateways/istio-ingress \
     --set global.hub="docker.io/istio" --set global.tag="1.8.0"
```

安装egressgateway

```
helm install --namespace istio-system istio-egress manifests/charts/gateways/istio-egress \
    --set global.hub="docker.io/istio" --set global.tag="1.8.0"
```

## 升级

### 金丝雀升级

1.通过设置修订值来安装Istio发现表的Canary版本:

```
helm install --namespace istio-system istiod-canary manifests/charts/istio-control/istio-discovery --set revision=canary \
    --set global.hub="docker.io/istio" --set global.tag=<version_to_upgrade>
```

1. 验证istiod集群中是否安装了两个版本:

```
kubectl get pods -n istio-system -l app=istiod -L istio.io/rev
  NAME                            READY   STATUS    RESTARTS   AGE   REV
  istiod-5649c48ddc-dlkh8         1/1     Running   0          71m   default
  istiod-canary-9cc9fd96f-jpc7n   1/1     Running   0          34m   canary
```

1. 验证金丝雀部署

要升级名称空间test-ns,请删除istio-injection标签,然后添加istio.io/rev标签以指向canary修订版本。该istio-injection标签必须拆除,因为它的优先级高于istio.io/rev标签向后兼容性。

```
kubectl label namespace test-ns istio-injection- istio.io/rev=canary
```

在命名空间更新之后,您需要重新启动Pod以触发重新注入。一种方法是使用:

```
kubectl rollout restart deployment -n test-ns
```

显示使用canary修订版的所有Pod

```
kubectl get pods -n test-ns -l istio.io/rev=canary
```

要验证test-ns名称空间中的新容器正在使用与修订istiod-canary相对应的服务canary,请选择一个新创建的容器,然后pod\_name在以下命令中使用:

```
istioctl proxy-config endpoints ${pod_name}.test-ns --cluster xds-grpc -ojson | grep hostname
"hostname": "istiod-canary.istio-system.svc"
```

验证并迁移工作负载以使用Canary控制平面后,可以卸载旧的控制平面:

```
helm delete --namespace istio-system istiod
```

### 就地升级

您可以使用Helm升级工作流程在集群中执行Istio的就地升级。

* 升级Istio基本chart:

```
helm upgrade --namespace istio-system istio-base manifests/charts/base
```

* 升级Istio discovery chart:

```
helm upgrade --namespace istio-system istiod manifests/charts/istio-control/istio-discovery \
    --set global.hub="docker.io/istio" --set global.tag="<version_to_upgrade>"
```

* 如果集群中安装了Istio入口或出口网关chart,请升级:

```
helm upgrade --namespace istio-system istio-ingress manifests/charts/gateways/istio-ingress \
    --set global.hub="docker.io/istio" --set "global.tag=<version_to_upgrade>"
helm upgrade --namespace istio-system istio-egress manifests/charts/gateways/istio-egress \
    --set global.hub="docker.io/istio" --set "global.tag=<version_to_upgrade>"
```

## 卸载

您可以通过卸载上面安装的chart来卸载Istio及其组件。

* 列出安装在istio-system名称空间中的所有Istio chart:

```
helm ls --namespace istio-system
```

* (可选)删除Istio入口/出口图表:

```
helm delete --namespace istio-system istio-egress
helm delete --namespace istio-system istio-ingress
```

* 删除Istio discovery chart:

```
helm delete --namespace istio-system istiod
```

* 删除Istio基本chart:

按照设计,通过Helm删除chart不会删除通过chart安装的已安装自定义资源定义(CRD)。

```
helm delete --namespace istio-system istio-base
```

* 删除istio-system名称空间:

```
kubectl delete namespace istio-system
```

* 删除CRD

```
kubectl get crd | grep --color=never 'istio.io' | awk '{print $1}' \
    | xargs -n1 kubectl delete crd
```
