【K8S 概述】

K8S 是容器化集群管理系统,进行容器化应用部署。使部署更加简洁高效。

【K8S 特性】

1、自动装箱
2、自我修复
当容器失败时,会自动重启
3、水平扩展
4、服务发现/负载均衡
5、滚动更新
6、版本回退
7、密钥和配置管理
8、存储编排
9、批处理
提供一次性任务,定时任务

【K8S 架构】

K8S 包括:Master 节点(管理节点)和 node 节点(工作节点)

1、Master 节点包含主要组件:
	1)APIServer:集群统一入口,以 restful 方式,交给 etcd 存储
	2)scheduler:节点高度,选择 node 节点应用部署
	3)controller-manager:资源管理,处理集群中常规的后台任务,一类资源对应一个控制器(CPU/内存/...)
	4)etcd:K-V 数据库,用于保存集群相关数据
2、node 节点包含订要组件:
	1)kubelet:master 派到 node 节点的代表,用于 master 管理 node 节点
	2)kube-proxy:提供网络代理、负载均衡等操作
	3)docker

【K8S 核心概念】

1、pod
	* 最小部署单元
	* 一组容器的集合(pod 里可以包含多个容器)
	* 同一 pod 中的容器是共享网络的
	* 生命同期是短暂的
2、controller
	* 确保预期的 pod 副本数量
	* 无状态应用部署
	* 有状态应用部署
	* 确保所有的 node 运行同一个 pod
	* 一次性任务和定时任务
3、service
	* 定义一组 pod 的访问规则

【】

kubeadm init:从指定镜像库拉取k8s镜像到指定机器(本机/master机器),并配置服务网段。
拉取时可通过 docker images 查看拉取情况
在这里插入图片描述
init 化完成时会在终端输出如下信息:
在这里插入图片描述
将上述输出内容在 node 节点上执行,将 node 加入 master 管理:在这里插入图片描述

然后就可以通过 kubectl get nodes 查看节点信息

在这里插入图片描述

【kubectl】

kubernetes 集群命令行工具 kubectl。

1、kubectl 命令语法格式:kubectl [command] [TYPE] [NAME] [flags]
	1)command:指定要对资源执行的操作,如 create、get、describe、delete
	2)TYPE:指定资源类型,资源类型大小写敏感,开发者可以使用单数、复数和缩略的形式。如 
		kubectl pod pod1
		kubectl pods pod1
		kubectl po pod1
	3)NAME:指定资源的名称,名称也大小写敏感。如果省略名称则显示所有的资源,如 kubectl get pods
	4)flags:指定可选的参数。如,可用 -s 或 - server 参数指定 k8s api server 的地址和端口

2、帮助命令
获取 kubectl 帮助方法:kubectl --help
	具体查看某个操作:kubectl [command] --help,如 kubectl get --help

3、kubectl 命令集
在这里插入图片描述
在这里插入图片描述
(3)故障和调试命令
在这里插入图片描述
在这里插入图片描述


K8S 命令:
kubectl [command] [type] [name] [flags]
    command: 命令,get/create/describe/delete/...
    type: 类型,node/pod/...
    name:名称
    flags:参数

    例:kubectl get pods k8spod1

查看帮助:
    kubectl --help

查看具体命令帮助:
    kubectl [command] --help
    例:kubectl get --help

同时查看多类信息:kubectl get pod,svc    

常用命令:
    1)创建 deployment
        kubectl create deployment nginx --image=nginx
    2)暴露端口
        kubectl expose deployment nginx --port=80 --type=NodePort

    kubectl get pods
    kubectl get pod
    kubectl get svc
    kubectl get cs
    kubectl get nodes
    kubectl apply -f

查看 API 版本 apiVersion:
    kubectl api-versions

查看资源类型 kind:
    kubectl api-resources

