001-K8S 笔记
001-K8S 笔记【K8S 架构】【K8S 核心概念】【kubectl】【YAML 文件】【K8S 架构】K8S 包括:Master 节点(管理节点)和 node 节点(工作节点)1、Master 节点包含主要组件:1)APIServer:集群统一入口,以 restful 方式,交给 etcd 存储2)scheduler:节点高度,选择 node 节点应用部署3)controller-manag
001-K8S 笔记
【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
更多推荐
所有评论(0)