记录了使用minikube建立一个k8s集群,安装helm,istio等过程。

综述

kubernetes,一个开源的容器集群管理系统,它提供资源调度,部署运行,服务发现,扩容缩容等功能,它并不依赖于docker,是一种通用的容器化应用管理方案。抽象概念和插件机制,k8s功能十分丰富、灵活。k8s由几个核心服务组成,包括apiserver,manager,scheduler,proxy,kublet,分布式存储etcd等。

Helm,k8s的包管理工具,帮助发现、共享和使用k8s构建的应用,kubctl是对于单个资源的操作,没有真正将一些资源作为整体去编排,helm提供了这方面的解决方案。

Istio,Service Mesh的一个具体实现,北京时间2018.08.01零点发布1.0版本,宣布生产环境可用。Service Mesh被誉为下一代微服务架构。

Minikube

  1. minikube是在本机上启动一个虚拟机,虚拟机内再运行docker守护进程,运行k8s相关服务镜像,在本机上启动一个全局的代理(比如Proxifier),便可以直接让虚拟机的请求被转发,从而拉取到谷歌仓库的镜像。(最省事也最有效的办法,因为基础镜像虽然可以很容易地在别的仓库找到,但后面使用helm、istio等各种额外服务时,找镜像相当劳累)

  2. 使用修改了minikube代码,更改默认镜像配置的minikube版本,这个方案能够将基础服务启动起来。同样,存在版本可能落后,扩展服务还是不易等问题。(云栖社区提供的基于阿里镜像库的minikube安装)

  3. 仅使用终端代理,可以让minikube运行,然后集群会显示基础镜像拉取失败,这时候minikube ssh到虚拟机,使用docker pull在阿里仓库的镜像,打上tag(tag和需要的镜像名相同),从而让docker使用本地镜像替代重新下载。(个人觉得tag太长,版本号也不容易确定,不是个好办法)

Helm

  1. helm安装没有什么坑,主要还是很多可用的chart库都需要代理,而国内几乎没有可用的chart仓库。

  2. helm提供了安装istio的chart,并且可以集中配置istio。

Istio

  1. 1.0新版在安装上也没什么问题,只是在minikube上部署istio,需要给minikube分配较大的内存(4g以上,推荐8g)以及cpu核数(推荐4个),同时,增加配置参数。(Minikube Istio Setup

  2. 安装

    • 通过helm安装则可以通过命令参数–set来修改配置

      1
      helm install install/kubernetes/helm/istio  --name istio --namespace istio-system --set gateways.istio-ingressgateway.type=NodePort --set gateways.istio-egressgateway.type=NodePort
    • 直接修改istio-demo.yaml,gateway服务的port方式改为nodeport。

      1
      kubectl apply -f install/kubernetes/istio-demo.yaml
  3. demo已经内置了prometheus、grafana、jaeger等服务,可通过端口转发的方式访问。

    1
    2
    3
    4
    5
    kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &  

    kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090 &

    kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &
  4. 运行官方例子bookinfo方便看见监控的变化。

    1
    2
    3
    4
    5
    kubectl label namespace default istio-injection=enabled  

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml