【K8S】学习笔记(二)

K8S学习笔记

  • 三、Kubernetes 核心概念
    • 3.1、kubernetes 集群命令行工具 kubectl
      • 3.1.1、kubectl 概述
      • 3.1.2、kubectl 命令格式
      • 3.1.3、kubectl 基础命令
      • 3.1.4、kubectl 部署命令
      • 3.1.5、kubectl 集群管理命令
      • 3.1.6、kubectl 故障和调试命令
      • 3.1.7、kubectl 其它命令
    • 3.2、Kubernetes 集群 YAML 文件详解
      • 3.2.1、组成部分
      • 3.2.2、YAML 快速编写
        • 3.2.2.1、使用 kubectl create 命令
        • 3.2.2.2、使用 kubectl get 命令导出 yaml 文件
    • 3.3 Pod
      • 3.3.1、Pod 基本概念
      • 3.3.2、Pod 存在的意义
      • 3.3.3、 Pod 实现机制
      • 3.3.4、 Pod 镜像拉取策略
      • 3.3.5、 Pod 资源限制
      • 3.3.6、 Pod 重启机制
      • 3.3.7、 Pod 健康检查
      • 3.3.8、 Pod 调度策略
    • 3.4、Controller
      • 3.4.1、Controller 概述
      • 3.4.2、Pod 和 Controller 的关系
      • 3.4.3、Deployment 控制器应用
      • 3.4.4、Deployment 部署应用
      • 3.4.5、升级回滚和弹性收缩
        • 3.4.5.1、应用升级
        • 3.4.5.2、查看升级状态
        • 3.4.5.3、查看升级状态
        • 3.4.5.4、应用回滚
        • 3.4.5.5、弹性伸缩

三、Kubernetes 核心概念

3.1、kubernetes 集群命令行工具 kubectl

3.1.1、kubectl 概述

kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署。

3.1.2、kubectl 命令格式

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

参数:

  • command:指定要对资源执行的操作,例如 create、get、describe、delete
  • type:指定资源类型,资源类型是大小写敏感的,开发者能够以单数 、复数 和 缩略的形式
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
  • name:指定资源的名称,名称也是大小写敏感的,如果省略名称,则会显示所有的资源,例如
kubectl get pods
  • flags:指定可选的参数,例如,可用 -s 或者 -server 参数指定 Kubernetes API server 的地址和端口

3.1.3、kubectl 基础命令

命令 介绍
create 通过文件名或标准输入创建资源
expose 将一个资源公开为一个新的 Service
run 在集群中运行一个特定的镜像
set 在对象上设置特定的功能
get 显示一个或多个资源
explain 文档参考资料
edit 使用默认的编辑器编辑一个资源
delete 通过文件名,标准输入,资源名称或标签来删除资源

3.1.4、kubectl 部署命令

命令 介绍
rollout 管理资源的发布
rolling-update 对给定的复制控制器滚动更新
scale 扩容或缩容 Pod 数量,Deployment、ReplicaSet、RC 或 Job
autoscale 创建一个自动选择扩容或缩容并设置 Pod 数量

3.1.5、kubectl 集群管理命令

命令 介绍
certificate 修改证书资源
cluster-info 显示集群信息
top 显示资源 (CPU/M)
cordon 标记节点不可调度
uncordon 标记节点可被调度
drain 驱逐节点上的应用,准备下线维护
taint 修改节点 taint 标记

3.1.6、kubectl 故障和调试命令

命令 介绍
describe 显示特定资源或资源组的详细信息
logs 在一个 Pod 中打印一个容器日志,如果 Pod 只有一个容器,容器名称是可选的
attach 附加到一个运行的容器
exec 执行命令到容器
port-forward 转发一个或多个
proxy 运行一个 proxy 到 Kubernetes API Server
cp 拷贝文件或目录到容器中
auth 检查授权

3.1.7、kubectl 其它命令

