《Istio官方文档》Kubernetes-安装Istio Sidecar
安装Istio Sidecar
注:以下要求Istio 0.5.0或更高版本。有关版本0.4.0或更高版本,请参阅https://archive.istio.io/v0.4/docs/setup/kubernetes/sidecar-injection。
注意:在以前的版本中,Kubernetes初始化程序功能已用于自动代理注入。这是一个可以更改/删除的alpha功能,并且在Kubernetes中默认不启用。从Istio 0.5.0发布开始,自动代理注入使用Kubernetes突变webhooks。这个Kubernetes功能是用来测试且默认情况下在Kubernetes 1.9及以上会获得到。在0.5.0中已经删除了对代理注入的alpha初始值设定机制的支持。无法升级到Kubernetes 1.9的用户应使用手动注入。
Pod规格要求
为了成为服务网格的一部分,kubernetes集群中的每个容器必须满足以下要求:
- 服务关联:该窗格必须属于单个 Kubernetes服务(截至目前,不支持属于多个服务的窗格)。
- 命名端口:服务端口必须命名。端口名称必须是
<protocol>[-<suffix>]
<protocol>
这种形式,且与http, http2, grpc, mongo, or redis 相搭配,以便充分利用Istio的路由功能。例如,name: http2-foo或者name: http是有效的端口名称,但name: http2foo不是。如果端口名称不是以可识别的前缀开头,或者端口未命名,则端口上的通信将被视为纯TCP通信(除非端口明确用于Protocol: UDP表示UDP端口)。 - 具有应用标签的部署:建议使用Kubernetes deployment部署的Pod在部署规范中具有显式app标签。每个部署规范都应该有一个明确的app标签,其中这个标签具有一个有意义的值。该app标签用于在分布式跟踪中添加上下文信息。
- 网格中的每个pod Sidecar:最后,网格中的每个pod必须运行与Istio兼容的sidecar。以下部分介绍了将Istio sidecar注入到一个pod的两种方法:手动使用istioctl CLI工具或自动使用Istio初始化程序。请注意,sidecar不涉及同一pod内的容器之间的通信。
注入
手动注入可以修改控制器配置,例如部署。这是通过修改pod模板规范来完成的,这样所有用于该部署的pod都是用注入的sidecar创建的。添加/更新/删除sidecar需要修改整个部署。
在创建时间点自动注入。控制器资源未修改。可以通过手动删除pods或通过部署滚动更新系统地选择更新sidecars。
手动和自动注入使用相同的模板化配置。自动注入从istio-system命名空间中的istio-inject ConfigMap 加载配置。手动注入可以从本地文件或ConfigMap中加载。
注入配置的两种变型提供了默认的安装:istio-sidecar-injector-configmap-release.yaml和istio-sidecar-injector-configmap-debug.yaml。注入配置映射包括默认的注入策略和sidecar注入模板。调试版本包括调试代理映像以及用于调试sidecar代理的附加日志记录和核心转储功能。
手动sidecar注射
使用内置的默认模板,并从istio ConfigMap中动态获取网格配置。其他参数覆盖可通过标志(请参阅istioctl kube-inject –help)。
kubectl apply -f <(~istioctl kube-inject -f samples/sleep/sleep.yaml)
kube-inject也可以在不访问正在运行的Kubernetes集群的情况下运行。创建注入和网格配置图的本地副本。
kubectl create -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml \
--dry-run \
-o=jsonpath='{.data.config}' > inject-config.yaml
kubectl -n istio-system get configmap istio -o=jsonpath='{.data.mesh}' > mesh-config.yaml
Run kube-inject`在输入文件上。
istioctl kube-inject \
--injectConfigFile inject-config.yaml \
--meshConfigFile mesh-config.yaml \
--filename samples/sleep/sleep.yaml \
--output sleep-injected.yaml
部署注入的YAML文件。
kubectl apply -f sleep-injected.yaml
确认sidecar已经注入到部署中。
kubectl get deployment sleep -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
sleep 1 1 1 1 2h sleep,istio-proxy tutum/curl,unknown/proxy:unknown app=sleep
自动sidecar注入
有关webhook准入控制器的概述,请参阅validatingadmissionwebhook-alpha-in-18-beta-in-19。
先决条件
Kubernetes 1.9集群需要启用admissionregistration.k8s.io/v1beta1。
kubectl api-versions | grep admissionregistration.k8s.io/v1beta1
admissionregistration.k8s.io/v1beta1
GKE
1.9.1适用于具有alpha群集的非白名单早期访问用户(请参阅https://cloud.google.com/kubernetes-engine/release-notes#january-16-2018)。
gcloud container clusters create <cluster-name> \
--enable-kubernetes-alpha
--cluster-version=1.9.1-gke.0
--zone=<zone>
--project <project-name>
gcloud container clusters get-credentials <cluster-name> \
--zone <zone> \
--project <project-name>
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole=cluster-admin \
--user=$(gcloud config get-value core/account)
minikube
TODO(https://github.com/istio/istio.github.io/issues/885)
IBM云容器服务
TODO(https://github.com/istio/istio.github.io/issues/887)
AWS与Kops
TODO(https://github.com/istio/istio.github.io/issues/886)
安装Webhook
安装基地Istio。
kubectl apply -f install/kubernetes/istio.yaml
Webhooks需要一个签名的证书/密钥对。使用install/kubernetes/webhook-create-signed-cert.sh来产生由Kubernetes’ CA签名的证书/密钥对,生成的证书/密钥文件作为Kubernetes 私密存储,以便sidecar注入器webhook使用。
注意:Kubernetes CA批准需要创建和批准CSR的权限。请参阅https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster并install/kubernetes/webhook-create-signed-cert.sh获取更多信息。
./install/kubernetes/webhook-create-signed-cert.sh \
--service istio-sidecar-injector \
--namespace istio-system \
--secret sidecar-injector-certs
安装sidecar注入配置图。
kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml
在webhook中设置caBundle安装YAML的Kubernetes API服务器用来调用webhook。
cat install/kubernetes/istio-sidecar-injector.yaml | \
./install/kubernetes/webhook-patch-ca-bundle.sh > \
install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
安装sidecar注入webhook。
kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
sidecar注入webhook现在应该运行。
kubectl -n istio-system get deployment -listio=sidecar-injector
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
istio-sidecar-injector 1 1 1 1 1d
NamespaceSelector根据该对象的名称空间是否与选择器匹配来决定是否在对象上运行webhook(请参阅https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors) 。默认的webhook配置使用istio-injection=enabled。
查看显示istio-injection标签的名称空间并验证default名称空间未被标记。
kubectl get namespace -L istio-injection
NAME STATUS AGE ISTIO-INJECTION
default Active 1h
istio-system Active 1h
kube-public Active 1h
kube-system Active 1h
部署一个应用程序
部署睡眠应用程序。验证部署和Pod都有一个容器。
kubectl apply -f samples/sleep/sleep.yaml
kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
sleep 1 1 1 1 12m sleep tutum/curl app=sleep
kubectl get pod
NAME READY STATUS RESTARTS AGE
sleep-776b7bcdcd-7hpnk 1/1 Running 0 4
用istio-injection=enabled标注default名称空间
kubectl label namespace default istio-injection=enabled
kubectl get namespace -L istio-injection
NAME STATUS AGE ISTIO-INJECTION
default Active 1h enabled
istio-system Active 1h
kube-public Active 1h
kube-system Active 1h
注入发生在创建时间点。杀死运行pod,并验证一个新的pod与注入sidecar创建。原来的pod有1/1的READY容器,而注入sidecar的pod有2/2的READY容器。
kubectl delete pod sleep-776b7bcdcd-7hpnk
kubectl get pod
NAME READY STATUS RESTARTS AGE
sleep-776b7bcdcd-7hpnk 1/1 Terminating 0 1m
sleep-776b7bcdcd-bhn9m 2/2 Running 0 7s
禁用default命名空间的注入,并验证新的pods没有用sidecar来创建。
kubectl label namespace default istio-injection-
kubectl delete pod sleep-776b7bcdcd-bhn9m
kubectl get pod
NAME READY STATUS RESTARTS AGE
sleep-776b7bcdcd-bhn9m 2/2 Terminating 0 2m
sleep-776b7bcdcd-gmvnr 1/1 Running 0 2s
了解发生了什么
admissionregistration.k8s.io/v1alpha1#MutatingWebhookConfiguration用来配置何时Kubernetes调用webhook。Istio提供的默认选择pods在名称空间中用标签istio-injection=enabled来配置。这可以通过修改install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml中的MutatingWebhookConfiguration来改变。
在 istio-system命名空间中将istio-inject ConfigMap配置默认注入政策和sidecar注入模板。
政策
disabled -sidecar注入器默认不会将sidecar注入到pods。将sidecar.istio.io/inject注释值设置为true到pod模板规范以启用注入。
enabled -sidecar注入器默认将sidecar注入到pods。将sidecar.istio.io/inject注释值设置为false到pod模板规范以禁用注入。
模板
sidecar注入模板使用https://golang.org/pkg/text/template,在解析和执行时,解码为包含要注入到pod中的容器和容器列表的以下结构。
type SidecarInjectionSpec struct {
InitContainers []v1.Container `yaml:"initContainers"`
Containers []v1.Container `yaml:"containers"`
Volumes []v1.Volume `yaml:"volumes"`
}
该模板在运行时应用于以下数据结构。
type SidecarTemplateData struct {
ObjectMeta *metav1.ObjectMeta
Spec *v1.PodSpec
ProxyConfig *meshconfig.ProxyConfig // Defined by https://istio.io/docs/reference/config/service-mesh.html#proxyconfig
MeshConfig *meshconfig.MeshConfig // Defined by https://istio.io/docs/reference/config/service-mesh.html#meshconfig
}
ObjectMeta 和Spec来自pod。ProxyConfig 和MeshConfig来自istio-system命名空间中的istio ConfigMap 。模板可以使用此数据有条件地定义注入的容器和容量。
例如,以下来自install / kubernetes / istio-sidecar-injector-configmap-release.yaml的模板片段
containers:
- name: istio-proxy
image: istio.io/proxy:0.5.0
args:
- proxy
- sidecar
- --configPath
- {{ .ProxyConfig.ConfigPath }}
- --binaryPath
- {{ .ProxyConfig.BinaryPath }}
- --serviceCluster
{{ if ne "" (index .ObjectMeta.Labels "app") -}}
- {{ index .ObjectMeta.Labels "app" }}
{{ else -}}
- "istio-proxy"
{{ end -}}
当应用在sample/sleep/sleep.yaml中由pod模板规范定义的pod上时,需要如下扩展:
containers:
- name: istio-proxy
image: istio.io/proxy:0.5.0
args:
- proxy
- sidecar
- --configPath
- /etc/istio/proxy
- --binaryPath
- /usr/local/bin/envoy
- --serviceCluster
- sleep
卸载webhook
kubectl delete -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
上面的命令不会从Pod中删除注入的sidecars。滚动更新或简单地删除pods并强制部署来创建它们是必需的。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Istio官方文档》Kubernetes-安装Istio Sidecar
赞! 内容这么丰富,博主用心了,推荐博主使用一个好用的接口管理工具-ApiPost,免费下载使用,感谢分享