本文采用本地k8s v1.10.3版本开发,如果还没有搭建可参照 kubernetes学习笔记 (一):搭建本地k8s开发环境进行搭建

搭建本地Docker镜像仓库

  1. docker pull docker.io/registry 拉取registry的镜像到本机
  2. docker run -d -p 5000:5000 --name=registry --restart=always --privileged=true --log-driver=none -v /home/data/registrydata:/tmp/registry registry 运行刚刚拉取的registry
  3. 在Docker for Mac中找到Docker -> Preferences -> Daemon,在insecure registries中填入自己刚刚搭建的本地仓库 http://localhost:5000

准备一个Docker镜像

  1. 随意使用什么语言写一个http接口,例如Nodejs:
    @Get('whoami')async whoAmI() {debug('whoAmI called with %O', {});return { serverType: Config.SERVER_TYPE };}
复制代码
  1. 编写对应的DockerFile
FROM node:8
WORKDIR /rootRUN mkdir -p /root/appCOPY package.json /root/app/
COPY dist /root/app/distWORKDIR /root/appRUN npm config set registry https://registry.npm.taobao.org/ ;\npm config set disturl https://npm.taobao.org/dist/ ;\npm i --productionCMD [ "node", "/root/app/dist/main.js" ]EXPOSE 80复制代码
  1. 编译、打标签,并推送到本地仓库中
echo 'Building to dits ...'
tscecho 'Docker building image ...'
docker build --rm -t localhost:5000/gateapp:0.0.1 .echo 'Pushing ...'
docker push localhost:5000/gateappecho 'Docker list images ...'
docker images
复制代码

最后你会看到localhost:5000/gateapp:0.0.1的镜像已经在你的机器中啦,下面会用到

Kubernetes中的重要概念

  1. Cluster: Cluster是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用
  2. Master: Master是Kubernetes的大脑,它的主要职责是调度,即决定将应用放在那里运行。
  3. Node: Node的职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。
  4. Pod: Pod是Kubernetes中最小工作单元。每个Pod包含一个或多个容器。Pod中的容器会作为一个整体被Master调度到一个Node上运行。
  5. Controller:Kubernetes通常不会直接创建Pod,而是通过Controller来管理Pod。Controller中定义了Pod的部署特性,比如有几个副本、在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等,后面会逐个学习这些Controller
  6. Service:Service定义外界访问一组特定Pod的方式。

创建Deployment部署应用

  1. 新建一个yaml文件,如:
apiVersion: extensions/v1beta1 # kubectl api的版本
kind: Deployment # kubernetes的资源类型
metadata:name: gate-deployment-dev
spec:replicas: 2 # 运行的Pod副本数量template:metadata:labels:app: gate-app-devspec:containers:- name: gateappimage: localhost:5000/gateapp:0.0.1 # Docker镜像地址(上面创建的)env: # 镜像启动时的环境变量- name: NODE_ENVvalue: 'development'- name: HTTP_PORTvalue: '80' # 容器http的端口 需要自己代码中实现
复制代码
  1. 通过kubectl apply -f xxx.yaml就可以部署上面的Deployment的了,也可以打开Kubernetes的Dashboard点击创建,输入yaml文件中的内容进行创建。经过一段时间后,在Dashboard面板中可以看到,1个部署 gate-deployment-dev,一个副本集 gate-deployment-dev-775d556ffb,两个容器组 gate-deployment-dev-775d556ffb-2tlgn、gate-deployment-dev-775d556ffb-sfqrq,可以点击查看每个资源的信息,大部分内容都是自解释的。

    在部署Deployment后,Kubernetes大致执行了以下几个过程:

    • 用户创建Deployment
    • Deployment创建了一个副本集(ReplicaSet)gate-deployment-dev-775d556ffb
    • ReplicaSet创建了两个Pod,与我们定义的replicas: 2 一致

创建Service

此时上面的镜像提供的接口还不能供外界访问,需要创建一个对应的Service

  1. 新创建一个yaml文件或者在上一个yaml文件中添加 --- 隔开
  2. 编辑以下内容:
