Kubernetes介绍及使用
一. Kubernetes简介
Kubernetes(简称K8s)是以Google Borg为原型重新设计和实现的基于容器技术的容器管理和编排调度工具,它支持自己部署,大规模可伸缩,可应用容器化管理,和docker公司的swarm和Apache的Mesos项目一样,2014年由Google开源。
2015年,谷歌将Kubernetes捐赠给Linux基金会下属的云原生计算基金会(CNCF)。
2018年初CNCF宣布Kubernetes正式毕业,标志着Kubernetes项目的成熟并可以用于生产环境使用。
Kubernetes最终使命是成为云计算新一代应用上的云的首选平台。
官网上面也有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
输入完命令会自动打开浏览器
可以查看扩展功能
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