CentOS7.3部署Kubernetes1.10集群及相关基础应用

  1.什么是 Kubernetes?前端

  Kubernetes(一般写成“k8s”)是最开始由google设计开发最后贡献给Cloud Native Computing Foundation的开源容器集群管理项目。它的设计目标是在主机集群之间提供一个可以自动化部署、可拓展、应用容器可运营的平台。Kubernetes一般结合docker容器工具工做,而且整合多个运行着docker容器的主机集群。node

  Kubernetes是近年来最具颠覆性的开源项目,做为一款强大的容器管理工具,在kubernetes的周围一间构建起了一个完整的开源生态链,值得全部人去钻研学习,Kubernetes具备以下几个特色:linux

  ①自动化容器的部署以及控制。nginx

  ②容器规模的动态扩展伸缩(可以根据宿主机自身状况变化,如CPU占用率等)。git

  ③将容器组织成组,构建出一组容器集群,可以提供服务的负载均衡。github

  ④可以对容器进行动态升级,回滚到原版本。算法

  ⑤自带控制台,可以提供Web界面对容器集群进行管理。docker

 

  2.核心概念后端

  Kubernetes采用主从架构的方式进行管理,由Master上的各个组件将所部署的服务,Pod调度到Slave上面,并对其进行管理,监控其健康状态。资源的抽象主要包括:centos

  ①容器组(Pod):由位于统一节点的一个或多个容器组成。由Master进行资源分配,是Kubernetes资源调度的最小单位。

  ②服务(Service):可以经过yaml的方式对所构建的Pod,提供负载均衡,不随Pod的改变而变化,带有惟一的访问标示,如端口,IP,域名。

  ③复制控制器(Replication Controller):负责启动Pod并维护其健康状态,当一个Pod“优雅的”挂掉后,会根据复制控制器从新建立一个相同的Pod,保证Pod的数量。

  ④部署(Deployment):建立Pod,提供了一种更加简单的更新RC和Pod的机制,K8S版本1.2实现的。经过在Deployment中描述所指望的集群状态,Deployment Controller会将如今的集群状态在一个可控的速度下逐步更新成所指望的集群状态。Deployment主要职责一样是为了保证pod的数量和健康,90%的功能与RC彻底同样,能够看作新一代的RC。

 

  Mster节点组成:

  Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。      

  ①APIServer:APIServer负责对外提供RESTful的Kubernetes API服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操做都要交给APIServer处理后再提交给etcd。

  ②kubectl:Kubernetes提供的客户端工具,该工具内部就是对Kubernetes API的调用,是直接和APIServer交互的。      

  ③schedule:scheduler的职责很明确,就是负责调度pod到合适的Node上。若是把scheduler当作一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个pod部署到这个Node上。Kubernetes目前提供了调度算法,可是一样也保留了接口,用户能够根据本身的需求定义本身的调度算法。      

  ④controller manager:若是说APIServer作的是“前台”的工做的话,那controller manager就是负责“后台”的。每一个资源通常都对应有一个控制器,而controller manager就是负责管理这些控制器的。好比咱们经过APIServer建立一个pod,当这个pod建立成功后,APIServer的任务就算完成了。然后面保证Pod的状态始终和咱们预期的同样的重任就由controller manager去保证了。      

  ⑤etcd:etcd是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

 

  Slave节点组成:    

  每一个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime。      

  ①runtime:runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。      

  ②kube-proxy:该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP链接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,而且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者形成影响。另外kube-proxy还支持session affinity。          

  ③kubelet:Kubelet是Master在每一个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上面的全部容器,可是若是容器不是经过Kubernetes建立的,它并不会管理。本质上,它负责使Pod得运行状态与指望的状态一致。


  3.Kubernetes安装

  须要安装的镜像,kube安装包

  连接:https://pan.baidu.com/s/1hE4TTDOXv2Bll6OlfWMDog 密码:wujl


  三台主机,一台master两台node主机

  192.168.175.142 k8s1

  192.168.175.143 k8s2

  192.168.175.144 k8s3

  1.编辑/etc/hosts,保证各个节点可以正确解析

  图片.png

 

  2.保证本机DNS解析可以解析到本身的IP,这是个坑,在kubeadm初始化的时候,要是DNS解析不到本地的话,就会一直超时等待。

  如下两个IP解析的不是本地的DNS,而是vmware的网关,因此须要让虚拟机可以解析到本身

  图片.png

  修改nameserver,指定DNS为本机

  图片.png

  安装dnsmasq

  图片.png

  修改/etc/dnsmasq.conf文件

  图片.png

  重启dnsmasq服务

  重试一次,已经可以解析到自身的地址

  图片.png

 

  3.同步系统时间,关闭selinux,iptables,swap,设置内核参数

  图片.png

  #systemctl stop firewalld //关闭防火墙

  #swapoff on  //关闭swap,由于kubeadm初始化,不支持交换分区开启


  设置内核参数

  图片.png

  sysctl --system //加载内核参数

 

  4.安装docker

  # yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm  -y

  # yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm  -y

  # systemctl start docker && systemctl enable docker

  # systemctl start docker && systemctl enable docker

  导入kubernetes镜像       # 镜像包在网盘中下载  

  图片.png


  5.安装kube软件              # 软件包在网盘中下载    
  # tar -xvf kube-packages-1.10.1.tar
  # cd kube-packages-1.10.1
  # yum -y install local *.rpm
  # systemctl start kubelet && systemctl enable kubelet


  6.统一k8s与docker的驱动

  修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  修改cgroupfs

  图片.png


  7.kubeadm初始化master节点

  # kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16

  注意:版本必需要与安装的kube安装包一致

  初始化正确输出,下面的是用于将node添加到master的命令,须要记住!!要否则只能从新初始化。

  从新初始化,执行如下命令便可

  # kubeadm reset

  图片.png

 

  这个时候直接在node上面执行上述命令就可以将其添加入kubernetes集群当中

  若是之后再root管理kubernetes就直接在root下执行如下命令,否则就切换用户执行

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

  查看各个节点的状态

  #kubectl get node -o wide

  图片.png


  8.部署网络flannel

  只须要在master上执行

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    #版本信息:quay.io/coreos/flannel:v0.9.1-amd64
   

    #kubectl create -f  kube-flannel.yml

    网络部署完成,能够查看到每个节点下都有flannel

    #ip a

    图片.png

  至此kubernetes集群配置完成

 

  4.dashboard配置

  # kubectl apply -f kubernetes-dashboard-http.yaml
  # kubectl apply -f admin-role.yaml
  # kubectl apply -f kubernetes-dashboard-admin.rbac.yaml

  yaml脚本在百度云盘中有

  查看运行状况

  # kubectl get pods --namespace=kube-system

   图片.png

  # kubectl describe svc kubernetes-dashboard --namespace=kebe-system 查看服务状态

  图片.png

  由上图可知dashboard的NodePort为31000,NodePort为对外在虚拟机显示的端口,能够经过该端口访问到dashboard的服务

  效果图以下:

  图片.png

 

  5.kubernetes基本应用

  1.配置单个pod

   配置一个pod,能够经过dashboard上书写yaml文件进行部署,也能够在命令行使用kubectl create建立

   下图为建立nginx Pod的一个简单部署,为了让其可以经过外部直接访问到,因此给他设置了Service负载

