二进制安装k8s集群(1)-开篇

本篇文章是一个系列,介绍如何用binary的方式手动安装k8s集群,目的是来更好的理解学习k8s。以学习和理解为目的,所以这里的每个组件都是一步一步手动来安装,以便有实践和理解。对于生产环境,如果host在自己的data center里,那么请专业的infrastructure架构师和devops团队来搭建生产级别的集群。如果是在公有云(AWS/GCP/Azure/阿里云/腾讯云)上搭建生产环境,请仔细阅读相关文档,不清楚的问题及时提交工单。

k8s集群安装的方式有很多,可以基于kubeadmin工具来创建与安装,也可以一个组件一个组件的安装。如果是公有云上环境可以基于console UI或者command line的方式创建与安装。上面所说,这里主要是学习的目的,所以采用二进制手动一个组件一个组件的安装。不论以任何方式创建k8s集群都会考虑如下一些条目。

  1. 容器:容器目前基本都是docker了,当然容器不仅仅只有docker。容器的实现也有很多,比方说podman(据说centos-8/redhat-8会预装),还有pivotal公司的商业化容器等(用在其pivotal cloud foundry pass里)。当然容器实现的大致原理不在这里细说,有兴趣的同学可以研究一下linux namespace/cgroup/ufs,就会对容器大致原理有所了解和认识。
  2. K8s基础组件:存储组件etcd,master组件api-server,controller-manager,kube-scheduler,worker组件kubelet,kube-proxy,客户端工具kubectl。
  3. 容器之间网络通讯:容器之间的网络通讯总结起来基本分为两种,underlay方式和overlay方式。underlay方式在通讯过程中没有额外的封包,通常将容器的宿主作为路由来实现数据包的转发。常见的实现方案有flannel host-gw方式,calico bgp方式。 overlay方式在通讯过程中有额外的封包,例如flannel vxlan方式(在三层网络里构建二层网络,即在udp包里封装eth以太包),calico ipip模式(在ip包里再次封装ip包)。还有flannel udp方式,在upd包里封装ip包(当然这种方式使用tun device,每次通讯都涉及到用户态到内核态的切换,所以效率不高,基本是不会被用的。不过作为学习入手是可以的)。 另外除了flannel和calico方案之外还有weave,ovs等方案,k8s自己并没有定义网络方案。毕竟网络实现会有多种情况,不同场景的复杂度也不尽相同,也不好一下子定死。感觉k8s把网络方案开放出来由不同的社区实现也是比较好的选择,一来出现了不同的k8s网络方案,不是一家独大,有利于技术和社区发展,二来也让使用者根据自己的实际情况有不同的选择。 对于这块感兴趣的同学可以多了解下linux bridge,veth-pair,route-table,arp-table,iptable,nat,fdb,tun&tap device,ipip-tunnel,vxlan,bgp protocol,l2-miss,l3-miss等基础知识,k8s的网络方案都是在这些基础知识上构建起来的。这里就不展开细节,扩展起来也可以写一个系列了。
  4. 镜像image的仓库:用来存储image的repo,目前选择有harbor(vmware开源的),nexus(这个就不用说了吧),不过harbor是专门做image repo的,nexus是支持了image repo。当然了如果是自建的private repo还要考虑volume和house-keeping(总不能放着一直不管吧)。开源方案短期可以考虑nsf挂载volume,长期可以用ceph集群挂载volume,当然有钱的话可以用nas。
  5. 容器的dns:容器之间通讯当然是用fqdn的了(容器是动态创建和销毁的,ip地址一定会变,不可能用ip。再说ip那么难记,也不方便用),既然有fqdn,那么一定就有dns服务了。从k8s各个版本来看,有过不同的dns,例如最早的sky-dns,到后来的kube-dns,到现在最新的coredns等。
  6. 可视化dashboard:一般用来把k8s集群中的资源以UI console的形式呈现出来,以及提供一些对资源的基础操作,这个一般是由kube-dashboard来实现。
  7. 外部访问容器提供的服务:服务部署到集群里肯定是需要从集群外部来调用的(有点废话,不被外部调用难道只在里面相互调用自嗨么)。一般有node port方式,ingress方式,公有云的环境里不同的厂商还提供不同的load balancer方式。当然node port方式在service里定义一下type和port就好,load balancer方式有兴趣的同学可以查看一下不同公有云厂商提供的doc。对于ingress来说,目前用的比较多的是nginx-ingress,traefik ingress,haproxy ingress。
  8. 镜像的release发布管理:有了镜像需要发布部署到集群里,可以用最原始的命令,不过比较费劲。当然目前已经有工具helm,这样我们就方便很多。helm也包括了client,tiller server还有charts repo(存放k8s application package)。
  9. 持久化存储:一般k8s里的应用都是无状态的,不过也避免不了存储数据。k8s提供给我们persistent volume机制。当然底层我们可以用nfs,ceph,nas等存储。
  10. 监控与预警:任何应用肯定是需要监控和预警的,对于k8s里方案也比较多。例如prometheus+grafana,telegraf+grafana+influxdb等等,这也是一个非常大的话题,暂时不在这里展开,扩展起来足足可以有一个系列。
  11. 日志的收集:日志的收集总结起来也基本有两种方式,sidecar方式和daemonset方式。sidecar方式需要在每一个pod里部署一个日志收集的agent,而daemonset方式需要在集群里部署日志收集agent的daemonset,就不需要每个pod里都有日志收集agent的container。当然日志收集方案也比较多,filebeat/fluentd/logstash(logstash比较重,一般不太用)为agent,es为存储,kabina为视图(ELK/EFK)。有钱也可以选择splunk,当然它可不仅仅是提供日志收集和搜索的功能。

