k8s架构
- 声明式api, 使用yaml定义需要k8s完成什么样的工作,而不是使用kubectl去调用api完成
对象描述
apiVersion: app/v1 #api版本
kind: Deployment # 什么类型的对象
-----------typemeta 对象类型的元信息
metadata:
name: nginx # 对象名
labels: #label定义
app: nginx
------------对象元信息
spec:
selector:
matchLabels:
app: nginx
replicas: 3 #副本数量
template:
metadata:
labels:
app: nginx
spec:
containers:
name: nginx
image: nginx:alpine # 使用的镜像
resources:
requests:
cpu:100m
memory: 200Mi
limits:
cpu: 100m
memory: 200Mi
imagePullSecrets:
- name: default-secret
-----------spec 对象期望状态,用什么镜像,有什么副本
status: {}
--------- 对象实际状态,创建对象后可以看到,创建时不用指定
分层
- 内核层
- 应用层,可以替换成第三方的
- 治理层
- 接口层
- 生态系统层
核心组件
- api server
- etcd
- scheduler
- controller manager
- cloud manager 各个云服务商自己加入
- kubelet
- kube proxy
- containerd 容器
污点和容忍度
- 先在pod.spec中定义容忍度等,让pod去找合适的node,然后使用污点去配置,容忍度是指,可以容忍某些污点
kubectl taint nodes node1 key1=value1:noschedule 增加污点,后面加个-为移除污点
pod
pod生命周期
- pod的status字段中podStatus.phase 表明了pod的声明周期
- pod生命周期: pending, running, failed succeed unknown
容器的三种状态
waiting、running、terminated
kubectl describe pod podname 查看容器状态
重启策略,never、always、onfailure
容器分类
基础容器,infra container,其他容器的父容器,为其容器提供共享的命名空间和网咯空间
初始化容器,init container 在容器启动前 需要做的准备工作的配置,例如查看网络和dns配置等,初始化容器可以定义多个,依次执行
业务容器 containers
pod启动
kubectl logs pod-name 查看日志
yaml配置文件中pod.spec中使用command和args来设置pod启动时的命令和参数,command会替代dockerfile中的entry point,args 用来传递参数
pod镜像相关配置
- image,指定镜像
- imagePullSecret,如果从私有仓库拉取镜像,这个字段设置仓库访问凭证
- imagePullPolicy 镜像拉去策略 ifNotPresent 优先本地 Always,从镜像库拉去,Never 仅用本地
pod接收外部内容
- 使用env。配置键值对
- 使用env.ValueFrom.SecretKeyRef 分别定义key和value
- 使用volme挂载
pod探针
探针诊断方式
- ExecAction, 在容器内执行命令,看是否执行成功
- TCPSocketAction 查看ip:port是否通
- HTTPGetAction,发送Get请求,查看返回状态码
探针的两种类型
- 存活探针,是否存活,livenessProbe
- 就绪探针,探测成功后,接收流量 readinessProbe
livenessProbe: # 探针类型,存活还是就绪
exec: # 诊断方式
command:
- cat
- /tmp/healthy
initalDelaySeconds: 5 # 启动后多少秒,探针才初始化,默认10s
periodSeconds: 5 # 探针执行的周期,默认1s
readinessProbe:
tcpSocket:
port:8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name:cstom-header
value: awesone
container 资源限制
container下的resource字段进行配置
resouses:
requests:
memory: "100Mi"
cpu: "250m"
limit:
memory: "100Mi"
cpu: "250m"
Deployment
无状态工作负载
- replicaSet副本控制器,用于确保pod的副本数量,来实现所扩容
- deployment通过控制replicaSet实现水平缩扩容、滚动更新,而不是直接操作pod
滚动更新
允许使用新的实例,逐步更新,不停机进行Deployment更新 - 可以实现应用程序从一个环境提升至另一个
- 可以进行版本回滚
- 持续集成和交付,无需停机
# 滚动更新的三种方式
kubectl edit deploy/nginx # 修改
kubectl set image deploy/nginx nginx=nginx:1.9.1 # 升级,将镜像由1.7.9改为1.9.1的
kubectl apply -f nginx.yaml # 修改yaml文件重新加载
kubectl rollout status deploy/nginx # 查看更新情况
kubectl rollout history deploy/nginx # 查看更新历史
回滚
kubectl rollout undo deployment/nginx --to-revision=2 指定回滚两个版本
暂停
kubectl rolout pause delopy/nginx
恢复
kubectl rollout resurme deploy/nginx
statefulSet
有状态工作负载
需要创建headless用于解析和pvc,用于数据存储
headless服务创建
- 服务名和statefulSet中定义的需要一致
- 选择器指定正确的Pod标签
- clusterIP设置为None
apiVersion: v1
kind: Service
metadata:
name: nginx
....
....
....
spec
selector:
app: nginx
clusterIP: None # 不需要clusterip的负载均衡能力
PVC创建
containers:
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
# spec 下定义Mounts的www
volumeClaimTemplates:
- metadata:
name: www
annotations:
everest.io/disk-volume-type:SAS
- spec:
- ReadWriteOne
resources:
requests:
Storage: 1G
storageClassName:csi-diskS
kubectl get sts 查看stateful的所有
DeamonSet 守护进程集
节点上的守护进程,每创建一个新的node,就会建立一个pod,运行deamon进程,yaml配置中和Deployment相似,不需要设置replicas,如果手工强制停止deamonSet的pod,系统会自动创建新的
Job、CronJob
kind选Job
completions 当前任务需要几个pod执行
parallelism 最多几个并发执行
restartPolicy 选择Never或者OnFailure
backoffLimit 指定job失败后的重试次数
cronjob
kind为CronJob,在spec下定义schedule字段,字段值为linux crontab语法
应用配置
- 可变配置信息,不能写入镜像,防止每次修改重启
- 敏感信息存储和使用,密码 token
k8s应用配置
configMap 管理一般可变配置,解耦镜像和应用程序,不能用于大块数据,主要用于环境变量、命令行参数、配置文件
Secret 信息采用base64进行编码
apiversion: v1
kind: ConfigMap
metadata:
name: xxx
data:
a: 1
使用可以将整个secret或者configmap挂载到volume上,当做文件,或者是在env中使用
k8s持久化存储
pv 持久存储卷
pvc 持久化存储声明
sc 存储类,为存储商提供存储接入
dp 驱动
动态卷,不需要关心卷的类型等,只需要声明pvc和sc进行空间操作
根据用户的配置,pvc进行最合适的pv选择
size、volmeMode、label、sc、accessMode
最后给一个符合条件,空间最小的pv
pv定义
apiVersion: v1
kind: PersistentVolume
metadata:
name: static-vol
spec:
accessModes: # rwonce读写权限,只能被单个node挂载 readOnlyMany 只读权限,允许多个node挂载 rwMany,读写权限,允许多node
- ReadWriteOnce
capacity:
storage: 10Gi # 容量
csi: # out tree配置信息 厂家提供
driver.disk.csi.everest.io
fsType: ext4
volmeAttributes:
everest.io/disk-mode: SCSI
everest.io/disk-volme-type: SAS
storage.kbernetes.io/csiProvisionerldentity: everest-csi-provisioner
volumeHandle: xxxx-xxx-xx-xx
persistentVolmeReclaimPolicy: Delete # retain/Recycle/Delete 保留数据、回收空间、删除
storageClassName: csi-disk # storageClass名
volumeMode: Filesystem # 挂载成文件系统还是块
使用pvc
apiVersion: v1
kind: PersistentVolmeClaim
metadata:
annotations: xxx
labels:
app: my
release: m
name: xx
namespace: default
spec:
accessModes:
- ReadWriteOnce # 与pv匹配
resources:
requests:
storage: 10G
volumeName/storageClassName: csi-disk #pv或者storageClass名字
volumeMode: Filesystem
selector: # 根据label 对系统所有的pv进行筛选
matchLabels:
release: "stable"
根据pv来写pvc 相当于静态挂载
如果使用动态挂载,则需要sc
apiVersion: v1
kind: StorageClass
parameters: # 插件驱动
csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
csi.storage.k8s.io/fstype: ext4
everest.io/disk-volume-type: SSD
everest.io/passthrough: "true"
provisioner: everest-csi-provisioner # 指定存储卷供应者
reclaimPolicy: Delete
volumeBindingMode: immediate # 立即绑定、waitForFirstConsumer 延迟绑定
allowVolumeExpansion: true # 是佛允许扩容
kubectl get pv/pvc
api server
承担了关键数据通信部分,其性能高低决定了集群性能高低。主要负责pod service等的增删改查
- api。提供restful api
- 访问控制层,主要提供访问控制、鉴权、对资源进行控制,判断能否访问对象
- Registry,存放各种对象
- etcd,持久化存储数据
etcd
etcd,可以以集群方式部署
- 其有一个leader节点,处理写请求,保存到日志,同步给其他节点,半数节点成功,主节点则提交这个事务
etcd组成
- http server,客户端api和其他节点同步请求和心跳检测请求
- Store,处理etcd的各种事务,是大部分api功能的实现
- raft 节点选举和数据同步
- wal 预写式日志,用于数据持久化,记录了所有事务指令
- snapshot 记录etcd某个时刻的全部数据
wal和snapshot结合实现了数据存储和节点故障恢复等操作
Service
有负载均衡的,管理一组pod
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- name.service0
targetPort: 80
port: 8080
protocol: TCP
type: ClusterIp # service类型
kubectl run -i --tty --image nginx:alpine test --rm 进入image操作
可以使用service name直接访问service
需要安装coreDNS插件
然后还会创建endpoint,k8s根据endpoint进行负载均衡,使用kubectl describe svc nginx 可以产看到endpoint
kubectl get endpoints 查看所有的endpoints,pod重启,ip变化,endpoint也会变
全域名
service.namespace.svc.cluster.local
service是kube-proxy和iptabels实现的,kube-proxy list watch apiserver中的service和endpoints,然后会使用iptabels创建service和pod映射关系,并且watch pod的变化,更新规则
service类型
- ClusterIp, 用于集群内部访问,一个pod访问一个集群内相同功能的pod
- NodePort,集群外部访问,通过节点上的port访问
- LoadBalancer,用于外部访问,外部访问loadBalancer,loadbalancer转发给NodePort,外部只需要访问LB
- Headless,用于pod间互相发现,不需要使用service的负载均衡
# nodeport的配置
apiVersion: v1
kind: Service
metadata:
name: nodeport-service
spec:
type: NodePort
ports:
- port:80
targetPort: 80
nodePort: 30120 # 不指定,k8s master会随机30000-32767
selector:
app: nginx
使用nodeip:nodePort 访问 kubectl get xx -o wide -o wide代表显示外部信息
不同LB厂商,对接不一样,其不是k8s的组件
ingress
基于七层的http协议进行转发,根据域名和路径进行路由
ingress controller不是k8s的自带组件,需要自行安装,例如nginx ingress、cce ingress
apiVersion: networking.k8s.io/v1
kind: ingress
metadata:
name: minimal-ingress
annotations: # 描述,不同类型的ingress,不同
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
pathType: prefix # exact 精准 prefix 前缀
backend:
service:
name: x
port:
number: 80
华为云产品
cce
- 集群管理
- 弹性伸缩
- 持久卷存储
- 容器网络
- 亲和、反亲和调度、
- 工作负载
- 节点、节点池管理
cce敏捷版
提供高性能、可扩展。融合了很多高级功能。mcp多云管理,可以将华为云产品,统一管理
- 适用于峰值流量的智能分担
- 跨云应用自动容灾
- 业务地域策略运营
mcp 云原生多云平台
- 混合云统一管理平台
osc,云原生服务中心
- 提供云原生服务的全生命周期管理
cie 云原生应用运维工具
- 可视化,一键故障诊断
cci云容器实例
- 使用kata 方案
- 用户值需要申请资源,不需要关心底层实现
- 智能调度(volcano)、按需计费、安全容器(运行在为虚拟机上,使用kata技术实现,实现虚拟机级安全隔离)、极速扩容(100ms内)四大特性
- 主要用于ai计算、高性能容器批量计算、长期稳定及扩容流量处理
使用cce,用户需要创建node节点,使用cci不需要,只需要创建工作负载
根据资源按小时计费 按s计费根据cpu和内存
适合大规模长期稳定的应用 批量计算,如法扩容,ci/cd
应用容器改造
容器改造步骤
- 容器选择
- 准备应用运行环境
- 编写开机脚本
- 编写dockerfile
- 制作并上传镜像
- 创建工作负载
cce集群选型
- cce
- cce-turbo 高性能的,大规模的,网络隔离、安全性高
高可用选型
- 多主节点跨az(区域)部署
- 节点高可用,node跨az部署
- 应用高可用
容器存储
- devicemapper,有一部分空间是容器共享空间,删除文件后不能立马回收空间,块存储,进行修改,只会修改对应快,适合文件大,修改少的场景
- overlayfs,文件存储,对文件进行修改,会修改整个文件,大并发,少io适合
节点池
- 一组有相同功能的节点集合,会统筹管理节点,修改配置会影响所有节点
网络选型
- 容器隧道网络,基于vxlan隧道封装,最大支持2000节点,
- vpc网络,无隧道封装,跨节点通过vpc转发,使用ipvlan(所有虚拟的网口mac地址相同)和vpc路由实现,默认200节点,受限于vpc路由表
- 云原生网络2.0
swr 镜像仓库
- 镜像扫描,可以扫描镜像中是否包含恶意漏洞等
- 跨区镜像同步,基于kafka,两个地区的镜像仓库可以同步,包含自动、手动同步
- 触发器、镜像老化,上传镜像自动触发版本更新等操作,老版本镜像自动删除等,自动cicd等
dockerfile
- 不要在docker file中升级软件
- 一个容器只运行一个进程,不要mysql和PHP等一起运行
- 使用exec from格式的cmd和entrypoint
- 变化频率相同的放在同一个run中
- 使用标签,具体到使用的基础镜像
- 删除过程文件,下载的apt包等
- 指定workdir
- 使用copy代替add
工作负载设计
- 需要对资源进行配置
- besteffort,不设置request和limits,优先被kill
- burstable,设置的request和limit不一致,oomadj为0-1000
- guaranteed,request和limit设置的一致,oomadj为-998,越小存活要长久(最后被kill)
容器生命周期
- poststart 开始接收请求
- perstop 停止之前
健康检查
- livenessProbe 检测容器是否存活,如果不存活了,根据策略重启pod
- readinessProbe,服务是否可用检查,服务可用才发送请求道这个endpoint
静态动态存储
- 静态 pv对应一个pvc
- 动态pvc对应storage class,storageclass配置了怎么选择pv kubectl get sc
调度策略
- nodeName和NodeSelector(使用调度器选择)
- 亲和、反亲和调度,节点和pod亲和、反亲和
伸缩策略
- HPA 根据cpu、内存利用率,对无状态的负载进行弹性伸缩,对pod进行缩扩容
- customHPA,华为自研,增加了周期性策略,每周、每月或者特别日期进行扩容
- cluster autoscaler,监控调度失败的pod,使用最小浪费算法,在节点池中选择节点扩容
服务设计
- 根据四层转发,clusterIp、nodePort、Elb(仅此支持公网访问)
- 根据七层转发,elb(可以单独为每个监听器配置证书)、nginx,根据uri转发
DNS
容器运维
运维的范围
- 环境定义,包括开发、测试、预生产、生产环境
- 部署,将包有效的部署到不同坏境
- 监控,能监控系统和应用
- 告警响应,告警发生时,对告警的响应和处理
- 性能调优,包括对各种服务的调优
- SLA保障,自动化环境定义、自动化部署、自动化监控
aom,应用运维管理
- prometheus—+grafana
- 注意grafana 数据十九华
- cie容器洞察引擎
- 开放兼容云原生技术
- 应用为中心
- 数据无缝关联
- 一键集群
敏捷版cie架构
- 由log-center和log-agent组成
- log-agent负责日志收集,转发
- log-center负责日志信息呈现、转存和老化
服务网格
一种云原生的(弹性、服务化、去中心的)、应用层(关注应用的发布、监控、恢复)网络技术
istio
- 控制平面,istiod
- pliot 服务发现和流量管理
- citadel 证书分发,提供角色控制
- Galley 配置管理
- 数据平面
envoy流量代理
- LDS,监听器发现服务
- RDS,路由发现服务
- CDS,集群发现服务
- EDS,集群成员发现服务
gateway
指定可以进入或者离开网格的流量
virtualService 流量控制
- 由一组路由规则组成,用于对pod进行寻址,如果流量命中了某个路由规则,就会发送到对应的服务后盾
DestinationRule 路由控制
- 流量到达后端后的处理规则,流量先经过VirtualService分发到目标地址,然后调用DestinationRule来分发到该目标的流量
serviceEntry
- 将网格的外部服务,添加到服务表中
服务网格监控
metrics
为通过它的流量生成指标和统计,从而监控流量大小以及对流量就行预测
accessLog
会记录完整的日志,请求源、请求目标、请求元数据,用于观测和审计
Distributed Traces 分布式追踪
日志比较孤立,用服务追踪来查看前后因果,非零侵入,需要进行调用链埋点
ASM(应用服务网格)
- 基于istio进行了功能的增强
- 流量,支持复杂入口流量定义
- 可靠性、可维护性,提供托管控制面板,减少运维负担
- 协议扩展,支持dubbo和spring cloud
- 混合部署
- 可观察性
- 灰度发布
- 跨集群治理
- 大规模治理
灰度发布
- 基于请求内容灰度规则
- 基于流量比例灰度
- 金丝雀
- 蓝绿
流量治理
熔断机制
- 当某个后端服务连续错误达到某个阈值时,进行熔断,一段时间后重新加入,测试是否可用,如果仍不可用,增加不可用时间,再进行驱逐
故障注入
再系统中加入故障,从而评估系统的稳定性等,无需侵入式的修改代码来实现
- 时延故障
- 中断故障
服务监控
asm观察微服务调用的请求总数,错误次数、请求时延、最大时延
asm 提供非侵入式的微服务调用链监控
容器多集群管理
MCP
华为基于karmada开发的容器多云和混合云解决方案
karmada架构
- karmada api-server 包含了k8s的基本api还有扩展的api
- controller 来根据api创建对象
- karmada schedler 实现应用在多个容器里的调度
- 支持集中式管理,公有云、私有云
- 集群隔离
- 支持分布式和集中式的集群同步
- member集群,由一个或者多个集群组成
- 三个重要对象
- resouse template 创建资源模板
- propagation policy 多云调度策略,分发策略 分发给那个后端的member,根据resourceSelectors进行调度选择
- override policy 多云 差异化配置,设置不同的环境变量、不同的镜像仓库等
apiVersion: types.kubefed.io/v1
kind: federatedDeployment
metadata:
name: test-deployment
namespace: test-namespace
spec:
template:
metadata:
labels:
app: nginx
spec:
replicas:
selector:
placement:
clusters:
- name: member1
- name: member2
overrides:
- clusterName: member2
clusterOverrides:
- path: "/spec/replicas"
value: 2
mcp介绍
- 天然多云
- 多云调度
- 多云治理
- 多云运维
- 多云安全
- 业务流量分担
- 数据与业务分离
- 开发和生产分离
- 计算资源合理调配
- 业务多活容灾
curl -fsSL get.docker.com -o get-docker.sh