Kubernetes 基础

第一章:K8S介绍

在部署应用程序的方式上,主要经历了三个时代:

  • 传统部署:直接将应用程序部署在物理机上

    优点:简单,不需要其他技术

    缺点:不能为应用程序定义资源使用边界,很难合理地分配计算机资源,程序之间容易互相影响。

  • 虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是一个独立的环境

    优点:程序环境不会互相产生影响,提供了一定程度上的安全性

    缺点:增加了操作系统,浪费了部分资源

  • 容器化部署:与虚拟化类似,但是共享了操作系统

    优点:

    ​ 可以保证每个容器拥有自己的文件系统,CPU,内存,进程空间等

    ​ 运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦

    ​ 容器化的应用程序可以跨云服务商,跨Linux操作系统发行版本进行部署

depolyments

但容器化部署依然存在问题:

  • 一个容器故障停机了,怎么让另一个容器去替补这个停机的容器。
  • 当并发访问量增大时,怎么做到横向扩展容器数量

这就是容器编排问题

1.2 K8S简介

K8s本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。它的目的就是实现资源管理的自动化,主要提供了以下功能:

  • 自我修复:一旦某个容器崩溃,能够在1秒左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务启动了多个容器,能够实现请求的负载均衡
  • 版本回退:如果新发布的版本有问题,可以立刻回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

K8S技能图谱:

![K8Sways]

1.3 K8S组件

一个K8S集群主要是由Master节点和node节点组成的,每个节点上都会安装不同的组件。

Master:集群的控制平面,负责集群的决策

ApiServer:资源操作的唯一入口,接收用户输入的命令,提供认证,授权,API注册和发现等机制

Scheduler:负责集群的资源调度,按照预订的调度策略将Pod调度到相应的node节点上

ControllerManager:负责维护集群的状态,比如程序部署安排,故障检测,自动扩展,滚动更新等

Etcd:负责存储集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境

Kubelet:负责维护容器的生命周期,即通过控制docker(container),来创建、更新、销毁容器

KubeProxy:负责提供集群内部的服务发现和负载均衡

Container:负责节点上容器的各种操作

kubernetes-nodes

以部署一个nginx服务来说明k8s系统各个组件的关系:

  1. 首先,一旦K8s环境启动后,master和node节点都会将自身的信息存储到etcd数据库
  2. 一个ngix服务的安装请求会被首先发送到master几点中的apiServer组件
  3. apiServer组件会调用Scheduler组件来决定将这个服务安装到哪个node上,因此,它会读取etcd中所有节点的信息,然后按照一定算法进行选择,并将结果告知apiServer
  4. apiServer调用Controller-manager去调度Node节点安装nginx服务
  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod。pod是k8s的最小操作单元,容器必须跑在pod上。
  6. 至此,一个nginx服务就已经跑起来了,如果想要从外部访问这个nginx服务,那么就可以通过kube-proxy来访问。

1.4 K8S部分概念

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Pod:K8S的最小控制单元,容器都是运行在Pod中的,一个pod可以有1个或多个容器

Controller:控制器,通过它来实现对pod的管理,比如启动pod,停止pod,伸缩pod的数量等等

Service:pod对外服务的统一入口,下面可以维护着同一类的多个pod。

Label:标签,用于对pod进行分类,同一类pod会有相同的标签、比如:app:tomcat。见下图。

NameSpace:命名空间,用来隔离pod的运行环境。

Label

第三章:资源管理

本章节主要介绍yaml语法和k8s的资源管理方式

3.1 资源管理介绍

在K8s中,所有的内容都被抽象为资源,用户需要通过操作资源来管理k8s。

k8s的本质上就是一个集群系统,用户可以在集群内部署各种服务,所谓的部署服务,其实就是在k8s集群中运行一个个容器,并将指定的程序跑在容器中。

k8s的最小管理单元是pod而不是容器,所以只能将容器放在pod中,而k8s一般也不会直接管理pod,而是通过Pod控制器

在Pod可以提供服务后,就要考虑如何访问pod中的服务,k8s提供了sercice实现了这个功能