对于本次安装我们用的组件如下:

  • ssl证书:各个组件之间的通讯开启ssl,我们不暴力关闭防火墙。
  • 容器:docker(18.09.6版本)
  • etcd:3.3.11版本
  • kubectl:1.15.1版本
  • kube-apiserver:1.15.1版本
  • kube-controller-manager:1.15.1版本
  • kube-scheduler:1.15.1版本
  • kubelet:1.15.1版本
  • kube-proxy:1.15.1版本
  • kubectl-debug:0.1.1本版(非k8s官方工具,主要用来方便调试pod。当你遇到一个pod里什么工具top/nslookup/ps/netstat/tcpdump等都没有,是没法调试的。当然从制作image的角度来说确实是不应该把和应用无关的items放到image里的,可是没有这些工具想要调试也是臣妾做不到啊,kubectl-debug就是为了解决这个问题的)
  • pod网络通讯:使用flannel(0.10.0版本)的host-gw方式(注意此方式要求所有的宿主host必须在同一个大二层网络里,换句话说也就是所有host不能跨ip网段)。
  • 镜像image的仓库:使用harbor(1.8.1版本),存储用nfs挂载。当然harbor依赖docker-compose,所以也会用到docker-compose(1.24.1版本)
  • 容器dns:使用coredns,部署在集群里,原始image为 k8s.gcr.io/coredns:1.3.1
  • dashboard:使用kube-dashboard,部署在集群里,原始image为k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
  • ingress外部访问容器:使用nginx-ingress,部署在集群里,原始镜像quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1
  • 示例:部署nginx应用作为example application
  • image release发布工具: a):helm client(2.14.3版本) b):tiller server(2.14.3版本,部署在集群里) c):chartmuseum(0.9.0版本,作为private charts repo) d):helmpush(0.7.1版本,用于把k8s应用package推送到priavte charts repo chartmuseum里)

环境介绍

  1. OS:oracle virtual box, centos-7
  2. Master:1台vm,172.20.11.41 (当然这里没有做master的HA,有兴趣的同学可以看一下nginx/haproxy + keepalived)
  3. Worker:2台vm 172.20.11.42/172.20.11.43
  4. Master 安装:
  • docker
  • etcd
  • flannel
  • kubectl
  • kube-apiserver
  • kube-scheduler
  • kube-controller-manager
  • kubectl-debug
  • docker-componse
  • harbor
  • nfs client
  • helm
  • chartmuseum
  • helmpush

5. Worker 安装:

  • docker
  • etcd
  • flannel
  • kubelet
  • kube-proxy
  • nfs-server(安装在172.20.11.43)

6. 集群中的基础服务安装:

  • coredns
  • kube-dashboard
  • nginx-ingress
  • tiller-server

目前先写到这里,在下一篇文章里我们开始介绍制作ssl证书。