kubernetes概述

2021-08-29  本文已影响0人  ysdyyy

一:Docker与k8s简介

在正式开始分享之前,给大家先分享一个相关的小故事:老王的叩问

老王是一家公司的工程师,精通各种技术栈,平常最重要的工作就是开发,上线和线上服务维护。

  1. 星期一,在一台服务器上部署一个nodejs应用,登录服务器后安装node,nginx,部署代码,安装依赖
  2. 星期二,部署nodejs应用的那台服务器因为某些原因挂掉了,待服务器重启后重启服务并检查是否正常
  3. 星期三,在某台服务器上部署一个web前端项目,登录服务器后部署代码,打包
  4. 星期四,node应用因访问量激增,在5台服务器上各自部署了1套,并用nginx实现了负载均衡
  5. 星期五,访问高峰过去了,停掉3套node服务,并对nginx做对应修改

每天的上线和维护消耗了老王大量的时间,夜深人静,老王不禁发出灵魂的叩问:啥时候是个头儿?
为了拯救老王,引入下面的词汇:容器,docker和kubernetes

1.1:容器

容器是一个标准化的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境可靠快速地运行到另一个计算环境。

1.2:docker

Docker 是一个开源的、轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建、管理和编排容器。

1.2.1 docker的口号

1.2.2 相关概念

有了docker,老王同志的上线工作变得轻松,只要编写标准的Dockerfile就行。但服务规模扩大以后容器的部署,伸缩和管理依然很麻烦。

1.3:kubernetes

大服务集群上容器的部署,伸缩和管理的各种问题,衍生出来了容器编排引擎,比较著名的有 Mesos, DockerSwarm, Kubernetes。

Kubernetes名字太长了,叫起来有点麻烦,而Kubernetes首字母与结尾字母之间有8个字母,因此被称作K8S。

1.3.1:发展历史

有了kubernetes,老王同志的服务管理工作终于轻松了一些,对着终端敲敲命令就行。

二:一个demo

kubernetes官网提供了最小可用系统,kubernetes.io开发了一个交互式教程,通过Web浏览器就能使用预先部署好的一个Kubernetes集群,快速体验Kubernetes的功能和应用场景:

https://kubernetes.io/docs/tutorials/kubernetes-basics/

PS:这个交互式教程,应该是类似文档+终端+命令复制粘贴这样实现的

2.1:创建Kubernetes集群

image image

相关命令:

2.2:部署应用

[图片上传失败...(image-c1fb57-1625644415633)]

image

相关命令:

2.3:访问应用

默认情况下,所有Pod只能在集群内部访问。对于上面这个例子,要访问应用只能直接访问容器的8080端口。为了能够从外部访问应用,我们需要将容器的8080端口映射到节点的端口

image

[图片上传失败...(image-c9eb10-1625644415633)]

相关命令:

2.4:扩缩应用(Scale)

默认情况下应用只会运行一个副本,可以通过命令增减副本

image

[图片上传失败...(image-3e707c-1625644415633)]

通过curl访问应用,可以看到每次请求有可能发送到不同的Pod

2.5:更新应用

image

相关命令:

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

三:k8s概念及架构

3.1:概念

3.1.1:Cluster

Cluster是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用

3.1.2:master

Master是Cluster的大脑,它的主要职责是调度,即决定将应用放在哪里运行。Master运行Linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个Master

3.1.3:node

Node的职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。Node运行在Linux操作系统上,可以是物理机或者是虚拟机。

在官网的交互式教程中,我们创建的Cluster只有一个主机,它既是Master也是Node。

3.1.4:pod

Pod是Kubernetes的最小工作单元。每个Pod包含一个或多个容器。Pod中的容器会作为一个整体被Master调度到一个Node上运行。同一个pod管理的多个容器之间可以通信和资源共享。

3.1.5:Controller

Kubernetes通常不会直接创建Pod,而是通过Controller来管理Pod的。Controller中定义了Pod的部署特性,比如有几个副本、在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等

3.1.6:Service

Kubernetes Service定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。

Kubernetes运行容器(Pod)与访问容器(Pod)这两项任务分别由Controller和Service执行。

3.1.7:Namespace

Namespace可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的

3.2:架构

3.2.1: master节点

image

master是kubernetes cluster的大脑

3.2.2: node节点

node是pod运行的地方。

image

3.2.3:单master架构

image

3.3:组件间的协作

kubectl run httpd-app --image=httpd --replicas=2 发生了什么?

image
  1. kubectl发送部署请求到API Server
  2. API Server通知Controller Manager创建一个deployment资源
  3. Scheduler执行调度任务,将两个副本Pod分发到k8s-node1和k8s-node2
  4. k8s-node1和k8s-node2上的kubectl在各自的节点上创建并运行Pod

四:kubectl命令

kubectl的语法:kubectl [command] [TYPE] [NAME] [flags]

常用命令示例:

其他内容,如:数据管理,dashboard,包管理、集群监控、集群日志管理等,感兴趣的同学可以通过下方的参考或链接了解。

五:更加简便的方式

老王还是觉得麻烦,因为自己要敲命令,怎么办?腾讯云TKE,阿里云ACK等都在kubernetes的基础上做了再一次的开发,相当简便。老王连命令都不用敲了,登录控制台点按钮,配参数就行。

本文参考

上一篇 下一篇

猜你喜欢

热点阅读