第十一课 Kubernetes生产级实践-ServiceMesh代表作istio
tags:
- k8s
- 慕课网
categories:
- ServiceMesh
- istio
文章目录
第一节 ServiceMesh代表作
1.1 ServiceMesh介绍
- 什么是ServiceMesh ?
- 服务网格
- 是概念,不是产品
- 解决网络层面的问题 服务发现 负载均衡 路由 流量控制 服务间的稳定行 监控
- 上面的问题其实都是一个问题即网络问题。大家开始琢磨,怎么把网络抽离出来,让他自己实现服务发现服务发现 负载均衡 路由 流量控制 实现熔断确保服务安全。让开发者感受不到这种东西。
- 于是Linked和Istio被提了出来。
- Linkerd 始于2016年的CNCF官方项目
- 1.x基于节点(物理机、虚拟机)
- 2.x基于kubernetes(源自Conduit )
- Istio是Google、IBM、Lyft发起的开源项目
- 2017年推出,2018年7月发布1.0
- 多平台支持
- Linkerd和对比Istio
- 都是基于sidecar模式 这种模式下每个服务都会分配代理 代理将数据转发给目标的代理
- 都分为数据层和控制层
- Istio更受欢迎:https://github.com/istio/istio
1.2 lstio架构和原理
-
官网: https://istio.io/
-
中文官网:https://istio.io/zh
-
核心就是代理,一个pod一个网络代理。
-
Istio的更加细致的架构图如下。
-
Istio解决的问题
- 故障排查
- 这个请求在哪失败的?A有调用B吗?
- 为什么用户的请求/页面hung住了?
- 为什么系统这么慢?哪个组件最慢?
- 应用容错性
- 客户端没有设置timeout导致应用卡住
- 某些节点异常(如load高),导致应用响应变长
- 没有重试机制,某个服务偶尔出现的异常导致用户页面错误
- 应用升级发布
- 新版本一次性升级,一旦出错影响范围很大
- 无法进行A/B测试,根据用户属性访问不通版本
- 服务版本的依赖关系处理不当导致的服务不可用
- 系统安全
- 服务都是HTTP的而非HTTPS
- 没有流量限制,任何人都可以对服务发起攻击
- 故障排查
1.3 部署面向生产的istio
- 因为Istio占用的资源比较大,所以之前安装的一些服务全给他干掉。
- 为了适应视屏中的版本选择1.1.7-liunx.tar.gz。https://github.com/istio/istio/releases/tag/1.1.7
tar -zvxf istio-1.1.7-linux.tar.gz
kubectl create namespace istio-system
cd /istio-1.1.7/install/kubernetes
cp -r helm/ ~
cd ~/helm/istio-init/
# 修改镜像地址registry.cn-hangzhou.aliyuncs.com/imooc-istio
vi values.yaml
# helm tempate是把当前的项目的chart的k8s的配置输出出来
helm template . --name imooc-istio-init --namespace istio-system > istio-init.yaml
kubectl apply -f istio-init.yaml
kubectl get pods -n istio-system
# 当上面完成了值后发现有很多crd 58个 官方文档上说
kubectl get crd
- istio核心组件的安装。官网建议我们再生产中使用default的配置文件。
cd helm/istio
# 看下default的配置文件 首先是依赖组件是否开启
# 因为我们选用的是准入控制的方案
istio_cni:
enabled: false
# 修改镜像地址
hub: registry.cn-hangzhou.aliyuncs.com/imooc-istio
# 修改prometheus的hub registry.cn-hangzhou.aliyuncs.com/imooc-istio
grep image: istio.yaml
vi charts/prometheus/values.yaml
helm template . --name imooc-istio --namespace istio-system > istio.yaml
vi istio.yaml
grep image: istio.yaml
# 修改LoadBalancer为type: NodePort
# 部署一下
kubectl apply -f istio.yaml
kubectl get pods -n istio-system
kubectl get pods -n istio-system -o wide | grep -v Completed
# 看下日志
journalctl -f
# 配置apiserver 二进制安装的需要手动配置一下
cd ~/kubernetes-ha-binary/target/pki/admin
rm -rf admin*.pem
cfssl gencert -ca=/etc/kubernetes/pki/ca.pem \
-ca-key=/etc/kubernetes/pki/ca-key.pem \
-config=../ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
cp admin*.pem /etc/kubernetes/pki
vi /etc/systemd/system/kube-apiserver.service
--requestheader-client-ca-file=/etc/kubernetes/pki/ca.pem \
--requestheader-allowed-names= \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--proxy-client-cert-file=/etc/kubernetes/pki/admin.pem \
--proxy-client-key-file=/etc/kubernetes/pki/admin-key.pem \
# 重启服务
systemctl daemon-reload && systemctl restart kube-apiserver.service
# metrics-server地址:https://github.com/kubernetes-sigs/metrics-server这里使用0.3.3版本
cd ~/deep-in-kubernetes/13-istio/metrics-server/1.8+ && kubectl apply -f .
kubectl get pods -n kube-system
# 主节点访问 服务+端口连不上 work节点可以连上
################ 这里被之前部署坑了,因为主节点没有proxy和calico。啥都没有嘛 #################
kubectl get svc -n kube-system
curl 10.254.248.89:443
# 主节点部署
sh download-images.sh
# 到任何一个节点的/opt/kubernetes/bin
scp * root@m1:/opt/kubernetes/bin
scp * root@m2:/opt/kubernetes/bin
# 到node节点上拿kubelet-bootstrap.kubeconfig 到主节点上