如何快速编写 yaml 文件:
    1) 使用 kubectl create 命令生成 yaml 文件
        kubectl create deployment web --image=nginx -o yaml --dry-run
        kubectl create deployment web --image=nginx -o yaml --dry-run > mydemo.yaml

    2) 使用 kubectl get 命令导出 yaml 文件
        kubectl get deploy nginx -o=yaml --export
        kubectl get deploy nginx -o=yaml --export > mydemo2.yaml




【YAML 文件】

  • 资源清单文件
  • 资源编排

1、语法格式

	* 通过缩进表示层级关系
	* 不能使用 Tab 进行缩进,只能使用空格
	* 一般开头缩进两个空格
	* 字符后缩进一个空格,比如冒号、逗号等后面
	* 使用三个小横杠 --- 表示新的 yaml 文件开始
	* 使用 # 表示注释

2、yaml 文件组成部分
1)控制器定义
2)被控制对象
在这里插入图片描述

3、常用字段含义
在这里插入图片描述

【如何快速生成 yaml 文件】

法一:使用 kubectl create 命令生成 yaml 文件
kubectl create deployment web --image=nginx -o yaml --dry-run
kubectl create deployment web --image=nginx -o yaml --dry-run > my.yaml

法二:使用 kubectl get 命令导出 yaml 文件
kubectl get deploy nginx -o=yaml --export > my2.yaml

【pod】

1、基本概念

1)最小的部署单元
2)一个 pod 里包含一个或多个容器
3)一个 pod 中的容器是共享网络命名空间(共享网络)
4)pod 是短暂的

每个 pod 都有一个特殊容器 pause 容器,被称为根容器。除了Pause 容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
在这里插入图片描述
2、pod 存在的意义
1)创建容器使用 docker,一个 docker 对应的是一个容器,一个容器里有一个进程,一个容器运行一个应用程序。(docker 是单进程程序)
2)pod 是多进程设计,可以运行多个应用程序。
 * 一个 pod 有多个容器,一个容器里面运行一个应用程序
3)pod 存在也是为了亲密性应用
 * 多个应用之间进行交互
 * 网络之前的调用
 * 两个应用之间需要频繁调用

3、pod 的实现机制
1)共享网络

容器本身之间是相互隔离的(通过 namespace、group实现)

pod 实现共享网络机制:
通过 Pause 容器,把其他业务容器加入到 Pause 容器里,让所有业务容器在同一名称空间中,以实现网络共享。

2)共享存储
引入一个数据卷概念 Volumn,实现数据持久化

2、影响节点调度因素

1)节点选择器–nodeSelector
2)节点亲和性–nodeAffinity
3)标签选择器
4)污点和容忍度

nodeSelector和nodeAffinity:Pod 调度到某些节点上,Pod属性,调度时实现
Taint 污点:节点不做普通分配调度,是节点属性
	污点值有三个:
	NoSchedule:一定不被调度
	PreferNoSchedule:尽量不被调度
	NoExecute:不会调度,并且还会驱逐Node 已有 Pod

为节点添加污点:

kubectl taint node [nodename] key=value:污点三个值之一
如:kubectl taint node node1 env_r=yes:NoSchedule

删除污点:

kubectl taint node node1 env_r:NoSchedule-

污点容忍度:
在这里插入图片描述

controller

1、什么是 controller
在集群上管理和运行容器的对象

2、pod 和 controller 关系
pod 通过 controller 实现应用的运维

pod 和 controller 之间是通过 label 标签建立关系的
在这里插入图片描述

3、deployment 控制器应用场景

  • 部署无状态应用
  • 管理 Pod 和 ReplicaSet
  • 部署,滚动升级等功能

4、yaml 文件字段说明

5、deployment 控制器部署应用
1)导出 yaml 文件:kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
2)根据需要修改 web.yaml 文件
3)使用 yaml 部署应用:kubectl apply -f web.yaml
4)对外发布(暴露对外端口号)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
kubectl apply -f web1.yaml

6、升级回滚
升级:kubectl set image deployment web nginx=nginx:1.15
查看升级状态:kubectl rollout status deployment 应用名

查看历史版本:kubectl rollout history deployment 应用名
回滚到上一版本:kubectl rollout undo deployment 应用名
回滚到指定版本:kubectl rollout undo deployment 应用名 --to-revision=版本号