当然,如果pod中程序的数据需要持久化,k8s还提供了各种存储系统。

![core structure](images/core structure.png)

3.2 Yaml语言

基本语法:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许用tab,只能用空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可

Yaml支持以下数据类型:

  • 纯量(单个的、不可再分的值),包括字符串,布尔值,整数,浮点数。Null,时间,日期
  • 对象:键值对的集合,又称为映射(mapping)、哈希(hash)、字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence)、列表(list)

注意:

1.书写yaml注意 后一定有一个空格

2.如果需要将多段yaml配置放在一个文件中,中间需要使用 ---分离

3,验证自己的yaml文件是否符合规范:

https://www.json2yaml.com/convert-yaml-to-json

3.3 资源管理方式

  • 命令式对象管理:直接使用命令去操作k8s资源

    kubectl run nginx-pod --image=nginx:1.71.1 --port=80
    
  • 命令式对象配置:通过命令配置和配置文件去操作k8s资源

    kubectl create/patch -f nginx-pod.yaml
    
  • 声明式对象配置:通过apply命令和配置文件去操作k8s资源

    kubectl apply -f nginx-pod.yaml
    

3.3.1 命令式对象管理

Kubectl 的语法:

kubectl [command] [type] [name] [flags]

Command:指定要对资源执行的操作,例如create,get,delete

type:指定资源类型,比如development,pod,service

name:指定资源的名称,名称大小写敏感

Flags:指定额外的可选参数 (-o wide 显示详细信息) (-o yaml jason)

#查看所有pod
kubectl get pod

#查看某个pod
kubectl get pod pod_name

#查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

资源类型

k8s中所有的内容都抽象为资源,可以通过下面的命令进行查看

kubectl api-resources

第四章:入门

本章介绍如何在集群中部署一个nginx服务,并且能够进行访问

4.1 Namespace

Namespace 是k8s系统中的一种非常重要资源,它的主要作用就是用来实现多套环境的资源隔离或者多租户的资源隔离

默认情况下,K8S集群中的所有Pod都是可以互相访问的。但是实际中,可能不想让两个Pod互相访问,那么就可以把两个pod划分到不同的namespace里。k8s通过将集群内部的资源分配到不同的namespace中,

namespace-1

K8S在集群启动之后,会默认创建几个namespace

kubectl get namespace

default #所有未指定的Namespace的对象都会被分配在default命名空间
kube-node-lease #集群节点之间的心跳维护
kube-public		#此命名空间下的所有资源可以被所有人访问(包括未认证用户)
kube-system		#所有由k8s系统创建的资源都在这个命名空间

下面是关于namespace的具体操作

查看

#1.查看所有的ns   命令:kubectl get ns
#2.查看指定的ns   命令:kubectl get ns ns名称
#3.指定输出格式 	命令: kubectl get ns ns名称 -o 格式参数
#4.查看ns详情	  命令:kubectl describe ns ns名称
	#ResourceQuota 针对namespace做的资源限制
	#LimitRange 针对namespace中的每个组件做的资源限制

4.2 Pod

Pod是k8s进行管理的最小单元,程序必须部署在容器中,而Pod中可以有一个或多个容器

K8s在集群启动之后,集群的各个组件也是通过Pod形式运行的,可以通过下面命令查看:

kubectl get pod -n kube-system

创建并运行

k8s没有提供单独运行pod的命令(注:新版k8s似乎已经提供了),都是通过pod控制器实现的

#命令格式:kubectl run (pod控制器名称) [参数]
# --image	指定Pod的景象
# --port	指定端口
# --namespace 指定命名空间
kubectl run nginx --image=nginx:latest --port=80 --namespace dev

删除

kubectl delete pod podname -n nsname

4.3 Lable

Lable 是k8s中的一个重要概念。它的作用就是在资源上添加标志,用来对它们进行区分和选择。

Lable的特点:

  • 一个Lable会以键值对的形式附加到各种对象上,比如Node、Pod、Service等
  • 一个资源对象可以定义任意数量的Lable,同一个lable可以被添加到任意数量的资源对象上去
  • label通常在资源对象定义时确定,也可以在对象创建后动态添加或删除

