DevOps Stack
DevOps Stack
Capa主要解决应用的混合云问题,涉及到对接适配多种云的底层实现。
Capa本身不提供功能,而是由底层的各种云原生的能力来提供。
对于Capa的运维工作,更多的精力是在同底层的云原生能力打交道。
所以了解云原生中底层组件的DevOps是很有必要的。
本目录主要为对云原生生态中DevOps的学习和实践。
Chaos混沌工程
Chaos Mesh - K8S
Chaos Mesh
一、故障注入场景
A、RPC服务通讯层演练
1. RPC演练-服务延时/性能 监控告警
演练目标:
演练手段:
演练:
2. RPC演练-服务弹性伸缩高可用
3. RPC演练-服务恢复
二、K8S混沌实验
故障注入暂停
# kubectl annotate {kind} {name} experiment.chaos-mesh.org/pause=true
kubectl annotate {networkchaos} {network-delay} experiment.chaos-mesh.org/pause=true
故障注入恢复
# kubectl annotate {kind} {name} experiment.chaos-mesh.org/pause-
kubectl annotate networkchaos network-delay experiment.chaos-mesh.org/pause-
故障注入删除
kubectl delete -f network-delay.yaml
# or delete the chaos object directly
kubectl delete {networkchaos} {network-delay}
A、POD故障
1. Pod Failure
向指定的 Pod 中注入故障,使得该 Pod 在一段时间内处于不可用的状态。
配置:
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-failure-example
namespace: chaos-testing
spec:
action: pod-failure
mode: one
duration: '30s'
selector:
labelSelectors:
'app.kubernetes.io/component': 'tikv'
实践:
- POD不会被K8S回收重新部署。
- POD会一直处于restart状态,可以看到值在增加
- 仅在对应namespace生效
- 使用http访问时,直接报连接错误
“Pod Failure” 混沌实验的一些注意事项
简言之,这里有几个关于使用 “Pod Failure” 混沌实验的建议:
- 如果你正在运行一个气隙或网络隔离的 Kubernetes 集群,请更换一个可用的 “pause image”。
- 为容器配置 livenessProbe 和 readinessProbe。
Pod Failure 混沌实验将会改变目标 Pod 中每个容器的 image 为 “pause image”,这是一个特殊的镜像,不会执行任何操作。我们使用 gcr.io/google-containers/pause:latest 作为默认的 “pause image”,你可以在 helm values controllerManager.podChaos.podFailure.pauseImage 中更改它。
下载 “pause image” 将会消耗时间,并且这个时间将会被计入实验的持续时间中。所以你可能会发现,“实际受影响的时间” 可能会比配置的时间短。这是推荐设置可用的 “pause image” 的另一个原因。
另外一个迷惑的点是,“pause image” 可以在未配置 command 的容器中正常工作。所以,如果容器未配置 command,livenessProbe 和 readinessProbe,它将会被视为 Running 和 Ready,即使它已经被改变为 “pause image”,并且实际上不提供正常功能, 或者被视为不可用。所以建议为容器配置 livenessProbe 和 readinessProbe。
B、网络故障
1. 网络延时
配置:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: delay
spec:
action: delay
# one(表示随机选出一个符合条件的 Pod)
mode: one
selector:
namespaces:
- {default}
labelSelectors:
'app': '{web-show}'
delay:
latency: '{10ms}'
# 表示延迟时间的时间长度与前一次延迟时长的相关性。取值范围:[0, 100]
correlation: '100'
# 表示延迟时间的变化范围
jitter: '0ms'
实践:
- 仅在对应namespace、pod生效
- http调用,感觉会有两个延时:一个是connect,一个是数据发送。所以如果设置10sdelay,可能完成一次调用要20s。
C、AWS故障
AWSChaos 能够帮助你模拟指定的 AWS 实例发生故障的情景。目前,AWSChaos 支持以下类型的故障:
- EC2 Stop: 使指定的 EC2 实例进入停止状态。
- EC2 Restart: 重启指定的 EC2 实例。
- Detach Volume: 从指定的 EC2 实例中卸载存储卷。
实践:
- 似乎无法操作非k8s管理的ec2
ec2级别的故障,可以由aws原生的fis来进行。
AWS FIS
AWS Fault Injection Simulator (AWS FIS)
一、重要概念
要运行实验,您首先要创建一个实验模板。实验模板是实验的蓝图。它包含实验的 操作、目标和停止条件。

