xtshuangxin 2019-11-19
之前就玩过docker,但是一直不知道怎么把容器运用到生产上。构建一个docker镜像,把他run起来很简单;难的是容器的部署(CICD),容器的网络,数据持久化等。如果我们像之前一样,打包好镜像,通过ssh连接到目标服务器run起来,这和打包成二进制传上去似乎也没多大进步。
k8s就是帮我们解决这些难点的工具。k8s是master-node架构,通过master管理node。首先需要将你的机器组成k8s集群,集群机器的内网应该是连通的,这样你的集群就捆绑成了一个整体由k8s接管了。你只需要准备好配置文件,用k8s的api或cli(命令行)发布镜像即可,k8s会根据你配置的规则来管理容器,应用场景有:一份镜像需要部署多少个容器(replicaSets),服务的升级策略(滚动更新),服务的容灾策略(某个node挂了可以在其他node补上缺失的容器),弹性伸缩(监控CPU等指标达到临界值后自动增加容器)等。
怎么样?是不是觉得很cool,你可能迫不及待的想去把k8s用起来了,可是你打开k8s官方文档大段大段的英文和各种生疏的概念就把你整懵了。你跟着教程敲了一遍,一大堆yaml配置,全是命令行操作,可能你已经被墙给干倒了(天朝ha);还有一堆概念,什么Pod, Deployment, ReplicaSet, Service都是些啥玩意。可能你花了大半天耐心的把文档过了一遍,觉得这个东西根本落不了地啊,这一大堆配置和命令行,这谁顶得住,k8s这么先进不应该是可视化的点点就完事了吗?我一开始天真的以为k8s dashboard能帮帮我,费了点力气把它装好后,发现只有一些监控数据。
下面我想介绍另一种学习思路,自顶向下的学习。其实你一开始不用了解k8s的各种概念,只需要看看别人是怎么用k8s的就行了(都9102年了,那些很潮的公司都已经玩了很久了)。不是说学东西必须得打好基础吗?自顶向下是个什么鬼?拿学开车举例,你开始只是在路上看到别人开车,很拉风可撩妹,比两轮的安全,不怕风吹雨打的,教练我也要开车;你去报了驾校(看到这里你肯觉得我要忽悠你报培训班),你摸到了车看到别人是咋开的,了解了基本知识你就可以在训练场地慢慢蠕动了(测试环境),你甚至不用了解交规,更不用了解汽车的原理,这些后面可以慢慢补。补好基础了你就可以上路,然后你可能需要了解汽车原理,改装它优化它,再练一练排水渠过弯的技巧,成为一代老司机。
回到正题,我们学k8s同样可以先看看别人是咋用的,再去了解其中细节,掌握它。咋看呢?一大部分公司还没跟上潮流,这时我们可以借助开源和云服务。
首先我们的思路没有问题,要便捷的使用k8s我们需要一个可视化管理平台。
开源的有rancher、Qihoo360/wayne等,云服务阿里云、腾讯云、AWS都提供容器服务管理后台。
这里就拿rancher开始吧,毕竟开源免费。值得一提的是,阿里云等的容器服务按量积分,master可托管,弄一两天低配node,一天也就几块。
在本地启动rancher容器:
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 -v /opt/rancher:/var/lib/rancher rancher/rancher
打开https://127.0.0.1:8443平台,可以看到cluster, node, namespace, member等功能。
下面我们需要准备一个k8s cluster(集群),用minikube可以方便的部署一个本地集群。minikube是通过虚拟机创建集群,支持多种虚拟机,我这里用的virtualBox。启动很简单,一个命令minikube start
,困难的是墙,下面贴一下配置代理的脚本:
function ministart() { export HTTP_PROXY=http://192.168.99.1:1089 export HTTPS_PROXY=http://192.168.99.1:1089 export NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24 minikube start \ --docker-env=HTTP_PROXY=$HTTP_PROXY \ --docker-env=HTTPS_PROXY=$HTTPS_PROXY \ --docker-env=NO_PROXY=$NO_PROXY \ --registry-mirror=https://registry.docker-cn.com }
注意一下这个ip,不能使用127.0.0.1,因为虚拟机需要使用宿主的代理,虚拟机跟宿主机通讯是使用虚拟网卡创建的网段,默认宿主的ip为192.168.99.1,虚拟机是192.168.99.100。你还得把你的梯子监听的地址改改,127.0.0.1->0.0.0.0,监听所有网卡。同样rancher里的ip也应使用192.168.99.1,这个ip必需是所有集群都能访问到的,如果你是用docker自带的k8s集群,你可以用ifconfig
找一个无线网或有线网的ip,反正不能使用127.0.0.1。
minikube下载一些必需镜像后,k8s集群就在虚拟机里启动了,可以使用minikube ssh
登录到虚拟机里探查一番。下面我们在rancher里引入集群:
集群引入了之后我们来部署我们第一个app,一个echo-server:
等了一会儿k8s把容器部署好了,上面配置了暴露随机端口值是32192,我们访问192.168.99.100:32192就能看的echo-sever返回的信息了。我们觉得一个pod不够,点击+号,k8s会帮我们做水平扩容启动第二个pod,虽然minikube是但节点的,但是依靠容器的隔离特性,单节点照样能部署多个相同应用。
体验一下rancher的pipeline,集成了CICD功能。配置好代码仓库后run起来,会创建Jenkins等容器。等了好一会儿后,可以看到workloads里example-server部署好了。
文档里有介绍pipeline的原理: https://rancher.com/docs/ranc...。rancher会自动创建三个组件:
Docker Registry和Minio的数据持久化可以为其配置volume。
ok,下面自行探索一下rancher的各个页面,有Workloads,Load blance,Service discory,pipeline这些部署常用的,还提供报警、日志、监控、用户权限等功能,这就是一个完善的k8s管理平台了,到此你应该了解k8s大概有哪些用处了。
下面你需要再把k8s官方文档捡起来看一看,或者是一本系统介绍k8s的书籍,把你在rancher上用到的功能和k8s的概念对应起来,现在你才能抓住哪些是重点。
一些概念:
pod:k8s最小调度单位,可以是一个或多个容器。
service:对内或对外暴露k8s服务。
deployment:pods和replicaSets的控制器,通过deployment配置的规则来管理pods。
三个主要的命令行程序:
kubeadm:用了启动k8s集群。
kubelet:需要在所以节点上运行,处理集群内部通讯,类似agent。
kubectl:客户端工具,用户用它来给k8s集群发指令,类似ssh,可配置好秘钥远程访问,默认配置是 ~/.kube/config。
一些常用的命令:
kubectl get all -A kubectl get namespaces kubectl get svc kubectl get pods kubectl get deployments hello-world # 暴露服务 kubectl expose deployment hello-world --type=NodePort --name=example-service # logs kubectl -n cattle-system logs -l app=cattle-cluster-agent # exec # -c --container kubectl exec -it pod-name -c container-name -- /bin/bash
更多细节日后再慢慢探索,下面总结一下:
k8s专注于容器部署这一块,它不提供镜像打包(CICD),镜像储存(registry),也没有管理平台,更没有service mesh(服务通讯管控)。如果你要落地和完善,还有很多东西需要你去搞。那个rancher平台看起来很美好,但是实际用起来问题挺多,更适合在其上二次开发。其实最靠谱的落地方案还是使用云服务,用钱来解决问题,先小规模用起来,摸熟了再研究其他姿势。
本文想表达的一个思想是:学习一个东西,你应该先搞清楚why(为什么用?有哪些应用场景?别人咋用的?),然后再研究how(怎么用),这样才能抓住重点,学起来事半功倍。