docker/k8s是为了解决服务部署问题
服务部署:- 服务:服务器程序- 部署:是把服务器程序部署到IDC中的计算机上让它运行起来,对Internet提供服务- 流程:编写代码-->编译成可执行的二进制文件-->将二进制文件和其运行所需要的配置打成压缩包-->复制压缩包到IDC机器上 -->解压并启动二进制文件编译打包:- 功能: 即把源代码编译成机器码,也有脚本语言不用编译。然后将二进制文件和其运行所需要的配置
服务部署:
- 服务:服务器程序
- 部署:是把服务器程序部署到IDC中的计算机上让它运行起来,对Internet提供服务
- 流程:编写代码-->编译成可执行的二进制文件-->将二进制文件和其运行所需要的配置打成压缩包-->复制压缩包到IDC机器上 -->解压并启动二进制文件
编译打包:
- 功能: 即把源代码编译成机器码,也有脚本语言不用编译。然后将二进制文件和其运行所需要的配置打成压缩包
- 运行环境异构:
异构: 编译机可能与真正运行代码的机器不同,如linux/windows等操作系统的区别,linux各版本也可能不同,物理机器如CPU架构不同
问题: 这导致编译出来的代码在有的机器可以运行,在有的机器上不能运行,甚至运行出错
- 依赖复杂:
依赖: 在大项目种,一个应用程序会依赖各种三方库,C++中如动态库,操作系统预状库,java的各种jar包, python的各种模块
问题: 运行环境库缺失,库冲突,如依赖了同一个库的不同版本。导致应用程序在开发环境可运行,在线上环境无法运行
- 编译构建速度慢: 大型应用可能编译需要几小时甚至几天
包分发:
- 功能: 编译打包后需要把包批量分发到IDC中需要运行服务的机器
- 上传包: 把包上传到IDC的存储上
- 下载包: 每台机器把包从存储中心上拉到本地
- 解压包: 把压缩包解压到指定目录
服务更新:
- 停止老服务: 向服务发送停止信号,等其正常退出,超时则强行杀死
- 启动新服务: 运行启动命令,启动解压出来的服务代码
- 滚动更新: 一个服务可能有N台机器。需要一批一批重启。 如果同时全量重启可能导致服务短时间不可用。 同时灰度重启可以验证新代码是否有bug.如果有就不发布剩余服务
健康检查:
- 存活检查: 如定时访问服务端口。有时服务进程虽然在,但其实已经无法提供服务
- 自动拉起: 业务进程退出后能自动拉起
扩缩容:
- 扩容: 访问客户端增多,如遇节假日,现在有机器无法承载,需要多加一些机器进来,并运行服务
- 缩容: 服务访问洪峰已过,或者业务下滑,机器利用率低,需要缩走部分机器,节省成本
- 自动化: 如配置高min, max,能自动根据服务负载动态扩缩容
负载均衡:
- 功能: 服务器可能通过N台服务器构建一个集群对外提供服务,但是对客户端端来说,只认为有一台服务器
- 4层: LVS
- 7层: nginx haproxy
- DNS: 通过域名实现高可用与负载均衡
- CDN: 通过cdn缓存
网络通信:
- 内部服务间: 一组服务器之间需要通信,也可能访问内部其他服务如数据库,配置中心。要打通服务间通信网络
- 客户端可访问: 打通客户端与服务器之间的网络。从Internet到防火墙到IDC内网到docker内
- 长连接: 客户端与服务器长时间保持连接
- pull/push:
- dns:服务内外dns服务
流量管理:
- 限流: 负载过高时需要限制流量
- 熔断:
- 标记: 对流量打标记
- 定向: 如把满足某条件流量定向到特定服务主机
作业类型:
- 无状态常驻集群: 要保证集群机器数量
- 有状态常驻集群: 要保证集群机器数量且需要存储
- 定时作业: 如每日报表,每日训练特征处理
- 守护进程: 如日志集,监控告警
- 批处理临时作业: 如tensorflow训练任务,SQL查询
作业执行环境:
- 清空,初始化
- 配置文件
- 环境变量
- 命令行参数
- 外部存储
- 可执行文件
资源管理:
- 资源分配: IDC中有大量机器需要根据作业要求分配资源(网络,ip,磁盘,memory,cpu, gpu...)
- 资源回收: 作业结束回收资源
- 分配策略: 可按一定的策略,或者用户自定义策略分配资源
- 优先级: 高优先级作业可以抢占低 优先级作业的资源
隔离:
- 不同作业之间 CPU, 网络,磁盘,内存等资源隔离
- 租户隔离
UI:
- 易操作的界面
- 可编程的API接口
计费: 不同机器,租户,业务,部门,作业的计费
安全: 不同机器,租户,业务,部门,作业的访问ACL。自身管理权限控制。
监控告警:
- 主机指标: CPU, Memory, Disk, I/O等待
- 业务指标: 成功,失败次数频率
- coredump监控: core次数,告警
- 自定义: 业务脚本访问服务,根据返回值打监控和告警
日志&Debug:
- 主机日志
- 业务日志
- 日志查询,可视化查询
- core文件保存
性能:
- 大规模资源管理
- 大规模作业调度
- 可线性扩展机器提升性能
高可用:
- 自身高可用: 发布系统是会影响到多个作业,多个业务。因此自身高可用十分重要。
- 不影响业务: 自身发布,或者出Bug尽量不影响业务
- 分区分服分set: 部分失败不影响整个系统
k8s之用户常用功能
k8s之YAML
想操作k8s就得写个YAML。YAML中描述的是想达让k8s达到一个什么状态(声明式)。如要启动多少个Pod,网络端口应当暴露哪个等等。不需要指明具体怎么做(命令式)。
yaml由apiVersion, kind, metadata, spec, 部分构成
spec中的template就是对pod的描述。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
labels: #给自己打上label
app: hello
spec:
selector: #要选择有如下label的pod
matchLabels:
app: hello
replicas: 5
template: # pod模板
metadata: #给自己打上label。就可以被上面的选择器选择了
labels:
app: hello
spec:
containers:
- name: hello
image: nginx
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 80
下边是一个正在运行的nginx pod的YAML
[root@centos100 ~]# kubectl get -o yaml pod nginx-deployment-9fbb7d78-dwjcc -n ns-test
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2022-03-01T14:49:03Z"
generateName: nginx-deployment-9fbb7d78-
labels:
app: nginx
pod-template-hash: 9fbb7d78
name: nginx-deployment-9fbb7d78-dwjcc
namespace: ns-test
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: nginx-deployment-9fbb7d78
uid: 0cb30eb3-92f3-4ffe-a9f5-26f52a89588f
resourceVersion: "248414"
uid: b345368d-7c0c-4e51-807b-399d6567fd58
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-pt2r8
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: centos103
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-pt2r8
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2022-03-01T14:49:03Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2022-03-03T12:36:37Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2022-03-03T12:36:37Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2022-03-01T14:49:03Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://0ad3a53d98bf78635e011cccbbefac5b961c4005c80545b71c470fe596083562
image: nginx:alpine
imageID: docker-pullable://nginx@sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3
lastState: {}
name: nginx
ready: true
restartCount: 3
started: true
state:
running:
startedAt: "2022-03-03T12:36:36Z"
hostIP: 192.168.0.103
phase: Running
podIP: 10.21.1.5
podIPs:
- ip: 10.21.1.5
qosClass: BestEffort
startTime: "2022-03-01T14:49:03Z"
更多推荐
所有评论(0)