中国知网查重 高校在线论文查重入口

立即检测
  • 58 元/篇
    系统说明: 知网职称论文检测AMLC/SMLC是杂志社专用系统,针对投稿论文、评审论文、学校、单位职称论文的学术不端重复率检测系统。
  • 298 元/篇
    系统说明: 知网本科论文检测PMLC是最权威的大学生毕业论文检测系统,含“大学生论文联合对比库”,国内95%以上高校使用。检测结果和学校一致!
  • 498 元/篇
    系统说明: 此系统不支持验证!可用作研究生初稿检测,相比知网VIP5.3缺少“学术论文联合对比库”,检测结果有5%左右的误差!(论文中若参考往届研究生论文,重复率误差会较大)
  • 128 元/篇
    系统说明: 大分解论文检测系统,对于想检测学术不端文献检测系统,而又价格便宜的同学可以选择,限每篇2.9万字符,结果与大学生PMLC、硕博VIP定稿系统有出入!
  • 68 元/篇
    系统说明: 知网论文小分解检测系统,适合中国知网初稿查重,数据库和定稿查重不同。结果与本科PMLC,研究生VIP5.3有出入,限每篇1.4万字符!
  • 3 元/千字
    系统说明: 学术家论文重复率检测系统,支持学位论文、毕业论文、投稿论文、职称评审论文,提供全文对照,word标红报告,性价比超高!
