k8s(四)、微服务框架istio安装测试

##

一、前言

Istio是Google/IBM/Lyft联合开发的开源项目,2017/5/发布第一个release 0.1.0,Service Mesh微服务新秀,采用sidecar的实现方式,有着高性能、极低的资源开销、无代码入侵等优秀特性,扛起微服务大旗,并与当下火热的k8s Paas容器云平台深度整合。官方描述为:

1
An open platform to connect, manage, and secure microservices

Istio提供一种简单的方式来建立已部署的服务的网络,具备负载均衡,服务到服务认证,监控等等功能,与k8s深度整合。
各组件工作图:
这里写图片描述

控制层面组件:
1.Pilot:负责将调度的配置下发到各svc endpoint后pod中注入的Envoys
2.Mixer:负责流量策略等统一调度
3.Citadel:负责安全策略,如TLS证书颁发

数据层面组件:
Envroys:将envroys proxy容器,以sidecar的方式注入到svc后端的pod中,与控制层面组件交互。一图助你理解sidecar工作方式(即:边三轮~):
这里写图片描述

非常感谢:
http://www.maogx.win/posts/25/

二、部署安装

1.部署前准备
这里使用较新的istio 0.7版本(目前最新为0.8),要求k8s版本1.9以上,同时对k8s有以下要求

1
2
3
4
5
6
7
8
9
10
# k8s 1.9 版本以后才能使用
# 查看是否支持
kubectl api-versions | grep admissionregistration

# 除了要满足以上条件外还需要检查kube-apiserver启动的参数
# k8s 1.9 版本要确保 --admission-control 里有 MutatingAdmissionWebhook,ValidatingAdmissionWebhook
# k8s 1.9 之后的版本要确保 --enable-admission-plugins 里有MutatingAdmissionWebhook,ValidatingAdmissionWebhook
# kubeadm默认安装的k8s 1.9版本,kube-apiserver启动参数 --admission-control 里没有 MutatingAdmissionWebhook,ValidatingAdmissionWebhook
#需要修改vim /etc/kubernetes/manifests/kube-apiserver.yaml,给--admission-control 添加两个参数 MutatingAdmissionWebhook,ValidatingAdmissionWebhook
#添加完成保存退出后重启kubelet服务

2.安装istio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
wget https://github.com/istio/istio/releases/download/0.7.1/istio-0.7.1-linux.tar.gz
tar xf istio-0.7.1-linux.tar.gz

# 安装配置环境变量
mv istio-0.7.1 /usr/local/
ln -sv /usr/local/istio-0.7.1 /usr/local/istio
echo 'export PATH=/usr/local/istio/bin:$PATH' > /etc/profile.d/istio.sh
source /etc/profile.d/istio.sh
istioctl version

# 如果环境不是云环境,不支持LoadBalancer
# 在公司生产环境中ingress-controller使用的是traefik,因此我这里是以ClusterIP的方式部署的istio-ingress service
# 若没有其他的ingress,可以直接使用istio-ingress,修改 Istio-ingress service type使用 NodePort
# 大概在1548-1590行左右
cd /usr/local/istio
cp install/kubernetes/istio.yaml install/kubernetes/istio.yaml.ori
vim install/kubernetes/istio.yaml

...

apiVersion: v1
kind: Service
metadata:
name: istio-ingress
namespace: istio-system
labels:
istio: ingress
spec:
# type: LoadBlance
type: ClusterIP
ports:
- port: 80
# nodePort: 32000
name: http
- port: 443
name: https
selector:
istio: ingress


...

# 安装不使用认证(不使用tls)
kubectl apply -f install/kubernetes/istio.yaml

3.启用自动注入sidecar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#注意上方讲的钩子一定给kube-apiserver要配置上
# 生成所需要的证书
./install/kubernetes/webhook-create-signed-cert.sh \
--service istio-sidecar-injector \
--namespace istio-system \
--secret sidecar-injector-certs

# 创建配置configmap
kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml

# 生成相关yaml
cat install/kubernetes/istio-sidecar-injector.yaml | \
./install/kubernetes/webhook-patch-ca-bundle.sh > \
install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

# 安装webhook
kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

# 查看
kubectl -n istio-system get deployment -listio=sidecar-injector
kubectl get namespace -L istio-injection

# 开启注入前,创建测试用例
kubectl apply -f samples/sleep/sleep.yaml
kubectl get deployment -o wide
kubectl get pod


# 设置 default namespace 开启自动注入
kubectl label namespace default istio-injection=enabled
kubectl get namespace -L istio-injection

# 删除创建的pod,等待重建
kubectl delete pod $(kubectl get pod | grep sleep | cut -d ' ' -f 1)

# 查看重建后的pod
# 查看描述,看看创建pod过程中是否有istio-proxy容器(即sidecar)
kubectl get pod
kubectl describe pod $(kubectl get pod | grep sleep | cut -d ' ' -f 1)

# 清理
kubectl delete -f samples/sleep/sleep.yaml

# 关闭default命名空间自动注入
kubectl label namespace default istio-injection-

# 关闭部分pod的自动注入功能
...
template:
metadata:
annotations:
sidecar.istio.io/inject: "false"
...

若不开启针对命名空间的自动注入,只想对部分部署使用自动注入,可以使用:

1
2
#不开启自动注入部署应用需要使用如下方式的命令,即给原有的部署yaml文件内容器部分添加一个istio-proxy容器
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)

4.访问测试

1
2
3
GATEWAY_URL=$(kubectl get po -l istio=ingress -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage

5.清理:
k8s创建和清理部署应用非常简单,创建使用apply/create,清理使用delete,文件指向部署yaml即可。

1
2
3
4
5
6
# 清理官方用例
samples/bookinfo/kube/cleanup.sh

# 清理istio
kubectl delete -f install/kubernetes/istio.yaml
# kubectl delete -f install/kubernetes/istio-auth.yaml
赏一瓶快乐回宅水吧~
-------------本文结束感谢您的阅读-------------