可以通过label实现资源的多维度分组,以便进行资源分配、调度、配置、部署等工作

一些常用label:

  • 版本标签:"version":"release","version":"stable"......
  • 环境标签:"environment":"dev","envirinment":"test","enviroment":"pro"
  • 架构标签:"tier":"frontend","tier":"backend"

标签选择:

标签定义完毕后,还要考虑标签的选择,这就要用到Label Selector,即:

​ Label 用于给某个资源对象定义标志

​ Label Selector 用于查询和筛选拥有某些标签的资源对象

当前有两种选择器:

  • 基于等式的:

    name = slave:选择所有包含label中key="name",value="slave"的对象

  • 基于集合的:

    name in (master,slave):选择所有包含label中key="name"且value="master"或"slave"的对象

标签的选择条件可以使用多个,使用逗号分隔。

命令方式:

#为pod资源打标签
kubectl label pod nginx-pod version=1.0 -n dev

#更新标签
kubectl label pod nginx-pod version=2.0 -n dev --overwrite

#查看标签
kubectl get pod nginx-pod -n dev --show-labels

#筛选标签
kubectl get pod -n dev -l version!=2.0 --show-labels

#删除标签
kubectl label pod nginx-pod version- -n dev

4.4 Deployment

在K8s中,Pod是最小的控制单元,但是K8S很少直接控制Pod,一般都是通过pod控制器来完成的。pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或者重建pod。

K8S中有很多种pod控制器,Deployment就是其中之一。

命令操作:

#命令格式:kubectl run deployment名称 [参数]
#--image 指定pod的镜像
#--port	指定端口
#--replicas 指定创建pod的数量
#--namespace 指定ns

kubectl run nginx --image=nginx:latest --port=80 --replicas=3 -n dev

#查看deployment的信息
kubectl get deploy -n dev

4.5 Service

第五章:Pod详解

5.1 Pod介绍

一个简单的 nginx pod 部署文件:

Nginx-deployment.yaml

apiVersion: apps/v1	#与 k8s 集群版本有关,使用 kubectl api-version 即可查看当前集群支持的版本
kind: Deployment 	#该配置的类型,这里使用的是 Deployment
metadata:			#元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment #Deployment 的名称
  labels:			#标签,可以灵活定位一个或多个资源,其中 key 和 value 均可自定义,可以定义多组
    app: nginx		#为该 Deployment 设置 key 为 app,value 为 nginx 的标签
  spec: 			#关于该 Deployment 的描述,可以理解为你期待该 Deployment 在 k8s 中如何使用
    replicas: 1     # 使用该 Deployment 创建多少个应用程序实例
    selector: 		#标签选择器,与上面的标签共同作用
      matchLabels:  #选择包含标签 app:nginx 的资源
        app: nginx
    template:		#这是选择或创建的 Pod 的模板
    metadata:       #Pod 的元数据
    labels:  		#Pod 的标签,上面的 selector 即选择包含标签 app:nginx 的 Pod
      app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9

在创建一个 Deployment 后, k8s 创建了一个 Pod(容器组)来放置应用程序实例(containers 容器)

![Pod intro](images/Pod intro.svg)

5.1.1 Pod结构

Pod

每个Pod中都可以包含一个或多个容器,这些容器可以分为两类:

  • 用户程序所在的容器,数量可多可少

  • Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个

    • 可以以它为依据,评估整个Pod的健康状态

    • 可以再根容器上设置IP地址,其他容器都通过这个IP(pod ip)实现Pod内部的网络通信

      这是Pod内部的通信,Pod之间的通信采用虚拟二层网络技术来实现,比如Flannel

5.1.2 Pod定义

Pod的资源清单:

在K8S中基本所有资源的一级属性都是一样的,主要包含5部分:

  • apiVersion 版本,由K8S内部定义,版本号必须可以用 kubectl api-version查询到
  • kind 类型,由K8S内部定义,版本号必须可以用kubectl api-resources查询到
  • metadata
posted @ 2023-01-11 14:19  chicc  阅读(228)  评论(0)    收藏  举报