论文技巧案例-基于kubernetes实现企业级高可用集群
时间:2021-05-07 17:27:52

  本设计从实际出发,研究Kubernetes企业级高可用集群详细的部署过程,减少集群部署过程中的不可控因素,从而使kubernetes企业级高可用集群的完成效率和成功率大大增加。达到企业级集群的自动化部署,自动化扩缩容,维护等所需要求。

  以容器领域最著名的软件Docker为例,其可以通过一个配置文件,从而实现一次构建、到处部署,将应用软件安装部署的工作量从N降为1。使得Dev和Ops标准化,让扩展变得简单并且标准并能够快速对出现的异常进行处理,极大地消除给公司带来多服务的额外消耗,从而有利于企业的安全运营。

  在集装箱技术发展的推动下,用于集装箱布局的kubernetes得到了迅速的发展,kubernetes高可用集群的部署已经成为一种流行。Kubernetes集群具有完善的集群管理能力,包括多级安全保护和访问机制、多租户应用支持能力、透明的服务注册和服务发现机制、自建的负载均衡器、故障发现和自修复能力,服务滚动升级和在线扩展,可扩展的资源自动调度机制,多粒度资源配额管理能力。此外,kubernetes还为人们带来了完整的管理工具,包括部署测试、运行维护监控等步骤。kubernetes作为云计算原生计算基金会最重要的成员之一,不仅要提供一个编排系统,更重要的是,它提供了一个规范、一个标准,这样人们就可以轻松地描述集群的体系结构并定义服务的最终状态。Kubernetes可以帮助系统自动达到并保持这种状态。[1]

  Kubernetes集群是一种新兴的高性能计算集群。Kubernetes兼容多种编程语言,它是不依赖编程语言的容器管理平台,可以管理应用生命周期,使应用可以自动伸缩和自愈,实现了更广泛的微服务概念集合。Kubernetes在更底层的平台层面为开发者消除微服务架构的各种问题和挑战。随着微服务架构的流行和Kubernetes软件的不断演进,部署Kubernetes企业级高可用集群的研究与设计具有重要的理论和实际意义。[2]

  1.1设计背景

  综合分析来看,绝大多数人认为在主机流行的时候,人们看重的是单独的服务器的物理性能的好坏。而在现在和未来,云技术迅猛发展的时 范,人们看的很要紧的是依靠虚拟化技术来搭建部署的集群处理的本领。

  kubernetes的出现其实要早于docker。但是也不必感到矛盾,毕竟自20世纪70年 范以来,容器平台一直存在,他们的开发可以追溯到Unix中的chroot系统调用。Docker在2013年左右出现在容器领域,并立即取得了成功。而kubernetes的发展独立于Docker。2003年左右,谷歌创建了Borg系统来应对日益增长的集群管理问题。这是一个内部工具。2014年年中,Google推出kubernetes作为Borg系统的开源版本。微软,红帽,IBM和Docker加入,以支持kubernetes社区。目前看来,主要的市场趋势正在将kubernetes作为一个容器编排解决方案。[3]

  在容器技术的发展带动下,用于容器编排的Kubernetes得到了迅猛的发展,建设Kubernetes企业级高可用集群的需求也日益增长。我们以CentOS操作系统为例,详细介绍了Kubernetes高可用集群部署时的技术要点,将复杂的Kubernetes集群部署流程化,减少Kubernetes集群的部署障碍,便于最新的技术可以被及时地利用到业务中去。[4]

  Kubernetes为面向应用的容器提供了一个容器部署和管理系统目的是首先要消除编排物理/虚拟计算、网络MS网络和存储基础设施的负担,允许应用程序操作员和开发人员充分注意用于自助操作的原始容器。Kubernetes还为构建自定义工作流和更高级的自动化任务提供了一个稳定、兼容的基础或平台。[8]

  Kubernetes是云原生应用来说就是它的中坚力量,差不多是一个云操作系统,有着不可磨灭的重要性。[5]

  1.2设计意义

  对于企业来说,计划搭建Kubernetes高可用集群,能给企业带来意想不到的收益还可以大大节约人力物力财力。Kubernetes让很多容器能在一个主机上运行这件事变得简单和容易。通过部署容器方式实现,让容器和容器之间相互分开,因为各个容器都有自己的文件系统,这样不会影响容器之间的进程,可以分辨处理计算资源。和虚拟机相比,容器可以快速规划和构建。将现在已经具备的条件资源进行最优化利用,减少服务器数量,降低成本。[6]

  容器占用的资源更少,部署也更快。每个应用程序都可以打包到容器映像中。每个应用程序和容器之间的一对一关系也为容器提供了更大的优势。容器可用于在构建或发布阶段为应用程序创建容器映像,因为每个应用程序不需要与应用程序堆栈的其余部分组合,也不依赖于生产环境基础设施,这使得从研发到测试和生产的环境保持一致。容器比虚拟机更轻,更“透明”,更易于监视和管理。

  近年来,随着业务的扩展,在线业务测试的需求越来越频繁,测试过程也越来越复杂。同时,面对项目和环境的增加,人力资源的短缺也导致了这些变化带来的更大压力和反应迟缓。传统的手工方式已经无法应对大型商业集群。经过充分研究,采用kubernetes规划部署集群解决这些问题,真正解放了运维的双手,使业务拓展更加方便。

  第2章系统所需技术介绍

  2.1 Docker简介

  Docker和其他容器技术属于操作系统虚拟化的范畴。操作系统虚拟化的最大特点是不需要额外的主管支持。Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现是分不开的。[7]

  Docker是一个基于go语言的开源容器项目。Docker可以实现“一次封装,无处不在”的应用组件级。docker基于Linux平台上的多种开源技术,提供高效、灵活、轻量级的容器解决方案,支持部署到本地环境和多种主流云平台。[8]

  云的时 范正在悄然来临。研究人员开发的应用程序必须能够在网络上快速、方便地传播并被采用,也就是说,应用程序必须不受底层物理硬件的限制;同时,它们必须“在任何时间、任何地点”可用。因此,开发人员需要一种新的方式来创建分布式应用程序,这是docker所能提供的最大优势。Docker提供了一种更智能的方式来打包应用程序、分离应用程序并通过容器运行平台。这有助于我们节省大量宝贵的时间,并降低部署过程中出现问题的风险。[9]

  在开发和运行维护过程中,docker的交付和部署速度更快,资源利用效率更高,迁移和扩展更容易,更新管理更简单。

  与虚拟机相比,docker作为一种轻量级的虚拟化模式,与传统的虚拟机模式相比,在运行应用程序方面具有以下显著的优势:docker容器速度非常快,启动和停止可以在几秒钟内实现,比传统的虚拟机模式快得多;docker容器对系统资源的需求很少,成千上万的Docker可以同时在一台主机上运行,Docker通过dockerfile支持灵活的自动创建和部署机制,提高工作效率,规范流程。[10]

  2.2 kubernetes简介

  Kubernetes是一个完整的分布式系统支持平台。Kubernetes具有完整的集群管理能力,包括多级安全保护和访问机制/多租户应用支持能力、透明的服务注册和服务发现机制、内置智能负载均衡器、强大的故障发现和自修复功能,服务滚动升级和在线扩容能力,可扩展的资源自动调度机制,多粒度资源配额管理能力。同时,kubernetes提供了完善的管理工具,涵盖了开发、测试部署、运行维护监控等各个方面,是一种基于容器技术的新型分布式体系结构解决方案,是一个一站式完整的分布式系统开发和支持平台。[4]

  Kubernetes主要由以下几个核心组件组成:etcd保存了整个集群的状态;apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;kubelet负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理;Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);kube-proxy负责为Service提供cluster内部的服务发现和负载均衡。[5]

  除了核心组件,还有一些推荐的Add-ons:kube-dns负责为整个集群提供DNS服务Ingress;Controller为服务提供外网入口;Heapster提供资源监控Dashboard提供GUI;Federation提供跨可用区的集群。

  放眼望去,在容器云技术的发展趋势中,从Kubernetes的问世到发展到今天,整个技术大环境和生态都发生了很大的变化,这其中有些变化不可避免的影响着我们身处其中的每一个人。Kubernetes在2017年底成为容器编排领域的实施标准,之后围绕着kubernetes的生态持续爆发,正占领着潜力巨大的市场。以下是CNCF测量容器管理市场的报告:

  图2-1调研报告

  拥有5000多名员工的公司中,有40%的公司使用kubernetes。Kubernetes在开发人员中非常流行。因此,在企业中应用kubernetes是非常必要的。

  第3章系统的设计与实现

  3.1设计可行性分析

  经济可行性:这个设计主要是做的是在校设计基于kubernetes实现企业级高可用集群的目标,不需要关注经济效益,主要看自身系统的功能。需要一台配置尽量高的电脑,方便系统的设计。

  技术可行性:docker技术和kubernetes技术满足了此次设计的要求,可以完美的结合,保证系统的技术可行性。

  运行可行性:该系统的运行需要安装VMware软件,为该系统的运行可行性作了保障。

  3.2系统的特点

  Kubernetes有以下特点:

  可移植性:该系统支持公有云,私有云,混合云,多重云的简单便宜移植。

  可扩展性:本系统有模块化,插件化,可挂载,可组合的特点。

  自动化:该系统可以自动部署,自动重启,自动复制,自动伸缩或者扩展。

  Kubernetes近一段时间的发展侧重稳定性、可扩展性、安全性。而在核心策略的变化上越来越小,越来越少。同时,kubernetes周边生态的二次创新正在高速发展,这也让kubernetes有了更多的应用场景,可以服务于更多的行业。

  3.3系统的功能需求

  经过查阅资料和分析,设计的系统要可以实现各类业务的快速迁移,快速扩展。实现无缝对接的应用功能。来达到节省资源,优化硬件资源的使用等的目的。

  本次设计中涉及了一种迁移实例。[8]

  3.4实践的准备环境

  该系统需要在支持虚拟化的环境中运行,本次设计中采用的是虚拟机VMwarePro15.5版本。除此之外,还用到了Xshell,它可以同时在一个界面中打开多个窗口,进行多个会话,给设计过程带来了便利。

  图3-1集群

  环境设置要求:

  操作系统centos7.6

  Kubernetes(v1.11.0)

  Etcd 3.2.18

  Docker 17.03

  Calico 3.1.3

  五台虚拟机内存都为40G,内核大于等于2,处理器大于等于2,虚拟机模式为仅主机模式。

  3.5系统设置

  3.5.1设置主机名

  必须保证每个节点的名称都不一样且所有节点之间可以通过hostname互相访问。

  #查看主机名

  $hostname

  #修改主机名

  $hostnamectl set-hostname m1-20.1-sheji.cn

  $hostnamectl set-hostname m2-20.2-sheji.cn

  $hostnamectl set-hostname m3-20.3-sheji.cn

  $hostnamectl set-hostname w1-20.20-sheji.cn

  $hostnamectl set-hostname w2-20.21-sheji.cn

  #配置host,使主节点之间可以通过hostname互相访问

  $vi/etc/hosts

  10.155.20.1 m1-20.1-sheji.cn

  10.155.20.2 m2-20.2-sheji.cn

  10.155.20.3 m3-20.3-sheji.cn

  10.155.20.1 w1-20.20-sheji.cn

  10.155.20.1 w2-20.21-sheji.cn

  3.5.2安装依赖包

  #更新yum

  $yum update

  #安装依赖包

  $yum install-y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

  3.5.3关闭防火墙、swap,重置iptables

  #关闭防火墙

  $systemctl stop firewalld&&systemctl disable firewalld

  #重置iptables

  $iptables-F&&iptables-X&&iptables-F-t nat&&iptables-X-t nat&&iptables-P FORWARD ACCEPT

  #关闭swap

  $swapoff-a

  $sed-i'/swap/s/^(.*)$/#1/g'/etc/fstab

  #关闭selinux

  $setenforce 0

  #关闭dnsmasq(否则可能导致docker容器无法解析域名)

  $service dnsmasq stop&&systemctl disable dnsmasq

  3.5.4系统参数设置

  #制作配置文件

  $cat>/etc/sysctl.d/kubernetes.conf<<EOF

  net.bridge.bridge-nf-call-iptables=1

  net.bridge.bridge-nf-call-ip6tables=1

  net.ipv4.ip_forward=1

  vm.swappiness=0

  vm.overcommit_memory=1

  vm.panic_on_oom=0

  fs.inotify.max_user_watches=89100

  EOF

  #生效文件

  $sysctl-p/etc/sysctl.d/kubernetes.conf

  第一次没有成功,执行下面的命令就成功了。

  modprobe br_netfilter

  3.5.5安装docker(worker节点)

  先创建一个目录

  $mkdir-p/opt/kubernetes/docker&&cd/opt/kubernetes/docker

  $yum-config-manager--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum makecache

  $yum install docker-ce-y

  #清理原有版本

  $yum remove-y docker*container-selinux

  #开机启动

  $systemctl enable docker

  #设置参数

  #查看磁盘挂载

  $df-h

  #2.选择比较大的分区

  $mkdir-p/较大分区的目录/docker-data

  $cat<<EOF>/etc/docker/daemon.json

  {

  "graph":"/较大分区的目录/docker-data"

  }

  EOF

  #启动docker服务

  service docker restart

  4.安装必要工具(所有节点)

  3.5.6工具说明

  kubeadm:部署集群用的命令

  kubelet:在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期

  kubectl:集群管理工具

  3.5.7安装方法(非科学上网)

  需要把yum源改成阿里云的镜像

  #配置yum源

  $cat<<E0F>/etc/yum.repos.d/kubernetes.repo

  [kubernetes]

  name=Kubernetes

  baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

  enabled=1

  gpgcheck=0

  repo_gpgcheck=0

  gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

  https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

  #安装工具

  yum install-y kubelet kubeadm kubectl--disableexcludes=kubernetes

  #启动kubelet

  systemctl enable kubelet&&systemctl start kubelet

  3.5.8下载配置文件

  Xshell作为中间节点,建立一个目录

  #mkdir kubernetes

  #cd kubernetes/

  在这个目录里做所有关于kubernetes的东西,先把项目克隆下来

  #$git clone https://gitee.com/pa/kubernetes-ha-binary.git

  #看看git内容

  $ls-l kubernetes-ha-binary

  addons/

  configs/

  pki/

  services/

  init.sh

  global-configs.properties

  3.5.9文件说明

  addons:

  kubernetes的插件目录,包括calico、coredns、dashboard等。

  configs:

  包含了部署集群过程中用到的各种配置文件。

  script:

  包含了部署集群过程中用到的脚本,比如下载镜像脚本、keepalive检查脚本等。

  global-configs.properties:

  全局配置,包含各种易变的配置内容。

  init.sh

  初始化脚本,配置好global-config之后,会自动生成所有配置文件。

  3.5.10生成配置

  不同的环境需要不同的配置文件来生成kubernetes部署过程。要在每个节点上生成所有配置,稍后将根据节点类型使用相关配置。

  #cd到之前下载的git 范码目录

  $cd kubernetes-ha-binary

  #编辑属性配置(根据文件注释中的说明填写好每个key-value)

  $vi global-config.properties

  #生成配置文件,确保执行过程没有异常信息

  $./init.sh

  #查看生成的配置文件,确保脚本执行成功

  $find target/-type f

  3.6搭建高可用集群

  3.6.1部署keepalived-apiserver高可用(任选两个master节点)

  安装keepalived

  #在两个主节点上安装keepalived(一主一备)

  $yum install-y keepalived

  创建keepalived配置文件

  #创建目录

  $ssh<user> <master-ip>"mkdir-p/etc/keepalived"

  $ssh<user> <backup-ip>"mkdir-p/etc/keepalived"

  #分发配置文件

  $scp target/configs/keepalived-master.conf<user> <master-ip>:/etc/keepalived/keepalived.conf

  $scp target/configs/keepalived-backup.conf<user> <backup-ip>:/etc/keepa lived/keepa lived.conf

  #分发监测脚本

  $scp target/scripts/check-apiserver.sh<user> <master-ip>:/etc/keepalived/

  $scp target/scripts/check-apiserver.sh<user> <backup-ip>:/etc/keepalived/

  启动keepalived

  #分别在master和backup上启动服务

  $systemctl enable keepalived&&service keepalived start

  #检查状态

  $service keepalived status

  #查看日志

  $journalctl-f-u keepalived

  #查看虚拟ip

  $ip a

  3.6.2部署第一个主节点

  #准备配置文件

  $scp target/<node-ip>/kubeadm-config.yaml<user> <node-ip>:~

  #ssh到第一个主节点,执行kubeadm初始化系统(注意保存最后打印的加入集群的命令)

  $kubeadm init--config~/kubeadm-config.yaml

  #配置kubectl

  $mkdir-p~/.kube

  $mv/etc/kubernetes/admin.conf~/.kube/config

  #测试

  $kubectl get pods--all-namespaces

  3.6.3 copy相关配置

  #copy证书和秘钥

  其他节点需要用到的证书文件列表:/etc/kubernetes/pki/ca.crt/etc/kubernetes/pki/ca.key/etc/kubernetes/pki/sa.key

  /etc/kubernetes/pki/sa.pub/etc/kubernetes/pki/front-proxy-ca crt/etc/kubernetes/pki/front-proxy-ca.key

  /etc/kubernetes/pki/etcd/ca.crt/etc/kubernetes/pki/etcd/ca.key/etc/kubernetes/admin.conf

  #在中转节点把文件copy回来

  $scp-r<user> <node-ip>:/etc/kubernetes/pki

  $scp<user> <node-ip>:/etc/kubernetes/admin.conf

  #删除多余的文件

  $cd pki

  $rm-f apiserver*

  $rm-f front-proxy-client.*

  $rm-f etcd/healthcheck-client.*etcd/peer.*etcd/server.*

  #分别copy到另外两个master节点

  $scp-r pki<user> <node-ip>:/etc/kubernetes/

  $scp admin.conf<user> <node-ip>:/etc/kubernetes/

  3.2 copy kubeadm-config

  #copy kubeadm-config.yaml到另外两个节点

  $scp target/<node-ip>/kubeadm-config.yaml<user> <node-ip>:~

  3.6.4部署第二个master节点

  #上传生成的初始化脚本

  $scp target/scripts/init-master-second.sh<user> <node-ip>:~

  #在第二个master节点上执行初始化脚本

  $sh init-master-second.sh

  #查看节点运行情况

  $netstat-ntlp

  $docker ps

  $journalctl-f

  #配置kubectl(可选)

  $mkdir-p~/.kube

  $mv/etc/kubernetes/admin.conf~/.kube/config

  3.6.5部署第三个master节点

  #上传生成的初始化脚本

  $scp target/scripts/init-master-thrid.sh<user> <node-ip>:~

  #在第三个master.上抉行初始化脚本

  $sh init-master-thrid.sh

  #查看节点运行情况

  $netstat-ntlp

  $docker ps

  $journalctl-f

  #配置kubectl(可选)

  $mkdir-p~/.kube

  $mv/etc/kubernetes/admin.conf~/.kube/config

  3.6.6部署网络插件-calico

  我们使用calico官万的安装方式来部署。

  #创建目录(在配置了kubectl的节点上执行)

  $mkdir-p/etc/kubernetes/addons

  #上传calico配置到配置好kubectl的节点(一个节点即可)

  $scp target/addons/calico*<user> <node-ip>:/etc/kubernetes/addons/

  #部署calico

  $kubectl create-f/etc/kubernetes/addons/calico-rbac-kdd.yaml

  $kubectl create-f/etc/kubernetes/addons/calico.yaml

  #查看状态

  $kubectl get pods-n kube-system

  3.6.7加入worker节点

  #使用之前保存的join命令加入集群

  $kubeadm join 172.18.41.14:6443--token xxxxx.xxxxxxxx--discovery-token-ca-cert-hash sha256:22a5c373835787:

  #耐心等待一会儿,并观察日志

  $journalctl-f

  #查看集群状态

  #查看节点

  $kubectl get nodes

  #查看pods

  $kubectl get pods--all-namespaces

  3.7集群的可用性测试

  3.7.1创建nginx ds

  #写入配置

  $cat>nginx-ds.yml<<EOF

  apiVersion:v1

  kind:Service

  metadata:

  name:nginx-ds

  labels:

  app:nginx-ds

  spec:

  type:NodePort

  selector:

  app:nginx-ds

  ports:

  -name:http

  port:80

  targetPort:80

  ---

  apiVersion:extensions/v1beta1

  kind:DaemonSet

  metadata:

  name:nginx-ds

  labels:

  addonmanager.kubernetes.io/mode:Reconcile

  spec:

  template:

  metadata:

  labels:

  app:nginx-ds

  spec:

  containers:

  -name:my-nginx

  image:nginx:1.7.9

  ports:

  -containerPort:80

  EOF

  #创建ds

  $kubectl create-f nginx-ds.yml

  3.7.2检查各种ip连通性

  #检查各Node上的Pod IP连通性(主节点没有calico所以不能访问podip)

  $kubectl get pods-o wide

  #在每个worker节点上ping pod ip

  $ping<pod-ip>

  #检查service可达性

  $kubectl get svc

  #在每个worker节点上访问服务(主节点没有proxy所以不能访问service-ip)

  $curl<service-ip>:<port>

  #在每个节点检查node-port可用性

  $curl<node-ip>:<port>

  3.7.3检查dns可用性

  #创建一个nginx pod

  $cat>pod-nginx.yaml<<EOF

  apiVersion:v1

  kind:Pod

  metadata:

  name:nginx

  spec:

  containers:

  -name:nginx

  image:nginx:1.7.9

  ports:

  -containerPort:80

  EOF

  #创建pod

  $kubectl create-f pod-nginx.yaml

  #进入pod,查看dns

  $kubectl exec nginx-i-t--/bin/bash

  #查看dns配置

  root nginx:/#cat/etc/resolv.conf

  #查看名字是否可以正确解析

  root nginx:/#ping nginx-ds

  root nginx:/#ping kubernetes

  3.8部署dashboard

  3.8.1部署dashboard

  #上传dashboard配置

  $scp target/addons/dashboard-all.yaml<user> <node-ip>:/etc/kubernetes/addons/

  #创建服务

  $kubectl apply-f/etc/kubernetes/addons/dashboard-all.yaml

  #查看服务运行情况

  $kubectl get deployment kubernetes-dashboard-n kube-system

  $kubectl--namespace kube-system get pods-o wide

  $kubectl get services kubernetes-dashboard-n kube-system

  $netstat-ntlp|grep 8401

  3.8.2访问dashboard

  为了集群安全,我们使用nodeport的方式暴露服务,可以使用https://NodeIP:NodePort地址访问关于自定义证书默认dashboard的证书是自动生成的,肯定是非安全的证书,如果大家有域名和对应的安全证书可以自己替换掉。使用安全的域名方式访问dashboard。在dashboard-all.yaml中增加dashboard启动参数,可以指定证书文件,其中证书文件是通过secret注进来的。

  -–tls-cert-file-dashboard.cer-–tls-key-file-dashboard.key

  3.8.3登录dashboard

  Dashboard默认只支持token认证,所以如果使用KubeConfig文件,需要在该文件中指定token,我们这里使用token的方式登录

  #创建service account

  $kubectl create sa dashboard-admin-n kube-system

  #创建角色绑定关系

  $kubectl create clusterrolebinding dashboard-admin--clusterrole=cluster-admin--serviceaccount=kube-system:dashboard-admin

  #查看dashboard-admin的secret名字

  $ADMIN_SECRET=$(kubectl get secrets-n kube-system|grep dashboard-admin|awk'{print$1}')

  #打印secret的token

  $kubectl describe secret-n kube-system${ADMIN_SECRET}|grep-E'^token'|awk'{print$2}'

  演示都在10.155.20.1和10.155.20.20以及10.155.20.21上进行。

  对于一个企业来说,kubernetes企业集群已经搭建好了,接着就可以迁移业务了。把原来在虚拟机上或者实体机上运行的服务,这些服务给它进行一下docker化,让kubernetes给它管理起来。在迁移之前有很多准备工作要做。

  首先,把服务docker化之后他会有许多的镜像,需要一个地方去管理这些镜像,其中包括镜像的存储、拉取。也就是说,要有一个docker registry,而阿里和网易的仓库速度比较慢,所以我们需要一个私有的仓库。本次采用的是业内常用的方案叫做Harbor(VMware开源出来的一个douker仓库,功能比较全。)

  对于一个公司来说要搭建的kubernetes集群已经准备好了。

  第4章harbor镜像仓库的搭建

  Harbor架构设计:

  图4-1 harbor构建

  采用的是离线安装的方式,在官网下载,采用的是v1.6.0版本,用的双主复制。在harborA和harborB之间挂一个nginx作负载均衡,让它既可以请求到harborA也可以请求到harborB,因为镜像在harborA和harborB上都有,所以假如一个点挂掉之后还可以用另外一个点,保证了数据的安全。

  harbor双主复制的高可用在两个worker节点上下载安装,安装完成之后在master节点上部署一个nginx。

  编辑配置文件harbor.cfg,将hostname改为每个节点所对应的主机的IP地址,不用域名是为了防止有相同的名称出现的时候DNS解析不到对应的节点去。

  然后再编辑一个docker-compose.yml,将存储镜像的目录挂载到有最大存储空间的磁盘中去。

  在另外一个节点上部署nginx,用docker部署

  编写配置文件nginx.conf:

  user nginx;

  worker_processes 1;

  error_log/var/log/nginx/error.log warn;

  pid/var/run/nginx.pid;

  events{

  worker_connections 1024;

  }

  stream{

  upstream hub{

  server 10.155.20.1:80;

  }

  server{

  listen 80;

  proxy_pass hub;

  proxy_timeout 300s;

  proxy_connect_ timeout 5s;

  }

  }

  Harbor仓库搭建完成后如图所示:

  图4-2 harbor成功1

  图4-3 harbor成功2

  可以由此添加镜像:

  图4-4 harbor添加镜像

  第5章基于kubernetes实现企业级高可用集群

  5.1 kubernetes的服务发现

  三种方式:

  1、集群内部(1.1、DNS+ClusterIP方式;1.2、Headless方式)

  2、集群内访问集群外部(2.1、IP+Port;2.2、OutService)

  3、集群外访问集群内部(3.1、NodePort;3.2、hostport;3.3、Ingress)

  图5-1访问结构示意

  5.2部署ingress-nginx

  域名访问方案:域名访问需求是每个公司都需有的,所以要使集群具备该能力。选择的是比较主流的方案ingress-nginx,从而使集群具备ingress服务发现能力。

  Ingress是在外部网络和集群内部服务之间打通了一个接口,可以通过ingress来访问集群内部的服务,包括负载均衡、ssl的支持等等。

  入口控制器本身实际上是一个监视器。入口控制器通过与kubernetes API的连续交互,实时感知后端服务和节点的变化,如新节点的增加和减少、服务的增加和减少等,获得这些变化后,入口控制器结合以下内容生成配置入口,然后更新反向 范理负载平衡器,并刷新其配置以实现服务发现的角色。

  总之,当添加新的服务时,域名和服务的相应问题通过ingress来解决。通过yaml创建和更新以加载ingress对象。

  5.3业务迁移之定时业务的迁移

  每个企业都有自己的业务场景,本次设计中设计到了其中两种业务的迁移。虽然每个业务每个项目都有自己具体的业务逻辑,但是项目在相同的结构上,在docker化和kubernetes迁移过程中过程都是大同小异的。

  把服务运行到kubernetes中,需要下面的步骤:

  图5-2架构流程

  因为程序是一个java程序,所以从https://hub.docker.com/搜索java找到jre文件。然后到master上把镜像下载下来,接着给它打一个标签,让它进入到我们自己的仓库里面,以便后续使用。在网上找到源码地址把它克隆到master节点上,进到项目里,接下来用maven打包,运行文件检查是否可以正常运行。构建镜像:把程序加到基础镜像里,键入相关参数。测试镜像没有问题,把构建好的镜像加入到仓库里面。

  确定发现服务的策略然后编写kubernetes文件

  图5-3 kubernetes文件

  #启动运行

  #kubectl apply-f cronjob.yaml

  #查看cornjob

  #kubectl get cronjob

  #查看在哪个节点上运行成功

  #kubectl get pods-o wide

  #查看到之后进入相应节点去看是否在运行

  #docker ps|grep corejob

  如果没有运行执行#docker ps–a|grep corejob

  检查日志看是否正常运行#docker logs文件名称

  至此,该程序就可以在kubernetes上成功运行了。

  5.4 kubernetes与cicd

  ci持续集成,cd持续部署。由于每个企业都有自己的组织架构,自己的业务特征,所以在cicd的过程中一定有很多个性化的东西。Cicd早在kubernetes之前已经有了很久的历史,发展的同时也催生了许多成熟的工具。