7、弹性伸缩



1、无状态和有状态
1)无状态

  • pod 都是相同的
  • 没有顺序要求
  • 不用考虑在哪个 node 上运行
  • 随意进行伸缩和扩展

2)有状态

  • 无状态因素都需要考虑
  • 每个 pod 是独立的,保持 pod 启动顺序和唯一性
    唯一网络标志符,持久存储
    有序,比如 mysql 主从

2、部署有状态应用

  • 无头 service
    ClusterIP: none

SatefulSet 部署有状态应用
在这里插入图片描述

deployment 和 statefulset 区别:
statefulset 是有身份标识(唯一标识)

  • 根据主机名 + 按照一定规则生成域名
    每个 pod 有唯一主机名
    唯一域名:主机名称.service名称.名称空间.svc.cluster.local

ConfigMap

作用:存储不加密数据到 etcd,让 pod 以变更或者 volume 挂载到容器中。

场景:配置文件
1、创建配置文件


命令:



K8S 命令:
kubectl [command] [type] [name] [flags]
    command: 命令,get/create/describe/delete/...
    type: 类型,node/pod/...
    name:名称
    flags:参数

    例:kubectl get pods k8spod1

查看帮助:
    kubectl --help

查看具体命令帮助:
    kubectl [command] --help
    例:kubectl get --help

同时查看多类信息:kubectl get pod,svc    

常用命令:
    1)创建 deployment
        kubectl create deployment nginx --image=nginx
    2)暴露端口
        kubectl expose deployment nginx --port=80 --type=NodePort

    kubectl get pods
    kubectl get pod
    kubectl get svc
    kubectl get cs
    kubectl get nodes
    kubectl apply -f

查看 API 版本 apiVersion:
    kubectl api-versions

查看资源类型 kind:
    kubectl api-resources

如何快速编写 yaml 文件:
    1) 使用 kubectl create 命令生成 yaml 文件
        kubectl create deployment web --image=nginx -o yaml --dry-run
        kubectl create deployment web --image=nginx -o yaml --dry-run > mydemo.yaml

    2) 使用 kubectl get 命令导出 yaml 文件
        kubectl get deploy nginx -o=yaml --export
        kubectl get deploy nginx -o=yaml --export > mydemo2.yaml


Pod 是 k8s 中最小部署单元,它是一组容器的集合。K8S 不直接处理容器,而是处理 Pod。
同一 Pod 中的容器是共享网络命名空间。
每个 Pod 都有一个根容器 Pause,除 Pause 外,Pod 还包含一个或多个业务容器。

Pod 存在的意义:
    一个容器一个进程。一个容器运行一个应用程序。
    Pod 是多进程设计。运行多个应用程序。
    Pod 也是为了亲密性应用而存在。
        两个应用之间进行交互。
        网络之间调用。
        两个应用需要频繁调用。

Pod 实现机制:
    共享网络。
        容器本身之间相互隔离是通过 namespace 和 group 实现的。而 namespace 里是网络是共享的。将多个容器纳入同一 namespace 中,则容器之间则可以实现网络共享。
    共享存储。

Pod 重启机制:
    Always:当容器终止退出后,总是重启容器,默认策略。
    OnFailure:当容器异常退出(退出状态码非0)时,才重启容器
    Never:当容器终止退出,从不重启容器。

Pod 健康检查:
    存活检查:livenessProbe,如果检查失败,将杀死容器,根据 Pod 的 restartPolicy 来操作。
    就绪检查:readlnessProbe,如果检查失败,K8S 会把 Pod 从 service endpoints 中剔除。

    Probe 支持以下三种检查方法:
        httpGet:发送 HTTP 请求,返回 200-400 范围状态码为成功。
        exec:执行 Shell 命令返回状态是 0 为成功。
        tcpSocket:发起 TCP Socket 建立成功。

