落地分布式微服务架构时,遥测信息收集是一个重要的环节。如果没有日志收集、指标收集、分布式追踪、应用性能管理,将导致问题定位效率低下、无法自动弹性伸缩、无法自动预警等,最终可能导致微服务架构落地失败。
在K8s中,我们可以使用Elastic Stack完成这些事情。Elasticsearch完成数据存储与搜索;Kibana提供可视化的用户界面;Beats完成数据采集;APM完成分布式追踪、应用性能管理。
在K8s集成Istio之后,虽然Jaeger可以追踪到Mesh边界,但仍需在代码中转发x-request-id
与x-b3-...
等头部信息,也没有比Elastic APM优美。同时,我们大部分时候只关注应用边界的性能,很少关注Mesh边界的性能。因此,在单独K8s或K8s + Istio集群中,Elastic Stack满足了我们的APM需求。
继续阅读→
在本地演练K8s,我们不一定需要分布式存储,只需一个本地存储就可以满足我们的需求。但是,本地存储不能自动分配持久化卷(PV),需要我们先创建好PV,PVC才能获取到资源。
继续阅读→
Istio是非入侵式的跨语言服务治理方案,与业务代码达到进程解耦,以SideCar模式完成服务治理——流量管理、安全、策略、遥测。Istio架构比Dubbo、Spring Cloud先进。
本文将演示:在K8s集群中部署Istio与其BookInfo样例。
1. 准备条件
继续阅读→
Helm与Tiller是C/S模式配合工作的,它们已变成K8s事实上的标准部署工具。本地快速部署工具Draft
也依赖Helm
。
Helm是安装在本地的,读取/home/$USER/.kube/config
与远程的Tiller或K8s API通信。
Tiller是安装在K8s集群中的,有一个独立的Pod与Service。
在k8s-master
节点执行:
wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
tar -zxvf helm-v2.14.3-linux-amd64.tar.gz
sudo cp linux-amd64/helm /usr/local/bin/
sudo cp linux-amd64/tiller /usr/local/bin/
kubectl apply -f https://raw.githubusercontent.com/istio/istio/1.3.3/install/kubernetes/helm/helm-service-account.yaml
helm init --service-account tiller --tiller-image doublemine/kubernetes-helm.tiller:v2.14.3 --skip-refresh --upgrade
# check version info
xxx@k8s-master:~$ helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
看得Server端的版本信息,说明工具部署完成。
继续阅读→
在K8S集群中,比较麻烦的是:有状态服务持久化,并且保证高可用。面临的问题:
- 有状态服务POD死亡时,持久化数据能够立刻转移到新拉起的POD。
- 持久化数据本身读写的高可用。
Ceph分布式存储就是解决问题2;同时使用独立的分布式存储集群,分离PV与工作节点的耦合,确保PVC能够转移给新的POD,解决问题1。
本文将演练:部署一个Ceph分布式存储单例,通过CephFS集成到K8s。
继续阅读→
目前,微服务是比较流行且成熟的后端架构。这几年来,K8S、云原生与Service Mesh也比较火热。
去年开始接触到K8S,然后开始学习互联网架构与云原生,前段时间有空在自己的笔记本中搭建开放环境。环境准备如下:
- DNS服务:阿里云域名服务,解析qinzhiqiang.cn的子域名到本地VM IP
- 宿主:Windows 10 专业版 + Hyper-V,CPU四核八线程,内存32G,使用Docker CLI
- VM1:Ubuntu 18.04 Server + Docker,提供Docker daemon、Docker registry服务,内存2G
- VM2:Ubuntu 18.04 Server + Docker,提供GitLab服务,内存8G
- VM3:Ubuntu 18.04 Server + Docker,提供K8S服务,内存16G
继续阅读→
Kubernetes (K8s)是云原生生态的基石,是CNCF中第一个毕业的项目,是事实上的“云操作系统”标准;后续的分布式微服务都部署在K8s中。
演练K8s集群(CNI + IPVS模式),我们使用3个虚拟机(Ubuntu Server 18.04),需要SSD磁盘作为存储。K8s本身的微服务就不少,磁盘操作次数比普通的单应用服务的多。如果使用普通的机械磁盘,K8s集群的启动都困难。
节点类型 |
节点名称 |
IP地址 |
最小内存 |
主节点 |
k8s-master |
192.168.80.90 |
3G |
工作点 |
k8s-worker-1 |
192.168.80.91 |
2G |
工作点 |
k8s-worker-2 |
192.168.80.92 |
2G |
继续阅读→
内部DevOps环境,一般需要部署私有的Docker Registry服务,避免打包的镜像需要上传到公网,加速私有服务容器的部署。
本文使用独立的Ubuntu Service 18.04服务器提供Docker registry服务,使用80与443端口。使用Nginx接入Docker registry与registry-ui的流量,均使用Docker容器提供服务(Everything in Docker)。
继续阅读→
Docker本身是C/S架构,Docker CLI –> Docker daemon。在本地Windows开发环境中,我们可以远程操作Linux环境中的Docker。在Docker容器中使用共享的远程Docker,可以避免每个容器中独立下载Docker Images的缓慢现象。
官方文档,见 https://docs.docker.com/config/daemon/systemd/ 和 https://docs.docker.com/install/linux/linux-postinstall/#configure-where-the-docker-daemon-listens-for-connections
在Ubuntu 18.04 Docker服务端中,只需执行以下命令:
继续阅读→
Docker是云原生的基石,服务软件都可以包含到Docker容器中,服务软件之间相互隔离。云原生时代,几乎到了“没有服务可以脱离Docker容器”。
服务器使用Ubuntu Server 18.04,后续安装其他软件与维护都比较方便。
sudo apt-get update
sudo apt-get install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker
继续阅读→