均衡,对外显示的NodePort端口为30088,NodePort指定的端口须要在30000-32767之间,这是外部经过

Service方位Pod的一种方式,还有就是Loadbalance。Service是根据Pod的Label标签来判断,那些Pod是

在该服务中,经过Pod的Label与Service的Selector选择器,来选定该服务中的容器组。

  selector:基于资源对象上绑定的标签信息,选择器能够经过指定标签键值对来过滤出一组特定的资源对象。

   图片.png

  Service是定义一系列Pod以及访问这些Pod的策略的一层抽象。Service经过Label找到Pod组。由于Service是抽象的,因此在图表里一般看不到它们的存在,这也就让这一律念更难以理解。
  如今,假定有2个后台Pod,而且定义后台Service的名称为‘backend-service’,lable选择器为(tier=backend, app=myapp)。backend-service 的Service会完成以下两件重要的事情:会为Service建立一个本地集群的DNS入口,所以前端Pod只须要DNS查找主机名为 ‘backend-service’,就可以解析出前端应用程序可用的IP地址。如今前端已经获得了后台服务的IP地址,可是它应该访问2个后台Pod的哪个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(以下面的动画所示)。经过每一个Node上运行的代理(kube-proxy)完成。这里有更多技术细节。

  2.部署Nginx应用(Deployment)

  Deployment须要区别apiVersion以及kind,Deployment部署正如前面所说的是可以成为新一代的Replication Controller而存在的

可以配置Pod集群,保证Pod高可用,并可以进行健康监测,在dashboard上可以较为清晰地了解到。

  replicas: 3 表示开启三个Pod容器组分布在两个Node节点上,当有一个Pod关闭,就会自动建立相同的Pod,保证Pod的数量在3。

还能够根据cpu负载数来调控Pod的数量。

  Label: app 设置标签,标签是一组键值对,用来标记所绑定对象,典型的就是Pod,进而能够分类。

  Deployment部署Nginx的Pod后,再经过Service的NodePort暴露出Pod容器组内服务的80端口在kubernetes对外的访问端口30089

的映射,便于客户端进行访问。

  图片.png

  根据上图yaml文件进行部署以下图,Pod容器组还在建立中,须要一点时间,若建立失败,则能够用

  # kubectl describe svc|pods nginx-service | nginx-deployment 查看详细信息

  图片.png

  部署成功,显示了各个Pod在哪一台node主机上,状态如何,Pod IP是多少

  图片.png

  经过30089端口正常访问:

  图片.png

 


 

  手动down掉一台Pod,立刻就会建立一台相同配置的Pod保证高可用

  图片.png

 Deployment动态扩展

  扩展Pod数为4个

  # kubectl scale deployment nginx-deployment --replicas=4
  缩减Pod数为1个
  # kubectl scale deployment nginx-deployment --replicas=1

  最关键的功能就是能够弹性扩容根据CPU的占用率(须要结合资源限制一同使用),后面会进行实际演示,cpu使用率80%  # kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80

相关文章
相关标签/搜索