A、AWS FIS 操作和支持的 AWS 服务
AWS FIS 支持针对以下 AWS 服务的目标资源的操作:
- Amazon 弹性计算云 (Amazon EC2)
- 亚马逊弹性容器服务 (Amazon ECS)
- Amazon 弹性 Kubernetes 服务 (Amazon EKS)
- Node(EC2)维度
- 不支持到POD维度
- Amazon 关系数据库服务 (Amazon RDS)
B、基本原则和指导方针
在开始使用 AWS FIS 进行实验之前,请执行以下步骤:
- 确定实验的目标部署——首先确定目标部署。如果这是您的第一次实验,我们建议您从预生产或测试环境开始。
- 审查应用程序架构——您必须确保您已确定所有应用程序组件、依赖项和每个组件的恢复过程。首先查看应用程序架构。根据应用程序,请参阅AWS 架构完善的框架。
- 定义稳态行为——根据重要的技术和业务指标定义系统的稳态行为,例如延迟、CPU 负载、每分钟登录失败、重试次数或页面加载速度。
- 形成一个假设——形成一个假设,说明您期望系统行为在实验期间如何变化。假设定义遵循以下格式:如果fault injection action执行,则business or technical metric impact不应超过value. 身份验证服务的假设可能如下所示:如果网络延迟增加 10%,则登录失败的增加不到 1%。实验完成后,您将评估应用程序弹性是否符合您的业务和技术预期。
二、实验步骤
A、创建角色权限
参考: https://docs.aws.amazon.com/fis/latest/userguide/getting-started-iam-service-role.html
B、创建实验
C、TODO
Chaos Mesh
Chaos Mesh
一、安装到K8S集群
Helm
A、有哪些POD
chaos-testing chaos-controller-manager-7788488bbd-dq8k8 1/1 Running 0 45h
chaos-testing chaos-controller-manager-7788488bbd-dvqdj 1/1 Running 1 (34h ago) 45h
chaos-testing chaos-controller-manager-7788488bbd-ffwss 1/1 Running 0 45h
chaos-testing chaos-daemon-4cqnm 1/1 Running 0 44h
chaos-testing chaos-daemon-djrth 1/1 Running 0 44h
chaos-testing chaos-daemon-hpc59 0/1 Pending 0 44h
chaos-testing chaos-daemon-jppg9 1/1 Running 0 44h
chaos-testing chaos-daemon-kgdwb 1/1 Running 0 44h
chaos-testing chaos-daemon-mqh5k 1/1 Running 0 44h
chaos-testing chaos-daemon-qw5cn 1/1 Running 0 44h
chaos-testing chaos-daemon-v8ptz 1/1 Running 0 44h
chaos-testing chaos-daemon-xzkm4 1/1 Running 0 44h
chaos-testing chaos-daemon-zlt67 1/1 Running 0 44h
chaos-testing chaos-dashboard-84ffc4bb9-4nxf9 1/1 Running 0 45h
chaos-daemon每个node一个,以daemonset方式运行。
B、范围控制:配置允许混沌实验的命名空间
控制混沌实验生效的范围
Chaos Mesh 提供了以下两种方式用于控制混沌实验生效的范围:
- 要配置混沌实验只在指定的命名空间内生效,你需要开启 FilterNamespace 功能(默认关闭),此功能将在全局范围内生效。开启此功能后,你可以为允许混沌实验的命名空间添加注解,其他未添加注解的命名空间则会受到保护不会被注入故障。
- 要为单个混沌实验指定实验生效的范围,请参考定义实验范围
开启 FilterNamespace 功能
helm upgrade chaos-mesh chaos-mesh/chaos-mesh -n chaos-testing --set controllerManager.enableFilterNamespace=true
在开启 FilterNamespace 功能后,Chaos Mesh 将只会向包含有 chaos-mesh.org/inject=enabled 注解的命名空间注入故障。因此,在进行混沌实验之前,你需要为允许混沌实验的命名空间添加该注解,其他命名空间则受到保护不会被注入故障。
添加注解
Q&A
A、kubectl和k8s集群版本差距过大
A:降级kubectl到和k8s server匹配的版本上
B、执行命令行时报权限类错误
确保命令行执行时,具有相应的权限。
如在AWS时,需确保客户端的IAM角色具有EKS的操作权限。
Chaos Mesh 使用 Kubernetes 原生的 RBAC 功能来管理用户角色和权限。用户在创建、查看、管理混沌实验时,需要拥有 chaos-mesh.org 这个 apiGroups 下混沌实验自定义资源的相应权限。
对于AWS而言,IAM会映射到RBAC上,所以需要IAM具有权限。
C、ChaosMesh支持K8s的版本
二、执行实验
A、爆炸范围选择
- 命名空间选择器 (Namespace Selectors)
- 标签选择器 (Label Selectors)
- 注解选择器 (Annotation Selectors)
- POD
- NODE
- ……
B、故障恢复
- 创建后,实验会立刻向测试目标注入已配置的故障。如果配置了 duration 参数,故障在 duration 指定的时间结束后会自动恢复。
- 当暂停或者删除混沌实验时,故障会立刻被恢复。
C、实验阶段介绍
在 Chaos Mesh 中,根据实验的执行流程,一个混沌实验的生命周期主要分为以下四个阶段:
- 注入阶段:混沌实验正在进行注入故障操作。通常情况下,此阶段持续的时间很短。如果此阶段持续的时间很长,可能是由于混沌实验出现了异常,此时可以查看事件信息确定异常原因。
- 运行阶段:当所有测试目标都已经被成功注入故障后,混沌实验进入运行阶段。
- 暂停阶段:当对混沌实验进行暂停操作时,Chaos Mesh 会恢复所有测试目标,此时实验进入暂停阶段。
- 结束阶段:如果配置了实验持续时间,当实验运行时间达到了持续时间后,Chaos Mesh 会恢复所有测试目标,表示实验已经结束。
C、查看实验结果
可以使用 kubectl describe 命令查看此混沌实验对象的 Status 和 Events,从而确定实验结果。
kubectl describe podchaos pod-failure-tikv -n tidb-cluster
...
Status:
Conditions:
Reason:
Status: False
Type: Paused
Reason:
Status: True
Type: Selected
Reason:
Status: True
Type: AllInjected
Reason:
Status: False
Type: AllRecovered
Experiment:
Container Records:
Id: tidb-cluster/basic-tikv-0
Phase: Injected
Selector Key: .
Desired Phase: Run
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal FinalizerInited 39s finalizer Finalizer has been inited
Normal Paused 39s desiredphase Experiment has been paused
Normal Updated 39s finalizer Successfully update finalizer of resource
Normal Updated 39s records Successfully update records of resource
Normal Updated 39s desiredphase Successfully update desiredPhase of resource
Normal Started 17s desiredphase Experiment has started
Normal Updated 17s desiredphase Successfully update desiredPhase of resource
Normal Applied 17s records Successfully apply chaos for tidb-cluster/basic-tikv-0
Normal Updated 17s records Successfully update records of resource
Status
依据混沌实验的执行流程,Status 提供了以下四类状态记录:
- Paused: 代表混沌实验正处于暂停阶段。
- Selected: 代表混沌实验已经正确选择出待测试目标。
- AllInjected:代表所有测试目标都已经被成功注入故障。
- AllRecoverd:代表所有测试目标的故障都已经被成功恢复。
可以通过这四类状态记录推断出当前混沌实验的真实运行情况。例如:
当 Paused、Selected、AllRecoverd 的状态是 True 且 AllInjected 的状态是 False时,说明当前实验处在暂停状态。
当 Paused 为 True 的时,说明当前实验处在暂停状态,但是如果此时的 Selected 值为 False,那么可以进一步得出此混沌实验无法选出待测试目标。
注意 你可以从上述的四类实验记录组合中可以推导出更多的信息,例如当 Paused 为 True 的时候,说明混沌实验处在暂停状态,但是如果此时的 Selected 值为 False,那么可以进一步得出此混沌实验无法选出待测试目标。
Events
事件列表中包含混沌实验整个生命周期中的操作记录,可以帮助确定混沌实验状态并排除问题。
三、Chaos Mesh Workflow
复杂的注入工作流。
TODO
Cloud CICD
Terraform
Cloud Ops
Traffic Ops
A、爬虫流量
1. 查看userAgent
- infosec:信安扫描流量
- python:爬虫脚本流量
Cloud Security
AWS IAM
AWS Security - IAM使用经验
一、IAM相关概念
A、用户
用户和角色类似,也是一组权限的集合,但是用户应该更多的面向 人/客户端?
- 人 是某个用户,通过密钥进行认证,然后具有对应的权限
- 机器 是某个用户,通过secretkey进行认证,然后具有对应的权限
B、角色
角色可以理解为,一组权限的集合代表,当需要权限进行操作时,往往是基于 角色 这个实体进行赋予。
- 对某个应用赋予某个角色
- 对某项操作赋予某个角色
C、策略
就是一组权限,或者单个权限。可以赋给 用户、角色。
二、权限认证实践
A、开放的访问环境(sandbox)
由于本身网络环境是开放的,所以仅需进行IAM认证即可连接到其中。
以下为一种示例流程:
1. 设置 用户 访问密钥
- 添加到系统文件
[aws]
aws_access_key_id=
aws_secret_access_key=
aws_session_token=
- 会话级别参数
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_SESSION_TOKEN=
2. 访问目标环境
这时,作为客户端,需要使用的是 用户 这个概念,然后具有 用户 上面对应的权限。
B、隔离的访问环境
1. 通过会话管理器进行访问
这时,作为客户端,需要使用的是 用户 这个概念,然后具有 用户 上面对应的权限。
2. 通过VPN进行访问
连接VPN后,操作步骤同A中所示。
Cloud SRE
AWS CloudWatch
AWS SRE - CloudWatch使用经验
日志、指标、告警等功能
一、日志查询
A、全局日志搜索:Logs Insights
使用 CloudWatch 查询语法进行 日志组 维度的全局日志搜索。
常用查询语法
fields @timestamp, @message
| sort @timestamp desc
| limit 20
“或"语法:|
使用 ‘|’ 来作为 “或” 语义的分隔符,使用多个查询条件
“注释”
使用 ‘#’ 在开头,作为该行查询语句的注释,可使用快捷键 “ctrl + /”
B、日志组
AWS原生日志组
AWS CloudWatch - Log Insights
一、网关搜索
A、查询接口以及响应码
fields @timestamp, @message
| filter @message like /(?i)(queryData)/
| filter @message like /(?i)("500")/
| sort @timestamp desc
| limit 100
二、应用搜索
A、TraceId检索
fields @timestamp, @message
| filter log._trace_id = '12345'
| sort @timestamp desc
| limit 20
B、应用检索
fields @timestamp, @message
| filter kubernetes.labels.appid = '12345'
| sort @timestamp desc
| limit 20
C、POD检索
fields @timestamp, @message
| filter kubernetes.pod_name = '12345-fb5f75b84-k5kgv'
| sort @timestamp desc
| limit 20
D、日志级别检索
fields @timestamp, @message
| filter log._log_level = 'INFO'
| sort @timestamp desc
| limit 20
E、异常模糊匹配
fields @timestamp, @message
| filter @message like 'HttpMediaTypeNotSupportedException'
| sort @timestamp desc
| limit 20