Kubernetes介绍及使用

一. Kubernetes简介

  Kubernetes(简称K8s)是以Google Borg为原型重新设计和实现的基于容器技术的容器管理和编排调度工具,它支持自己部署,大规模可伸缩,可应用容器化管理,和docker公司的swarm和Apache的Mesos项目一样,2014年由Google开源。

  2015年,谷歌将Kubernetes捐赠给Linux基金会下属的云原生计算基金会(CNCF)。

  2018年初CNCF宣布Kubernetes正式毕业,标志着Kubernetes项目的成熟并可以用于生产环境使用。

  Kubernetes最终使命是成为云计算新一代应用上的云的首选平台。

  官网:https://kubernetes.io/

   

 

             官网上面也有Kubernetes基本介绍

  Borg和Kubernetes

    在Kubernetes之前谷歌公司就有了10多年使用大规模容器管理使用经验,这些经验就是来源于谷歌内部Borg系统的使用。Borg是一个比较顶层的集成管理系统,它功能就是负责谷歌内部很多服务的调度和管理,在它上面跑了谷歌大部分的应用程序,框架包括Gmail、Google Docs、Web Search等这样直接面对客户的一些应用程序,这些应用程序都需要通过它来管理底层的这些物理机。

    Borg的特点

       1. 隐藏的资源管理和故障处理的细节,让用户不用关心资源管理的问题,不用操心底层的系统是怎么操作的(运行在Borg的程序,就算挂了也会被启动起来,可以专注自己的业务

       2. Borg一个典型的分布式平台的架构,可以提供高可靠性和高可用性的操作,并支持应用程序做到高可靠高可用。

       3. Borg可以在数以万计的机器上高资源利用率运行,就是可以将资源最大化的利用。

    

     图片来源:https://imgedu.lagou.com/ca6e2b48f7a64829aea24d788349e01b.jpg

     

     Kubernetes设计思想就是源自于Google Borg系统,例如Kubernetes继承了Borg项目中集群管理的理念。Kubernetes如今的成功是离不开Google Borg这么多年的使用经验积累。

     为什么使用Kubernetes

      1. Google业内最成熟容器编排技术管理经验的输出。包括先进的Workload管理经验模型:Pod和Controllers。

      2. 2017年战胜Docker Swam和Apache Mesos,成为云原生应用首选容器编排管理平台。

      3. 传统云平台提供商Google k8s engine,Red Hat的OpenShift,Microsoft的Azure container service,IBM的cloud container service全面支持。

 

二. Kubernetes能做什么

  1. 容器自动化部署和复制,随时扩展或者收缩容器规模(资源配额和分配管理),并提供负载均衡。比如当某个容器内存使用不够,会自动扩展出一个副本出来。当多个副本提供服务的时候,能够保证负载均衡。

  2. 健康检查,自愈,容器滚动升级。

  3. 提供容器弹性,方便容器替换,比如有容器失效了Kubernetes就可以很容易将损害的容器从集群中替换掉。

  4. 将容器组织成组,并且提供容器间的负载均衡。

  5. 方便测试。可以将测试服务器集中化,自动化管理。可分配资源将各种平台的服务器加入集群,按需部署或者销毁。

  6. 持续集成时候方便对应用部署。

  7. 提供了对微服务的支撑 ,包括服务发现,服务编排,内部路由支持,服务快速部署,自动负载均衡等。

  8. 面向云原生可移植的新"云平台"。

   总的来说Kubernetes是来可以动态的利用策略解决集群中资源调度,管理及监控等问题。

 

三. Kubernetes核心概念及架构设计

  

 

                 Kubernetes总体架构图

 

   Kubernetes基本概念:

    1. Cluster(集群):

      Kubernetes作为一个服务调度平台,需要资源/机器等资源才可以进行调度,所以是Kubernetes一个集群架构,Kubernetes可以利用集群上的资源运行各种基于容器的应用。下面这篇文章就是说Kubernetes Cluster:https://www.redhat.com/en/topics/containers/what-is-a-kubernetes-cluster

      

 

    Master node是主服务器,Work node是用于部署应用容器的服务器。

      

      

      Master节点

        上图中间六边形就是Master节点。Master是Cluster 的大脑,是控制整个Kubernetes集群的核心,它的主要职责是调度,即决定将应用放在哪里运行。运行着如下一系列Daemon服务:

          1. Api Server:

           k8s集群的接口和通讯总线,用户通过kubectl,dashboard,sdks等操作k8s都是通过Api Server来与集群进行交互的。Api Server也可以作为一个订阅事件总线,其它外围组件可以订阅在Api Server上,当有新的事件发生,Api Server可以将相关的事件来通知这些外围组件。

          2. Scheduler:

           负责Kubernetes集群调度和决策,掌握当前集群资源等使用情况。当有新的应用发布到Kubernetes集群中,Scheduler负责决策相应的Pod应该分不到哪些空闲的节点上。Kubernetes上的调度决策算法是可以进行扩展。

          3. Controller Manager:

           保证集群状态最终一致。通过Api Server来监控集群的状态,比如果然一个应用需要10个Pod,那么Controller会保证实际就会启动10个Pod,如果其中有一个Pod挂了,Controller Manager会协调重新启动Pod,如果启动多了,Controller Manager也会协调关闭多余的Pod。

           Controller Manager是集群实现自愈的机制。

          4. etcd:

            负责Kubernetes集群状态,节点数据,配置等信息的存储。可以独立部署,也可以和master部署在一起,etcd被Api Server来操作 。etcd部署一般需要三个节点来保证高可用。

          5. Pod网络。

          

 

                          Master节点组成部分

 

        Work Node节点

          Work Node是Pod运行的实际节点,是Kubernetes资源的提供者。Node职责是运行容器应用。Kubernetes本身知道Docker和rkt等容器的运行。 在Node节点中,运行的Kubernetes组件包括:

           1. kubelet:

            Work节点的资源管理者,相当于agent这样的角色,它一直监听在Api Server上,根据Master节点的指示做出相关的动作,比如启动/关闭Pod。同时也会将所管理的节点信息收集并汇报给Master。

           2. kube-proxy:

            管理Kubernetes中service网络。Pod在Kubernetes中是不固定的(ephemeral),Pod的ip可能会变化,为了屏蔽Pod这种变化性,Kubernetes引入了service这样的概念,service可以屏蔽这样的变化,并且可以在调用的时候进行负载均衡,当需要将服务暴露给外部的时候,kube-proxy可以进行转发,kube-proxy就是实现背后这些服务网路的实现机制。

           3. Pod网络

           4. Container Runtime:

            节点上容器资源的管理者,kubelet并不会直接管理节点上的容器,而是委托Container Runtime进行管理。Container Runtime在启动容器的时候如果没有本地镜像缓存就会去Docker Hub上去拉取然后缓存在本地。

       

 

 

    2. Pod:

        Pod是kubernetes中一个非常重要的概念,Pod是放置容器的地方,因为所有的应用最终都是运行在Pod里的。

        Pod里可以运行容器,那么Pod运行在哪呢?

        Pod运行在一个node上。只要资源足够,一个node上可以有任意个pod。kubelet负责调度pod。

        位于Work node里面,Pod是基本操作单元,也是应用运行的载体,比如可以存放web服务器的容器。整个Kubernetes系统都是围绕着Pod展开,比如如何部署和运行Pod,如何保证Pod数量,如何访问Pod等。而之前所说的副本就是指Pod。另外Pod是有生命周期的。

                分离关注点,每个容器只做一件事。

        一般一个Pod里面只运行一个容器,当然也有一个Pod里运行多个容器,其中一个容器是主容器,其它的是辅助容器。

        一个Pod里多个容器共享Pod的网络栈,存储资源等。

    3. Deployment:

      Deployment控制器定义了Pod部署信息,并控制Pod的部署并维持其状态。

 

    下面是Kubernetes发布流程图,展示了Master,Worker节点及其它组件是如何配合工作的。

  

 

     1. kubectl向API Server提交一个创建副本的应用请求,ReplicaSet副本集是规范副本数量的。

    2. Controller Manager监听ReplicaSet创建及修改等事件,它接收到ReplicaSet的通知。

    3. Controller Manager比较当前集群的状态和预期集群的状态,这里它会创建新的Pods。

    4. Scheduler监听到需要创建Pod,就会根据调度算法来选择合适的Worker节点,然后在使用API Server来更新Pod定义等状态,这时候应用还没有真正的发布,Controller Manager和Scheduler只是通过API Server更新了集群所期望的状态。

    5. 当Pod被分配到某个具体到worker节点,API Server就会通知相应节点上的Kubelet。

    6. Kubelet接受到通知就会告知Container runtime在其节点上去下载,启动,并运行对应的容器,同时Kubelet会监控容器的运行。

 

组件 节点 作用
etcd Master 或者独立集群 集群状态集中存储
API Server Master 集群接口和通讯总线
Controller Manager Master 协调发布状态最终一致性组件
Scheduler Master 协调决策组件
Kubelet Worker Worker节点资源管理器
Container runtime Worker 容器资源管理
kube-proxy Worker 实现Service服务抽象组件,屏蔽PodIP的变化和负载均衡
Pod Worker Kubernetes云平台中提供虚拟机,Kubernetes基本调度单位
Container Worker 应用跑在容器中,资源隔离单位

 

 

 

 

 四. Kubernetes安装

   下面讲述如何在mac系统上安装Kubernetes。

   如果已经安装过docker desktop,先将kuernetes选项勾选掉。

   

        如果你已经勾选了,那么在启动docker的时候,右下角会显示kubernetes is starting...,因为网络的问题会一直卡在那,可以参考网络上一些解决方案 https://github.com/maguowei/k8s-docker-desktop-for-mac

     安装方式一:

    官方推荐使用kubeadm来安装,不过国内使用不了kubeadm,需要FQ上网才行。

   安装方式二: 

     下载Minikube。

      Minikube是一套适合本地学习开发使用的库k8s环境,支持Linux,Mac,Windows多种操作系统,支持大部分k8s的功能。Minikube比docker desktop相比可以进行配置,同时还可以支持docker以外其他的容器。

      Minikube github: https://github.com/kubernetes/minikube

      Minikube官网 :https://kubernetes.io/docs/tasks/tools/install-minikube/

    

     安装Minikube先决条件要安装kubectl。

       安装kubectl https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-using-curl

       Mac安装可以选择比较简单的homebrew方式:brew install kubectl

       安装完毕后,可以查看kubectl版本信息

songguojundeMacBook-Pro:~ songguojun$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.3", GitCommit:"5e53fd6bc17c0dec8434817e69b04a25d8ae0ff0", GitTreeState:"clean", BuildDate:"2019-06-06T01:44:30Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"darwin/amd64"}

 

    安装Minikube

      安装Minikube也可以使用homebrew方式:brew install minikube

      启动Minikube

        minikube默认启动命令:minikube start

      第一次启动Minikube会下载kuernetes一些虚拟机镜像和kuernetes的组件,也会出现网络问题。

      为了访问海外的资源,阿里云提供了一系列基础设施