apiVersion: v1 # kubectl api的版本
kind: Service # kubernetes的资源类型
metadata:name: gate-svc-dev
spec:type: NodePort # service的类型 ClusterIp类型 只有Cluster内部节点和Pod可以访问 NodePort Cluster外部可以通过<NodeIp>:<NodePort>访问 LoadBalancer负载均衡selector:app: gate-app-dev # 与上面的template中定义的label一致ports:- protocol: TCP # 只有TCP 或 UDPport: 80 # clusterIp 监听的端口nodePort: 30000 # Node 监听的端口取值范围 30000-32767targetPort: 80 # Pod 监听的端口
复制代码
  1. kubectl apply -f xxx.yaml 或者在Dashboard中创建

  2. 观察Dashboard面板,会发现多了一个名字叫gate-svc-dev的服务,提供了监听了30000端口

  3. curl http://localhost:30000/whoami 可以看到接口已经可以访问了

    需要注意的是:

    • 为什么需要Service?

      Deployment等其他Controller动态创建和销毁Pod来保证应用的健壮性,也就是Pod是脆弱的,应用是健壮的,我们不该期望Pod的健壮性。每个Pod都有自己的ClusterIp地址,当Pod发生故障被新的Pod替代时,ClusterIp很有可能发生变化,所以如果直接让外界访问Pod就有问题了。

    • Service和Pod如何映射?

      通过上面的yaml定义可以看出,Service通过 label标签选择器选择对应的一堆Pod。当请求被发送到Service上时,Service采用了某种分配策略把流量转发到了某一个Pod上面进行处理。

    • Service有哪些类型?

      1. ClusterIp:Service通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可以访问,这是默认的类型。
      2. NodePort: Service通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过<NodeIp>:<NodePort>访问Service
      3. LoadBalancer: cloud provider特有的对外提供服务,后续线上部署时会讲到

滚动更新

滚动更新是一次只更新一小部分副本,成功后再更新更多的副本,最终完成所有副本的更新。滚动更新最大的好处就是零停机,保证了业务的连续性。

  1. 对本地代码进行一点改动
  2. 编译、打标签,并推送到本地仓库中
echo 'Building to dits ...'
tscecho 'Docker building image ...'
docker build --rm -t localhost:5000/gateapp:0.0.2 .echo 'Pushing ...'
docker push localhost:5000/gateappecho 'Docker list images ...'
docker images
复制代码

这时候可以看到有0.0.1 和 0.0.2两个版本的镜像

  1. 在Dashboard中编辑Deployment,把image: localhost:5000/gateapp:0.0.1改成image: localhost:5000/gateapp:0.0.2,点击更新

  2. 等待一段时间,再观察所有的Pod都被更新成0.0.2版本的了,是不是很方便!

    反复执行上面的步骤,不难发现更新过程中Kubernets都做了什么:

    • Deployment的镜像被更新为0.0.2版本
    • 新创建了一个名称为gate-deployment-dev-594468997c的ReplicaSet副本集,镜像为0.0.2
    • 新的ReplicaSet增加了一个Pod
    • 旧的ReplicaSet减少了一个Pod
    • 逐渐的新的ReplicaSet接管了所有旧ReplicaSet的Pod,滚动更新完成
  3. 自定义滚动更新行为

    strategy:rollingUpdate: # 滚动更新策略maxSurge: 10% # 数值越大 滚动更新时新创建的副本数量越多maxUnavailble: 10% # 数值越大 滚动更新时销毁的旧副本数量越多replicas: 2 # 运行的Pod副本数量
复制代码
- maxSurge:此参数控制滚动更新中副本总数超过DESIRED的数量或最大比例,数值越大 滚动更新时新创建的副本数量越多
- maxUnavailble:此参数控制滚动更新中,不可用的副本占DESIRED的最大数量或最大利弊,数值越大 滚动更新时销毁的旧副本数量越多
复制代码

那如果更新过程出错了怎么办?请接着往下看

健康检查

Kubernetes有很强大的自愈能力,默认的实现方式是重启发生故障的容器,此外用户可以使用Liveness、 Readiness的探测机制设置更为精细的健康检查,进而真正实现零停机部署、避免部署无效的镜像、更加安全的滚动升级

  1. 编辑之前的Deployment.yaml,例如:
                  image: localhost:5000/gateapp:0.0.13readinessProbe: # 一种健康检查决定是否加入到service 对外服务httpGet:scheme: HTTP # 支持http httpspath: /healthyport: 80 # 与你的pod端口一致initialDelaySeconds: 10 # 容器启动多久后开始检查periodSecods: 5 # 几秒检查一次