命令 介绍
apply 通过文件名或标准输入对资源应用配置
patch 使用补丁修改、更新资源的字段
replace 通过文件名或标准输入替换一个资源
convert 不同的 API 版本之间转换配置文件
label 更新资源上的标签
annotate 更新资源上的注释
completion 用于实现 kubectl 工具自动补全
api-versions 打印受支持的 API 版本
config 修改 kubeconfig 文件(用于访问 API,比如配置认证信息)
help 所有命令帮助
plugin 运行一个命令行插件
version 打印客户端和服务版本信息

3.2、Kubernetes 集群 YAML 文件详解

3.2.1、组成部分

主要分为了两部分,一个是控制器的定义 和 被控制的对象。

在一个 YAML 文件的控制器定义中,有很多属性名称

属性名称 介绍
apiVersion API 版本
kind 资源类型
metadata 资源元数据
spec 资源规格
replicas 副本数量
selector 标签选择器
template Pod 模板
metadata Pod 元数据
spec Pod 规格
containers 容器配置

3.2.2、YAML 快速编写

一般来说,我们很少自己手写 YAML 文件,因为这里面涉及到了很多内容,我们一般都会借助工具来创建

3.2.2.1、使用 kubectl create 命令

这种方式一般用于资源没有部署的时候,我们可以直接创建一个 YAML 配置文件

# 尝试运行,并不会真正的创建镜像
kubectl create deployment web --image=nginx -o yaml --dry-run

或者我们可以输出到一个文件中

kubectl create deployment web --image=nginx -o yaml --dry-run > hello.yaml

然后我们就在文件中直接修改即可

3.2.2.2、使用 kubectl get 命令导出 yaml 文件

可以首先查看一个目前已经部署的镜像

kubectl get deploy

然后我们导出 nginx 的配置

kubectl get deploy nginx -o=yaml --export > nginx.yaml

然后会生成一个 nginx.yaml 的配置文件

3.3 Pod

3.3.1、Pod 基本概念

最小部署的单元

Pod 里面是由一个或多个容器组成【一组容器的集合】

一个 pod 中的容器是共享网络命名空间

Pod 是短暂的

每个 Pod 包含一个或多个紧密相关的用户业务容器

3.3.2、Pod 存在的意义

创建容器使用 docker,一个 docker 对应一个容器,一个容器运行一个应用进程

Pod 是多进程设计,运用多个应用程序,也就是一个 Pod 里面有多个容器,而一个容器里面运行一个应用程序

Pod 的存在是为了亲密性应用

两个应用之间进行交互

网络之间的调用【通过 127.0.0.1 或 socket】

两个应用之间需要频繁调用

3.3.3、 Pod 实现机制

Pod 主要有以下两大机制:共享网络 和 共享存储。

1、共享网络【容器通过 namespace 和 group 进行隔离】
Pod 中容器通信 过程:
同一个 namespace 下
在 Pod 中创建一个根容器: pause 容器
在 Pod 中创建业务容器 【nginx,redis 等】【创建时会添加到 pause 容器 中】
在 pause 容器 中会独立出 ip 地址,mac 地址,port 等信息,然后实现网络的共享

2、共享存储【Pod 持久化数据,专门存储到某个地方中,使用 Volumn 数据卷进行共享存储】
【K8S】学习笔记(二)_第1张图片

3.3.4、 Pod 镜像拉取策略

我们以具体实例来说,拉取策略就是imagePullPolicy

拉取策略主要分为了以下几种:

  • IfNotPresent:默认值,镜像在宿主机上不存在才拉取
  • Always:每次创建 Pod 都会重新拉取一次镜像
  • Never:Pod 永远不会主动拉取这个镜像

3.3.5、 Pod 资源限制

也就是我们 Pod 在进行调度的时候,可以对调度的资源进行限制
例如我们限制 Pod 调度是使用的资源是 2C4G,那么在调度对应的 node 节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度。

这里分了两个部分:

  • request:表示调度所需的资源
  • limits:表示最大所占用的资源

3.3.6、 Pod 重启机制

因为 Pod 中包含了很多个容器,假设某个容器出现问题了,那么就会触发 Pod 重启机制