Pod 调度影响因素:
    1)Pod 资源限制
    2)节点选择器标签
        给节点打标签: kubectl label node nodename key=value,kubectl label node node1 env_role=dev
        查看打标签的节点:kubectl get nodes nodename --show-labels
    3)节点亲和性 nodeAffinity
        nodeAffinity 和 nodeSelector 基本一样,根据节点上的标签来约束节点调度
        A)硬亲和性:约束条件必须满足,才能具有亲和性。requiredDuringSchedulingIgnoredDuringExecution。
        B)软亲和性:尝试满足。preferredDuringSchedulingIgnoredDuringExecution。
        支持常用操作符:In/NotIn/Exists/Gt/Lt/DoesNotExists
    4)污点和污点容忍
        nodeAffinity 和 nodeSelector 都是为了将 pod 调度到某些节点上。
        Taint 污点:节点属性,节点不做普通分配调度。打上污点是为了不让 pod 调度上打卡污点的节点上。
        》1、查看指定节点上的污点情况:kubectl describe node nodename | grep Taint
            污点值有三个:NoSchedule(该节点一定不会被调度)、PreferNoSchedule(尽量不被调度)、NoExecute(不会调度,并且还会驱逐Node已有Pod)
        》2、给节点打污点:kubectl taint node 主机名 key=value:污点值
            kubectl taint node k8snode1 env_role=yes:NoSchedule
        》3、删除污点:kubectl taint node 主机名 key:污点值-
            kubectl taint node k8snode1 env_role:NoSchedule-
        污点容忍:tolerations,设置污点容忍后,即使节点被设置为污点,节点也有机会被调度到。


controller:管理和运行容器的对象

Pod 和 controller 之间的关系:pod 是通过controller 实现应用运维,比如伸缩、滚动升级等等。
    pod 和 controller 之间通过 label 标签建立关系。

deployment 控制器应用场景:部署无状态应用、管理pod和 ReplicaSet、部署、滚动升级等

yaml 文件字段说明

deployment 控制器部署应用:
    kubectl create deployment web --image=nginx   (学习时使用,生产时不建议)

    kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
    kubectl apply -f web.yaml
    对外发布(对外暴露端口号):
        kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
        kubectl apply -f web1.yaml

        spec:
        ports:
        - port: 80		#Service端口
            protocol: TCP	#协议
            targetPort: 80	#容器端口
            nodePort: 30000	#指定暴露端口号

升级回滚:
    查看镜像:docker images
    升级镜像:kubectl set image deployment web nginx=nginx:1.15
    查看升级状态:kubectl rollout status deployment web
    查看升级的历史版本:kubectl rollout history deployment web
    回滚到上一个版本:kubectl rollout undo deployment web
    回滚到指定版本:kubectl rollout undo deployment web --to-revision=2  (版本号)

弹性伸缩:
    kubectl scale deployment web --replicas=10


【Service】
1、service 存在的意义:
    1)防止 pod 失联(服务发现,pod 在 service 注册)
    2)定义一组pod访问策略(负载均衡)
2、pod 和 service 关系
    根据 label 和 selector 建立联系。
    service 对外暴露一个 vip(虚拟ip)
3、常用 service 类型
    通过 kubectl expose --help 可查看。
    ClusterIp:集群内部使用。
    NodePort:用于对外暴露,对外访问应用使用
    LoadBalancer:对外访问应用使用,公有云

node 内网部署应用,外网一般不能访问到,那如何才能访问内网部署的应用呢:
    找一台可以进行外网访问的机器,安装 nginx,反向代理
    手动把需要访问的节点添加到 Nginx 里。


1、无状态和有状态
2、部署有状态应用
    无头service:ClusterIp 为 None
    StatefulSet:部署有状态应用

deployment 和 statefulset 区别:
    * statefulset 是有身份的(唯一标识)
    * statefulset 根据主机名称 + 按照一定规则生成域名
        - 每个 pod 有唯一主机名,如:nginx-statefulset-0
        - 唯一域名 :主机名称.service名称.名称空间.svc.cluster.local,如:nginx-statefulset-0.nginx.default.svc.cluster.local


Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