复制代码
  • readinessProbe即是使用Readiness健康探测机制,当检查不通过时(例如接口返回的状态码不是200-400之间),Kubernetes就不会把容器添加到Service中供外界访问,观察Pod的状态为Not Ready。 initialDelaySeconds是决定容器启动多久后开始检查,通常要比启动时间再长一些;periodSecods是多久检查一次,连续3次探测失败后,Ready将变成不可用,Kubernets把这个Pod从Service中下线

  • LiveNess的配置项和Readiness的一样,不同之处在于探测失败后的行为。前者会重启容器,后者会设置Pod不可用,并从Service中下线。

  • LiveNess和Readiness的探测是独立使用的,二者没有依赖,可以单独使用也可以同时使用。一般情况下使用LiveNess判断容器是否需要重启实现自愈;Readiness判断容器是否已经准备好对外提供服务。

  1. 自定义健康检查的代码: 自定义/healthy get接口,比如数据库连接等等
    @Get('healthy')async checkHealthy(@Res() res: Response) {let isHealthy = false;// some code to check healthy beginisHealthy = true;// check endconst data = {isHealthy,};debug('执行健康检查结果 %O', data);res.status(isHealthy ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR).json(data);}
复制代码

一起来学习Kubernetes

相信看完以上的文章,你也会认为Kubernetes真的非常强大,是非常值得学习的。笔者也是小白一个,从0开始学习的,如果你也想一起,可以加入我们的群。

kubernetes学习笔记 (二):k8s初体验相关推荐

  1. PyTorch学习笔记:PyTorch初体验

    PyTorch学习笔记:PyTorch初体验 一.在Anaconda里安装PyTorch 1.进入虚拟环境mlcc 2.安装PyTorch 二.在PyTorch创建张量 1.启动mlcc环境下的Spy ...

  2. Python学习笔记:pandas初体验

    Python学习笔记:pandas初体验 一.安装pandas模块 1.安装Python3.7 注意:必须勾选pip(python install package). 2.配置环境变量 3.下载 pa ...

  3. Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用

    Kubernetes学习系列文章:Kubernetes-博客专栏 今天在学习极客时间专栏:<深入剖析Kubernetes> 第五讲05 | 白话容器基础(一):从进程说开去和第六讲06 | ...

  4. mysql初体验学习笔记_MySQL数据库初体验

    克隆表,将数据表的数据记录生成到新的表中 方法一: create table test01 like GCC01; #通过 LIKE 方法,复制GCC01表结构生成test01表 insert int ...

  5. CSS学习笔记——动画animation初体验(小熊案例)

    文章目录 一.动画概念 二.动画基本用法 1.动画模板 2.动画的使用 3.小熊案例 总结 一.动画概念 动画是CSS3的一个重要用法,动画使元素逐渐从一种样式变为另一种样式.您可以随意更改任意数量的 ...

  6. Kubernetes学习笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> Kubernetes学习笔记(一) 博客分类: Kubernetes 导语 2015年4月,传闻已久的Borg论文伴随Kube ...

  7. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  8. Kubernetes学习笔记之Calico CNI Plugin源码解析(一)

    女主宣言 今天小编为大家分享Kubernets Calico CNI Plugin的源码学习笔记,希望对正在学习k8s相关部分的同学有所帮助: PS:丰富的一线技术.多元化的表现形式,尽在" ...

  9. 深度强化学习笔记(二)——Q-learning学习与二维寻路demo实现

    深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 文章目录 深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 前言 理论 什么是Q-Learning 算 ...

最新文章

  1. 英语语法---短语总结
  2. 分享一套阿里高级Java面试题,要去阿里的先过这些题。
  3. hashmap java_Java – HashMap详细说明
  4. android自定义选年控件,Android精美日历控件CalendarView自定义使用完全解析
  5. 蓝桥杯 ALGO-123 算法训练 A+B problem
  6. XMind思维导图文件损坏,无法打开怎么办?
  7. 中海达ihand30手簿详细教程_开盘秒清,中海这次模拟选房结果恐将成真
  8. VSCode解决中文乱码问题
  9. VM虚拟机同步.4开同步教程MouseWithoutBorders无界鼠标安装配置教程
  10. 职能型、矩阵型、项目型组织结构的优缺点
  11. python打开xlsm_关于python:如何使用openpyxl使用Macro保存XLSM文件
  12. xposed+justtrustme
  13. 播布客教学视频_C学习笔记_8.1_统计1到100中9的个数(分治)
  14. word替换功能 如何将相同的内容,替换为依次排列的数字编号
  15. 《流浪地球》影评数据爬取分析
  16. 图像超分辨重构(SR)论文整理————适用于刚接触这个领域的初级研究者。(持续更新)
  17. 微信小程序:拨打电话
  18. AutoCAD快捷键大全(按字母分类检索)
  19. nvme分区选mbr还是guid_固态硬盘安装win10系统,关于分区的这些注意事项你都知道吗?...
  20. (附源码)计算机毕业设计SSM机械零件生产管理系统

热门文章

  1. Git区分文件名大小写
  2. Hadoop HDFS概念学习系列之shell命令使用HDFS的一些其他命令(十九)
  3. 数据中心布线系统的整体规划
  4. Redis持久化总结
  5. 存储过程语法 - 变量
  6. 从源码剖析SpringBoot中Tomcat的默认最大连接数
  7. AbstractBeanFactory 的getBean()方法调用FactoryBean
  8. 基于Xml 的IOC 容器-载入<property>的子元素
  9. EasyExcel实现读操作
  10. 微服务网关-Gateway-LoadBalancerClient实现负载均衡讲解