重启策略主要分为以下三种:

  • Always:当容器终止退出后,总是重启容器,默认策略 【nginx 等,需要不断提供服务】
  • OnFailure:当容器异常退出(退出状态码非 0)时,才重启容器。
  • Never:当容器终止退出,从不重启容器 【批量任务】

3.3.7、 Pod 健康检查

1、通过容器检查

kubectl get pod

2、通过应用检查

# 存活检查,如果检查失败,将杀死容器,根据 Pod 的 restartPolicy【重启策略】来操作
livenessProbe

# 就绪检查,如果检查失败,Kubernetes 会把 Pod 从 Service endpoints 中剔除
readinessProbe

Probe 支持以下三种检查方式

  • http Get:发送 HTTP 请求,返回 200 - 400 范围状态码为成功
  • exec:执行 Shell 命令返回状态码是 0 为成功
  • tcpSocket:发起 TCP Socket 建立成功

3.3.8、 Pod 调度策略

创建 Pod 流程:

  • 首先创建一个 pod,然后创建一个 API Server 和 Etcd【把创建出来的信息存储在 etcd 中】
  • 然后创建 Scheduler,监控 API Server 是否有新的 Pod,如果有的话,会通过调度算法,把 pod 调度某个 node 上
  • 在 node 节点,会通过 kubelet – apiserver 读取 etcd 拿到分配在当前 node 节点上的 pod,然后通过 docker 创建容器
    【K8S】学习笔记(二)_第2张图片

3.4、Controller

3.4.1、Controller 概述

Controller 是集群上管理和运行容器的对象

  • Controller 是实际存在的
  • Pod 是虚拟机的

3.4.2、Pod 和 Controller 的关系

Pod 是通过 Controller 实现应用的运维,比如弹性收缩,滚动升级。

Pod 和 Controller 之间是通过 label 标签建立关系,同时 Controller 又被称为控制器工作负载。

  • Controller【控制器】【工作负载】selector: app:nginx
  • Pod【容器】labels: app:nginx

3.4.3、Deployment 控制器应用

Deployment 表示用户对 K8S 集群的一次更新操作。

Deployment 控制器可以部署无状态应用

  • 管理 Pod 和 ReplicaSet
  • 部署,滚动升级等功能
  • 应用场景:web 服务,微服务

3.4.4、Deployment 部署应用

使用 Deploment 部署应用

kubectrl create deployment web --image=nginx

使用 YAML 文件进行配置:【快速编写 YAML 文件】

kubectl create deployment web --image=nginx -o yaml --dry-run > nginx.yaml

nginx.yaml:【selector 和 label 就是我们 Pod 和 Controller 之间建立关系的桥梁】

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  # Pod
  labels:
    app: web
  name: web
spec:
  replicas: 1
  # Controller
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

现在,使用nginx.yaml文件创建镜像:

kubectl apply -f nginx.yaml

然后,对外暴露端口:

kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1

# 参数说明
# --port:就是我们内部的端口号
# --target-port:就是暴露外面访问的端口号
# --name:名称
# --type:类型

3.4.5、升级回滚和弹性收缩

3.4.5.1、应用升级

kubectl set image deployment web nginx=nginx:1.15

首先是开始的 nginx 1.14 版本的 Pod 在运行,然后 1.15 版本的在创建
然后在 1.15 版本创建完成后,就会暂停 1.14 版本
最后把 1.14 版本的 Pod 移除,完成我们的升级
这么做的好处就是:升级可以保证服务不中断

3.4.5.2、查看升级状态

kubectl rollout status deployment web

3.4.5.3、查看升级状态

kubectl rollout history deployment web

3.4.5.4、应用回滚

# 查看历史版本
kubectl rollout history deployment web

# 回滚到上一版本
kubectl rollout undo deployment web

# 回滚到指定版本
kubectl rollout undo deployment web --to-revision=2

3.4.5.5、弹性伸缩

# 通过命令创建多个副本
kubectl scale deployment web --replicas=10

你可能感兴趣的:(K8S,笔记,kubernetes,学习,docker)