参数
–vm-driver 使用docker
–image-mirror-country 镜像所在的国家是中国
–image-repository 镜像仓库地址为阿里云
–logtostderr 输出日志到stderr

        我们使用阿里云提供的一些镜像地址。

       命令 minikube start --cpus=4 --memory='3000mb' --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'

       

       安装过程出了报错

stderr:
Unable to find image 'gcr.io/k8s-minikube/kicbase:v0.0.13@sha256:4d43acbd0050148d4bc399931f1b15253b5e73815b63a67b8ab4a5c9e523403f'

       上面错误是说找不到对应的镜像,解决是查找替代的镜像,比如anjone/kicbase。(解决方案来自https://blog.csdn.net/kelsel/article/details/107728562

       下载替换的镜像 docker pull anjone/kicbase。

      使用anjone/kicbase,而不是gcr.io/k8s-minikube/kicbase:v0.0.10。
      这样就不会因为gcr.io/k8s-minikube/kicbase:v0.0.10下载失败,而无法启动集群!

      当再次执行时候依然报错,查看错误信息,说cpu数量不够。

    

         我后来将参数命令中 --cpus=4 去掉,依然不行,就将docker设置的cpu数量调整最大,如下图。

      

       然后执行修改后的命令

minikube start  --memory='3000mb' --base-image="anjone/kicbase" --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'

     执行成功,没有报错。  

    

     使用命令minikube status来验证minikube是否安装成功,如下展示说明已经安装成功。

songguojundeMacBook-Pro:~ songguojun$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

         查看kubectl所指向的是哪个Kubernetes环境,下面命令结果展示就是当前kubectl已经指向的是minikube

songguojundeMacBook-Pro:~ songguojun$ kubectl config current-context
minikube

     也可以查看docker客户端当前指向的Kubernetes环境,也可以进行选择切换。

  

   使用命令也可以进行切换。

songguojundeMacBook-Pro:~ songguojun$ kubectl config use-context minikube
Switched to context "minikube".

   打开Kubernetes控制台,

minikube dashboard

   输入完命令会自动打开浏览器

  

  地址:http://127.0.0.1:51379/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/overview?namespace=default

  

  可以查看扩展功能

minikube addons list

  

   可以看到 minikube 默认为我们启动了一些插件。

可以看到 minikube 默认为我们启动了一些插件

作者:慕村9548890
链接:https://www.imooc.com/article/275780
来源:慕课网

   查看集群状态

songguojundeMacBook-Pro:~ songguojun$ kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:32768
KubeDNS is running at https://127.0.0.1:32768/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

   查看节点信息

songguojundeMacBook-Pro:~ songguojun$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   9h    v1.19.2

 

 

 

 参考文档

  https://developer.aliyun.com/article/221687

 

 

 

 

  

 

posted @ 2020-12-29 10:30  songguojun  阅读(680)  评论(0编辑  收藏  举报