https://developer.aliyun.com/learning/course/572/detail/7786
什么是容器(Container)?
![](https://i-blog.csdnimg.cn/blog_migrate/0492bf2d7227443c5c4dddf1373e0b1c.png)
什么是镜像(docker)?
![](https://i-blog.csdnimg.cn/blog_migrate/e9669b399caafb1dd83b48676fc1216e.png)
分层和复用
![](https://i-blog.csdnimg.cn/blog_migrate/b889e1eaab98f6de1e7bd000b55985d7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1677719453ef6602311dab02f8dcfed7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/81f06e0d31e9715816339fd6941744d2.png)
运行后名称为 demo,进程是top命令
![](https://i-blog.csdnimg.cn/blog_migrate/80dc8de64ce11d7fb2a19144f68677f7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b9d2fb7792582a873c27b7eef717b93c.png)
二、容器的生命周期
数据卷是一个特殊的目录
![](https://i-blog.csdnimg.cn/blog_migrate/6c72a71a368b5e71ad521ac037476ae5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/343d47a0d5fd66f7fef3f34e9dcc4ed4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/86ce0b8006ce8b65add5437bde6d0fc4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/98714822175c2f189d517449cd1150b7.png)
四、容器 VS VM
虚拟机
![](https://i-blog.csdnimg.cn/blog_migrate/d38ca3d54d6d2da2402babc19dab671b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6e2ab82a294083c76cc8c062d2305067.png)
一、什么是 Kubernetes
![](https://i-blog.csdnimg.cn/blog_migrate/a5f4199a963eb6bfd4b88c3435c25488.png)
二、Kubernetes 有如下几个核心的功能:
![](https://i-blog.csdnimg.cn/blog_migrate/c5b4310064c8201aa71a34b140df651d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ce56a24f02b438d1ef996427b79f7ea5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/05ba021abb273e673e204783f3693b8e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/819e51a16690e8c219b0f03f6f3239e8.png)
三、Kubernetes 的架构
水平扩张(负载)
热备从广义上讲,就是服务器高可用应用的另一种说法,可写可读之类。
![](https://i-blog.csdnimg.cn/blog_migrate/4293cc59419d5bff389cb4a395089069.png)
![](https://i-blog.csdnimg.cn/blog_migrate/afebdee81faa9a4cc459a0cadf353351.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6807756af8c23b7e3c9499814bfc0697.png)
四、Kubernetes 的核心概念与它的 API
![](https://i-blog.csdnimg.cn/blog_migrate/b8e033e79e8094a910cf5f7ac9797433.png)
![](https://i-blog.csdnimg.cn/blog_migrate/18953da1370b00cb63f28287372c0134.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d13e3708f6e5a87408230bb36fab775e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a6fb4c1e2651724b105016d306176d3b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/db33466de40214cecfa27e030c3da05b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3003204c5d63e7f3c70d59f84a3b31cb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b883de88cd011763fa10d933adfd105e.png)
五、以一个 demo 结尾
最后一部分,我想以一个例子来结束,让大家跟我一起来尝试一个 kubernetes,在尝试 Kubernetes 之前,我希望大家能在本机上安装一下 Kubernetes,安装一个 Kubernetes 沙箱环境。
安装这个沙箱环境,主要有三个步骤:
首先需要安装一个虚拟机,来在虚拟机中启动 Kubernetes。我们会推荐大家利用 virtualbox 来作为虚拟机的运行环境;
安装 VirtualBox: https://www.virtualbox.org/wiki/Downloads
其次我们需要在虚拟机中启动 Kubernetes,Kubernetes 有一个非常有意思的项目,叫 minikube,也就是启动一个最小的 local 的 Kubernetes 的一个环境。
minikube 我们推荐使用下面写到的阿里云的版本,它和官方 minikube 的主要区别就是把 minikube 中所需要的 Google 上的依赖换成国内访问比较快的一些镜像,这样就方便了大家的安装工作;
安装 MiniKube(中国版): https://yq.aliyun.com/articles/221687
最后在安装完 virtualbox 和 minikube 之后,大家可以对 minikube 进行启动,也就是下面这个命令。
启动命令:minikube start —vm-driver virtualbox
如果大家不是 Mac 系统,其他操作系统请访问下面这个链接,查看其它操作系统如何安装 minikube 沙箱环境。
https://kubernetes.io/docs/tasks/tools/install-minikube/
当大家安装好之后,我会跟大家一起做一个例子,来做三件事情:
提交一个 nginx deployment;
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
升级 nginx deployment;
kubectl apply -f https://k8s.io/examples/application/deployment-update.yaml
扩容 nginx deployment。
kubectl apply -f https://k8s.io/examples/application/deployment-scale.yaml
第一步,我们提交一个 nginx 的 Deployment,然后对这个 Deployment 进行一次版本升级,也就是改变它中间 Pod 的版本。最后我们也会尝试对 nginx 进行一次扩容,进行一次水平的伸缩,下面就让大家一起跟我来尝试这三个操作吧。
首先,我们先看一下 minikube 的 status,可以看到 kubelet master 和 kubectl 都是配置好的。
![](https://i-blog.csdnimg.cn/blog_migrate/43300fc4a6e67e759593f4a1878208ad.png)
下一步我们利用 kubectl 来看一下这个集群中节选的状态,可以看到这个master 的节点已经是running状态:
![](https://i-blog.csdnimg.cn/blog_migrate/1606f3d4230c00b9b491673d44075943.png)
我们就以这个为节点,下面我们尝试去看一下现在集群中 Deployment 这个资源:
![](https://i-blog.csdnimg.cn/blog_migrate/ec5ac1bdc1cf579a25eaebda735b47f5.png)
可以看到集群中没有任何的 Deployment,我们可以利用 watch 这个语义去看集群中 Deployment 这个资源的变化情况。
下面我们去做刚才想要的三个操作:第一个操作是去创建一个 Deployment。可以看到下面第一个图,这是一个 API 的 content,它的 kind 是 Deployment,name 是 nginx-deployment, 有图中它的 replicas 数目是2,它的镜像版本是 1.7.9。
![](https://i-blog.csdnimg.cn/blog_migrate/79e7b1b9d445700c6a47fcb87d20ebd5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/58d2d6b04bef211f78757fa3d3ed33e4.png)
我们下面还是回到 kubectl 这个 commnd 来执行这次 Deployment 的真正的操作。我们可以看到一个简单的操作,就会去让 Deployment 不停地生成副本。
![](https://i-blog.csdnimg.cn/blog_migrate/39612002cc58266934aa06b5b629b8f6.png)
Deployment 副本数目是 2 个,下面也可以 describe 一下现在的 Deployment 的状态。我们知道之前是没有这个 Deployment 的,现在我们去 describe 这个 nginx-deployment。
下图中可以看到:有一个 nginx-deployment 已经被生成了,它的 replicas 数目也是我们想要的、selector 也是我们想要的、它的 image 的版本也是 1.7.9。还可以看到,里面的 deployment-controller 这种版本控制器也是在管理它的生成。
![](https://i-blog.csdnimg.cn/blog_migrate/35e23eb1bdf01cbfd81594443696f2b5.png)
下面我们去升级这个 Deployment 版本,首先下载另外一个 yaml 文件 deployment-update.yaml,可以看到这里面的 image 本身的版本号从 1.7.9 升级到 1.8。
![](https://i-blog.csdnimg.cn/blog_migrate/a9f7a84de54923cf9e0018367099cd82.png)
接下来我们重新 apply 新的 deployment-update 这个 yaml 文件。
可以看到,在另一边的屏幕上显示出了这个 Deployment 升级的一些操作,最终它的 up-to-date 值从 0 变成了 2,也就是说所有的容器都是最新版本的,所有的 Pod 都是最新版本的。我们也可以 discribe 具体去看一下是不是所有 Pod 的版本都被更新了,可以看到这个 image 的版本由 1.7.9 真正更新到了 1.8。
最后,我们也可以看到 controller 又执行了几次新的操作,这个控制器维护了整个 Deployment 和 Pod 状态。
![](https://i-blog.csdnimg.cn/blog_migrate/9d7203c5df72b2ab2c1711d5848a8a00.png)
最后我们演示一下给 Deployment 做水平扩张,下载另一个 yaml 文件 deployment-scale.yaml,这里面的 replicas 数目已经从 2 改成了 4。
![](https://i-blog.csdnimg.cn/blog_migrate/e4ee8da3ba34fa79baff5dff87cb8ed6.png)
回到最开始的窗口,用 kubectl 去 apply 这个新的 deployment-scale.yaml 文件,在另外一个窗口上可以看到,当我们执行了 deployment-scale 操作之后,它的容器 Pod 数目从 2 变成了 4。我们可以再一次 describ 一下当前集群中的 deployment 的情况,可以看到它的 replicas 的数目从 2 变到了 4,同时也可以看到 controller 又做了几次新的操作,这个 scale up 成功了。
![](https://i-blog.csdnimg.cn/blog_migrate/123ce51a883add8e18dcd12c69e24496.png)
最后,让我们利用 delete 操作把我们刚才生成的 Deployment 给删除掉。kubectl delete deployment,也是刚才我们本身的 deployment name,当我们把它删除掉之后,我们今天所有的操作就完成了。
我们再去重新 get 这个 Deployment,也会显示这个资源不再存在,这个集群又回到了最开始干净的状态。
![](https://i-blog.csdnimg.cn/blog_migrate/7ed437cad6fe4ff90c6582990a3e6c28.png)
以上这就是这堂课中所有的内容了,我们关注了 kubernetes 的核心概念以及 kubernetes 的架构设计,希望大家能在这节课中有所收获,也希望大家能关注云原生技术课堂中的其他内容,谢谢大家的观看!
本节总结
Kubernetes 是一个自动化的容器编排平台,它负责应用的部署、应用的弹性以及应用的管理,这些都是基于容器的;
Kubernetes 架构是一个比较典型的二层架构和 server-client 架构;