使用 Istio Operator 安装
除了手动在生产环境中安装、升级、和卸载 Istio,您还可以用 Istio Operator 管理安装。 这样做还能缓解管理不同 Istio 版本的负担。 您只需简单的更新 Operator 自定义资源(CR) 即可, Operator 控制器将为您应用更改的相应配置。
当您
使用 Istioctl
安装 Istio 时,
底层使用的是和 Operator 安装相同的
IstioOperator
API
。
在这两种场景下,都会以架构验证配置,并执行同样的正确性检查。
先决条件
-
执行必要的 平台安装 。
-
检查 服务和 Pod 的要求 。
-
安装 istioctl 可执行程序 。
安装
部署 Istio Operator
istioctl
命令可用于自动部署 Istio 操作符:
$ istioctl operator init
此命令运行 Operator 在
istio-operator
命名空间中创建以下资源:
- Operator 自定义资源定义(CRD)
- Operator 控制器的 Deployment 对象
- 一个用来访问 Operator 指标的服务
- Istio Operator 运行必须的 RBAC 规则
您可以配置 Operator 控制器安装的命名空间、Operator 观测的命名空间、Istio 的镜像源和版本、以及更多。
例如,可以使用参数
--watchedNamespaces
指定一个或多个命名空间来观测:
$ istioctl operator init --watchedNamespaces=istio-namespace1,istio-namespace2
更多详细信息,请参阅
istioctl operator init
命令参考
。
使用 operator 安装 Istio
使用 operator 安装 Istio
要使用 Operator 安装 Istio
demo
配置项(configuration profile)
,请运行以下命令:
$ kubectl apply -f - <<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane
spec:
profile: demo
控制器将检测
IstioOperator
资源,然后安装(
demo
)配置指定的 Istio 组件。
默认情况下,Istio 控制平面(istiod)将安装在
istio-system
命名空间中。
要将其安装到其他命名空间,请如下使用
values.global.istioNamespace
字段:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: demo
values:
global:
istioNamespace: istio-namespace1
可以使用以下命令确认 Istio 控制平面服务是否成功:
$ kubectl get services -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-egressgateway ClusterIP 10.96.65.145 <none> ... 30s
istio-ingressgateway LoadBalancer 10.96.189.244 192.168.11.156 ... 30s
istiod ClusterIP 10.96.189.20 <none> ... 37s
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-696cccb5-m8ndk 1/1 Running 0 68s
istio-ingressgateway-86cb4b6795-9jlrk 1/1 Running 0 68s
istiod-b47586647-sf6sw 1/1 Running 0 74s
更新
更新
现在,控制器已经运行起来,您可以通过编辑或替换
IstioOperator
资源来改变 Istio 配置。
控制器将检测到改变,继而用相应配置更新安装的 Istio。
例如,使用以下命令将安装切换到
default
配置:
$ kubectl apply -f - <<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane
spec:
profile: default
您还可以启用或禁用组件、修改资源设置。
例如,启用
istio-egressgateway
组件并增加 pilot 的内存请求:
$ kubectl apply -f - <<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane
spec:
profile: default
components:
pilot:
resources:
requests:
memory: 3072Mi
egressGateways:
- name: istio-egressgateway
enabled: true
通过检查 Operator 控制器日志,您可以检测到控制器为了响应
IstioOperator
CR 的更新,而在集群中所做的改变:
$ kubectl logs -f -n istio-operator "$(kubectl get pods -n istio-operator -lname=istio-operator -o jsonpath='{.items[0].metadata.name}')"
参阅
IstioOperator
API
获取完整的配置设置。
就地升级
就地升级
下载并提取希望升级到的 Istio 版本对应的
istioctl
。
在目标 Istio 版本的目录中,重新安装 Operator:
$ <extracted-dir>/bin/istioctl operator init
您会看到
istio-operator
的 Pod 已重新启动,其版本已更改到目标版本:
$ kubectl get pods --namespace istio-operator \
-o=jsonpath='{range .items[*]}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{"\n"}{end}'
经过一两分钟后,Istio 控制平面组件也会重新启动为新版本:
$ kubectl get pods --namespace istio-system \
-o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{"\n"}{end}'
金丝雀升级
金丝雀升级
金丝雀升级的过程类似于
istioctl
版本的金丝雀升级
。
例如,要升级上一节中安装的 Istio 修订版本,首先验证集群中名为
example-istiocontrolplane
的
IstioOperator
CR 是否存在:
例如要升级 Istio 1.19.0 到 1.20.2,
首先安装 1.19.0:
$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.19.0 sh -
使用 Istio 版本 1.19.0 部署 Operator:
$ istio-1.19.0/bin/istioctl operator init
安装 Istio 控制平面 demo 配置文件:
$ kubectl apply -f - <<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane-1-19-0
spec:
profile: default
确认您的集群中存在名为
example-istiocontrolplane
的
IstioOperator
CR:
$ kubectl get iop --all-namespaces
NAMESPACE NAME REVISION STATUS AGE
istio-system example-istiocontrolplane1-19-0 HEALTHY 11m
下载并提取希望升级到的 Istio 版本对应的
istioctl
。
然后,运行以下命令,基于集群内的
IstioOperator
CR 的方式,安装 Istio 目标版本的控制平面
(这里,我们假设目标修订版本为 1.8.1):
$ istio-1.20.2/bin/istioctl operator init --revision 1-20-2
复制
example-istiocontrolplane
CR 并将其另存为
example-istiocontrolplane-1-8-1.yaml
文件。
在 CR 中修改该文件的名称为
example-istiocontrolplane-1-8-1
,并添加
revision: 1-8-1
。
更新后的
IstioOperator
CR 如下所示:
$ cat example-istiocontrolplane-1-20-2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane-1-20-2
spec:
revision: 1-20-2
profile: default
运行该命令后,您将看到两组并排运行的控制平面 Deployment 和 Service:
$ kubectl get pod -n istio-system -l app=istiod
NAME READY STATUS RESTARTS AGE
istiod-1-20-2-597475f4f6-bgtcz 1/1 Running 0 64s
istiod-6ffcc65b96-bxzv5 1/1 Running 0 2m11s
$ kubectl get services -n istio-system -l app=istiod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istiod ClusterIP 10.104.129.150 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP 2m35s
istiod-1-20-2 ClusterIP 10.111.17.49 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 88s
要完成升级,请给工作负载的命名空间打这个标签:
istio.io/rev=1-8-1
,并重新启动工作负载,
就如
数据平面升级
文档的描述。
卸载
卸载
如果您使用 Operator 完成了控制平面的金丝雀升级,请运行以下命令卸载旧版本的控件平面,并保留新版本:
$ kubectl delete istiooperators.install.istio.io -n istio-system example-istiocontrolplane
等到 Istio 卸载完成 - 这可能需要一些时间。
然后删除 Istio Operator:
$ istioctl operator remove --revision <revision>
如果省略
revision
标志,则 Istio Operator 的所有修订版本都将被删除。
注意:在 Istio 完全移除之前删除 Operator 可能会导致 Istio 资源残留。
需要清理 Operator 未删除的内容:
$ istioctl uninstall -y --purge
$ kubectl delete ns istio-system istio-operator