常见的几种 LLM Agent 架构
1. 链式提示系统(Prompt chaining) 提示链将任务分解为一系列步骤,其中每个 LLM 调用都会处理前一个步骤的输出。 2. 路由系统(Routing) 路由会对输入进行分类,并将其定向到专门的后续任务。 3. 并行化系统(Parallelization)
Recent content on 陈少文的网站
1. 链式提示系统(Prompt chaining) 提示链将任务分解为一系列步骤,其中每个 LLM 调用都会处理前一个步骤的输出。 2. 路由系统(Routing) 路由会对输入进行分类,并将其定向到专门的后续任务。 3. 并行化系统(Parallelization)
1. 处理确定故障 对于有具体处理方式的故障,直接使用 Agent 处理,发通知周知即可。 类似的自动处理,我们有应用层的异常负载删除、节点层的磁盘清理、GPU 掉卡屏蔽卡、屏蔽节点等。先找出团队中遇到得最多、需要最多人力的事情,对其进行自动化处理。你可以认为,
1. 原始模型测试 启动环境 1 2 3 4 5 6 7 8 9 10 nerdctl run -it \ --gpus all \ --ipc=host \ -p 8000:8000 \ --ulimit memlock=-1 \ --ulimit stack=67108864 \ --name vllm \ --volume /data/models:/data/models \ --entrypoint /bin/bash \ vllm/vllm-openai:v0.10.1.1 后面 vllm 相关的测试,都基于这个环境。 启动服务 1 2 3 4 5 6 export CUDA_VISIBLE_DEVICES=0 python3 -m vllm.entrypoints.openai.api_server \ --model /data/models/Qwen3-0.6B \ --served-model-name /data/models/Qwen3-0.6B \ --host 0.0.0.0 \ --port 8000 测试 1 2 3 4 5 6 7 8 curl -X POST "http://127.0.0.1:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ -d '{ "model": "/data/models/Qwen3-0.6B", "messages": [ {"role": "user",
1.为什么要 PD 分离部署大模型应用 在大模型推理的过程中,有两个串行阶段: 处理全量的输入上下文,生成 KV Cache(Prefill 阶段) 增量生成新的 token(Decode 阶段) 这两个阶段对资源的需求不一样。Prefill 阶段要计算大量的 KV Cac
1. LMCache 简介 TTFT 是指从请求发出到模型生成第一个 token 的时间。由于 Prefill 阶段需要把输入的上下文编码成 KV Cache,才能开始生成,在生成第一个 token 时需要大量的计算从而导致 TTFT 很高。 为了降低 TTFT,有一个思路就是将 Prefill 阶段计算出来的 KV Cache 缓存起来,下次遇到相同的上下
1. 什么是 Prefix Cache 在模型推理场景下,经常会使用缓存机制来提升吞吐和性能。常见的有两种缓存机制: Key-Value Cache (KV Cache),面向的是单次请求的内部,将 Transformer 模型中间计算结果(Key 和 Value)缓存起来,避免重复计算 Prefix Cache,面向的是多次请求时,利用 Prompt 的公
1. 安装驱动 下载驱动 访问 https://www.nvidia.com/en-us/drivers/ 选择对应的驱动版本下载 1 wget https://us.download.nvidia.com/XFree86/Linux-x86_64/580.76.05/NVIDIA-Linux-x86_64-580.76.05.run 安装驱动 1 bash NVIDIA-Linux-x86_64-580.76.05.run 查看显卡 1 nvidia-smi 1 2 3 GPU 0: NVIDIA GeForce RTX 5090 (UUID: GPU-92fcdc58-4754-73c7-af6c-56740936817d) GPU 1: NVIDIA GeForce RTX 5090 (UUID: GPU-e05cb455-7dd3-0db5-ac39-70794aa19d4e) ... 开启持久模式 1 nvidia-smi -pm 1 查看拓扑结构 1 nvidia-smi topo -m 1 2 3 4 5 6 7 8 9 GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 CPU Affinity NUMA Affinity GPU NUMA ID GPU0 X PIX NODE NODE SYS SYS SYS SYS 0-47,96-143 0 N/A GPU1 PIX X NODE NODE
1. 什么是模型量化 模型量化是将高精度的模型(通常为 32 位浮点数 FP32 或 16 位浮点数 FP16 )的权重和激活值转换为低精度模型(如 8 位整数 INT8)的过程。 FP32 的值范围为 -3.4*10^38 到 3.4*10^38,有 40 亿个值。而对于 INT8,我们只能看到可能值集内的 256 个值,值范围为
1. 基础包 Kubernetes 版本 ≥ 1.18 socat 必须安装 conntrack 必须安装 ebtables 可选,但推荐安装 ipset 可选,但推荐安装 ipvsadm 可选,但推荐安装 1 apt-get -y install socat conntrack ebtables ipset ipvsadm 2. 端口要求 2.1 基础节点服务 Service Protocol Action Start Port End Port Comment ssh TCP allow 22 22 节点远程管理 docker TCP allow 2375 2376 Docker 远程通信 etcd TCP allow 2379 2380 etcd 集群通信 2.2 Master/Control Plane 组件 Service Protocol Action Start Port End Port Comment apiserver
1. cgroup v1 与 v2 接口路径差别 v1 1 2 3 4 /sys/fs/cgroup/cpu/cpu.cfs_quota_us /sys/fs/cgroup/cpu/cpuacct.usage /sys/fs/cgroup/memory/memory.limit_in_bytes /sys/fs/cgroup/memory/memory.usage_in_bytes v2 1 2 3 4 /sys/fs/cgroup/cpu.max /sys/fs/cgroup/cpu.stat /sys/fs/cgroup/memory.max /sys/fs/cgroup/memory.current cgroup v2 是 v1 的升级版本,具有更统一的资层级管理、精准的资源隔离等优点。但也导致了,写代码时,读取相关接口文件时路径不一样,需要做兼容处理。另外,一个思路就是,统一到一个 cgroup 版本。 Kubernetes 默认支持
同样适用于桌面环境。 1. 准备 node.js 环境 安装 nvm 1 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash 1 2 echo 'export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"' >> ~/.bashrc echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc 1 source ~/.bashrc 查看 nvm 版本 1 nvm --version 安装 node.js 1 nvm install 20 升级 npm 1 npm install -g npm 2. 安装 claude-code 安装包 1 npm install -g @anthropic-ai/claude-code 查看版本 1 claude --version 1 1.0.96 (Claude Code) 3. 安装 claude-code-router claude-code 目前仅能调用 Claude 的 API。使
处理故障时,参考或者记录下的内容,持续更新中 1. 容器挂载设备 1 export IMAGE=ascendai/pytorch:2.1.0 1 2 3 4 5 6 7 8 9 10 nerdctl run --rm -it --ipc=host \ --device=/dev/davinci7 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ ${IMAGE} \ /bin/bash 2. 创建 Pod 1 2 export IMAGE=ascendai/pytorch:2.1.0 export NodeName= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 kubectl create -f - <<EOF apiVersion: v1 kind: Pod metadata: name: test-ascend-pod namespace: default spec: restartPolicy: Never nodeName: ${NodeName} containers: - name:
1. 什么是 DCGM DCGM (Data Center GPU Manager) 是 NVIDIA 提供的一个用于数据中心 GPU 管理和监控的工具集,提供了以下功能: GPU 行为监控 GPU 配置管理 GPU 策略监督 GPU 健康和诊断 GPU 计费和进程统计 NVSwitch 配置和监控 2. 安装 DCGM 2.1 安装 libnvidia-nscq 一般都是 NVLink 连接 GPU,可以通过 nvidia-smi topo -m 查看是否有 NVSwitch 字样输出判断是否需要安
1. 什么是僵尸进程 进程的创建过程: 父进程调用 fork() 创建子进程 子进程执行 exec() 加载新程序 子进程结束执行,调用 exit() 或返回 父进程调用 wait() 或 waitpid() 如果父进程没有调用 wait() 或 waitpid(),子进程结束后仍然保留在系统中,成为僵尸进程。 2. 怎么查看僵尸进程 可以使用 ps 命令查
VLLM Benchmark 是 VLLM 提供的一个用于测试模型性能的工具,支持多种推理后端。本文主要记录一些使用 VLLM Benchmark 进行模型性能测试的过程。 1. 启动模型服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 python -m vllm.entrypoints.openai.api_server \ --model /models/Qwen2.5-7B-Instruct \ --served-model-name /models/Qwen2.5-7B-Instruct \ --host 0.0.0.0 \ --port 8000 \ --trust-remote-code \ --dtype bfloat16 \ --gpu-memory-utilization 0.90 \ --max-model-len 4096 \ --max-seq-len-to-capture 8192 \ --max-num-seqs 128 \ --disable-log-stats \ --tensor-parallel-size 1 \ --no-enable-prefix-caching 2. 启动客户端
1. 打脸式删库删镜像删文档 发起人 Ray 在职青云科技的最后一天,开源项目 KubeSphere 的前端、文档、镜像被删除,用户在各种渠道收到【关于 KubeSphere 开源项目调整的公告】。 即使,这家公司管理层对 KubeSphere 分歧很大,对某些人有针对性、有敌意,也不至于如此粗暴与迅速。只能说,这事办得
1. 部署 NFS 存储 1.1 在存储节点配置 NFS 服务 存储节点安装 NFS 服务 1 apt-get install -y nfs-kernel-server 启动并设置 NFS 服务开机自启 1 systemctl start nfs-server.service & systemctl enable nfs-server.service 配置 NFS 共享目录 1 mkdir -p /data/nfs 1 vim /etc/exports /data/nfs *(rw,sync,no_root_squash,no_all_squash) 重启 NFS 服务 1 systemctl restart nfs-server.service 1.2 在全部节点配置 NFS 客户端 1 apt-get install -y nfs-common 2 配置 StorageClass 1 2 helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version v4.9.0 1 2 3 4 5 6 7 8
1. history 命令 使用 history 命令可以查看当前会话的命令历史记录,当退出 shell 时,命令历史会被保存到对应的历史文件中。 如果是 bash,则命令历史会保存在 ~/.bash_history 文件中;如果是 zsh,则保存在 ~/.zsh_history 文件中。也可以使用 HISTFILE 环境变量来指定历史记录文件的位置,export HISTFILE=/data/ops/bash_history 。 2. 如
2025 Intrinsic Fingerprint of LLMs [发布日期: 07-04] 点击查看 论文提出了一种基于注意力参数矩阵(Q/K/V/O)层间标准差分布模式的鲁棒指纹识别方法,用于检测大型语言模型(LLM)的血缘关系(如是否通过继续训练/微调/升级再造衍生自另一模型),并声称该方法揭示了华为 Pangu Pro
1. 获取项目 ID 和 API 密钥 访问 https://aistudio.google.com/apikey 获取项目 ID 和 API 密钥,并设置为环境变量 1 2 echo "export GOOGLE_CLOUD_PROJECT=" >> ~/.bashrc echo "export GEMINI_API_KEY=" >> ~/.bashrc 1 source ~/.bashrc 2. 准备 node.js 环境 安装 nvm 1 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash 1 2 echo 'export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"' >> ~/.bashrc echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc 1 source ~/.bashrc 查看 nvm 版本 1 nvm --version 安装 node.js 1 nvm install 20 升级 npm 1 npm install -g npm 3. 安装 gemini 1
1. 安装依赖 MindCluster ToolBox 是一套面向集群运维与硬件管理的系统级工具集,主要用于设备监控、性能测试、日志收集等运维操作。 MindCluster ToolBox 中包括 Ascend DMI 工具、日志收集工具和 Ascend Cert 工具。 MindCluster ToolBox 工具的原理是,通过调用底层 DCMI(设备控制管理接口)以及 AscendCL(Ascen
1. k8s-device-plugin https://github.com/NVIDIA/k8s-device-plugin 是 NVIDIA 官方提供的 Kubernetes 设备插件,用于在 Kubernetes 集群中管理和分配 NVIDIA GPU 资源。 k8s-device-plugin 通过与 kubelet 的交互,自动发现和注册 GPU 设备,并将其作为资源提供给 Kubernetes 调度器。它支持多种 GPU 型号,并能够处理 GPU 的分片和共享。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: restartPolicy: Never containers: - name: cuda-container
1. 设置环境变量 设置 foundationdb 集群名称和版本 1 2 3 4 5 export CLUSTER_NAME= export NAMESPACE= export DEPLOY_NAME=${CLUSTER_NAME}-deployment export SECRET_NAME=fdb-backup-secret export VERSION=7.1.26 设置 S3 备份存储桶和凭证 1 2 3 4 5 export BUCKET= export HOST=s3.us-west-2.amazonaws.com export AK=x export SK=x export S3_BACKUP_URI="blobstore://${AK}:${SK}@${HOST}/fdb-backup?bucket=${BUCKET}&sc=0" 2. 创建凭证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: ${SECRET_NAME} namespace: ${NAMESPACE} type: Opaque stringData: credentials: | { "accounts": { "${BUCKET}@${HOST}": { "access_key": "${AK}", "secret": "${SK}", "endpoint": "${HOST}" } } } EOF 3. 创
副标题: 开启自我改变的原动力 作者: 周岭 出版社: 人民邮电出版社 出版年: 2020-10 ISBN: 9787115543424 Notes: 这本书分为两个部分。 第一部分是向内的,认识自我。从三位一体脑理论出发,介绍脑的运作方式。本能脑维持基本生理需求,情绪脑负责情绪和社交,理性脑处理逻辑和决策。但大部分
1. 背景 Node Exporter 是 Prometheus 生态系统中用于收集主机指标的常用组件,但默认情况下不提供访问认证。本文介绍如何为 Kubernetes 环境中的 Node Exporter 添加基本认证,提高安全性。 2. Node Exporter 配置凭证 2.1 生成加密密码 使用 htpasswd 工具生成加密密码: 1 htpasswd -nBC 12 "" | tr -d ':\n' 这里需要输入密码,生成的输出将是一个
1. smokeping-prober 是什么 smokeping-prober 是一个用于探测网络质量的工具,它通过向目标节点发送 ICMP 请求来探测网络质量。 2. 部署 smokeping-prober 2.1 生成 smokeping-prober.yaml 配置文件 1 2 3 4 5 6 7 8 9 10 11 cat > smokeping_prober.yaml <<EOF --- targets: - hosts: - 1.2.3.4 interval: 1s # Duration, Default 1s. network: ip # One of ip, ip4, ip6. Default: ip (automatic IPv4/IPv6) protocol: icmp # One of icmp, udp. Default: icmp (Requires privileged operation) size: 56 # Packet data size in bytes. Default 56 (Range: 24 - 65535) tos:
1. Cline 使用 Ops 查询有哪些集群 获取节点的详情 Case 非常简单但数据真实,说明 Cline 已经能够对接 Ops 进行运维操作。至于更复杂的一些 Case 需要更多测试。具体的玩法可能在于: 给定一些特定的 Workspace 作为上下文信息、设置自定义的指令强化某些特征等。 2. Cline 配置 Ops MCP 2.1 前提条件 使用 Cline 需
1. 问题描述 相关 Pod 1 2 3 4 5 6 kubectl -n istio-system get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES istiod-647c7c9d95-7n7n6 1/1 Running 0 77m 10.244.173.51 docs-ai-a800-4 <none> <none> istiod-647c7c9d95-k6l88 1/1 Running 0 30m 10.244.210.160 ai-a40-2 <none> <none> istiod-647c7c9d95-pj82r 1/1 Running 0 51m 10.244.229.217 docs-ai-a800-2 <none> <none> 相关 Service 1 2 3 4 kubectl -n istio-system get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istiod ClusterIP 10.99.225.56 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 645d 1 2 3 4 kubectl -n istio-system get endpoints NAME ENDPOINTS AGE istiod 10.244.173.51:15012,10.244.210.160:15012,10.244.229.217:15012 + 9 more... 645d Endpoints 与 Pod 的 IP 是一致的。 测试结果 在异常节点
1. 背景 在测试 NFS Over RDMA 的性能时,发现 4M 的文件的读取性能竟然能达到 45GB/s。 1 2 3 fio -numjobs=128 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/data1/nfs READ: bw=42.3GiB/s (45.4GB/s), 42.3GiB/s-42.3GiB/s (45.4GB/s-45.4GB/s), io=1269GiB (1363GB), run=30019-30019msec 而磁盘的 4M 多线程读取性能只有 6 GB/s 1 2 3 fio -numjobs=128 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/data1/host READ: bw=6190MiB/s (6491MB/s), 6190MiB/s-6190MiB/s (6491MB/s-6491MB/s), io=182GiB (196GB), run=30152-30152msec 2. NFS Over RDMA VS NFS 3. 数据拷贝路径比较 3.1 NFS
1. Direct IO Direct IO 绕过了操作系统的页缓存(page cache),直接与硬件设备进行数据交互。 Direct IO 的特点: 新数据多,不需要缓存 内存占用少 大文件顺序读写 对于超过阈值(默认 1MB)的同步读取操作,3FS 的客户端会将其转为 AIO (以 Direct IO 方式打开文件)操作以提高
记录一些 DeepSeek 3FS 的运维操作,持续更新中。 1. 基本概念及注意事项 Chain 一个 Chain 是由若干个 Target 组成,每个 Target 是一个存储的副本。在全部提交就绪的情况下,一个 Chain 的所有 Target 都是一致的。 一个 Chain 上的 Target 不能在同一个节点上。 Chain 就是存储的空间,写文件是会被分配到一个 Chain 上,读文件
1. 部署方案 在开始容器化部署之前,先提几点要求: 为了简化交付,只需要一个镜像 为了可靠性,尽可能多副本部署 通过不同的参数启动不同的服务 通过环境变量注入配置,渲染到配置文件中 下面是 DeepSeek 3FS 的部署方案: 需要部署: 一个 Monitor 用来收集监控数据,数据存储在 ClickHouse 中 一
1. 硬件测试 有两块 NVMe SSD SAMSUNG MZQL27T6HBLA-00A07,两个节点组成的 3FS 集群,每个节点有 4 个 IB 网口。 1.1 单线程 磁盘 FIO 128 K,读 1 fio -numjobs=1 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=128K --group_reporting -size=100M -time_based -runtime=30 -name=fio-test -directory=/data/fio 1 Jobs: 1 (f=1): [R(1)][100.0%][r=2211MiB/s][r=17.7k IOPS][eta 00m:00s] 磁盘 FIO 128 K,写 1 fio -numjobs=1 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=write -bs=128K --group_reporting -size=100M -time_based -runtime=30 -name=fio-test -directory=/data/fio 1 Jobs: 1 (f=1): [W(1)][100.0%][w=3703MiB/s][w=29.6k IOPS][eta 00m:00s] 磁盘 FIO 4 M,
1. 为什么要将 3FS 对接到 Fluid 3FS 是 DeepSeek 开源的分布式存储系统,因其极优异的性能测试结果,而被津津乐道,star 量快速飙升。 我所在的团队也对 3FS 展开了技术上的跟踪,寻找合适的应用场景,发挥 AI 硬件基础设施的最大价值。 我们线上推理、训练服务使用的存储系统都是通
1. 前置条件 存储与使用存储的节点组成 RDMA 网络 RDMA 设备配置了 IP 地址 如果使用的是 Mellanox 网卡,在安装驱动时需要加上参数 -with-nfsrdma 1 ./mlnxofedinstall --with-nfsrdma 2. 服务端启动 安装依赖 1 apt install nfs-kernel-server rdma-core -y 加载内核模块 1 modprobe svcrdma 将端口加入 portlist 1 echo 'rdma 20049' | tee /proc/fs/nfsd/portlist 挂载目录 1 mkdir /data1/nfs 1 2 3 vim /etc/exports /data1/nfs *(rw,sync,no_root_squash,no_all_squash) 启动 NFS 服务 1 systemctl start nfs-server.service 检测挂载
1. 现象 能查看 Pod 的信息 1 2 3 4 kubectl -n my-testns get pod my-testpod NAME READY STATUS RESTARTS AGE my-testpod 1/1 Running 0 2d13h 不能查看 Pod 的日志 1 2 3 kubectl -n my-testns logs my-testpod -f Error from server (NotFound): the server could not find the requested resource ( pods/log my-testpod) 在 Pod 所在主机上可以通过 docker logs 查看容器日志。 测试 Kubelet 的健康状态 OK 1 curl -k https://x.x.x.x:10250/healthz 这里要使用主机的 IP 地址,kubectl logs 命名会直接
由于机房服务器绑定的带宽较小,本篇主要是借助 Dante 提供 SOCKS5 转发,借助一些大带宽的服务器进行流量转发,用以加快依赖包的下载速度。 1. 找一台大带宽的服务器 安装 speedtest-cli 1 pip3 install speedtest-cli 列出对端测试服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 speedtest-cli --secure --list Retrieving speedtest.net configuration... 5396) China Telecom JiangSu 5G (Suzhou, China) [747.08 km] 16204) JSQY - Suzhou (Suzhou,
1. 测试全部带宽 在目标主机上启动 iperf3 服务端 1 2 3 4 5 iperf3 -s ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- 在客户端主机上测试 1 iperf3 -c x.x.x.x -p 5201 -t 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Connecting to host x.x.x.x, port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 151 MBytes 1.27 Gbits/sec 3562 164 KBytes [ 5] 1.00-2.00 sec 134 MBytes 1.12 Gbits/sec 230 164 KBytes [ 5] 2.00-3.00 sec 124 MBytes 1.04 Gbits/sec 250 213 KBytes [ 5] 3.00-4.00 sec 122 MBytes 1.03 Gbits/sec 229
1. 什么是 Ray 2016 年,UC Berkeley 的 RISELab 发布了一个新的分布式计算框架 Ray。 2017 年,发布 Ray 相关论文之后,受到业内的广泛关注,国内主要是蚂蚁集团采用并贡献了 Ray。 2020 年,Ray 发布了 1.0 版本,引入 Placement Group 特性,增加了用户自定义任务编排的灵活性,为后续的 Ray AI Libraries 和 vLLM 等
1. Qwen 模型介绍 2023 年 4 月,阿里巴巴推出 Qwen 的测试版。 2023 年 12 月,阿里巴巴开源了 Qwen 的第一个版本。 2024 年 9 月,阿里巴巴发布了 Qwen2.5。 2025 年 1 月,阿里巴巴发布了 Qwen 2.5-Max。 Qwen 2.5 是 Qwen 大语言模型的目前最新系列。之所以说是系列,是因为在训练完一个预训
NVIDIA_VISIBLE_DEVICES 指定程序可见的 GPU 设备 1 CUDA_VISIBLE_DEVICES=0,1 可用值: 1,2,以逗号分隔的 GPU UUID 或索引列表 all,所有 GPU none,加载驱动,但无法访问 GPU void,不加载驱动 NVIDIA_DRIVER_CAPABILITIES 控制哪些驱动程序库/二进制文件将被安装在容器内 1 NVIDIA_DRIVER_CAPABILITIES=compute,utility 可用值: compute,CUDA 和 OpenCL 应用程序所需。 co
HCCL_IF_IP 配置 HCCL 的初始化 root 通信网卡 IP 。 环境变量 HCCL_IF_IP > 环境变量 HCCL_SOCKET_IFNAME > docker/lo 以外网卡(网卡名字典序升序) > docker 网卡 > lo 网卡。 1 export HCCL_IF_IP=10.10.10.1 HCCL_IF_BASE_PORT 指定 Host 网卡起始端口号,配置后系统默认占用以该端口起始的 16 个端口进行集群信息收集,取值范围为[1024,65520] 。 1 export HCCL_IF_BASE_PORT=50000 HCCL_SOCKET_IFNAME HCCL 可通
1. 设置环境变量 1 2 export NAMESPACE=xxx export PVC=xxx 2. Dataset 无法就绪 2.1 Fluid 组件问题 1 kubectl -n fluid-system get pod -o wide | grep -v "Running" 可能出现没有正常启动的情况。 2.2 有异常的 Dataset 异常的资源可能导致 Fluid 资源不断重启,需要人工介入删除。 2.3 检查 Worker \ Fuse 副本 worker 副本 1 kubectl -n ${NAMESPACE} get sts -l release=${PVC} 1 kubectl -n ${NAMESPACE} get pod -l release=${PVC},role=juicefs-worker fuse 副本 1 kubectl -n kas-job get ds -l
1. 环境准备 下载 Miniforge 1 wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" 安装 Miniforge 1 bash Miniforge3-$(uname)-$(uname -m).sh 1 2 echo "export PATH=$HOME/miniforge3/bin:$PATH" >> ~/.bashrc source ~/.bashrc 创建环境 1 conda create -n vllm python=3.12 目前 vllm 要求 Python 3.9+ 激活环境 1 conda activate vllm 安装依赖 1 conda install vllm 2. 推理测试 2.1 模型准备 设置模型地址 海外 1 export MODEL_REPO=https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat 国内 1 export MODEL_REPO=https://hf-mirror.com/Qwen/Qwen1.5-1.8B-Chat 下载模型 1 nerdctl run --rm -v ./:/runtime shaowenchen/git lfs clone $MODEL_REPO 2.2 Offline Batched Inference 这种推理方式适用于离线场景,比
1. Nerdctl 安装 安装 Opscli 1 curl -sfL https://raw.githubusercontent.com/shaowenchen/ops/main/getcli.sh |VERSION=latest sh - 安装 Nerdctl 1 opscli task -f install-nerdctl --arch amd64 2. BuildKit 下载 Buildkit 1 wget https://github.com/moby/buildkit/releases/download/v0.19.0-rc2/buildkit-v0.19.0-rc2.linux-amd64.tar.gz 安装 Buildkit 1 2 tar xvf buildkit-*.tar.gz mv bin/* /usr/local/bin/ 配置 Buildkitd 1 mkdir -p /etc/buildkit /data/buildkit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cat > /etc/buildkit/buildkitd.toml <<EOF debug = true root = "/data/buildkit" [worker.oci] enabled = false [worker.containerd] address = "/run/containerd/containerd.sock" enabled = true platforms = [ "linux/amd64", "linux/arm64" ] namespace = "buildkit" gc = true gckeepstorage = 9000 cniPoolSize = 16 EOF 生成 Systemd Unit 文件 1 2 3 4 5 6 7 8
1. 制作镜像 为了方便测试,这里将模型文件打包到镜像中。 下载模型 1 2 3 4 git clone https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat cd Qwen1.5-1.8B-Chat && git lfs pull rm -rf .git cd .. 编写 Dockerfile 1 2 3 4 5 cat <<EOF > Dockerfile FROM vllm/vllm-openai:latest RUN mkdir -p /models/Qwen1.5-1.8B-Chat COPY Qwen1.5-1.8B-Chat/* /models/Qwen1.5-1.8B-Chat EOF 编译镜像 1 nerdctl build --platform=amd64 -t registry-1.docker.io/shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 . 推送镜像 1 nerdctl push --platform=amd64 registry-1.docker.io/shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 2. 主机上推理服务 设置环境变量 国内 1 export IMAGE=shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 国外 1 export IMAGE=registry-1.docker.io/shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 指定设备,运
Embedding 模型 Embedding 模式将高维度的数据映射到低维度的空间,这样有利于数据的处理和分析。 文本模型 这里有一个排行榜,https://huggingface.co/spaces/mteb/leaderboard 在上面的排行榜中,会给出模型的评分,模型的参数量
1. 部署 Jumpserver 需要提前准备好 StorageClass,用于存储 Jumpserver 的数据。除了下面提到的数据库,各个组件 jms-core、jms-web、jms-koko、jms-lion、jms-chen 都需要一个 PV 存储。 1.1 部署 MySQL 参考 https://github.com/shaowenchen/ops-hub/blob/main/database/mysql8.yaml ,部署 MySQL。 需要调整
https://github.com/shaowenchen/ops 1. 告警 Kubernetes 集群的事件 监控指定的关键字 1 2 3 4 5 6 7 8 9 10 11 apiVersion: crd.chenshaowen.com/v1 kind: EventHooks metadata: name: kube-pod-falid namespace: ops-system spec: type: xiezuo url: https://xz.wps.cn/api/v1/webhook/send?key= subject: "ops.clusters.*.namespaces.*.pods.*.event" keywords: - failed 一份简单的配置,即可收获大量的相关告警。 监控之后,自动化处理 1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: crd.chenshaowen.com/v1 kind: EventHooks metadata: name: kube-no-free-node namespace: ops-system spec: additional: "action: restart-kubelet-bypod" keywords: - no free node subject: ops.clusters.*.namespaces.*.pods.*.event type: webhook url: http://x.x.x.x/webhook 借助 Ops Copilot 的执
本文使用的是 Fluid 1.0 版本,高版本的配置文件路径发生了变化,需要根据实际情况调整。 1. 制作镜像 1.1 fluid_config_init.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/usr/bin/env python import json import os rawStr = "" with open("/etc/fluid/config.json", "r") as f: rawStr = f.readlines() rawStr = rawStr[0] script = """ #!/bin/sh set -ex MNT_TO=$targetPath trap "umount ${MNT_TO}" SIGTERM mkdir -p ${MNT_TO}
1. Jindo 挂载 S3 配置环境变量 1 2 3 4 export ENDPOINT=obs.ap-southeast-3.myhuaweicloud.com export BUCKET= export AK= export SK= 创建凭证 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: mys3secret type: Opaque stringData: fs.s3.accessKeyId: ${AK} fs.s3.accessKeySecret: ${SK} EOF 创建 Dataset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: mys3-jindo spec: mounts: - mountPoint: s3://${BUCKET}/test2/ options: fs.s3.endpoint: ${ENDPOINT} encryptOptions: - name: fs.s3.accessKeyId valueFrom: secretKeyRef: name: mys3secret key: fs.s3.accessKeyId - name: fs.s3.accessKeySecret valueFrom: secretKeyRef: name:
1. 什么是 TensorBoard TensorBoard 主要是用来监控模型的各种指标的变化,比如 accuracy、loss、各种层的权重分布等。 TensorBoard 是 TensorFlow 的一个可视化工具,支持标量、文本、图像、音频、视频和 Embedding 等多种数据可视化,但是 PyTorch 也可以使用 TensorBoard。 2. 安装 tensorboard 1 pip install tensorboard 3. 使用
1. 创建训练脚本 创建训练脚本 mnist.py,内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
1. 安装新的内核版本 推荐使用 apt 源安装,避免安装了不兼容的内核版本。 1.1 源安装 查看可用版本 1 2 3 4 apt list linux-headers-5.15.*-*-generic linux-image-5.15.*-*-generic linux-image-5.15.0-94-generic/focal-updates,focal-security 5.15.0-94.104~20.04.1 amd64 linux-image-5.15.0-97-generic/focal-updates,focal-security 5.15.0-97.107~20.04.1 amd64 安装内核 1 apt install linux-image-5.15.0-97-generic linux-headers-5.15.0-94-generic 1.2 自行下载安装 需要先确认下当前的系统与目标内核版本是否兼容。 下载内核 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 1 2 3 4 wget https://kernel.ubuntu.com/mainline/v5.19/amd64/linux-headers-5.19.0-051900-generic_5.19.0-051900.202207312230_amd64.deb wget amd64/linux-headers-5.19.0-051900_5.19.0-051900.202207312230_all.deb wget https://kernel.ubuntu.com/mainline/v5.19/amd64/linux-image-unsigned-5.19.0-051900-generic_5.19.0-051900.202207312230_amd64.deb wget https://kernel.ubuntu.com/mainline/v5.19/amd64/linux-modules-5.19.0-051900-generic_5.19.0-051900.202207312230_amd64.deb 安装内核 1 dpkg -i *.deb
1. 什么是 MPI MPI,Message Passing Interface 消息传递接口,是一种用于并行计算的通信协议。 MPI 提供了一组标准化的接口,用于在不同的计算节点之间传输数据,广泛应用于科学计算、机器学习、深度学习等领域。 MPI 有多个实现,常用实现有 MPICH 和 OpenMPI。MPICH
基于生产的真实需要,最近对 https://github.com/shaowenchen/ops 又进行了几个重要的更新,同时发布了 v1.0.0 版本。这里主要介绍一下这个版本的主要特性。 1. 多集群执行任务的支持 在实践中,建议: 将当前集群的主机创建为 Host 可以创建多个 Cluster,拥有的 Cluster 对象即为纳管的集群 Task、Pipe
1. Fat-Tree 1985 年 麻省理工学院的 Charles E. Leiserson 发明了 Fat-Tree 胖树网络。如下图,胖树网络是一颗二叉树,从更节点到叶子节点带宽逐步增加。 2008 年 8 月,加州大学圣地亚哥分校的一组计算机科学家发表了一个可扩展的网络架构设计,该设计采用受胖树拓扑启发的拓扑结构,实现了比以前的分
1. 什么是 RDMA RDMA(Remote Direct Memory Access,远程直接内存访问)是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。 TCP/IP 传输时,数据经过网络堆栈,再经过网卡发送,接收端接收后,按照序列号组装数据。 DMA 传输时,可以直接在设备和内存之间传输数据,不需要经过网
1. 什么是 SR-IOV 技术 SR-IOV(Single Root I/O Virtualization)是一种虚拟化技术,它允许虚拟机、容器直接访问物理硬件资源,从而提高 I/O 性能,还能减少主机 CPU 消耗。 如上图,SR-IOV 将单个物理设备(例如网络接口卡,NIC)划分成多个虚
1. InfiniBand 网络 InfiniBand(缩写 IB),是一个用于高性能计算的计算机网络通信标准,它具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。InfiniBand 也用作服务器与存储系统之间的直接或交换互连,以及存储系统之间的互连。 InfiniBand
1. Jindo 挂载 OBS 配置环境变量 1 2 3 4 export ENDPOINT=obs.cn-north-4.myhuaweicloud.com export BUCKET= export AK= export SK= 创建凭证 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: myobssecret type: Opaque stringData: fs.obs.accessKeyId: ${AK} fs.obs.accessKeySecret: ${SK} EOF 创建 Dataset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: myobs-jindo spec: mounts: - mountPoint: obs://${BUCKET}/test2/ options: fs.obs.endpoint: ${ENDPOINT} name: default path: "/" encryptOptions: - name: fs.obs.accessKeyId valueFrom: secretKeyRef: name: myobssecret key: fs.obs.accessKeyId
1. 数据处理架构 主要分为四层: 处理能力层,Spark on Kubernetes 提供流式的数据处理能力 数据管理层,Iceberg 提供 ACID、table 等数据集访问操作能力 存储层,Hive MetaStore 管理 Iceberg 表元数据,Postgresql 作为 Hive MetaStore 存储后端,S3 作为数据存储后端 资
1. 什么是 GDS(GPUDirectStorage) GDS 允许 RDMA 网卡直接访问 GPU 内存,有助于增加 GPU 应用读写文件的 IO 带宽,减少 IO 时延,并降低其 CPU 负载。 客户端在开启 GDS 特性后,文件将以 O_DIRECT 方式打开,客户端不会再缓存文件数据。应用层读写文件时,客户端通过 nvidia-fs.ko 将
Token 是一个与数据紧密相关的单位,可以用来度量训练模型所需的语料量,还可以用来度量推理时的输入和输出长度。 1. token 是什么 Token 可以是一个完整的单词、子词,甚至是一个字符。在语言模型中,文本被拆分为若干个 token,模型逐一处理这些 token 来生成预测或生成新文
1. 关于 FLOPs FLOPs(Floating Point Operations Per Second)指的是每秒执行的浮点数运算次数。 具体地说: 一次浮点加法:如 a + b,被计为一次浮点运算。 一次浮点乘法:如 a * b,也被计为一次浮点运算。 其他基本浮点运算:如除法和平方根,也可以被计为一次浮
1. 定义 LLM 推理过程中存在着两个截然不同的阶段,PD 分离就 计算密集型的 Prefill 阶段, LLM 处理所有用户的 input,计算出对应的 KV Cache 显存密集型的 Decode 阶段, 顺序的产生一个个的 token,每次访存只计算一个 token 2. 指标 2.1 prefill 性能评估指标 TTFT(Time To First Toke
本文使用的 DLRover 版本是 0.3.7 1. DLRover Operator 1.1 启动 ElasticJob 和 ScalePlan 的控制器 实现代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 创建 ElasticJob 的控制器 if err = controllers.NewElasticJobReconciler(mgr, masterImage).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ElasticJob") os.Exit(1) } // 创建 ScalePlan 的控制器 if err = controllers.NewScalePlanReconciler(mgr).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScalePlan") os.Exit(1) } // 启动控制器 if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) } 这部分代码是
1. 产品线 GeForce 面向游戏玩家,提供强大的图形处理能力、先进的游戏技术。 常见的有 NVIDIA GTX 系列、高端的 RTX 系列、Titan 系列。 Quadro 面向专业市场,如设计师、工程师、科学家和内容创作者。 常见的有 Quadro P 系列,高端的 Quadro RTX 系列 Tesla 面向数据中心和高性能计算(HPC)市场,
1. Parameter Server 架构 在 Parameter Server 架构中,集群中的节点被分为两类,参数服务器节点(Parameter Server)和工作服务器节点(Worker)。 1.1 Parameter Server Parameter Server 用于存放模型的参数。 每个参数服务器节点负责管理和更新模型的一部分参数,而每个工作节点则只处理与其对应
1. 分布式训练面临的问题 预估训练资源困难,无法自动化 需要多少算力、需要多少时间、需要多少带宽、需要多少 CPU、需要多少内存,如果没有足够的积累,很难估算准确。导致的结果就是,超额申请、超额分配,造成极大的资源浪费。 需要去沉淀和提供解决方案。 故
本篇内容主要来自内部的一次分享,也是最近工作的一些总结。 1. 常见的故障处理流程 如上图是一次典型的运维异常处理流程。 按照时间线,有如下关键时间点: 发生故障 发现故障 响应故障 定位故障 恢复故障 发生故障到发现故障,指的是被系统检测到,主要涉及到指标的采
1. 为什么将元数据存储从 Redis 迁移到 PGSQL PGSQL 成本低 Redis 使用内存存储元数据,PGSQL 使用磁盘存储元数据,成本差异显而易见。 PGSQL 性能可调节 不同的 PGSQL 提供了不同的性能 IOPS。如果对性能没有持续高的要求,使用 PGSQL 是不错的选择。 PGSQL 存储上限更高 如果按照元数据大小估算
1. 制作 hccl-test 镜像 下载依赖包 Python-3.8.18.tgz Ascend-cann-toolkit_8.0.RC2_linux-x86_64.run Ascend-cann-kernels-910b_8.0.RC2_linux.run mpich-3.2.1.tar.gz 如果不方便下载,也可以直接从我打包的镜像中拷贝出来。 编写 Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 FROM ubuntu:22.04 WORKDIR /home RUN sed -i -e 's/^APT/# APT/' -e 's/^DPkg/# DPkg/' /etc/apt/apt.conf.d/docker-clean RUN apt-get update && apt-get install
1. 制作 nccl-test 镜像 查看 CUDA 版本 1 2 3 nvidia-smi | grep "CUDA Version" | awk '{print $9}' 12.2 编写 Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cat > Dockerfile << EOF FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive ARG CONDA_VERSION WORKDIR /workspace ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt install -y openmpi-bin libopenmpi-dev ssh openssh-server net-tools vim git iputils-ping nfs-common RUN git clone https://github.com/NVIDIA/nccl-tests.git && \ cd nccl-tests && \ make MPI=1 MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi EOF 编译 nccl-test 镜像 1 docker build -t shaowenchen/nccl-test:12.1.0-ubuntu22.04 -f Dockerfile . 推送 nccl-test 镜像 1 docker push shaowenchen/nccl-test:12.1.0-ubuntu22.04 2. 运行 Volcano Job 给测试节点打
1. top 查看节点资源使用率超过 100% 1 2 3 4 5 6 kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master-1 995m 16% 13760Mi 118% master-2 827m 13% 10672Mi 92% master-3 889m 14% 10244Mi 88% 这是由于在计算使用率时,默认使用的是可分配的资源,排除了 Kubelet 保留的部分。在 kubectl 源码中可以看到: 1 2 3 4 5 6 7 for _, n := range nodes { if !o.ShowCapacity { availableResources[n.Name] = n.Status.Allocatable } else { availableResources[n.Name] = n.Status.Capacity } } 如果需要
1. 查看 CPU 查看 CPU 型号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 57 bits virtual CPU(s): 160 # 有 160 个 CPU On-line CPU(s) list: 0-159 Thread(s) per core: 2 # 每个核心支持 2 个线程 Core(s) per socket: 40 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 106 Model name: Intel(R) Xeon(R) Platinum 8380 CPU @ 2.30GHz Stepping: 6 CPU MHz: 3000.000 # 当前工作频率为 3000 MHz BogoMIPS:
本文内容整理自我在一次内部分享的部分内容。 1. 存储系统的核心要素 1.1 安全 对象存储桶的凭证、使用存储 PVC 时的授权、对访问来源的控制,这些都是安全需要关注的问题。 但这些又非常容易被忽视,出了问题就是大问题。 1.2 生命周期管理 存储系统是为业务使用数据服务的
1. 使用内存作为存储介质 如上图是存储金字塔,展示了存储介质价格与速度的关系。 目前,企业之所以广泛采用磁带和磁盘作为存储介质,主要是因为它们的价格优势。市场价格受市场供需影响,即便是价格较高的存储介质,如果生产成本低廉,具有足够大的市场,生产过
1. Jindo 直接加速 OSS 配置环境变量 1 2 3 4 5 6 7 export ENDPOINT=oss-cn-beijing-internal.aliyuncs.com export BUCKET= export AK= export SK= export NAMESPACE=default export PVC=myoss-jindo export URI=datacenter 创建凭证 1 2 3 4 5 6 7 8 9 10 11 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: ${PVC} namespace: ${NAMESPACE} type: Opaque stringData: fs.oss.accessKeyId: ${AK} fs.oss.accessKeySecret: ${SK} EOF 创建 Dataset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: ${PVC} namespace: ${NAMESPACE} spec: mounts: - mountPoint: oss://${BUCKET}/${URI}/
1. 关于 JuiceFS 的缓存 在主机上,预热的缓存是直接放在主机上的。 在集群中,分为两级缓存: Worker,提供集群级别共享的缓存 Fuse,提供仅当前节点级别的缓存 2. 使用 JuiceFS 客户端预热数据 需要注意的是在 Fuse 层预热,仅对当前节点有效,如果需要预热整个集群,需要在
1. 现象 基于 Kubernetes 的 Elasticsearch 频繁重启,导致服务几乎不可用。 在导入数据过程中,Pod 的内存使用持续增长 Pod 内存使用接近 Limit 之后,继续导入就会触发 Pod 异常退出,错误日志 ERROR: Elasticsearch exited unexpectedly Pod 内存使用率并不会下降,而是维持在 Limit 附近,不久又异常退出 Elasticsearch Pod 内存限制在 64GB,而 JVM 内
1. 在主机上挂载内存存储目录 创建目录用于挂载 1 mkdir /mnt/memory_storage 挂载 tmpfs 文件系统 1 mount -t tmpfs -o size=800G tmpfs /mnt/memory_storage 存储空间会按需使用,也就是使用 100G 存储时才会占用 100G 内存。主机节点上有 2T 内存,这里分配 800G 内存用于存储 Elasticsearch 数据。 提前创建好目录 1 2 3 mkdir /mnt/memory_storage/elasticsearch-data-es-jfs-prod-es-default-0 mkdir /mnt/memory_storage/elasticsearch-data-es-jfs-prod-es-default-1 mkdir /mnt/memory_storage/elasticsearch-data-es-jfs-prod-es-default-2 如果没有提前创建好目录,并
1. 安装驱动 创建 HwHiAiUser 用户 1 2 groupadd -g 1000 HwHiAiUser useradd -g HwHiAiUser -u 1000 -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash 添加目录权限 1 2 chown -R HwHiAiUser /usr/local/Ascend chmod -R 755 /usr/local/Ascend 下载驱动、固件 前往 https://www.hiascend.ru/hardware/firmware-drivers/community?product=1&model=30&cann=All&driver=1.0.26.alpha 找到对应的驱动和固件。 1 wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Ascend%20HDK/Ascend%20HDK%2024.1.RC2.2/Ascend-hdk-910b-npu-driver_24.1.rc2.2_linux-x86-64.run 1 wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Ascend%20HDK/Ascend%20HDK%2024.1.RC2.2/Ascend-hdk-910b-npu-firmware_7.3.0.2.220.run 安装驱动 1 bash ./Ascend-hdk-910b-npu-driver_24.1.rc2.2_linux-x86-64.run --full --install-for-all 安装固件 1 bash ./Ascend-hdk-910b-npu-firmware_7.3.0.2.220.run --full 2. 安装 ascend-docker-runtime 下载 ascend-docker-runtime 前往 https://gitee.com/ascend/ascend-docker-runtime/releases/tag/v5.0.0-RC3.2 找到对应架构的下载链接。 1 wget https://gitee.com/ascend/ascend-docker-runtime/releases/download/v5.0.0-RC3.2/Ascend-docker-runtime_5.0.RC3.2_linux-x86_64.run 安装 ascend-docker-runtime 1 bash ./Ascend-docker-runtime_5.0.RC3.2_linux-x86_64.run --install 3.
1. 基于对象存储的数据交付 如上图,在模型研发过程中,主要涉及三个子平台,分别是: 数据平台 数据平台主要负责数据相关的管理,比如: 数据接入、数据处理,最终生成训练所需的数据。 数据平台将原始数据存储到对象存储中,在处理时,从对象存储中获取数据,进行
1. 存储的分层与互联 2. 各种存储类型 存储类型 带宽 容量 响应延时 单位存储成本 存储原理 适用场景 CPU L1 Cache 256-512GB/s 32-64KB/核心 <1ns 约$2000/MB SRAM CPU 核心最近层缓存 CPU L2 Cache 64-256GB/s 256KB-2MB/核心组 2-5ns 约$1000/MB 部分 SRAM,部分嵌入式 DRAM CPU 下一级缓
1. 存储方案 三种存储方案: 基于目录隔离公用一个 JuiceFS Elasticsearch 的节点共用一个 JuiceFS,通过子目录挂载不同的 Elasticsearch 节点。 /0/ 对应节点 Node-0 /1/ 对应节点 Node-1 /2/ 对应节点 Node-2 这种方式的好处主要是,易于扩展、配置方便。 基于 JuiceFS 隔离节点数据 Elasticsearch 每个节点都对接一个独立的 JuiceF
1. 创建 Dataset 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: my-s3 type: Opaque stringData: aws.accessKeyId: xxx aws.secretKey: xxx EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: my-s3 spec: mounts: - mountPoint: s3://BUCKET/ name: s3 options: alluxio.underfs.s3.endpoint: ks3-cn-beijing-internal.ksyun.com alluxio.underfs.s3.disable.dns.buckets: "false" encryptOptions: - name: aws.accessKeyId valueFrom: secretKeyRef: name: my-s3 key: aws.accessKeyId - name: aws.secretKey valueFrom: secretKeyRef: name: my-s3 key: aws.secretKey accessModes: - ReadWriteMany EOF 2. 创建 Runtime 1 2 3 4 5 6 7 8 9
1. 分析 Fluid 挂载 NFS 存储 查看 Fuse Pod 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 kubectl get pod nfs-demo-fuse-f9wg8 -oyaml apiVersion: v1 kind: Pod metadata: generateName: nfs-demo-fuse- spec: containers: - command: - /usr/local/bin/entrypoint.sh env: - name: FLUID_RUNTIME_TYPE value: thin - name: FLUID_RUNTIME_NS value: default - name: FLUID_RUNTIME_NAME value: nfs-demo - name: MOUNT_POINT value: /runtime-mnt/thin/default/nfs-demo/thin-fuse - name: MOUNT_OPTIONS value: ro image: fluidcloudnative/nfs:v0.1 imagePullPolicy: IfNotPresent lifecycle: preStop: exec: command: - sh - -c - umount /runtime-mnt/thin/default/nfs-demo/thin-fuse name: thin-fuse securityContext: privileged: true volumeMounts:
1. 打包 Fluid Runtime 镜像 创建 fluid_config_init.py 脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/usr/bin/env python import json rawStr = "" with open("/etc/fluid/config.json", "r") as f: rawStr = f.readlines() rawStr = rawStr[0] script = """ #!/bin/sh set -ex MNT_FROM=$mountPoint MNT_TO=$targetPath trap "umount ${MNT_TO}" SIGTERM mkdir -p ${MNT_TO} mount -t lustre -o relatime,flock ${MNT_FROM} ${MNT_TO} sleep inf """ obj = json.loads(rawStr) with open("mount-lustre.sh", "w") as f: f.write('mountPoint="%s"\n' % obj["mounts"][0]["mountPoint"]) f.write('targetPath="%s"\n' % obj["targetPath"]) f.write(script) 只需调整一下 mount 命令即可。 创建启动脚本 entrypoint.sh 1 2 3
1. 创建 Dataset 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: nfs-demo spec: mounts: - mountPoint: x.x.x.x:/x-x/ name: nfs-demo EOF 2. 创建 Runtime 1 2 3 4 5 6 7 8 9 10 11 12 13 14 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: ThinRuntimeProfile metadata: name: nfs spec: fileSystemType: nfs fuse: image: fluidcloudnative/nfs imageTag: v0.1 imagePullPolicy: IfNotPresent command: - "/usr/local/bin/entrypoint.sh" EOF 1 2 3 4 5 6 7 8 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: ThinRuntime metadata: name: nfs-demo spec: profileName: nfs EOF 3. 创建测试 Pod 1 2 3 4 5 6 7 8 9 10 11 12
1. 让 Ops Copilot 成为 Ops Coilot 在 2023 年 09 月,我写过一版 Ops Copilot,也有文章发出 我在给 Ops 工具写 Copilot 。 实现的效果是这样的: 1 2 3 4 5 6 7 8 9 10 Opscli> 打开浏览器 Open a browser and navigate to 'https://www.google.com'. ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ import webbrowser webbrowser.open('https://www.google.com') ↑↑↑↑↑↑↑↑↑↑↑
1. 什么是 MLOps MLOps 是 Machine Learning Operations 的缩写,描述的是围绕模型研发整个生命周期过程的标准化和工程化。 MLOps 包括以下几个关键步骤: 数据管理,数据的存储、访问、清洗、转换 模型开发,算法开发、模型构建 模型训练与调优,使用数据训练模型,调整超参数优化模型,微调模型 模型评
1. 数据并行 训练步骤: master 设备加载模型,并将模型参数复制到每个 worker 设备 master 设备按照 batch 维度划分训练数据,将每个 batch 传递给每个 worker 设备 每个 worker 设备进行训练 master 设备汇总每个 worker 设备的梯度,更新模型参数 master 设备广播模型参数到每个 worker 设备,准备下一个 batch 训练 核心思想: 将训练
1. 镜像 Tag 标识的含义 base/cuda: 包括 CUDA 运行时 runtime: 在 base 的基础上,新增了 CUDA math 库和 NCCL、cuDNN 运行时 devel: 在 runtime 的基础上,新增了头文件和用于构建 CUDA 镜像的开发工具,对于多阶段构建特别有用 cuddn: 在上面基础上,新增了 cuDNN 神经网络加速库 py3: Python 3 环境 2. CUDA 镜像 镜像 AMD64 镜像大小 ARM64 镜
1. 安装 conda 1 2 3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh rm -rf Miniconda3-latest-Linux-x86_64.sh 但 Miniconda 不能免费大规模商用,可以使用 Miniforge 平替。 1 2 wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" bash Miniforge3-$(uname)-$(uname -m).sh 2. 修改默认配置 2.1 初始化 Shell 如果不进行初始化,激活环境时会报错 CondaError: Run 'conda init' before 'conda activate' 。 1 2 3 4 5 6 7 8 9 conda init --help usage: conda init [-h] [--all] [--user] [--no-user] [--system] [--reverse] [--json] [-v] [-q] [-d] [SHELLS ...] Initialize conda for shell interaction. positional arguments: SHELLS One or more shells to be
1. Argo Events 工作原理 上面是 Argo Events 官方网站上的架构图,对于事件处理系统,有三个重要的组成 事件源的接入,对应于 Event Source 事件的分发,对应于 Event Sensor 事件的消费,对应于 Event Trigger 事件消息存储在 EventBus 中,默认使用的 NATS。 2. 创建 ServiceAccount 给 Sensor 和 Workflow 创建 operate-workflow-sa operate-workflow-sa 用来授权 Sensor 操作 Workflow 。 1 2 3 4 5 6
1. Volcano 简介 Volcano 是华为开源的一个基于 Kubernetes 的资源调度系统,相较于原生的调度器,具有的显著特点有: 支持 gang scheduling 对于批量作业的调度,容易碰到死锁的问题,比如两个作业都需要同时运行 10 个 Pod 才能启动,当两个作业同时提交时,可能都只有部分 Pod 被调度,两个作业都无法正常
1. 什么是 npu-smi npu-smi 是华为提供的一个命令行工具,专门用于管理和监控华为昇腾(Ascend)系列神经网络处理器(NPU)的状态和性能,似于 NVIDIA 的 nvidia-smi。 2. npu-smi 字段含义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 npu-smi info +------------------------------------------------------------------------------------------------+ | npu-smi 23.0.2.1 Version: 23.0.2.1 | +---------------------------+---------------+----------------------------------------------------+ | NPU Name |
最近在研习模型训练相关的基础设施,发现 AI 芯片互连拓扑决定着训练集群任务的调度和资源分配,因此花了一点时间整理了一下常见的 AI 芯片互连方案。 1. 点对点互连 传统的 PCIe 系统下, AI 芯片与 AI 芯片之间的数据传输是通过 PCIe 传输,无法满足大规模数据传输的要求。 1.1 NVLink
处理故障时,参考或者记录下的内容,持续更新中 1. XID 错误事件 XID 是 NVIDIA 的错误码,可以通过命令: 1 dmesg -T | grep -i "NVRM: Xid" 或者 1 journalctl --since `date -d "10 days ago" "+%Y-%m-%d"`|grep Xid 根据 XID 可以定位故障,下面是一些常见的 XID 事件 XID 说明 13 Graphics Engine Exception。通常是数组越界、指令错误,小概率是硬件问
1. 不断尝试落地 AI 应用端 基于对运维的认知,我开发了一个开源的运维工具 https://github.com/shaowenchen/ops 。 Ops 工具将运维操作划分为脚本执行、文件分发两类,而运维对象主机和 Kubernetes 集群分别都实现了这两种运维操作。 Ops 对外提供的能力有,Ops Cli 命令行终端,Ops Server 服务端 API 接口,Ops Controller 集群
本篇主要记录创建企业版 JuiceFS PVC 的脚本,方便快速配置。 1. 设置环境变量 1.1 基础配置 1 2 3 export NAMESPACE= export PVC_NAME= export JUICEFS_VOLUME= 1.2 JuiceFS 认证信息 1 2 3 export TOKEN= export ACCESS_KEY= export SECRET_KEY= 1.3 JuiceFS 服务配置 1 2 export BASE_URL=http://x.x.x.x:8080/static export CFG_URL=http://x.x.x.x:8080/volume/%s/mount 1.4 镜像配置 1 2 3 4 export JUICEFS_IMAGE=juicedata/mount export JUICEFS_IMAGE_TAG=ee-5.2.13-7a0eb79 export DEMO_IMAGE=ubuntu 1.5 Worker 配置 1 2 3 export WORKER_REPLICAS=1 export NODE_SELECTOR_KEY= export NODE_SELECTOR_VALUE="true" 1.6 缓存配置 1 2 3 export CACHE_GROUP="${PVC_NAME}-cache-group" export CACHE_PATH=/data/jfs-cache export CACHE_QUOTA=2Ti 不同网络分区
本篇主要记录创建社区版 JuiceFS PVC 的脚本,方便快速配置。组件部署可以参考 使用 Fluid 和 JuiceFS 在 Kubernetes 管理数据 。 1. 设置环境变量 桶的配置 1 2 3 4 5 6 export ACCESS_KEY= export SECRET_KEY= export BUCKET= export ENDPOINT=ks3-cn-beijing-internal.ksyun.com export BUCKET_ENPOINT=$BUCKET.$ENDPOINT export PROVIDER=ks3 Workload 的配置 1 2 3 4 5 export NAMESPACE= export PVC_NAME= export NODE_SELECTOR_KEY= export NODE_SELECTOR_VALUE= 镜像的配置 export JUICEFS_IMAGE=juicedata/juicefs-fuse export DEMO_IMAGE=shaowenchen/demo:ubuntu 元数据的配置 如果是 Redis 配置 1 2 3 4 export REDIS_PASSWORD= #ip:port/database export REDIS_ENDPOINT=
1. argo 介绍 Argo 是一个开源项目,它在 Kubernetes 上提供了一系列工具,用于构建和运行应用程序。Argo 的核心组件主要包括以下几个: Argo CD Argo CD 是一个基于 GitOps 的持续交付工具,它允许用户声明式地管理 Kubernetes 集群中的应用部署。Argo CD 通过与 Git 仓库同步,确保集群状态与 Git 仓库中
1. 什么是 Ops 项目 我在之前的文章中介绍过一个常用的 Ops 工具。 Ops 的设计理念在于,运维工具的核心在于文本分发和脚本执行,实现了这两种能力就能够满足运维的功能诉求。 目前我主要的运维对象是 Host 主机、Kubernetes 集群,因此在 OpsObject 层实现了 Host 和 Cluster 对象,分别
1. 什么是 TensorRT TensorRT 是一个 C++ 库,主要用在 NVIDIA GPU 进行高性能的推理加速上,提供了 C++ API 和 Python API 用于集成。 TensorRT 支持的主流深度学习框架有: Caffe,TensorRT 可以直接读取 prototxt 格式 TensorFlow,需要将 TensorFlow 的 pb 转换为 uff 格式 PyTorch,需要将 PyTorch 的 pth 格式转
1. 项目简介 kind 是使用容器管理 Kubernetes 集群的工具。项目地址 https://github.com/kubernetes-sigs/kind 。 主要用在: 本地开发环境 学习时的临时环境 自动化测试 2. 安装 kind macOS 1 brew install kind Linux 1 2 curl -Lo /usr/local/bin/kind https://kind.sigs.k8s.io/dl/v0.21.0/kind-linux-amd64 chmod +x /usr/local/bin/kind 3. 创建 kind 集群 如果你本地配置有 PROXY,在创建之间建议重新设置一下环境变量: 1 2 export https_proxy=http://x.x.x.x:7890 export http_proxy=http://x.x.x.x:7890 本地代理通常设
1. dcgm-exporter dcgm-exporter 是 NVIDIA 官方社区提供的 GPU 监控工具。 项目地址 https://github.com/NVIDIA/dcgm-exporter 1.1 安装方式 添加 Helm 镜像仓库 1 helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts 1 helm repo update 安装 1 2 3 4 5 helm install dcgm-exporter gpu-helm-charts/dcgm-exporter --namespace monitor --create-namespace \ --set serviceMonitor.enabled=false \ --set image.tag=3.3.3-3.3.0-ubuntu22.04 \ --set nodeSelector."accelerator\/provider"=nvidia-gpu \ --version 3.3.1 需要给 NVIDIA GPU 节点打上标签 1 kubectl label node <node-name> accelerator/provider=nvidia-gpu 1.2 指标 GPU 利用率 指标名称 指标类型 单位 描述 DCGM_FI_DEV_GPU_UTIL Gauge % GPU 利用率 DCGM_FI_DEV_MEM_COPY_UTIL Gauge % GPU 内存
1. TensorRT-LLM 编译模型 1.1 TensorRT-LLM 简介 使用 TensorRT 时,通常需要将模型转换为 ONNX 格式,再将 ONNX 转换为 TensorRT 格式,然后在 TensorRT、Triton Server 中进行推理。 但这个转换过程并不简单,经常会遇到各种报错,需要对模型结构、平台算子有一定的掌握,具备转换和调试能力。而 TensorRT-LLM 的目标
1. 什么是 nvidia-smi nvidia-smi 全称是 NVIDIA System Management Interface,是 NVIDIA 提供的管理和监控 GPU 的接口。 nvidia-smi 调用的是 NVML。NVML 全称是 NVIDIA Management Library,提供了一组 C API,用于 NVIDIA GPU 监控和管理的库。 1.1 可查询的状态 ECC 错误计数 GPU 利用率 活动计算进程 时钟和 PState 温度和风扇速度 电
1. Fluid 简介 下面是来源于 https://github.com/fluid-cloudnative/fluid 的 Fluid 的架构图: Fluid 抽象了两个概念: Dataset,数据集合,用户视角的抽象 Runtime,数据存储、加速等真实服务的抽象 Fluid 主要解决了传统缓存系统在 Kubernetes 上使用的问题: 通过 CRD 对数据集合 Dataset 进行描述,提供生命周期管理 依赖于 Runtime 后端,
请注意文中的 --block-size 4096 为 4GB,如果使用 --block-size 4 会更合理,在写数据性能上会更好。 1. 环境准备 进入一个安全目录 1 mkdir -p /data/test && cd /data/test 在这个目录下完成全部的测试任务。 给 Redis 单独建一个目录 1 mkdir redis-data 建议新建一个目录,因为 Redis 会将当前目录文件的 Owner 改成 systemd-cored
使用 nvidia-container-runtime 的朋友可以重点关注下,特别是还有 JuiceFS 的情况。 1. 突然收到告警,我慌了 周末,学习 TensorRT LLM,顺便给线上最大的正式集群安装了一下 Dragonfly,然后就去买菜了。 下午发现有个节点的 Dragonfly Daemon 没起来,一直告警,就去所在节点重启了下 Kubelet。 大约
1. Dragonfly 简介 Dragonfly 的相关文档在社区 https://d7y.io/zh/docs/ 已经有详细说明。这里只是简单介绍一下,V2 版本的主要组件: Manager,提供 UI 界面、用户管理、集群监控、任务管理等功能 Scheduler,调度 Peer 之间的流量、提供预热等功能 Seed Peer,回源节点,用于从源站(Har
据统计容器中的大部分文件不会被使用。根据这一特征,Nydus 自定义了 Rafs 格式的文件系统,实现了镜像文件的按需加载,以解决大镜像导致的启动慢和占用存储的问题。而在 AI 场景下,无论是推理还是训练,镜像常常都是几个 G 起步,甚至几十个 G,Nydus 非常
1. 高速前进的轮子才能保持平衡 1.1 C 端红利期已经过去 截至 2023 年 6 月,我国网民规模达 10.79 亿人,较 2022 年 12 月增长 1109 万人,互联网普及率达 76.4%。C 端人口红利期已过,上网时长也增长缓慢,各类存量场景下的应用增长空间已经不大。 在经历了 C 端的 easy 模式之后,很多
1. 磁盘处理 1.1 查看磁盘 查看新磁盘 1 fdisk -l Disk /dev/nvme1n1: 3.91 TiB, 4294967296000 bytes, 8388608000 sectors 1.2 组建 RAID0 如果有多块小盘,更好的方式是组建一个 RAID0,这样不仅能获得更大的存储目录,还能获得更快的速度。 创建 RAID 1 mdadm --create --verbose /dev/md0 --level=0 --raid-devices=3 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 查看 RAID 1 mdadm --detail /dev/md0 1.3 挂载磁盘 创建文件系统 1 mkfs.xfs -f /dev/nvme1n1 xfs 适合大文件
提供有偿接入服务,200 RMB/年;另外,提供技术支持 200 RMB/次,不超过 1 hour;关注公众号,可获得联系方式。 1. 需要提供的信息 进入 https://mp.weixin.qq.com/ 在左侧菜单栏 【设置与开发】-> 【基本设置】,就能找到下面的信息 AppID 开发者 ID,可以明文直接查看到。 AppSecret
1. 直接使用大模型面临的问题 输出不稳定性 生成式 AI 的特点之一,输出结果的多样性。同样一个问题,问大模型多次,可能会得到不同的答案。 这种输出的不确定性,在对话、创作场景下,会给用户带来惊喜。但在确定性要求比较高的场景下,大模型进入不了采纳阶段。 数
两个月前,我在业务团队有过一次关于混沌工程实践的分享,这里主要整理下讲稿的内容。 点击查看演示文稿 1. 混沌产生 1.1 混沌学科的产生 在讲混沌之前,我们可以先思考一下混沌、混沌工程和我们线上服务之间的关联。 我们经常听到的故事是,一只在亚马逊河流中的蝴蝶
1. 两年前选了一条不一样的路 现在回顾,2021 年应该是近些年武汉互联网打工人跳槽的黄金年份。疫情过去,我们对未来充满期待;货币政策宽松,公司对市场前景满怀信心。 在这个背景下,当时一批做 Kubernetes 开源产品的同事纷纷跳槽,去云厂商继续做云基础设施。凭借过
主要用来规范自己写的 API,也是为了让 LLM 更好理解我的 API。 1. Domain 尽量单独使用一个域名,例如 api.example.com 。 2. Path 统一使用小写字母。 不用包含 /api 前缀。 不要包含扩展名。 / 不要出现在末尾。 对于 Restful API,/ 用来划分资源层级,末尾的 / 会导致混淆。 使用带版本的路径 /v1 。
由于定价和限制会随时间变化,本文仅供撰写当前时间参考。 1. 术语 RPM (requests per minute) 每分钟请求次数 RPD (requests per day) 每天请求次数 TPM (tokens per minute) 每分钟 Token 数 TPD (tokens per day), 每天 Token 数 在 https://platform.openai.com/tokenizer 可以根据文本查询对应的 token 数。在 https://github.com/openai/tiktoken/blob/main/tiktoken/model.py 可以发现 text-embedding-ada-002 与 gpt-3.5、gpt-4 的词表都是 cl100k_bas
1. EnvoyFilter 是什么 EnvoyFilter 是 Istio 的 CRD 资源,它允许用户修改 Envoy 的配置,以满足用户针对不同场景的定制需求。 1 2 3 4 5 6 7 8 9 kubectl get envoyfilter -A NAMESPACE NAME AGE istio-system add-request-id-into-ingressgateway 54d istio-system compression-gzip 18d istio-system custom-access-log 3d istio-system ingressgateway-settings 52d istio-system preserve-request-header-us-test-ingress-gateway 95d istio-system preserve-x-request-id 54d 通常在使用 istio 时,或多或少都会用到一些 EnvoyFilter。 EnvoyFilter 提供的功能是基于 Envoy 已有的内
1. 内存对齐 结构体内字段,从大到小排列 减少内存占用 安装 fieldalignment 工具 1 go install golang.org/x/tools/go/analysis/passes/fieldalignment/cmd/fieldalignment@latest 分析并修复内存对齐 1 2 3 4 5 6 7 8 9 fieldalignment -fix ./... /Users/shaowenchen/Code/app/config/config.go:136:14: struct with 32 pointer bytes could be 24 /Users/shaowenchen/Code/app/config/config.go:150:11: struct of size 96 could be 88 /Users/shaowenchen/Code/app/config/config.go:166:14: struct of size 152 could be 144 /Users/shaowenchen/Code/app/config/config.go:194:12: struct with 80 pointer bytes could be 72 /Users/shaowenchen/Code/app/config/config.go:209:12: struct with 56 pointer bytes could be 40 /Users/shaowenchen/Code/app/dao/gormx/gorm.go:12:13: struct with 16 pointer bytes could be 8 /Users/shaowenchen/Code/app/dao/gormx/entity/cluster.go:5:14: struct with 128 pointer bytes could be 104 查看 fieldalignment 进行
1. 查看 PCI 接口设备 使用 lspci 查看设备是否已经安装 1 2 3 lspci |grep storage d8:00.0 Mass storage controller: Shannon Systems Device 2275 这里发现了一块 Shannon Systems 的设备,说明已经安装了 SSD。 1 2 3 4 5 6 7 8 lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 893.8G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 892.8G 0 part └─ubu
1. 现象 业务反馈应用 app-a 的接口慢,查看日志发现是某一个 Pod 慢,删除该 Pod 让其更换节点就好。 从监控指标可以看到,Pod 的 CPU 使用率确实有剧增。 但该 Pod 没有达到 Limit 的限制,没有被限流 CPU。 接着看节点的 CPU 监控,发现节点的 CPU 使用率也有剧增。 并且增加的部分是 System C
1. kube-controller-manager 对网段的管理 在 kube-controller-manager 有众多控制器,与 Pod IP 相关的是 NodeIpamController。 NodeIpamController 控制器主要是管理节点的 podcidr,当有新节点加入集群时,分配一个子网段给节点;当节点删除时,回收子网段。 每个节点的子网段不会重叠,每个节点都能够独立
1. 安装 FFmpeg macOS 上执行命令: 1 brew install ffmpeg 2. FFmpeg 使用 1 ffmpeg {1} {2} -i {3} {4} {5} 五个部分的参数依次如下: 全局参数,-y、-loglevel、-preset 等用来控制的整体行为 输入文件参数,-i、-ss、-t、-stream_loop 等用来控制输入文件的读入方式 输入文
持续更新中… 1. Golang 使用 trimpath 移除编译路径,避免暴露编译路径信息 1 go build -gcflags="all=-trimpath=${PWD}" -asmflags="all=-trimpath=${PWD}" -o ./bin/opscli ./cmd/cli/main.go 添加之前异常输出路径 /Users/shaowenchen/Code/Github/ops/main.go,添加之后异常输出路径 main.go 。 -ldflags “-w -s” 移除调试信息,减小
1. 什么是 Ops 工具 https://www.chenshaowen.com/ops/ 是我日常运维最频繁使用的工具之一。 运维机器,我可以复用之前的脚本,批量进行操作。 运维集群,我可以复用之前的脚本,不用登录节点也可以操作机器。 如果遇到新的运维问题,我会马上编写 Task Yaml 对操作进行固化,方便下一次复用。 Ops 的核心操作是
1. 本地容器运行 启动 LLM 1 docker run --rm -p 8000:8000 shaowenchen/chinese-alpaca-2-7b-gguf:Q2_K 在 http://localhost:8000/docs 页面即可看到接口文档,如下图: 部署一个简单的 Chat UI 这里需要注意的是 OPENAI_API_HOST 参数,需要设置为你的宿主机 IP 地址,而不是 localhost 127.0.0.1,否则无法访问。 1 docker run -e OPENAI_API_HOST=http://{YOUR_HOST_IP}:8000 -e OPENAI_API_KEY=random -p 3000:3000 ghcr.io/mckaywrigley/chatbot-ui:main 页面效果如下: 2. K8s 快速部署 部署 LLM 应用 kubectl create
1. 大模型部署工具 llama.cpp 大模型的研究分为训练和推理两个部分。训练的过程,实际上就是在寻找模型参数,使得模型的损失函数最小化,推理结果最优化的过程。训练完成之后,模型的参数就固定了,这时候就可以使用模型进行推理,对外提供服务。 llama.cpp 主要解决的是推理过程
2024.06.26 已经下线 1. 申请到 GPT-4-32K API 了 之前在 Azure 上提交申请使用 GPT-4,前几天收到审核通过的邮件了。 价格收费如下: Context Length Prompt per 1,000 tokens (8k) Completion per 1,000 tokens (32k) 8k $0.03 $0.06 32k $0.06 $0.12 请求限速为 60K TPM,即每分钟最多能处理 60K 个 Tokens。 2. 使用方式 无需登录,直接访问 https://chatgpt.chenshaowen.com/ 点击设置 输入访问密
1. 配额限制 每种云上的资源,能用多少是有限制的。 这是云厂为了防止资源滥用,降低租户之间的相互影响。 比如,一个账户下的企业项目数、弹性主机的数量、弹性公网 IP 的数量、弹性公网 IP 带宽的大小等。 因配额不够导致的资源申请失败,很常见;但在弹性业务高峰期
transformers 是由 Hugging Face 开发的 Python 库,用于在自然语言处理(NLP)任务中使用和训练预训练的 Transformer 模型。它提供了许多强大的工具和功能,使得处理文本数据和构建 NLP 模型变得更加容易。该库广泛应用于各种 NLP 任务,如文本分类、命名实体识别、问答、文本生成等。 1. transformers 中的 pipeline pipeline 提供
HuggingFace 通过提供共享模型 model、数据集 dataset、在线托管 space 等服务,为 AI 研究人员和开发者提供了一个完整的生态。本篇文章将介绍如何使用 HuggingFace 的模型和数据集。 1. 模型操作与使用 1.1 自定义存储目录 1 export HF_HOME=/Volumes/Data/HuggingFace 否则默认在 ~/.cache/huggingface 目录下。 1.2 模型的下载 第一种方法,页面上
1. 为什么是 Transformer 全连接的自注意 以往的 RNN 模型,每个单词只能和邻近的单词产生联系,而 Transformer 模型中的 Attention 机制,单词可以和任意位置的单词产生联系,这样就可以捕捉到全局的上下文信息。 没有梯度消失问题 RNN 作用在同一个权值矩阵上,使得其最大的特征值小于 1 时,就会出现
1. 大模型到底是什么 先请两位大模型回答一下这个问题,看看他们的回答是什么。 Claude 说,大模型本质上是语言知识的概率表达,通过统计学习对语言各层次规律建模,表征语言生成的先验分布,从而具备语言预测生成能力。 ChatGPT 说,大模型本质是深度神经网络通过大量参数和
1. 关键字 机器学习(ML) 从数据中自动获取知识的技术 神经网络(NN) 模仿生物神经网络结构和学习机制的模型,是机器学习的分支之一 神经网络的结构包括,输入层、隐藏层、输出层 深度神经网络(DNN) 隐含层常常大于 2 层 DNN 的出众表现源于它使用统计学方法从
1. 大模型与 Langchain 很多人可能没有机会训练、甚至微调大模型,但对大模型的使用却是未来趋势。那么,我们应该如何拥抱这一变化呢?答案就是 Langchain。 大模型提供的是一种泛而通用的基础能力,目前,我看到的有两种主要落地方式: 基于生成能力的 AIGC,
1. 什么需要拨测服务 今年 GPT 大火,我也部署、开发了几个应用、小程序进行学习。当然,秉承帮助厂商测试功能的原则,目前只有 GPT 3.5 的 API 每天有少许费用,服务器、数据库、带宽都是免费的。 为了节省成本,我没有测试环境,每次提交代码,只要能编译成功就会直接发布
1. DNS 请求超时 原因: alpine 使用的是 musl 库,在 DNS 解析上会有一些限制[1] 解决方式: 不使用 apline 镜像,并在容器 resolv.conf 文件中增加 options single-request-reopen 配置。因为 single-request-reopen 配置项只对 glibc 库生效,但是 apline 镜像使用的是 musl 库 2. Docker 下无法解析 hosts 原因: alpine 没有 /etc/nsswitch.conf,导致依赖 hosts
在 client 中已经看到 Docker CLI 在给 Docker Daemon 发生构建上下文时,通过设置 X-Registry-Config 传递凭证,但在最近的构建反馈中,还是会出现一些无法解释的现象,本篇主要是进行一些基础的测试,以便于更好排查问题。 1. 宿主机 Docker 下构建 Docker Daemon 以 root 用户权限启动。 未登录任何账户 1 2 3 4 su ansible echo "FROM harbor.chenshaowen.com/private/test:v1" | sudo
1. 申请使用 GitHub Copilot Chat 申请链接 https://github.com/github-copilot/chat_waitlist_signup/join 申请通过之后,会收到一封邮件: 2. 什么是 VS Code insiders 什么是 VS Code insiders VS Code insiders 是 VS Code 的预览版本,提供一些最新的功能和改进,更新非常频繁。如果有更新强迫症,慎重使用,因为几乎每天都有更新。 VS Code 和 VS Code insiders 的区别 VS Code 的命令行是 code ,logo
1. 背景 微服务架构下,服务与服务的依赖关系复杂。在开发过程中,多个服务之间经常需要联调。此时有两种方式: 将服务部署到线上开发环境 Kubernetes 集群 使用 telepresence 打通本地与线上集群的通信,这样能获得一个比较稳定的联调环境。 缺点是,需要生成足够权限的凭证、需要研发人
1. 业务背景 当企业达到一定规模时,完全依赖于公有云基础设施,IT 成本会很高。 采购物理机器的成本可以摊薄到未来 3~5 年,之后机器并不会报废,而是会继续超期服役。私有云需要配比一定运维人员、购买专线带宽、机房费用等,IT 服务达到一定规模才能有效降低成
1. HPA VS KEDA HPA 也实现了: 自定义指标的弹性 Scale to Zero 这些与 KEDA 相比较,并不算劣势了。 真正的差别在于 HPA 只能利用监控数据进行伸缩,而 KEDA 可以利用更多数据来源进行伸缩,比如队列消息、数据库、Redis 等,当然也包括监控数据。 从 Kubernetes-based Event Driven Autoscaler (KEDA) 项目的名字就可以看出,K
1. WebAssembly 简介 跨平台性,可以在任何支持 WebAssembly 的平台上运行,包括 Web 浏览器、服务器、移动设备等 高性能,采用了一种紧凑的二进制格式,可以在浏览器中快速加载和解析,从而提高应用程序的性能 安全性,采用了一种沙箱模型,可以隔离运行在其中的代码,从而保护系统免受恶
1. 基于容器的 Serverless 无法支撑下一代应用的形态 如上图,我们正经历着一次运行时态的变革。 从裸金属机到虚拟机,应用不在受限于本地服务器的数量、机房稳定性,具有更好的弹性和可用性。 从虚拟机到容器,应用不再受限于操作系统、配置漂移,具有更好的可移植性和可扩
1. 受限的构建环境无法满足构建需求 Tekton 是基于 Kubernetes 集群的 CICD 引擎,相较于 Jenkins 更加云原生。说人话就是,更好开发插件、更好扩容、更好可观测性、更好玩儿。 由于代码仅能落盘公司内网,导致构建集群仅能部署于办公内网。这导致了很多受限: 硬件资源,没有弹性扩容能力 网
1. 关闭 affinity-assistant 之后 在前面的博文中,我通过关闭 affinity-assistant、使用 NFS 存储,平均每条流水线执行时间节约了近 30 秒。[1] affinity-assistant 的影响 在关闭之前,创建 Pod 的时序图如下: 由于 affinity-assistant 开启,每条流水线绑定在一个节点执行。 在关闭之后,创建 Pod 的时序图如
1. 创建 ChatGPT 账号 访问 https://chat.openai.com/ 测试网络 如果出现的是下面这个页面,说明你的网络不支持 ChatGPT 正常的应该是下面这个页面 解决办法是更换网络,幸运的是公司的网络是支持的,所以我就在公司的网络下注册了账号。 找一个接码平台 注册 openai 账户时,需要输入手机号,而 openai 不支持国内的手
1. 什么是文档工具化 文档工具化,工具产品化,是我之前博文中反复提过的一个口号。 好的文档,不如好用的工具。一个脚本、一条命令,比阅读文档更加直接,更能快速解决问题。同时,有很多文档会让读者对知识产生眩晕,在急于解决问题的窗口期无法补全知识体系的
Envoy 是第三个从 CNCF 毕业的项目,由于其动态生效、高性能等特性,已经成为云原生事实上的数据平面标准。很多项目都会借助于 Envoy 处理数据平面流量,而专注于控制面适配应用场景,将用户输入通过 xDS 协议写入 Envoy。 1. Envoy 数据处理流程 其中 Downstream,进 Envoy
wasme 只支持到 istio 1.9,而我使用的是 Istio 1.14,因此本篇直接使用 tinygo 进行验证和学习。 1. 安装 tinygo 要求 Go v1.18+ 安装 tinygo 1 2 brew tap tinygo-org/tools brew install tinygo 查看版本 1 2 3 tinygo version tinygo version 0.27.0 darwin/amd64 (using go version go1.19.3 and LLVM version 15.0.0) 2. 创建 wasm-istio 项目 初始化项目 1 2 3 mkdir wasm-istio cd wasm-istio go mod init wasm-istio 编辑 main.go 见 https://github.com/shaowenchen/demo/blob/master/wasm-istio/main.go 主要是下面这段 1 2 3 4 5 6 7
1. 安装 Ubuntu 1 apt-get install -y iperf3 CentOS 1 yum install -y iperf3 2. 参数 iperf3 的原理是通过客户端给服务端发送数据包来分析网络,有两种运行模式,客户端和服务端。 iperf3 的参数分为三部分,公共参数,客户端参数,服务端参数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Istio 注入 Sidecar 的模板在 istio-sidecar-injector ConfigMap 中。通过 annotations 可以对 Sidecar 的各种参数进行自定义配置,比如 CPU 使用、proxyImage 等。下面主要整理的是 Sidecar 的注入方式。 1. 给命名空间添加标签 -> 整个命名空间生效 注入标签 1 kubectl label namespace default istio-injection=enabled --overwrite 重启应用之后,会自动注入 Sidecar 容器。此时,访问流量将通
1. 常用对象配置 1.1 Gateway selector 选择规则生效的 Envoy servers 匹配的域名 端口 协议 TLS 证书 1.2 VirtualService gateways 指定生效的网关,默认值 mesh 为东西向流量;如果指定 Gateway 对象则为南北向流量 http 七层路由 重定向 重写 重试 条件规则 超时 故障注入 跨站策略 tcp 七层路由 tls 带证书路由 TLS 证书 1.3 DestinationRule host 路由 trafficPolicy 镜像流量 故障转
1. 积重难返的运维服务体系 针对明确的运维诉求,开发相应的运维服务以供运维、业务用户使用,本无可厚非。但如果仅满足于此,很容易出现下面的情况: 用户频繁地寻找各个系统的入口,在各个系统之间来回跳转,忙于寻找各种按钮、拷贝参数。 一旦这样的运维服务多
1. 现象 - Tekton 克隆代码任务慢 在执行克隆任务时,Tekton 很费时间,多仓库下一般都需要 2 分 30 秒左右。如下图: 仅克隆的流水线就需要执行 2 分钟 16 秒,而克隆脚本实际上仅执行 1-3 秒。其中大部分时间花在了哪里?能不能减少?这是本篇主要想讨论的问题。 2. 分析克
1. Falco 是什么 Falco 是由 Sysdig 贡献给 CNCF 的云原生运行时安全相关项目。 Falco 实现了一套可扩展的事件规则过滤引擎,通过获取事件、匹配安全规则、产生告警通知系列操作,能够发现系统中的安全问题。其中的事件来自系统调用,同时也支持 ebpf 探针,规则是开源的[1],可以自行定
1. 运行 Stable Diffusion 推荐配置 内存: 不低于 16 GB DDR4 或 DDR5 存储: 不低于 10 GB 可用空间 GPU: 不低于 6 GB 显存 N 卡 如果硬件达不到要求,也可以使用各种优化 fork 兼容更低配置的硬件,但生成时间会增长。 当前的开发主机配置为: 2.9 GHz 8-Core Intel Core i7 16 GB 2666 MHz DDR4 250 GB SSD 由于没有 GPU,生成图片时,
1. 跳过证书校验无法获取监控 如果指标抓取时,能跳过 TLS 认证是最便捷的。其 Prometheus 的 ConfigMap 配置如下: 1 2 3 4 5 6 7 8 9 - job_name: etcd metrics_path: /metrics scheme: https tls_config: insecure_skip_verify: true static_configs: - targets: [ '1.1.1.1:2379' ] - targets: [ '2.2.2.2:2379' ] - targets: [ '3.3.3.3:2379' ] 但 Prometheus Targets 报错 Get "https://3.3.3.3:2379/metrics": remote error: tls: bad certificate 在 targets 页面的报错如下图: 2. curl 验证抓取请求 跳过证书 1 2 3 curl https://1.1.1.1:2379/metrics -k curl: (35)
1. 部署 Ingress Controller 查看 Kubernetes 版本 1 2 3 4 kubectl version --short Client Version: v1.21.4 Server Version: v1.21.4 查找兼容的 Nginx Ingress 版本 Helm Chart version Helm Chart 最高可用版本 K8s 适配版本 3.x.x 3.36.0 1.16+ 4.x.x 4.4.2 1.19+ 参考: https://github.com/kubernetes/ingress-nginx 安装 Nginx Ingress Controller 1 2 3 helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx --create-namespace --version v4.4.2 查看服务 1 2 3 4 5 6 7 8 9 10 11 12 kubectl -n ingress-nginx get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.233.11.232 <pending> 80:30914/TCP,443:31493/TCP 14m ingress-nginx-controller-admission ClusterIP 10.233.56.67 <none> 443/TCP 14m kae@node1:~$
1. 遇到的问题 项目介绍: 文件大小 5.6 GB 文件数量 529352 Dockerfile 1 2 3 FROM golang:1.13 COPY ./ /go/src/code 构建命令及输入如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 time DOCKER_BUILDKIT=1 docker build --no-cache -t test:v3 -f Dockerfile . --progress=plain #1 [internal] load build definition from Dockerfile #1 sha256:2a154d4ad813d1ef3355d055345ad0e7c5e14923755cea703d980ecc1c576ce7 #1 transferring dockerfile: 37B done #1 DONE 0.1s #2 [internal] load .dockerignore #2 sha256:9598c0ddacf682f2cac2be6caedf6786888ec68f009c197523f8b1c2b5257b34 #2 transferring context: 2B
不同于 CentOS、Ubuntu,我们感受到 mv 比 cp 快;在使用 Dockerfile 构建镜像时,使用 Run cp 会比 Run mv 更快。本篇将给出相关的一些测试、验证的数据结果。 1. 测试准备 机器环境 Ubuntu 20.04.1 LTS 32C 125Gi 由于是生产机器,上面会有些负载,因此测试会有偏差。我会多次测试,等结果稳定
最近碰到两次,因故障需要重装主机系统。其中一次 Etcd 只剩下一个节点,导致整个集群宕机半个小时才恢复。本篇主要记录的是新系统 Ubuntu 20.04 初始化的过程,完成初始化之后采用优秀的集群安装工具 Kubekey 的 add nodes 命令,无需修改配置文件,一键就将节点重新加入了集群。 1. 恢复 Etcd
弹性伸缩主要有三个维度: HPA,根据利用率,自动伸缩 Pod 数量 VPA,根据历史数据,自动设置 Pod 的 Request、Limit CA,根据使用率,自动伸缩 Node 数量 本篇主要讨论的是节点扩缩容部分。 1. 自动扩缩容组件 autoscaler autoscaler 是 Kubernetes 社区维护的项目。目前 autoscaler 组件已经提供
1. 测试目的 调优构建集群的参数 探测 Tekton 并发流水线数量上限 给出单个集群最佳并发上限值 2. 相关组件及机器配置 Kubernetes 版本 v1.21.4 Tekton 版本 v0.24.1,与生产版本保持一致 OpenEBS 版本 localpv 版本 3.3.0,与生产版本保持一致 集群节点配置,共五个节点,四个用于构建 node1 master
1. 本地存储容量 所需磁盘大小(GB) = 数据保留时长 * 每秒获取指标数量 * 指标数据大小 / 1024 / 1024 / 1024 其中 每秒获取指标数量 rate(prometheus_tsdb_head_samples_appended_total[1d]) 一个小时内样本的平均大小 rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1d])/rate(prometheus_tsdb_compaction_chunk_samples_sum[1d]) 一天(86400 秒)的磁盘消耗,可以在 Prometheus 中直接查询: 86400 * (rate(prometheus_tsdb_head_samples_appended_total[1d]) * (rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1d]) / rate(prometheus_tsdb_compaction_chunk_samples_sum[1d]))) / 1024 /1024 / 1024 例如,返回 {instance="localhost:9090", job="prometheus"} 4.437
设置合理的 Req 和 Limit 不设置 Req 和 Limit,当应用的 CPU、MEM 暴涨时,会危害同一节点上的其他 Pod,甚至导致集群节点一个接一个被压垮。 Req 和 Limit 一共有四个值,如果只设置部分值,当节点资源使用率达到 Kubelet 预设值时,Kubelet 会驱逐 Pod,驱逐的顺序
FailedCreatePodSandBox 错误 Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:402: getting the final child's pid from pipe caused: EOF: unknown 处理 清理 cache 1 echo 3 > /proc/sys/vm/drop_caches 原因 内存碎片过多 calico-node 不停重启 increase max user 错误 runtime: failed to create new OS thread (have 11 already; errno=11),runtime: may need to increase max user processes (ulimit -u) 处理 增加 ulimit 限制额度 1 ulimit -u unlimited 原因 用户进程数耗尽 calico-node BIRD is not ready 错
记录一次因为 IP 变更导致集群故障的修复过程。有两个集群,一个是单节点(allinone),另一个是四节点(3 master 1 node)的集群。 1. 更新 Etcd 证书 【在每个 Etcd 节点】备份 Etcd 证书 1 cp -R /etc/ssl/etcd/ssl /etc/ssl/etcd/ssl-bak 查看 Etcd 证书中的域 1 2 3 openssl x509 -in /etc/ssl/etcd/ssl/node-node1.pem -noout -text|grep DNS DNS:etcd, DNS:etcd.kube-system, DNS:etcd.kube-system.svc, DNS:etcd.kube-system.svc.cluster.local, DNS:localhost, DNS:node1, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1, IP Address:x.x.x.1 需要
本文翻译自 https://learnk8s.io/kubernetes-network-packets,并没有逐字翻译,带入了些自己的理解。 阅读本文,你可以了解在 Kubernetes 内外,数据包是如何转发的,从原始的 Web 请求开始,到托管应用程序的容器。 Kubernetes 网络要
1,脱离职责的流程是没有意义的 软件架构与组织架构相匹配,不仅仅体现在功能边界,更体现在职责划分。 清晰的职责边界,才能构筑良好的团队协作与发展。每个团队、每个人都应该明白自己的目标,什么事情应该承担,什么事情应该回避,将时间和精力投入到对主要
1,接上一回,共享存储优化海外镜像的拉取 在基于 Harbor 和 Registry 的镜像管理分发方案的基础上,最近又做了一个优化。 之前的方案是,在每个区域,使用一台低配大磁盘的机器,部署一个 Mirror Cache 缓存镜像。这样带来一个问题,就是每个区域都需要拉取一个镜像,如果有 N 个区域,
最近有一个需求,收集 Kubernetes 的外网访问情况。因此对相关项目进行了调用和试用,本篇主要是介绍如何安装 Kindling,配置 Grafana 查看 Kubernetes 网络连接数据。 1. 什么是 Kindling Kindling 解决的是,在不入侵应用的前提下,如何观测网络的问题,其功能主要是通过暴露内核事件来实现观测。
1. 安装方式 1 2 kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' OpenEBS 主要用来给 Tekton 流水线作为默认的存储使用。之前,我也试过 Longhorn,但是高峰期扛不住,流水线 Pending。而卸载 Longhorn 之后有残留,导致 kube-apiserver 一直报错,最后花了很大力气才删除。 2. Kubernetes 集群证书过期之后,OpenE
1. 平台化才能让你走得更远 只要你比竞争对手响应市场快一点,活得久一点,就能争取更多生存的空间。绝妙的商业模式、市场机遇更像是魔法,能迅速壮大公司,但并不是人力可控的范畴。我们能做的是打磨好工具、平台,以待风起时变,稍能驾驭便能青云直上。 平台建
本文描述的监控指标,仅包含 Kubernetes 基础的指标,不包含业务相关指标,相关组件为 prometheus-server、kube-state-metrics、node-exporter,数据的保存周期为 3 天。 1. 集群中监控相关组件 1 2 3 4 helm -n monitor list NAME NAMESPACE REVISION UPDATED STATUS
主机 主机内存使用率超过阈值 1 - node_memory_MemAvailable_bytes{mode!="idle"} / node_memory_MemTotal_bytes 阈值:0.9 主机 CPU 使用率超过阈值 1 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (host_name) 阈值:0.85 主机硬盘使用率超过阈值 1 - avg without (fstype)(node_filesystem_free_bytes{fstype!='rootfs',mountpoint!~'/(run|var|snap).*'} / node_filesystem_size_bytes{fstype!='rootfs',mountpoint!~'/(run|var|snap).*'}) 阈值:0.8 Windows Windows 主机内存使用率超过阈值 1 - 1 * windows_os_physical_memory_free_bytes{job="windows_exporter",mode!="idle"} / windows_cs_physical_memory_bytes 阈值:0.9 Windows 主机 CPU 使用率超过阈值 1 - (avg by (host_ip,host_name) (irate(windows_cpu_time_total{job="windows_exporter",mode="idle"}[1m]))) 阈值:0.85
1. 主机服务端口 1 2 iptables -I INPUT -p tcp --dport 80 -j DROP iptables -I INPUT -p tcp -s 1.2.3.4 --dport 80 -j ACCEPT 这里仅允许 1.2.3.4 访问本地主机的 80 端口。 2. Docker 服务端口 对于类似 docker run -d -p 80:80 shaowenchen/demo:whoami 运行的服务,上面的方法无效,需要在 DOCKER-USER 链中添加规则。 Docker 会将 iptables 规则添加到 DOCKER 链中,如果需要在 Docker 之前添加规则需要添加到 DOCKER-USER 链中
1. Linux 下的流量控制原理 通过对包的排队,我们可以控制数据包的发送方式。这种控制,称之为数据整形,shape the data,包括对数据的以下操作: 增加延时 丢包 重新排列 重复、损坏 速率控制 在 qdisc-class-filter 结构下,对流量进行控制需要进行三个步骤: 创建 qdisc 队列 上面提到 Linux 是
1. 相关背景 早上 10:00 因同事需求,我通过工具在集群上创建 Kubernetes Job 执行任务。 工具创建 Job 时,会拿到集群上的全部节点,然后逐个绑定节点创建 Job。例如,如下集群: 1 2 3 4 5 6 7 8 9 10 kubectl get node NAME STATUS ROLES AGE VERSION node2 Ready control-plane,master,worker 64d v1.16.11 node3 Ready control-plane,master,worker 64d v1.16.11 node4 Ready control-plane,master,worker 64d v1.16.11 node5 Ready worker 64d v1.16.11 node6 Ready worker 64d v1.16.11 node7 NotReady,SchedulingDisabled worker 64d
1. 异构系统带来的认证鉴权问题 企业系统,可以分为以下几种类型: 购买的商业软件,比如 JumpServer 开源的软件,比如 Kibana、Grafana 自主研发的软件,比如应用管理平台 这里需要说明的是,认证和鉴权是两个功能: 认证,证明你是你 鉴权,你是管理员,而不是普
1. 自签 *.docker.io 域名证书 1.1 创建 CA 证书 生成 CA 证书私钥 1 openssl genrsa -out ca.key 4096 生成 CA 证书 1 2 3 4 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=chenshaowen.com" \ -key ca.key \ -out ca.crt 1.2 创建 *.docker.io 域名证书 生成私钥 1 openssl genrsa -out docker.io.key 4096 生成证书签名请求 CSR 1 2 3 4 openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=*.docker.io" \ -key docker.io.key \ -out docker.io.csr 生成 x509 v3 扩展 1 2 3 4 5 6 7 8 9 10 11 cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE
1. Harbor 跨区带来的挑战 如果只是简单的存放镜像数据, Registry 作为镜像仓库会是一个很好的选择。Registry 不仅支持多种存储后端,还可以配置 HTTPS 证书,访问凭证。值得一题的是,Harbor 也是使用 Registry 存储镜像数据。 如果团队需要进行角色管理,存储控制,对接 LDAP 认
如果采用 Logstash 集中接收 Filebeat 的日志输入,容易造成单点瓶颈;如果采用 Kafka 接收 Filebeat 的日志输入,日志的时效性又得不到保障。这里直接将 Filebeat 采集的日志直接输出到 Elasticsearch。 1. 准备工作 节点规划 这里没有区分 master、data、client 节点,而是
1. 创建负载时,通过 nodeSelector 指定 Node 给节点添加标签 1 kubectl label node node2 project=A 指定 nodeSelector 创建工作负载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx-nodeselector spec: replicas: 1 selector: matchLabels: app: nginx-nodeselector template: metadata: labels: app: nginx-nodeselector spec: nodeSelector: project: A containers: - name: nginx image: nginx EOF 查看工作负载 1 2 3 4 kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
如果你需要监控两个主机、主机与外部服务之间的网络状况,那么就可以试一试本文提到的 Blackbox Exporter。 1. 安装 Blackbox 1.1 在主机上部署 下载二进制包 1 2 3 4 5 wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.21.0/blackbox_exporter-0.21.0.linux-amd64.tar.gz tar -xzvf blackbox_exporter-0.21.0.linux-amd64.tar.gz mv blackbox_exporter-0.21.0.linux-amd64/blackbox_exporter /usr/bin/ mkdir /etc/prometheus mv blackbox_exporter-0.21.0.linux-amd64/blackbox.yml /etc/prometheus/ 清理安装包 1 rm -rf blackbox_exporter-0.21.0.linux-amd64* 新建 Systemd 服务 1 vim /usr/lib/systemd/system/blackbox_exporter.service 新增如下内容: [Unit] Description=blackbox_exporter After=network.target [Service] Restart=on-failure ExecStart=/usr/bin/blackbox_exporter \ --config.file=/etc/prometheus/blackbox.yml Restart=on-failure [Install] WantedBy=multi-user.target
1. 应用架构与业务发展、运维能力匹配 在行业会议、文档博客中,我们时常能见到各种优秀的解决方案,但是如果直接照搬到自己的业务,却又频频碰壁。因为,这些技术方案是特定的业务场景孵化出来的,不同的业务形态、不同的业务规模、不同的业务发展阶段都会影响
1. 为什么需要二次调度 Kubernetes 调度器的作用是将 Pod 绑定到某一个最佳的节点。为了实现这一功能,调度器会需要进行一系列的筛选和打分。 Kubernetes 的调度是基于 Request,但是每个 Pod 的实际使用值是动态变化的。经过一段时间的运行之后,节点的负载并不均衡。一些节点负载
在默认情况下,Kubernetes 的证书每隔一年需要 renew 一次,下面是记录的一次证书更新过程。 1. 查看证书 在 Master 节点上查看证书过期时间: 1 2 3 4 5 6 7 8 9 10 11 12 13 kubeadm certs check-expiration CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Apr 02, 2023 09:53 UTC 296d no apiserver Apr 02, 2023 09:53 UTC 296d ca no apiserver-kubelet-client Apr 02, 2023 09:53 UTC 296d ca no controller-manager.conf Apr 02, 2023 09:53 UTC
1. 抓取 Tekton Metrics 新增 ConfigMap 配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: config-observability namespace: tekton-pipelines labels: app.kubernetes.io/instance: default app.kubernetes.io/part-of: tekton-pipelines data: metrics.backend-destination: prometheus metrics.taskrun.level: "task" metrics.taskrun.duration-type: "histogram" metrics.pipelinerun.level: "pipeline" metrics.pipelinerun.duration-type: "histogram" EOF 修改 data 中的配置,会改变上报指标的粒度,甚至会严重影响 Prometheus 的性能,需要谨慎修改。 重启 Tekton 1 kubectl -n tekton-pipelines rollout restart deployment tekton-pipelines-controller [可选] 将 tekton-pipelines-controller 设置为 NodePort
1. 为什么需要 kube-status-metrics Kubernetes 的监控主要关注两类指标: 基础性能指标 CPU、内存、磁盘、网络等指标,可以通过 DaemonSet 部署 node-exporter,由 Prometheus 抓取相关指标。 资源对象指标 Deployment 的副本数量、Pod 的运行状态等。这些指标需要 kube-status-metrics 轮询 Kubernetes 的 API 查询,并暴露给 Prometheus 才能够看到
1. 含义 如果一个服务有多个域名入口,通过这些入口访问得到的内容一样,那么称这些域名为等价域名。 比如,通过等价域名,可以提供 3 个一模一样的文件或者接口服务。 https://server.chenshaowen.com/static/index.html https://server-peer-a.chenshaowen.com/static/index.html https://server-peer-b.chenshaowen.com/static/index.html 2. 用途 2.1 增加浏览器并发上限 浏览器通常会限制对单个域名最大并发数量不超过 6 个/秒。通
1. 关于流量分发 流量的治理分为南北向和东西向。在典型的 Network Diagrams 的绘图习惯中,核心网络组件绘制在顶部,客户端绘制在底部,不同的服务水平绘制,因此有了南北和东西流量的称呼。 其中,南北流量指的是从客户端发起的流量,东西流量指的是服务与服务之间的流量。目
1. 准备定时脚步 如果是 Bash 脚本,第一行需要指定解释器。 1 2 mkdir -p /root/scripts vim /root/scripts/quick-clear.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/sh /usr/local/bin/kubectl --kubeconfig /root/.kube/config get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs --no-run-if-empty -L1 /usr/local/bin/kubectl --kubeconfig /root/.kube/config delete pod -n || true /usr/local/bin/kubectl --kubeconfig /root/.kube/config get pods --all-namespaces -o wide | grep Error | awk '{print $1,$2}' | xargs --no-run-if-empty -L1 /usr/local/bin/kubectl --kubeconfig /root/.kube/config delete pod -n || true /usr/local/bin/kubectl --kubeconfig /root/.kube/config get pods --all-namespaces -o wide | grep Completed | awk '{print $1,$2}' | xargs --no-run-if-empty
1. 相关背景 待在工作岗位上,总得做点事,也想做点新鲜事。但并不是你想做就有机会去做,并能做好。 一个人做、还是能和大家一起做,最终的结果是不一样的。这就涉及到时机,大家能否达成一致的动机。 今年是降本增效的一年,很多公司在裁员、减配降本。因此,对
1. 下载二进制文件 1 2 3 4 wget https://github.com/thanos-io/thanos/releases/download/v0.26.0/thanos-0.26.0.linux-amd64.tar.gz tar xvf thanos-0.26.0.linux-amd64.tar.gz mv thanos-0.26.0.linux-amd64/thanos /usr/bin/ rm -rf thanos-0.26.0.linux-amd64* 2. 安装 Thanos Query 1 vim /etc/systemd/system/thanos-query.service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [Unit] Description=Thanos Query After=network-online.target [Service] Restart=on-failure ExecStart=/usr/bin/thanos query \ --log.level=debug \ --query.auto-downsampling \ --grpc-address=0.0.0.0:30091 \ --http-address=0.0.0.0:30092 \ --query.partial-response \ --query.replica-label=prometheus_replica \ --query.replica-label=rule_replica \ --store=1.0.0.0:30091 \ --store=2.0.0.0:30091 [Install] WantedBy=multi-user.target --store 参数添加需要聚合的全部源。 1 systemctl daemon-reload && systemctl enable thanos-query 1 systemctl start thanos-query && systemctl status thanos-query 3. 安装 Thanos Sidecar 1 vim /etc/systemd/system/thanos-sidecar.service 1 2 3 4 5
作者: 王伟 出版社: 中信出版社 出版年: 2017-10-15 ISBN: 9787508667751 Notes: 在万年内,地缘是无法改变的事实,也是各位战略家不断深入研究的领域。中国往东,经过日本,越过北太平洋就是美国;中国往西南,经过印度洋、大西洋,也与美国连通。 美国依靠的是本土的工业、科技能力,通过控制
1. 通信协议的选择 运维系统更适合 HTTP 而非 gRpc 。 熟悉 HTTP 的运维、研发人员比其他协议的人多。在掌握 HTTP 协议的基础上,学习 Restful 风格的 HTTP API 很快。更多人熟悉、更易于学习,意味着更好沟通、更低的交接成本,因为他们有着更多共同的领域背景。 支持 HTTP 调试的工具非常多。无论
1. 通过 kubectl create 添加 1 kubectl create secret docker-registry mypullsecret --docker-server=harbor.chenshaowen.com --docker-username=robot-test --docker-password=xxxxxx 通过 kubectl create 可以直接添加拉取镜像的凭证。 2. 通过 ~/.docker/config.json 添加 使用账户密码登录镜像仓库 1 docker login harbor.chenshaowen.com:5000 1 docker login harbor.chenshaowen.com 可以添加多个。 查看本地保存的凭证 1 2 3 4 5 6 7 8 9 10 11 12 cat ~/.docker/config.json { "auths": { "harbor.chenshaowen.com:5000": { "auth": "xxxxxx" }, "harbor.chenshaowen.com": { "auth": "xxxxxx" } } } 对凭证进行 base64 编码 1 2 3 cat ~/.docker/config.json |base64 -w
1. 容器的 ulimit 设置太小 报错信息: 1 2 3 4 5 6 7 CheckpointDir: /root/.obsutil_checkpoint OutputDir: /root/.obsutil_output runtime: mlock of signal stack failed: 12 runtime: increase the mlock limit (ulimit -l) or runtime: update your kernel to 5.3.15+, 5.4.2+, or 5.5+ fatal error: mlock failed 如果是 Docker 下,可以在启动时添加 ulimit 参数 1 docker run -it --ulimit memlock=-1 ... 如果是 Kubernetes 下,需要以特权模式启动 Pod 1 2 3 securityContext: privileged: true runAsUser: 0 在 yaml 配置中添加上面的片段,然后在启动脚
作者: [美] 李政道 出版社: 清华大学出版社 出版年: 2000-05 ISBN: 9787302038665 Notes: 以前还是挺喜欢阅读数学和物理领域知识的,参加工作之后疲于解决各种项目和技术问题,对世界本真的模样逐渐失去了好奇。得益于作者深厚的功力,这本书能够轻松将各领域、场景下的对称与不对称进行呈
1. 使用 Query 聚合数据 如上图,Thanos Query 可以对接的组件有: Thanos Store Gateway Thanos Query Thanos Receive Prometheus,借助于 Sidecar 利用 Thanos Query 之间的级联,我们可以实现跨组件的关联查询,组建超大型的监控系统。这也意味着,每个对接的组件应该提供足够快的 Prometheus API。整个接口的响应时
1. 全球的网络规划 很多面向全球的多区域基础设施,在设计之初并没有在网络规划上花费太多心思。当业务复杂到一定程度时,又被逼着进行网络调整和优化。而任何网络上的大调整,都将对业务产生巨大影响。最终会陷入进退两难之地,只能投入更多人力,背上历史包袱
1. 监控的分层 如上图,在建设监控系统时,会采用两种策略: 分层监控。IaaS、MySQL 中间件、App 层监控分开的好处是,系统之间具有高可用性、容错性。当 App 层监控无法工作时,IaaS 层监控立马就会体现出来。 长短期指标分离。短期指标用来提供给告警
1. 添加 key 的步骤 1.1 客户端生成 ssh key 有两种格式的 Key: 老格式,私钥以 -----BEGIN RSA PRIVATE KEY----- 开头 1 ssh-keygen -m PEM -t rsa -b 4096 -C "mail@chenshaowen.com" 新格式,私钥以 -----BEGIN OPENSSH PRIVATE KEY----- 开头 1 ssh-keygen -t rsa -b 4096 -C "mail@chenshaowen.com" 由于某些旧的系统不支持新格式的 Key,这里建议生成老格式的 Key。如果你已经在使用新格式的 Key,可以使用 puttygen
升级思路是,驱逐负载、摘除流量之后,先升级控制节点,后升级工作节点。 1. 查看集群版本 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:12:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T17:57:25Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"} 当前版本是 1.22,由于 kubeadm 不允许跨版本升级,这里准备升级到 1.23 。 2. 添加 Kubernetes 安装源 CentOS 操作系统: 1 2 3 4 5 6 7
1. Kubernetes Pod 引用环境变量的几种方式 1.1 直接 Key/Value 可以直接设置 Value 值,也可以将当前 Pod 的信息作为 Value 值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 apiVersion: v1 kind: Pod metadata: name: envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: gcr.io/google-samples/node-hello:1.0 env: - name: DEMO_GREETING value: "Hello from the environment" - name: DEMO_FAREWELL value: "Such a sweet sorrow" - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name 1.2 从 Secret 引用 有两
1. 给主机添加 DNS 1.1 CentOS 第一种方法: /etc/resolv.conf 管理 DNS 禁用 NetworkManager 如果不禁用 NetworkManager,在重启 NetworkManager 组件之后,直接在 /etc/resolv.conf 中添加的 DNS 记录会丢失。 1 2 3 4 vim /etc/NetworkManager/NetworkManager.conf [main] dns=none 在 [main] 部分添加 dns=none。 此时重启 NetworkManager,对已经添加到 /etc/resolv.conf 的记录无影
1. 硬盘格式化 查看新磁盘 1 fdisk -l 通常,第二块硬盘的名字会是 /dev/sdb 。 磁盘分区 1 fdisk /dev/sdb 会有提示输入参数: command (m for help):n Partition number(1-4):1 First cylinder (1-22800,default 1):Enter command (m for help):w 格式化磁盘为 ext4 1 mkfs.ext4 /dev/sdb 将磁盘挂载到指定目录 1 2 mkdir /data mount -t ext4 /dev/sdb /data 开机自动挂载目录 先找到设备的 UUID。 1 2 3 blkid |grep /dev/sdb /dev/sdb: UUID="328a9d32-abb6-492a-aabe-b6a63583674d" TYPE="ext4" 编辑 /etc/fstab 新
非分阶段构建场景下,使用容器进行构建时,我们可以将容器中的缓存目录挂载到构建主机上,执行构建任务;然后将产物拷贝到运行镜像,制作应用镜像。但是在分阶段构建时,构建镜像和运行镜像在同一个 Dockerfile 中,这给优化第三方依赖的缓存带来了难度。 1. 创建一个 Vue 实
1. 免密登录 修改 /etc/my.cnf,在 [mysqld] 中添加一行: skip-grant-tables=1 重启 mysqld 服务 1 systemctl restart mysqld 使用 root 用户登录到 MySQL 1 mysql -u root 2. 允许全部访问来源 登录 MySQL 1 mysql -u root -p 在 mysql 交互命令行中输入: 1 2 3 4 USE mysql; SELECT user, host FROM user; update user set host = '%' where user = 'root'; FLUSH PRIVILEGES; 3. 导出全部数据 1 mysqldump -uroot -proot --all-databases >/tmp/all.sql
监控系统的难点在于,存储大容量时序数据,提供高性能的查询能力;告警系统的难点在于,设计高效的告警引擎,实现灵活的告警升级机制。最近一直在跟踪监控告警系统,本篇主要是整理监控告警相关的一些概念、组件,调研方案。 1. 监控告警系统的组成 对于监控告警
1. 布卢姆分类学 布卢姆分类学 (Bloom’s taxonomy) 是美国教育心理学家本杰明·布鲁姆于1956年在芝加哥大学所提出的分类法,把教育者的教学目标分类,以便更有效的达成各个目标。根据布卢姆的理论析,知识可以分成以下三个范畴: 态度范畴(Affective Domain)
1. 面试流程 建立招人标准 对齐招人标准 简历分析 开场寒暄 胜任力评估 价值观评估 辨别真伪 动机评估 吸引优秀候选人 结束面试 填写面试评估表 协助入职跟进 2. 面试前 2.1 建立招人标准 why 使用统一的考核标准评估候选人 how 冰山模型,冰山上-当前(知识、技能),冰山下-未来(
最近在调研开源的 Kubernetes 管理平台,需求是能够管理内网的上百个集群。功能定位是辅助运维、向应用层提供能力,而非直接面向终端用户。 1. Kubernetes Dashboard 项目地址: https://github.com/kubernetes/dashboard 技术栈:Angular + Go 关键字: 单集群 K8s 资源管理 2. Kuboard 项目地址: https://github.com/eip-work/kuboard-press 技术栈:Vue 关键字: 多集群 K8s 资源管
1. 安装准备 一个安装好 PE 的 U 盘 如果是 MacOS,可以使用 balenaEtcher 刻录 wepe for mac 镜像。 下载 synoboot 文件 http://down.nas2x.com/synology/dsm/6.2/synoboot/ 下载 DSM.pat 文件 https://archive.synology.com/download/Os/DSM 2. 开始操作 通过 PE 引导,进入系统 将 synoboot 写入内置的 SSD 存储 如果使用 U 盘引导,可能还需要修改 grup.cfg 中的 PID、VID 值。 卸载 U 盘,重启系统,进入 Happy hacking 页面 同网络
1. 安装 node exporter 1 2 3 wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/ 如果访问不了 GitHub,可以参考: 国内访问 GitHub 的若干方法 。 2. 配置并启动 exporter 新增 Systemd 配置 1 vim /etc/systemd/system/node_exporter.service 增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 [Unit] Description=Node Exporter After=network.target [Service] User=root Group=root Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target 启动 exporter 1 2 systemctl daemon-reload systemctl start node_exporter 添加开机自启动 1 systemctl enable node_exporter 本地查看 Metric 接口 1 2
1. 背景和前置条件 Btrfs 文件系统相较于 Ext4 ,是一种更年轻的文件系统,具有更多可玩的特征,比如支持快照、子卷、校验和自检、软 RAID 甚至透明压缩等。 但是在没有运维能力的情况下,建议不要使用 Btrfs 文件系统。本文记录的是,在群辉 DSM 系统下,将 Btrfs 文件系统的磁盘拆下后,
1. 升级 Go 版本之后 go.sum 版本不匹配 执行命令 go build 报错。 错误提示: missing go.sum entry for module providing package golang.org/x/time/rate; to add 解决办法: 在 go build 之前更新 go.sum,执行命令 go mod tidy 2. tls 错误 执行命令 go mod download 报错。 错误提示: fatal: unable to access 'https://github.com/agiledragon/gomonkey/': GnuTLS recv error (-110): The TLS connection was non-properly terminated. 解决办法: 禁用证书校验执行命令,export
长时间运行的集群,常会面临各种资源耗尽的问题,另外磁盘不足时 Kubelet 还会主动清理镜像增加不确定因素,本文提供了一些命令片段用于清理工作。 1. Kubernetes 基础对象清理 清理 Evicted 状态的 Pod 1 sudo kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | sudo xargs -L1 kubectl delete pod -n 清理 Error 状态的 Pod 1 sudo kubectl get pods --all-namespaces -o wide | grep
1. 时间与时区 1.1 时间标准 UTC,世界标准时间,是现在的时间标准,以原子时计时。 GMT,格林威治时间,是以前的时间标准,规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午 12 点。 UTC 时间更加准确,但如果对精度要求不高,可以视两种标准等
1. Logstash 的基本原理 Logstash 是一个用于数据传输和处理的组件。 通过插件的组合,Logstash 可以满足各种日志采集的场景: logstash->elasticsearch filebeat->logstash->elasticsearch filebeat->kafka->logstash->elasticsearch filebeat->redis->logstash->elasticsearch 2. Logstash 的基本配置 下面是一个 Logstash 的配置格式: 1 2 3 4 5 6 7 8 9 10 11 12 # 数据源,例如 Kafka、MySQL input { } # 过滤器,用于处理数
1. 错误提示 在拉取镜像时,偶尔会碰到如下错误: 1 2 3 4 5 6 7 8 docker pull node:10.16-alpine 10.16-alpine: Pulling from library/node e7c96db7181b: Already exists 50958466d97a: Pulling fs layer 56174ae7ed1d: Pulling fs layer 284842a36c0d: Pulling fs layer error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2 /docker/registry/v2/blobs/sha256/b9/b95baba1cfdbfa8b789137179d8e fff08b9768f1906725a8758cf0c431b59621/data? verify=1636603895-lbb1QIruPZBdfgfhBZ95ArGK0wU%3D: dial tcp 104.18.124.25:443: i/o timeout 2. 主要解决办法 2.1 修改 DNS 地址 如果是 CentOS ,直接修改 /etc/resolv.conf 文件,新增一行 nameserver 8.8.8.8 即可。 如果是 Ubuntu ,需要修改 /etc/syste
应用配置管理强调的是,应用运行时依赖的配置管理,不同于项目的静态配置。本文是实际开发过程中的一些总结,以供大家参考,也欢迎交流。 1. 关于配置管理 1.1 名称解释 配置项 一个 key=value 组合 配置集 一组配置项的集合,key1=value, key2=value2 配置实例 一份完整的,可供
从调研数据来看,大家选择小集群的比较较高。下面是从节点数、节点配置角度提供的一份对比列表。 下面是选择少量大集群,还是多个小集群的对比列表: 特征 少量大集群 多个小集群 资源利用率 高 低 管理节点开销 低 高 资源伸缩范围 大 小 资源调度范围 大 小 应用间通信效率 高
1. SSH 连接方向: Master 主动连接 Agent 要求: Master 能通过 SSH 直连 Agent Agent 上启动了 SSHD 服务 Jenkins 安装 SSH Credentials Plugin、SSH Build Agents 插件 2. JNLP 连接方向: Agent 主动连接 Master 要求: Agent 能访问 Master Agent 需要 JVM 环境运行 Master 需要放开 50000(默认值)端口用于 Agent 通信 50000 端口是 Jenkins Master 的服务端口,不需要再运行
副标题: 让谷歌、亚马逊实现爆炸性增长的工作法 作者: (美) 约翰·杜尔(John Doerr) 出版社: 中信出版社 出版年: 2018-12 ISBN: 9787508696881 Notes: OKR 即目标与关键成果法,是 Intel 创始人安迪·葛洛夫发明的一种用于管理目标和完成的工作方法。O 代表着目标,它应该是重要且具体、
1. 缺少发自内心的渴望 有了渴望才会有动力。对生存的渴望、对美好的渴望,是推动人类进步的源泉。渴望愈加强烈,动力才会愈加强烈。强烈的渴望会让人不顾一切地冲向目标。想要突破,激情比理性更加重要。 2. 疲于满足日常的生理 无法突破的身体和精神极限。太在意
1. 关于两地三中心 如上图,两地三中心的架构,是为了提高系统的容错、容灾的能力。当一个数据中心不可用时,能够将关键业务的流量切换到其他数据中心,可以抵御城市级的自然灾害。 两地指的是,地理上不同的两座城市,而三中心指的是: 生产中心 同城灾备中心 异地
副标题: 如何从智商衰退中跳脱出来 作者: (日) 大前研一 出版社: 中信出版社 出版年: 2010-4 ISBN: 9787508619262 Notes: 值得注意的是这本书的形成时间。十多年后的今天,阅读这本书依然可以感受到其分量。 网络越发达,大脑越懒惰。年轻人只关注自己的片瓦之地,不再有欲望和向上的动力。
1. 为什么需要定义应用运行时 运行时更多选择。传统的应用运行时有,物理机、虚拟机、云主机。容器时代,常见的运行时有 Docker、Kubernetes。这些运行时,提供给我们的不再是一个单一的运行时选择。 应用拓扑更复杂。如果由 CMDB 统一存储应用的拓扑
Kubevela 目前处于 1.1 版本。通常,我们认为 1.x 的版本是相对稳定的,可以尝试引入生产。在不断地跟踪和学习过程中,也感受到 Kubevela 的一些好的地方,这是一篇小结性的文档。 1. Kubevela 能解决什么问题 面向平台开发者 需要区分几个角色: 开发、运维、运维开发。开发面向的是业务需求,
1. 系统要求 Kubernetes, >= 1.16.0-0 Helm, >= 3.0 Linux 内核 >= 4.9.17 CentOS 7 升级内核过程,可以参考 Calico 下如何切换数据面到 eBPF 。 2. 卸载 Calico 删除集群资源 1 2 3 4 5 6 kubectl -n kube-system delete ds calico-node kubectl -n kube-system delete deploy calico-kube-controllers kubectl -n kube-system delete sa calico-node kubectl -n kube-system delete sa calico-kube-controllers kubectl -n kube-system delete cm calico-config kubectl -n kube-system delete secret calico-config 1 kubectl get crd | grep calico | awk '{print $1}' | xargs
1. 环境准备 1.1 Calico eBPF 要求 系统要求 Ubuntu 18.04.4+ Red Hat v8.2 Linux kernel v5.3+ 如果 Calico 没有检测到兼容的内核,将会回退到标准模式。 每个节点的 /sys/fs/bpf 都需要挂载有 BPF 文件系统 Calico 版本不低于 3.13 1.2 升级内核 这里使用的是 CentOS 7 操作系统: 1 2 3 uname -rv 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 内核版本不满足要求,因此需要升级内核
1. Calico 1.1 BIRD is not ready 1 kubectl -n kube-system get pod calico-node-xxx 0/1 一直起不来,报错 calico/node is not ready: BIRD is not ready: BGP not established with 解决办法: Calico 默认使用 first-found,也就是从第一个找到的网卡中获取 NodeIP。虽然排除了 lo、docker0 等网卡,但是依然有一定概率会识别失败。需要手动修改,
nload 是一个流量监控的终端工具,读取 /proc/net/dev 文件,绘制流量图。下面是一个简单的使用简介。 1. 安装 CentOS 1 yum install -y nload 如果系统的源找不到 nload 包,可以执行如下命令添加新源: 1 yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm Ubuntu 1 apt-get install -y nload 2. 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 nload --help Command line syntax: nload [options] [devices] nload --help|-h Options: -a
1. 本地怎么访问远程集群 在研发时,需要直接连接远端 Kubernetes 集群。通常的做法是,将 /etc/kubernetes/admin.conf 拷贝到本地 ~/.kube/kubeconfig。 但是 kubeconfig 的 server 地址是 kubernetes.default.svc。因此,我们需要配置一个 hosts: 1 1.1.1.1 kubernetes.default.svc 如果需要在不同集群之间切换
Prometheus 社区更新太快,之前写的一些文档有些过时。最近又开始关注可观测性,补齐运维方面的一些知识点。 1. 名词解释 Grafana 一个可视化工具,提供各种可视化面板,支持各种数据源,包括 Prometheus、OpenTSDB、MySQL 等。 Prometheus 一个时间序列数据库,主要
1. 问题背景 在 Jenkins 中添加了很多个构建节点使用同一个 Label 以供流水线使用,但是 Jenkins 却每次都倾向于在同一个节点进行构建。 这导致了并发问题,单个节点的压力过大,而其他节点空闲,负载极其不均衡。 2. 业务流水线的设计 上述问题的产生和业务流水线的设计有一定的关系。
1. 几种常见网关的比较 Nginx, 模块化设计的反向代理软件,C 语言开发 OpenResty, 以 Nginx 为核心的 Web 开发平台,可以解析执行 Lua 脚本 Kong, OpenResty 的一个应用,是一个 API 网关,具有 API 管理和请求代理的功能,使用 PostgreSQL 存储 APISIX, 替换了 Kong 的 PostgreSQL 为 Etcd,基于 Nginx 的核心库实现 APISIX 的优势在于提供了 API 的管理
1. Serverless 的使用场景 如果说云计算是希望资源能够像自来水一样,隋开随用、随关随停,那么 Serverless 就是云计算的未来方向之一。相较于 IaaS、Kubernetes 这些运行时,Serverless 提供更细粒度资源控制的同时,还能提供更大的弹性,允许开发者快速交付
1.背景 1.1 目前使用 Jenkins 遇到的问题 编排引擎不稳定 Jenkins 是由 Java 编写的编排引擎,在 Full GC 时会 Stop The World(STW)。在大规模构建时,STW 可能会导致 Jenkins 无法处理新的请求。 大量构建卡顿 Jenkins 使用磁盘文件存储数据,每条流水线、每次构建都会占用一个文件目录,产生大
通常,我们需要在 GitHub 上进行一些操作,才能触发 GitHub Action。本篇将介绍一种通过 API 远程调用触发 GitHub Action 的方法。 1. 常见的几种触发 GitHub Action 的方式 下面是一个 GitHub Action 的示例: 1 2 3 4 5 6 7 name: GitHub Actions Demo on: [push, pull_request] jobs: Explore-GitHub-Actions: runs-on: ubuntu-latest steps: - run: echo "Hello World!" 在 on 关键字下,定义的就是触发 Workflow 执行的事件。
1. 多集群构建 Tekton 的优势 借助于 Kubernetes, Tekton 已经具备很好的弹性, 能够支持大规模构建。同时, 开发 Task 主要使用 Yaml 和 Shell, 这扩大了 Tekton 的各种场景适配范围。 上面是一张 Tekton 在多集群下的示意图。为什么 Tekton 需要多集群执行流水线? 随时可变的 Kubernetes 集群。单一的 Kubernetes 集群, 无法满足运维的要求,
1. 创建一个 Go Modules 项目 创建目录 1 2 mkdir go-test cd go-test 初始化包 1 2 3 4 5 go mod init gitlab.private.com/shaowenchen/go-test go: creating new go.mod: module gitlab.private.com/shaowenchen/go-test go: to add module requirements and sums: go mod tidy 添加业务代码 main.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello world.", }) }) r.Run() } 下载依赖到 vendor 1 2 go mod tidy go mod vendor 本地运行 1 2 3 4 5 go run
1. CICD 平台的基本功能 常见的 CICD 引擎并不适合直接提供给业务方使用。主要原因在于用户学习成本高、缺乏必要的鉴权、维护升级难度大。 我们通常会基于流程引擎,针对业务进行适配提高易用性,针对场景进行封装收敛复杂度,那么一个 CICD 平台需要具备哪些基本的功能呢?
1. 编辑 Kubelet 配置文件 1 vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 修改 Kubelet 相关参数 ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS 可以通过如下命令查看可选的参数: 1 kubelet --help 例如需要修改,KUBELET_KUBECONFIG_ARGS 的 --sync-frequency , 同步容器配置的时钟周期,默认值是 1 min。其含义是,更新了容器挂载的配置文件 1 min 之后,容器
1. 需求背景 如上图,业务方需要隔离 namespae 的服务,禁止 bar 空间的负载访问,而允许用户从 Load Balancer (LB) 通过 NodePort 访问服务。可以很容易地写出一个网络策略: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: foo spec: podSelector: matchLabels: {} policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.2.3.4/32 - namespaceSelector: matchExpressions: - key: region operator: NotIn values: - bar 然而
不能 1. 问题背景 基于 Kubernetes 构建可靠、稳定的运维系统时,虚拟机 (VM) 的销毁和新建是一种常态。VM 提供的是计算和内存资源,而使用外部存储,通过 StorageClass 提供给集群中的 PVC 消费。 在这样的背景下,如何快速初始化 VM 成为新的挑战。常见的思路是制作 Node 节点的 VM 镜像,提前将依赖
1. 如何部署 Jenkins 为了方面进行下面的测试,先介绍两种部署 Jenkins 的方式,这里使用的是 shaowenchen/jenkins:2.277.4 镜像。在生产环境中,需要替换为官方 jenkins/jenkins 镜像或自己定制的镜像。 1.1 docker-compose 运行 docker-compose.yaml 文件 version: '3' services: jenkins: image: shaowenchen/jenkins:2.277.4 container_name: jenkins restart: always network_mode: "bridge" environment: - JAVA_OPTS="-Xms1Gi -Xmx4Gi" ports: - 8080:8080 - 50000:50000 - 2222:2222 environment: TZ: Asia/Shanghai volumes: - /Volumes/Data/jenkins_home:/var/jenkins_home 在本地创建一个目录 /Volumes/Data/jenkins_home 用于存储 Jenkins 的数据
1. 配置较大的 -Xms -Xmx 参数 Jenkins 是由 Java 编写的编排引擎, 在 Full GC 时会 Stop The World(STW)。在大规模构建时, STW 可能会导致 Jenkins 无法处理新的请求。 为了避免频繁的 STW, 同时增大并发量, 建议设置较大的堆, -Xms3g -Xmx6g -XX:MaxRAM=6g。具体数值可以根据监控值来设置,
1. 解耦引擎释放流水线能力 在设计系统时,我们常面临两难。是内敛复杂度,对外提供单一易用的功能;还是释放复杂度,将灵活归还用户。这非常考验产品能力。 设计 CICD 系统时,我们可以直接将 Jenkinsfile、PipelineRun 等概念直接抛给用户,让
1. Kubernetes 中的网络隔离 Kuberntes 自 1.3 引入了 Network Policy(网络策略) ,通过 ipBlock、podSelector、namespaceSelector 定义实体,控制其 From(Ingress)、To(Egress)的流量行为。 但 Kubernetes 只是定义了网络策略,具体实
1. 我的平台建设经历 毕业之后,我加入了腾讯蓝鲸,主要参与 SaaS 的开发。待了近三年之后,回武汉老家,加入青云,负责 DevOps 的研发。待了近两年之后,加入新的公司,参与业务支撑平台建设,思考业务侧对 Kubernetes 的落地实践。 我写过很多关于平台的文档,领域输出才是 PaaS 的核心
由于众所周知的原因,在国内的网络环境下,访问 Github 时,网络会阻断或者很慢。本文提供了若干访问方法。 1. 使用 Github Mirror 下载 直接在 GitHub 仓库前面拼接 Proxy 地址,不同的 Mirror 拼接方式可能有所不同。下面以拉取 https://github.com/shaowenchen/scripts 仓库为例。 https://ghproxy.chenshaowen.com 1 git clone https://github.com/shaowenchen/ops 2. 通过 Gitee 导入 GitHub 项目 可以参考文档: GitHu
下面是一个 Jenkins 与 Tekton 对比的列表: 功能 Jenkins Tekton 编程语言 Java Golang 开发插件语言 Java Shell、Yaml 流水线描述语言 Groovy、Shell Yaml、Shell 插件生态 很多插件,LDAP、GitLab 不足 插件数量 1500+ 100+ 插件之间的兼容性 可能会有冲突,不能随便升级 完
使用的是 CentOS 7,内核版本 3.10.0-327 。 1. 查看当前 Docker 的版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 docker version Client: Docker Engine - Community Version: 20.10.6 API version: 1.41 Go version: go1.13.15 Git commit: 370c289 Built: Fri Apr 9 22:46:01 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.6 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 8728dd2 Built: Fri Apr 9 22:44:13 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.4 GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e runc: Version: 1.0.0-rc93
Docker 的 Mirror 仅能加速 docker.io 的镜像,而不能加速私有仓库的镜像。 1. 为什么需要一个私有的镜像仓库 mirror 公网限速 dockerhub 拉取限制频率 减少拉取镜像时间 2. 创建一个 Registry 镜像加速服务 生成一个配置文件 version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3 但这样启动的服务只能作为 Registry
1. 为什么需要物理构建机 在文章《如何接入远程 macOS 物理机进行 Jenkins 流水线构建》中,我描述了在 Jenkins 中添加物理构建机的方法。这并不是我拍脑袋想的需求,而是当时真的有 ToB 的商业客户在咨询方案。 对于多端开发商来说,构建 Android、IOS、macOS、Arm 、
计算机基础 堆和栈 什么时候用堆?什么时候用栈?栈有什么作用?Golang 的变量在栈还是堆?堆、栈有没有上限?有的话和什么有关? 数据结构 Slice 空间是怎样分配的?双倍扩容,原来数据复制过去。 Golang 的 map 是什么结构 Golang 的 map 是什么结构,遍历是否有序, 什么是 Hash 表?
大概是十年前,我在笔记本上安装过 macOS。当时最头疼的是只有特定的硬件才能安装成功,而且还缺各种驱动程序。后来自己买了 Mac 笔记本,很长时间没有关注如何在通用机器上安装 macOS 。最近拿到了一台 Dell 台式机,配置还不错,又尝试了一下。本文主要是记录这一过
1. 本文主要讨论什么 勿在浮沙筑高台。业务量的增长、业务形态的进化都需要坚实强劲的 IT 系统支撑。业务内容对市场是透明的,但是 IT 系统不是一朝一夕能建设完善的。未来公司之间的竞争主要也会来自于 IT 系统之间的竞争,能不能快速响应业务需求是决胜的关键。 IT 系
本文主要描述在 CentOS 8.2 下,如何使用本地工具编译 https://github.com/istio/istio 项目。另外一种方法是通过 BUILD_WITH_CONTAINER 参数控制,使用容器编译,仅依赖于 make 和 docker。 1. 安装并升级 Ruby >= 2.6 安装 Ruby 1 yum install -y ruby 查看 Ruby 版本 1 2 3 ruby -v ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux] 安装 RVM 1 2 3 4 yum install -y tar gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB curl -sSL https://get.rvm.io | bash -s stable source /etc/profile.d/rvm.sh 安
1. 以开源为核心的商业模式 开源的魅力之一在于其包容性。它能接受怀揣各种意图的人,无论是执着技术的的工程师,还是心怀鬼胎的商人,亦或是热心公益的志愿者,甚至茶余饭后的看客,都能在这里碰撞、交融,形成一股力量。 围绕开源做商业,应该被允许和接受。开
1. 安装 zsh 1 sudo yum install -y zsh 2. 安装 oh-my-zsh 1 sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 建议将 Zsh 设置为默认的 Shell。 3. 安装插件 3.1 安装 autojump 1 sudo yum install -y epel-release 1 sudo yum install -y autojump-zsh 3.2 安装 zsh-autosuggestions 1 git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions 3.3 安装 zsh-syntax-highlighting 1 git clone git://github.com/zsh-users/zsh-syntax-highlighting $ZSH_CUSTOM/plugins/zsh-syntax-highlighting 4. 添加 .zshrc 配置 1 sed -i 's/^plugins=(\(.*\)/plugins=(autojump zsh-autosuggestions zsh-syntax-highlighting \1/' ~/.zshrc 退出 Terminal, 再次登录即可。
在 CentOS 下安装包时,通常需要寻找各种源,使用 Homebrew 就没这样的烦恼。本文使用的是 CentOS 7.6,不同的系统版本可能会有差异。 1. 创建非 root 用户 Homebrew 不允许以 root 身份运行,因此需要创建一个新的用户。 新建用户 1 adduser shaowenchen 设置密码 1 passwd shaowenchen 给新用户添加 sudo 权限 编辑权限配置文件: 1 2 chmod
1. 什么是云原生 云原生是一个快速发展的领域。 2013 年, Pivotal 提出云原生的概念,并不断对其进行解读。下面是 Pivotal 对云原生架构的特征描述: 2015年,12-Factor、面向微服务、抗脆弱 2017年,可观测性、模块化、可替代性、可处理性 2019年,DevOp
作者: [美] Eric S·Raymond 出版社: 机械工业出版社 原作名: The Cathedral & the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary 译者: 卫剑钒 出版年: 2014-5 ISBN: 9787111452478 PDF: 点击查看 Notes: 大教堂隐喻由少数专家封闭式创作,不完成不发布的开发模式; 集市隐喻群策群力,小步快跑的敏捷开发模式。 从 Linux ,到 Fetchmail ,
在 《大公司和小公司的 ToB 思路》 中,我对大公司的 ToB 策略进行了较多的分析,本篇将从另外一个角度补充关于小公司 ToB 策略的思考。 1. 什么是 ToB 服务 一家商业公司通常维护着至少一条价值链,并从中获取利润。国内的中小企业平均寿命只有 2.5 年,新公司成立、旧公司破产是
本文介绍一个 ChatOps 工具 Lighthouse, 主要内容来自官方文档 。Kubernetes 社区使用 Prow 驱动其在 GitHub 上的协作, 但是不适用于其他仓库。Lighthouse 普适于更多类型的 Git 仓库。 1. 什么是 Lighthouse Lighthouse 是一个基于 webhooks 的轻量级 ChatOps 工具 , 通过 Git 仓库的 webhooks 可以触发 Jenkins X 流水线 、Tekt
从原理上看,在 Kubernetes 集群中,Jenkins 都可以使用 Podman 进行镜像构建,本文主要以 Containerd 为例。 1. 去 Docker 给 CICD 带来新的挑战 在 CICD 场景下, 我们经常需要在流水线中构建和推送镜像。 在之前的文档 《在 Kubernetes 上动态创建 Jenkins Slave》 中, 我描述了通过挂载 /var/run/docker.sock 文件, 允许在 Docker 驱动的 Kubernetes
原文由来自 Red Hat (CDF 成员) 的 Puneet Punamiya 撰写。 Tekton 是持续交付基金会 (CDF) 下的一个开源项目。它提供了一个以云原生构建 CI/CD 系统的框架。简单点说, 人们可以将整个 CI/CD 流水线定义为 Kubernetes 资源。 Tekton Pipelines 的核心是一个可复用的组件 - Task, 很容易共享。在 Tekton Catalog 仓库中包含了这些 Task 的列表。这些 Task 可
1. Buildpack 老树开新花 Buildpacks 项目最早是由 Heroku 在 2011 年发起, 被以 Cloud Foundry 为代表的 PaaS 平台广泛采用。在之前的文档 《PaaS 部署之 buildpack》 中, 我演示了如何将一个 Django 应用部署到 Heroku 上。 Buildpacks 不足的是产出包是 Droplet 格式, 不能直接适配容器平台。 在 2018 年 1 月, Pivotal 和 Heroku 发起了一个项
1. Argo CD 能解决什么问题 1.1 从 GitOps 说起 GitOps 起源于 Weaveworks 公司在 2017 年发表的一篇博客, GitOps - Operations by Pull Request 。在文中,Alexis 介绍了一种以 Git 为唯一事实来源的部署方式。 在 GitOps 实践中,我们需要将软件设施定义在 Git 仓库中进行管理。其中的软件设施,包括 IaaS、Kubernet
1. 什么是 pyfiglet pyfiglet 是一个用 Python 实现的 ASCII 艺术字生成工具。可以根据字符生成如下图形: 1 2 3 4 5 6 _ _ _ _ _ _ | |__ ___| | | ___ __ _____ _ __| | __| | | | '_ \ / _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | | | | | | __/ | | (_) | \ V V / (_) | | | | (_| |_| |_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_) |/ 在编写 CLI 工具时,可
1. 一个令人困惑的问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 name: Go on: [push, pull_request] jobs: build: name: CI runs-on: ubuntu-latest steps: - name: Set up Go 1.13 uses: actions/setup-go@v1 with: go-version: 1.13 - name: Check out code into the Go module directory uses: actions/checkout@v2 - name: Check pr is properly formatted run: diff -u <(echo -n) <(gofmt -d ./pkg ./cmd ./tools ./test) - name: Test & Build run: make all 上面是项目中 workflow 的一部分, 主要用来检测代码风格、执行单元测试、
如果你已经在使用 GitHub Actions ,那么阅读本文你将获得更多有趣而有用的打开方式。阅读完,我又给仓库新增了几个 workflow 。 1. workflow 执行时,传入参数 在执行 workflow 时, 允许在 GitHub Actions 页面输入参数,控制执行逻辑。我们可以将人工处理的逻辑,在 GitHub Actions 参数化执行,适用于持续部署场景。 1 2 3
本文档主要用于展示 Docker 特权模式的危害,请谨慎操作。对于没有 CLI 操作权限的用户,可以拷贝示例的 Yaml,直接创建集群负载 Pod、Job、DaemonSet 等进行操作。 1. 直接删除全部资源 如果能登陆机器,收拾好东西,执行命令: 1 kubectl delete all --all --all-namespaces 但是也有可能
1. 登录 Ngrok 获取一个 Authtoken 1.1 登陆 Ngrok 官网,获取 Authtoken 访问 Ngrok 官网,https://dashboard.ngrok.com/ , 可以使用 GitHub 或者 Google 账户登陆。 进入 Authentication 页面,找到自己的 Authtoken,如下图: 1.2 在 GitHub 项目下,配置 Secrets 在项目的 Settings 页面中,新增 Secrets
1. 什么是 Ngrok Ngrok 是一个内网穿透工具,能够将内网的服务,发布到公网上。下面这张图,可以很好地展示其功能: 相较于同类工具 Frp (需要同时运行 Server 和 Client ),Ngrok 将内网穿透做成了一个服务。只需要在 Ngrok 注册账户,获得 Authtoken ,启动 Client 就可以对外提供,本地服务的公网地
1. Debug 到想跑路 GitHub Actions 是 GitHub 在 2018 年 10 月推出的持续集成服务。对于开源项目,免费提供无限时长的构建时间,同时支持 Linux、MacOs、Windows 系统,非常招人喜爱。 但是,最近的一次经历改变了我的看法。我给同事的仓库,提交了一个 improvement: build and ci 的 commit ,用于完
1. 一个奇怪的需求 老板有个奇怪的需求,通过一个 kubeconfig 文件,获取主机的各种状态信息,比如进程列表、进程状态等。 第一反应就是,老板是不是不懂容器,容器怎么能这样玩,这样玩还要什么容器,内心万马奔腾。 直到最近遇到了一个命令行工具,才发现原来小丑是我自己
1. 写作如写代码一般重要 从行为上看写作和写代码都是在 Typing (打字),只不过,写作面向的是人,写代码面向的是机器。 写代码是为了能控制机器的状态,让其按照预设的指令转换;而写作是为了传达知识,让其他人能够按照预设的逻辑理解。 因此,写代码和写作其实是两
在上一篇文档 《使用 ChatOps 改进研发流程》中,通过 ChatOps 给 Pull Requests 提供预览链接提升了敏捷速度。本篇主要描述如何快速实现这个功能。 1. 第一步: 配置一个触发器 1.1 选择一个触发器 在 GitHub 中有三类 Workflows 触发器,定时、人工、自动触发器。我们需要选择一个自动触发器,用于触发执行逻
1. 什么是 ChatOps GitOps、ChatOps、AIOps 等(以下简称 NewOps )是近几年出现的新兴运维理念。NewOps 将 Ops 从混沌的状态离析为两个部分:一个面向用户,趋势是更加人性化、可审计、可回溯;另一个面向基础设施,趋势是更加程序化、自动化、智能化。
1. 行业规范 [TPSA19-22]SRC行业安全测试规范: https://security.tencent.com/announcement/msg/180 2. SRC 列表 序号 上线时间 SRC名称 01 2012 TSRC(腾讯) 02 2013 ZSRC(猪八戒) 03 2013 NSRC(网易) 04 2013 KSRC(金山) 05 2013 JSRC(京东) 06 2013 BSRC(百度) 07 2013 ASRC(阿里巴巴) 08 2013 3
1. Terraform 如何管理资源状态 在执行 terraform init 之后,Terraform 会将依赖的插件下载到本地 plugins 目录。 1 2 3 4 5 6 7 8 9 10 11 12 13 tree -aL 5 . |-- myresource.tf |-- .terraform | `-- plugins | |-- registry.terraform.io | | |-- hashicorp | | | `-- null | | `-- shaowenchen | | `-- qingcloud | `-- selections.json `-- var.tf 在执行 terraform apply 之后,Terraform 会使用 terraform.tfstate 文件存储资源的
1. 什么是 Workshop Workshop ( 工作坊 ) 是以领域富有经验的主讲人为核心,通过活动、讨论、演讲等方式,指导成员共同讨论某个话题的学习形式。 相较于传统的方式,Workshop 具有如下特点: 更具有针对性 有点像研习班,可以针对某一类问题,集中、充分地进行讨论。 组织更
更多的技巧,请持续关注本文的更新。 1. 运营不再是拍脑袋的事 万物互联,互联网对物理世界的建模越来越准确。我们的地理位置、行动轨迹、在电子设备上的操作都在被记录。如果能汇集各大厂商的用户画像,我们的数字版就出来了。 你只能代表此刻的你,而数字人可以
1. 测试是海上的航标 项目越复杂、规模越大,越能体现测试的价值和重要性。 测试保证了方向的正确性。就像航行时,海上出现的航标,可以用来检验、纠正路线。便于掌舵人,随时了解动态,做出调整。 测试决定了迭代的速度。随着 Scrum 等敏捷开发方法的实践,交付的节奏
1. 谈谈对 CICD 工具的审美 我在文档 软件产品是团队能力的输出 中提到,软件产品是解决方案的交付承载物,其优劣取决于团队对核心问题的理解。对领域有深入理解,交付的产品才有好的可能。CICD 是一个应用很广泛的领域,在不同的场景下,总有人在琢磨重复造轮子,
1. daemon-less 镜像构建工具 1.1 什么是 daemon-less 镜像构建工具 在 CICD 流程中,经常会涉及镜像构建,常规的做法是使用 Docker in Docker 或者 Docker out of Docker 进行构建。详情可以参考文档:如何在 Docker 中使用 Docker 实际上,为了避免垄断,促进行业发展,基于 Docker 的镜像格式,早就指定了统一的 OCI 镜像格式规范。也就是
1. DockerHub 限制 终究还是绕不过下面这个报错: 1 Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit DockerHub 从 2020 年 11 月 2 日,正式开始限制非付费用户的拉取频率: 匿名用户,每 6 小时只允许 pull 100 次 已登录用户,每 6 小时只允许 pull 200 次 好吧,正常情况下,到这里就友尽了,不让用就不
很多云原生的开源组件是先有服务,后有可视化。今天开了个脑洞,反其道而行,先有可视化交互,再设计底层。 1. 一张画布搞定半壁云原生 用户只需要一张画布,定义好 Workflow,就可以自由地游走在各种高大上的 Cloud Native 应用之上。 2. 为什么会这种奇怪的想法 2.1 看
对于互联网行业的工程师,常思考的是系统的 Scalable,例如,流量、计算、存储增长时如何改进系统,有各种水平、垂直扩容的方案。除了服务,团队的 Scalable 也是十分关键的。本篇主要思考的是,如何组织团队,在一定规模下,通过加人能够提升团队的事务处理能
1. 什么是 GitHub Actions 在前面的文档中,我对 GitLab 提供的 CI 功能进行了实践,点击查看 。使用 GitLab 的好处是可以私有化部署、无限的私有仓库数量、CI 配置简单、能接入自建的 Runner 。但随着 GitHub 越来越开放,GitLab 的这些优势在逐步丧失。 从 CICD 的角度看,越接近 Git 仓库的功能,越贴
1. 什么是布隆过滤 布隆过滤(Bloom Filter)是布隆在 1970 年提出的一种数据结构。 将元素(x、y、z)通过一系列函数,映射到一个二进制向量(0101 序列),用于快速判断元素 w 是否在一个集合当中。如下图(来自维基百科): 相较于使用单个映射函数
揭秘《DevOps 能力成熟度模型》 研发运营(DevOps)解决方案能力分级要求 - PDF 下载 第1部分:总体架构 - PDF 下载 第2部分:敏捷开发管理过程 - PDF 下载 第3部分:持续交付过程 - PDF 下载 第4部分:技术运营 - PDF 下载 第5部分:应用设计 - PDF 下载 第6部分:安
本文同样适用于接入 ARM、MIPS 架构,FreeBSD、Windows 系统的物理机,如果 Jenkins 能连上构建机,可以跳过 Frp 部分。 1. 遇到的问题 在以 Kubernetes 为基础设施的场景下,Jenkins 构建流水线时,将为每一条流水线单独创建一个 Pod 用于构建。Pod 中的容器
1. 典型适用场景 在 CI 中,通常会有一个 CI Engine 负责解析流程,控制整个构建过程,而将真正的构建交给 Agent 去完成。例如,Jenkins 、GitLab 均是如此。 如下图, 连接 CI Engine 的 Agent, 种类很多。这是为了满足不同项目对构建环境的要求。 同时 Agent 是动态的,构建时才需要,
Kubernetes 依靠 kube-proxy 组件实现 Service 的通信与负载均衡。在这个过程中,由于使用了 SNAT 对源地址进行了转换,导致 Pod 中的服务拿不到真实的客户端 IP 地址信息。本篇主要解答了在 Kubernetes 集群中负载如何获取客户端真实 IP 地址这个问题。 1. 创建一个后端服务 1.1 服务选择 这里选择 containous/whoami 作为后端服务镜
1. 开源越来越受欢迎 2019 年的 IDC 北美开源软件使用调查显示,71% 的企业正在使用开源软件,54% 的企业计划扩大使用范围。2020 年的 RedHat 企业开源现状调查显示,有 95% 的 IT 领导者认为企业开源对于企业基础架构软件战略至关重要。 一方面企业越来越接受开源软件,另
作者: [美] 约翰·D·洛克菲勒 出版社: 吉林出版集团有限责任公司 出版年: 2012-1-1 ISBN: 9787546369785 Notes: 成功的路直接而明亮,失败的路却是各有不同。
1. 曾经的尝试 在博文没有标签的你,让人无法想起中,我强调在趋同的群体中,个体成为了背景噪声,而标签成为了有效的信息。 在下面这张图中,我们很难记住某一个人,但是却很容易通过 A、B、C、D、E 标签找到某一个人。 标记之后,人与人之间会形成网络,而所
作者: 杜军 出版社: 电子工业出版社 出版年: 2019-10 ISBN: 9787121373398 Notes: 网络是 Kubernetes 中不易掌握的一个难点。网络故障会直接影响现有的负载,通常是十分紧急的问题。而网络相关的知识相较于应用开发更底层,很多的细节,需要长期的积累。 书中相关的要点之前陆续都有所接触,通过阅读这
本篇主要介绍如何运维 DevOps 流水线,怎么解决一些常见的问题。问题主要分为两大类,一类是 Kubernetes 相关的,具有一定通用性;另一类是与业务相关,需要对领域有所了解,解决问题时才能事半功倍。文档内容,会不断滚动更新。 1. Kubernetes 问题排查 1.1 基本的创建流程 如上图所示,是用
KubeSphere DevOps 包含 S2I 和 Pipeline 两部分。在社区中,openshift 提供了一个打包应用的工具 S2I,具体请参考 使用 S2I 构建云原生应用 。KubeSphere 将其做成了服务,采用 CRD 使用一个单独的 Operator 对其进行管理,功能比较独立。而在 3.0 中 Pipeline 与 KubeShere Core 耦合依然十分紧密,在搭建
1. 重剑出鞘问天下 自 1840 开始,中国经历了百余年的屈辱;而自 1978 开始,中国只花了四十余年就从一个贫弱的大国变成一个富足的强国。 这是民族坚韧与智慧的体现。悠久的文化历史,提供给人们足够的养分。在微观上,人们可以找到各自人生的归处;在宏观上,推动着国家
Kubernetes 平台管理软件运行在 Kubernetes ,用于管理运行在 Kubernetes 上的资源对象。 1. 测试思路 测试在一定负载一定集群规模下,平台软件的管理能力,而不是 Kubernetes 的管理能力。平台软件的管理能力主要体现在能通过 UI 对负载、PV 进行增删改查,在 UI 上能够直接查看负载的监控和日志。 明确测试
联系方式 邮箱:mail(at)chenshaowen.com 微信号 关注我的微信公众号,可以获取我的微信号。 免费咨询 请发送邮件或者加微信后留言,避免过多寒暄,直接给出问题,我一般都会回复,但通常并不会非常即时。 付费咨询 200 RMB/0.5 小时,限一个大类方向
1. 为什么采用镜像独立部署 更好的 SEO 使用 Github Pages ,部署静态网站非常方便。一次配置,每次提交都可以自动部署更新。再加上 jsDelivr、Cloudflare 加速,在免费方案中,已经生产可用。 无奈的是,百度搜索引擎对 Github Pages 网站,收录极慢,甚至不收录。即使
1. Github Container Registry 9 月 1 日,GitHub 宣布 Github Container Registry 开始公测,测试期间提供免费、无限容量的 Docker 镜像仓库服务。 再也不用担心,docker.io 一言不合清理镜像了。真好真香! GitHub 正在以托管代码仓库为切入点,逐步覆盖整个研发工具链,打造一站式 DevOps 平台。项目管理有 Issues
1. 面向接口编程 1.1 特征 面向接口编程,强调的是模块之间通过接口进行交互。首先,调用方指定一组方法签名,然后,由被调用方实现这组方法。 接口编程与其他编程显著不同的一点是,接口编程关注的是方法,而不是属性。在很多的编程场景中,方法是围绕属性进行定义
1. Go 中的并发模型 1.1 通信模型 CSP CSP 全称 Communicating Sequential Process ,通信顺序进程,描述的是一种并发通信模型。Process 可以使用很多个 Channel ,而 Channel 不关心谁在使用它,只负责收发数据。 Go 社区中,有一句非常著名的论断: 不要通过共享内存来通信,要通过通信来共享内存。意思是,不
1. 什么是编程范式 编程范式是一类典型的编程规范。一方面提供了工程师对实体的建模方法,将物理世界与代码关联起来;另一方面也提供了工程师对代码程序的理解思路。 编程范式与编程语言属于多对多的关系。一种编程语言中,可能包含多种编程范式,例如,C++ 包
1. Kata 解决什么问题 安全性和隔离性是 Kata Container 显著区别于 Docker Container 的地方。 Kata Container 来源于 Intel Clear Containers 和 Hyper runV 项目的合并。Intel Clear Containers 借助 Intel VT-x 技术使用轻量级虚拟机提供容器,解决安全性问题,同时性能优异。而 Hyper runV 对标的是 Docker 的 runc ,提供容器的运行时,遵循 OCI runtime 规范。 2. Kubernetes 中的 Kata 2.1
1. 什么是柯里化 根据维基百科词条定义,在计算机科学中,柯里化(Currying)是把接受多个参数的函数转变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 英文版定义是一个两层的定语从句,翻译
1. Terraform Vs Kubernetes 基础架构即代码(Iac) 基于不可变的基础架构,使用编排工具将基础架构文本化,允许像管理代码一样管理基础设施。 2018 年,我在从事 SaaS 开发,使用 Kubernetes 平台进行部署,这一年 Terraform 很火。2019 年,我开始从事 Kubernetes 的二次开发,才听说 Terraform 。现在网上 Terraform 相关的文档增
1. 钱少事多受人欺 运维部门是成本部门。有个词叫,成本优化。CXO 看到机器的负载这么低,就会想着裁撤机器,能少花就少花点,运维也就来活儿了。优化成本是运维的职责之一。 运维是研发的服务团队。不能够创造营收,就意味着没有话语权,运维在公司的地位可想
1. Jenkins X 简介 Jenkins 依靠庞大的插件生态,占据了目前大部分的企业级 CICD 引擎的份额。但在云原生时代,Jenkins 也暴露出很多的问题,单点服务、磁盘存储、内存占用等。 Jenkins X 围绕 Kubernetes,提供了一种更适合云原生时代的 DevOps 方式。Jenkins X 不是 Jenkins
1. Etcd 基本介绍 Etcd 是一个分布式 Key/Value 的存储系统,通过分布式锁、leader 选举、写屏障(write barriers) 实现了分布式协作,提供高可用、持久化数据存储和检索服务。 工作原理 每个 Etcd 节点都存储了一份完整的数据,任意时刻至多存在一个主节点。主节点处理所有来自客户
前面的文档中,我们利用 Kubernetes 提供的弹性,在 Kubernetes 上动态创建 Jenkins Slave 。本篇文档主要是对 Jenkins 进行大规模构建的压力测试。 1. 集群配置 1.1 Kubernetes 版本 这里使用的是 v1.16.7 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.7", GitCommit:"be3d344ed06bff7a4fc60656200a93c74f31f9a4", GitTreeState:"clean", BuildDate:"2020-02-11T19:34:02Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.7", GitCommit:"be3d344ed06bff7a4fc60656200a93c74f31f9a4", GitTreeState:"clean", BuildDate:"2020-02-11T19:24:46Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"} 1.2 节点数量 集群节点总数, 16 个 1 2 3 kubectl get node |grep "Ready" | wc -l 16
最近离职的小伙伴有点多,比较缺人。陆陆续续面试了近十位候选人,一面通过率大约 50 % ,还没有确定的 HC 。 1. 准备工作 搜集简历。发帖、邮件公告、朋友圈、招聘网站,都是简历来源。离开的人有各种各样的理由,待遇差、不喜欢的工作方式、不开心、不受重视,当然
1. 开启 Docker 的 experimental 特性 这里先开启 Docker 的 experimental 特性,方便下文使用相关命令。 编辑文件 vim ~/.docker/config.json ,增加如下内容: 1 2 3 4 { "experimental": "enabled", "debug": true } 注意,这里不是 /etc/docker/daemon.json 文件,也不需要重启 Docker 。 2. Docker 镜像 从 Docker 1.10 、 Registry 2.3 开始,Docker 引入了 manifest 用于描述镜像的元数据。 2.1 Dockerfile 如何转换成镜像 如上图,
1. 编译报错:java.nio.file.NoSuchFileException 在编译 Jenkins 插件时,提示错误信息如下: 1 2 3 4 mvn package Compilation failure [ERROR] java.nio.file.NoSuchFileException: /root/java/target/classes/META-INF/annotations/hudson.Extension 原来 Maven 使用的是 JAVA_HOME 而不是 PATH,找不到 Java 运行环境导致,而且 Java 11 不行,Java 1.8 才能正常编译。 2. 安装 JDK 安装 Java
作者:(俄)奥列格·斯克伦尼科(Oleg Skrynnik) 出版社: 清华大学出版社 出版年: 2020-05-01 ISBN: 9787302547143 Notes: 内容如题,书中主要阐述了业务视角中的 DevOps 。从起源到基础,从原则到实践,你都可以从中有所收获。DevOps 的基础是精益生产(丰田流水线)和敏捷开发,
1. 遇到了什么问题 Jenkins 执行日志报错: 1 2 3 4 5 6 Started by user admin Lightweight checkout support not available, falling back to full checkout. Checking out git https://github.com/shaowenchen/pipeline-test.git into /var/jenkins_home/workspace/abc@script to read Jenkinsfile ... ... Unable to access '.git/index.lock': File exists. 原因分析: 简单介绍一下 Jenkins 的部署情况,Jenkins 使用 Helm Chart 部署在 Kubernetes,使用 Kubernetes 动态 Pod 进行构建。Jenkins 的 /var/jenkins_home 挂载到 PV
在 CICD 的流程中,需要保存的产物主要有两类,构建产物和缓存。构建产物是最终的执行结果,缓存是为了优化下一次的构建速度。本篇主要描述的是在 Jenkins 中如何对构建产物和缓存进行归档,并结合对象存储进行实践。有部分示例使用的是 在 Kubernetes 上动态创建 Jenkins Slave 进行构建,配置
使用 Jenkins 总是离不开各种各样的插件,为了更好的实践 DevOps ,我们也应该具备开发插件的能力,使整个流程都能够在 Jenkins 中汇合。 1. Jenkins 插件 1.1 插件的生态 Jenkins 前身 Hudson 始于 2004 ,历经 16 年,依然作为主流的 CI/CD 引擎。除了,Jenkins 提供了 Master-Agent 分布式构建、Pipeline 编排的功
在前面两篇文档,在 Kubernetes 上动态创建 Jenkins Slave 和 Kubernetes 添加 Windows 节点提供 Jenkins 构建动态 Agent 的基础之上,本篇文档主要尝试在 Kubernetes 上动态提供 Windows 构建 Agent 。 1. 新增流水线 Kubernetes 与 Jenkins 集成部分可以参考上面的两篇文档,这里直接新建两条流水线进行测试。 windows - jenkins 内置的流水线示例 1 2 3 4 5 6 7 8 9 10
1. 思想驱动行为 思想驱动行为,行为产生效益。接人、待物、处事来源于文化,不会因为技术的迅猛发展而产生跃变。拥有悠久历史的中华民族,沉淀了极具韧性的思想智慧。王朝更迭,政治更替,都打不到她。即使用武力征服,最终也会被同化。 汲取更多先哲智慧、历史
这里主要使用 Windows 节点作为 Worker,而 Master 控制平面依然在 Linux 。 1. 系统配置 1.1 Kubernetes 控制平面 Kubernetes 自 1.14 版本,增加了对 Windows 节点生产级的支持。由于微软官方文档主要提供的是 flannel 网络插件的安装方式,这里建议 Kubernetes 也采用 flannel 插件。 查看当前集群 Kubernetes 版本 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.6", GitCommit:"d32e40e20d167e103faf894261614c5b45c44198", GitTreeState:"clean", BuildDate:"2020-05-20T13:16:24Z",
在对 JWT 进行 Base64 解码时,发现 JSON 数据不完整。本文主要介绍相关知识点并解决这个问题。 1. JWT 简介 JWT 通过在 Header 中设置 Authorization: Bearer <token> 进行认证的传递。 JWT Token 是一个 . 连接的 Base64 编码字符串,类似这样 Header.Payload.Signature ,有三部分组成: Header ,定义 Token 类型和加密算法 1 2 3 4 { "alg": "HS256", "typ": "JWT" } Payload ,负载信息,通
1. 批量删除 Evicted 状态的 Pod 1 kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n 2. 批量删除指定空间指定状态的 Pod 根据 field-selectors ,可以删除指定空间指定状态的 Pod 。 1 kubectl get pods --field-selector=status.phase!=Running -n default | cut -d' ' -f 1 | xargs kubectl delete pod -n default
1. 提高自动化水平 远端构建通常需要借助一定的 CI 工具,比如 Github Actions 、Travis CI 等。如果是内网环境,可以借助 GitLab CI ,添加一个 CI 节点进行自动化构建,可以参考 我的 GitLab 文档 。 自动化的好处不言而喻,能规范流程、节约大量时间,具有明显的收益。 2. 有利于其他人参与
1. Kubernetes 中的调度器 kube-scheduler 是 Kubernetes 中决定 Pending 状态的 Pod 运行在哪个 Node 的组件,被称之为调度器。 Kubernetes 中内置了大量的调度策略,也提供了一些高级调度策略(nodeAffinity、podAffinity 等),以供用户使用,基本能够满足绝大部分的业务需求。 前面的文档 Kubernetes 之 L
这也是一个给开源项目提交 PR 的完整 Git 流程。 1. 本地配置 提交用户信息 1 2 git config --global user.name "username" git config --global user.email "user@email.com" GPG 配置 参考:GPG 验证提交 2. 克隆代码 首先 fork 原仓库 克隆 fork 的仓库代码 1 git clone https://github.com/yourname/django-xss-cleaner.git 添加原仓库 1 git remote add upstream https://github.com/shaowenchen/django-xss-cleaner.git 查看本地配置的远程源 1 2 3 4 git remote -v origin xxx upstream xxx 3. 日常开发 拉取最新
1. Create a merge commit PR Commit 记录: 1 2 commit c1 commit c2 集成分支 Commit 记录: 1 2 3 commit PR #NUM commit c2 commit c1 Create a merge commit 会将 PR 中的全部 Commit 记录完整带到集成分支中,同时增加一条 PR Commit 信息。 2. Squash and merge PR Commit 记录: 1 2 commit s1 commit s2 集成分支 Commit 记录: 1 commit PR #NUM Squash and merge 合并之后,集成分支只会增加一条 Commit 记录。观感
1. 当我们值工单时,在值什么 一般人可能只提过工单,没值过工单。值过工单的人一般不会轻易提工单。 工单就是客户花钱买产品,赠送的一服务,专门解决各种使用上的问题。在云基础设施的厂商很常见,IaaS、CDN、Domain、Container 等,不会
1. 问题描述 配置 Webhook 自动触发执行 Jenkins 流水线时,报错: 1 2 3 hudson.plugins.git.GitException: Command "git checkout -f 23b446ea" returned status code 128: stdout: stderr: fatal: reference is not a tree: 23b446ea 2. Git 如何管理版本 Git 是一个内容寻址文件系统。Git 维护着一棵 sha tree ,通过 sha 值可以回溯到任何一个历史节点。先看看提交记录: 执行命令: 1 2 3 4 5 6 7 8 9 10 11 12
磨刀不误砍柴工,无论什么时候,花点时间在工具链上都是值得的。 1. 自动补全 - kubectl OS X 安装命令: 1 brew install bash-complete@2 不仅仅是 kubectl ,也给其他命令行提供自动补全的命令提示。 在 .zshrc 中添加如下内容: 1 2 # kubectl complete source <(kubectl completion zsh) 在输入 kubectl get pod 命令时,键入 Tab 会自动列举当前类型下的资源,如
Homebrew 是 OS X 下的包管理工具,类似 CentOS 的 yum ,Ubuntu 的 apt-get 。在 OS X 命令行下,可以通过 brew 和 brew cask 命令安装应用。 1. 安装 brew cask 1 brew install brew-cask-completion 2. brew 和 brew cask 区别 brew 与 brew cask 的区别在于偏向的应用类型。brew 更偏向于开发人员,主要安装命令行工具;brew cask 偏向日常用户,主要
1. Restful 请求 1 curl -X POST --data 'keyword=value' http://domain.com/mypath/ -X 后面还可以是 DELETE PUT 等。 2. 添加头部 1 curl -H 'Content-Type:application/json' -H 'Authorization: bearer MyToken' http://domain.com/mypath/ 3. Basic 验证访问 1 curl -u username:password http://domain.com/mypath/ 4. 下载并执行 curl -sSL http://domain.com/my.sh | bash 5. 忽略证书校验 1 curl -k https://domain.com/mypath/ 6. 设置代理 1 curl -x socks5://proxyuser:proxypassword@proxy.domain.com:8001 https://domain.com/mypath/ 7. 指定 Host 使用 IP 访问 1 curl -H 'Host: www.domain.com' 1.2.3.4:8000
最近用 Surface ,找出触控笔发现没电。换了一个 AAAA 电池,又发现笔尖触控失效。 网上很多文档介绍的是卸载 Marvell AVASTAR Bluetooth ,重启生效。但这种方法对我无效,卸载 Precise Touch Device 之后反而生效。 在设备管理里面找到下图选项,右键卸载,不用勾选删除,直接确定,然后重启生效。
大家是否思考过如何设计大型企业级系统?在进行主要的软件开发之前,我们先得选择一个合适的架构。这个架构要给我们所需的功能和质量保证。因此,在将这些架构用于我们的设计之前,我们应该理解不同的架构体系。 1. 什么是架构模式 根据 Wikipedia 解释, 一个架构模式就是
通常,我们在主机上执行 export http_proxy/https_proxy 格式的命令,即可设置 Proxy 。但是主机上的设置在容器中并不会生效,下面提供了几种配置方法。 1. 配置 Docker 的代理 - Node 级 在需要使用 Proxy 的节点进行配置,下面以 Docker 为例: 创建配置文件 1 2 mkdir -p /etc/systemd/system/docker.service.d touch /etc/systemd/system/docker.service.d/https-proxy.conf 编辑配置文件,配置代理 [Service] Environment="HTTP_PROXY=http://proxy.example.com:80/" Environment="HTTPS_PROXY=https://proxy.example.com:443/" Environment="NO_PROXY=localhost,127.0.0.1" 重启 Docker 1 2 systemctl
1. 关于 Label 在前面的文档 如何使用 python-gitlab 自动创建 GitLab Label 中,我已经阐述了 Label 可以用于简单的项目管理。 一个团队,通常不止一个代码仓库,为了减轻沟通和学习成本,除了使用一致的工具链,还应该达成一定的基础共识。这些基础共识,促使大家达成最佳的实践方式。同一个大项
1. 人越来越重要 为什么互联网行业的估值显著高于制造业?同样优秀的行业公司,腾讯的 PE 高达 30+,而格力的 PE 只有 10+。 互联网行业的特点是轻资产,没有昂贵的复杂设备,不需要大的生产厂房。除非准备收藏,设备的价值每年都有减损,还少不了维护费用,不定
Helm 3 终于发布了。我们可以告别 Tiller 了,但 Helm 3 的改变不仅于此。让我们继续探讨其他的变化。 1. 告别 Tiller Helm 3 移除了 Tiller ,是个不错的决定。但是要理解为什么不错,我们还需要了解一下 Tiller 产生的背景。Tiller 是 Helm 的服务端组件(运行在 Kubernetes 集群上),主要目的是为了让多
副标题: 物联网创利模型和全新实践 作者: 【日】大前研一 译者: 朱悦玮 出版社: 北京时代华文书局有限公司 出版年: 2019-2-1 ISBN: 9787569932171 Notes: 作者是非常著名的管理学家,我之前读过他写的另外一本书 《思考的技术》。 本书主要阐述的是 IoT 的重要性和如何将 IoT 落地产生效益。万物感知,
1. 关于 DNS 1.1 DNS 服务的用途 DNS 提供的是域名到 IP 的映射服务。例如,在浏览器输入 https://www.chenshaowen.com 访问页面,但数据链路是基于 IP 的通信,无法识别 www.chenshaowen.com 。这时就需要进行 DNS 查询,输入参数是 www.chenshaowen.com ,返回结果是 IP 地址。 可以看到 DNS 提供了一种助记方法,我们不必关注 IP 地址以及其变动,而只需
helm 官方源 https://charts.helm.sh/stable ,国内的某些机器无法访问,需要配置镜像源。 1. 官方镜像源 1 helm repo add stable https://charts.helm.sh/stable 2. Git Pages 镜像 1 helm repo add stable https://burdenbear.github.io/kube-charts-mirror/ 可以参考 kube-charts-mirror ,搭建一个自主可控的镜像源。 3. Aliyun 镜像 长时间未更新,版本较旧 1 helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts/ 4. Azure 镜像源 已经不可用,2021.07.08 更新。 1 2 helm repo add stable http://mirror.azure.cn/kubernetes/charts/
在之前的文章 使用 Helm 安装 harbor 中,我已经详细描述了安装 Ingress 、Harbor ,最后成功推送镜像的步骤。其中的域名是公网可以访问的,证书是认证机构签发的。但是在内网环境下,我们需要使用内网域名进行访问。本文主要解决使用自签证书通过 Https 访问 Harbor 的问题。 1. 生成自
1. 关于 Prow 在 Kubernetes、Istio 等知名项目的 Github 仓库中,我们经常会看到 xxx-bot 用户,给 issues 添加标签、合并 PR 。这个机器人账户就是被 Prow 驱动的。 Prow 是 Kubernetes 测试特别兴趣小组的项目,目前是 kubernetes/test-infra 的一部分。Prow 是一个基于 Kubernetes 使用各类事件驱动执行 Job 的 CI/CD 系统。 除
1. 安装基础环境 安装 Kubernetes 参考链接:使用 Kubeadm 安装 Kubernetes 集群 。值得注意的是 Kubeflow 并不是对每个版本的 Kubernetes 兼容,system-requirements。 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.12", GitCommit:"e2a822d9f3c2fdb5c9bfbe64313cf9f657f0a725", GitTreeState:"clean", BuildDate:"2020-05-06T05:17:59Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.12", GitCommit:"e2a822d9f3c2fdb5c9bfbe64313cf9f657f0a725", GitTreeState:"clean", BuildDate:"2020-05-06T05:09:48Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"} 安装 kustomize 1 2 curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash mv kustomize /usr/local/bin/ 1 2 3 kustomize version {Version:kustomize/v3.5.5 GitCommit:897e7b6e61e65188d846c32bd3af9ef68b0f746a BuildDate:2020-05-11T16:51:33Z GoOs:linux GoArch:amd64} 2. 安装 Kubefolow 确
VS Code 安装 Go 插件之后,打开 Go 项目时,编辑器会提示安装工具包。 但是 golang.org 无法直接访问,我们需要将包手动下载到 GOPATH 目录,进行安装。 创建包目录 1 2 cd $GOPATH mkdir -p src/golang.org/x 下载包 1 2 3 cd src/golang.org/x git clone https://github.com/golang/tools.git git clone https://github.com/golang/lint.git 安装包 1 2 go get golang.org/x/tools/... go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.27.0
1. 关于服务业 第一产业是以农业为代表的,解决生存问题;第二产业是以工业为代表的,解决效率问题;第三产业是以服务业为代表的,解决别人的问题。 除非某种因素导致人的生理存在受到威胁,服务业具有极其广阔的成长空间。因为人的欲望是没有天花板的,人与人之
1. 分阶段构建 编译项目需要借助一系列特定的工具,但在运行阶段并不需要这些工具。为了减小镜像体积,可以分阶段构建。在第一阶段进行构建,然后将编译生成的文件传入下一个阶段,生成更小体积的镜像。 1 2 3 4 5 6 7 8 9 10 11 FROM golang:1.12 as builder COPY / /go/src/github.com/shaowenchen/goproject WORKDIR /go/src/github.com/shaowenchen/goproject RUN CGO_ENABLED=0 GO111MODULE=on GOOS=linux GOARCH=amd64 GOFLAGS=-mod=vendor go
前面写过一篇文档,如何在 CentOS 安装 GPU 驱动 ,这篇就来看看怎么利用 Docker 运行 Tensorflow 。 1. 检查当前 CPU 支持的 Tensorflow 版本 在不支持 AVX 指令的 CPU 上,运行 Tensorflow > 1.15 版本时,会报错,Illegal instruction (core dumped)。 执行检测命令: 1 2 3 cat /proc/cpuinfo | grep avx flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
原作名: On China 作者: [美]基辛格 译者: 胡利平/林华/杨韵琴/朱敬文 出版社: 中信出版社 出版年: 2012-10 ISBN: 9787508635583 Notes: 作者是美国著名的学者、政治家,给予本书不一样的视角,记录了中国近代、当代、现代的外交政策与决策机制。书中描述的各类事件很多,领导人之前相互博弈
1. 什么是左移 需要说明的是,这里的左不是政治上代表保守或激进的左,而是表意流程的左、时间的提前。 在调研自动化测试时,我第一次接触 “左移” 。提法很吸引,落地很简单。翻译一下就是,之前测试的工作是开发完成之后,现在要求提前
这里以清空 main 历史提交记录为例。 切换到 main 分支 1 git checkout main 创建一个干净的分支 1 git checkout --orphan new_main 提交全部文件 1 2 git add -A git commit -m "msg" 删除 main 分支 1 git branch -D main 将新分支重命名为 main 1 git branch -m main 强制推动到远程仓库 1 git push -f origin main
作者: 一禅小和尚 出版社: 江苏凤凰文艺出版社 出版年: 2017-09 ISBN: 9787559411013 Notes: 简明的画风,一禅小和尚带领大家走进了一个充满善意与智慧的世界。 如果你身陷囹圄、烦恼于生活琐屑,这本书定能给予你启发。 但知易行难,人生就是一场修行,愿与小和尚同在。
作者: 食家饭 出版社: 北京联合出版公司 出版年: 2017-3-2 ISBN: 9787550294509 Notes: 有风吹过的厨房,夹带着人间的气息。一道道美味的菜品,让人边看边流口水。作者对生活一定也充满了热爱。 写的是寻常可见的菜,但文字十分俏皮、乃至有些可爱,角度不凡,细腻动人。看完对上海人平添了几
作者: 但斌 副标题: 但斌投资札记 出版社: 中信出版社 出版年: 2018-06 ISBN: 9787508688640 Notes: 本书主要收录 200X 年,作者关于投资的思考和分析。北岛的《时间的玫瑰》陪伴作者度过了最艰难的时光,遂取同名。 一个人过往的经历,决定了未来选择的路。经历过艰苦,思考过死亡,作者的思维非
以 CentOS 7.7,Tesla P100 GPU 为例。 1. 基础环境准备 安装 lspci 命令 1 yum install -y pciutils 检查 GPU 是否支持 CUDA 1 2 3 lspci | grep -i nvidia 00:09.0 3D controller: NVIDIA Corporation GP100GL [Tesla P100 PCIe 12GB] (rev a1) 支持 CUDA 的 GPU 列表:https://developer.nvidia.com/cuda-gpus 检查系统是否支持 CUDA 1 2 3 4
主要记录最近遇到的一些开发问题,解决方法。 1. macOS 快速切换不同 Kubernetes 环境 涉及 Kubernetes 相关开发时,经常需要在多个集群之间切换。配置多集群 context 是一个选择,但是如果集群在不断重置,可以试下如下方法: 在 ~/.profile 文件中定义一系列相关 function,切换时只需要执行 on_cluster_name 即可
1. Velero 简介 Velero 是 heptio 团队(被 VMWare 收购)开源的 Kubernetes 集群备份、迁移工具。 Velero 使用对象存储保存集群资源。默认支持的对象存储有 AWS、Azure、GCP ,兼容 S3 协议,也可以通过插件来扩展到其他平台,比如 Aliyun OSS。 目前,Velero 不具备版本管理功能,只能进行增
主要记录最近遇到的一些开发问题,解决方法。 1. Azure 镜像代理 在国内的服务器上,拉取某些镜像速度较慢,或根本就无法拉取。Azure 提供了容器仓库的镜像代理服务。 无法拉取的镜像源 替换之后的镜像源 k8s.gcr.io gcr.azk8s.cn/google_containers docker.io dockerhub.azk8s.cn gcr.io gcr.azk8s.cn quay.io quay.azk8s.cn 2. watch 命令 watch 命令可以周期性地执行指定的命令
首先,编译器需要将 .java 文本文件编译为 .class 字节码,然后 JVM 执行 .class 字节码文件。流程并不复杂,本文主要记录一些在编译、运行时的相关过程。 1. 单个文件源代码 新建文本文件 Hello.java 1 2 3 4 5 public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } } 编译源码 1 javac Hello.java 执行字节码 1 java Hello 2. 多个源码文件 使用
主要记录最近遇到的一些开发问题,解决方法。 1. 重启 Kubernetes 中的 Job 任务 1 kubectl -n {NAMESPACE} get job {JOB_NAME} -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f - 如果提示没有找到 jq 命令,需要先按照 jq ,yum install -y jq。 2. DNS 的 SPF 记录 在发送邮件时,由于发件人可以任意指定,收件人无法验证发件人是否真实。SP
使用 KubeSpray 安装 Kubernetes 时,报错 1 2 3 4 5 6 fatal: [node0]: FAILED! => { "assertion": "ip in ansible_all_ipv4_addresses", "changed": false, "evaluated_to": false, "failed": true } 查看 inventory.ini 配置 1 2 3 4 5 6 7 cat inventory.ini # ## Configure 'ip' variable to bind kubernetes services on a # ## different ip than the default iface # ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value. [all] node0 ansible_host=139.168.12.4 ip=139.168.12.4 ... 查找报错信息来源 kubespray/extra_playbooks/roles/network_plugin/calico/tasks/pre.yml 1 2 3 4 5 6 7 8 9 ---
1. 测试分层 测试的目的是为了验证预期的功能,发现潜在的缺陷。测试增强了交付合格产品的信心,也给敏捷迭代带来了可能。可以说,测试决定了产品的开发进度。 网络模型有七层的 OSI 、四层的 TCP,而开发模式有 MTV、MVC、MVP、MVVM 等。高内聚、低耦
1. Jenkins 的工作模式 Jenkins 是一个单 Master,多 Slave 架构。Master 负责分配任务、管理服务。 Slave 负责执行具体任务。 即使部署了多个 Master,这些 Master 之间依然相互独立,无法协同调度。在高可用的 Jenkins 方案中,需要借助外部的任务分发框架,协调多 Master 之间的调度,比
1. 为什么要拨测 对于系统中的一些关键服务,我们通常会配置监控服务。当故障发生时,能够尽快被检测到,发送通知给关注人。当故障发生后,能够有效地追溯故障过程。 拨测是监控系统中的一个重要环节,能够检测服务的网络质量,并提供实时告警。 在公有云上,云厂
主要记录最近遇到的一些开发问题,解决方法。 1. Kubernetes 服务仅在负载节点可用 正常情况下 NodePort 类型的 Service ,任意 Node 节点 IP + 端口,都可以访问。但是,也有可能仅负载的 Node 节点 IP + 端口可以访问。 首先,可以尝试配置转发相关参数: 1 2 3 4 5 6 cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward=1 vm.swappiness=0 EOF 1 sysctl
1. 自动签发 Ingress 证书 安装 cert-manager 1 2 3 4 5 6 7 8 9 10 kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml kubectl create namespace cert-manager kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true helm repo add jetstack https://charts.jetstack.io helm repo update helm install \ --name cert-manager \ --namespace cert-manager \ --version v0.10.0 \ jetstack/cert-manager 创建一个全局的签发机构 新建文件 issuer.yaml 1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod namespace: cert-manager spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: admin@domain.com privateKeySecretRef: name: letsencrypt-prod http01: {} 创建签发机构 1 kubectl apply -f issuer.yaml 签发证书 新建
Deployment 通过创建 ReplicaSet 控制 Pod 的数量、状态。本篇主要介绍一些 Deployment 常用的操作。 1. Deployment yaml 格式 带上 --dry-run 参数表示并不执行命令,仅生成 yaml 输出: 1 kubectl create deployment nginx --image=nginx --dry-run -o yaml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: nginx name: nginx spec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx name: nginx resources: {} status: {} 2. 创建 使用 run 参数 1 kubectl run nginx --image=nginx 使用
我使用的是 Kubernetes 1.15.3 ,不同版本的处理方法可能会有不同。 1. 关于证书 根证书是自签的 根证书是由自己签发的。在浏览器中,内置了常见的证书服务商的 CA 证书。因此,浏览器才会信任这些证书服务商签发的下一级证书。 我们也可以生成根证书,但是需要将根证书添加到系统信
通过 Operator 的方案,可以对 Kubernetes 的功能进行友好地扩展。Operatpr = CRD + Controller。首先通过 yaml 定义,生成 CRD ,然后 Controller 不断地监听 etcd 中的数据,执行相应动作。开发 Operator 时,有很多繁琐且重复的事情。KubeBuilder 可以帮助我们快速生成骨架代码,
1. CNI 问题 错误日志 1 2 journalctl -u kubelet ...Unable to update cni config: No networks found in /etc/cni/net.d 由于没有安装 CNI ,需要移除 /var/lib/kubelet/kubeadm-flags.env 参数中的--network-plugin=cni 1 2 cat /var/lib/kubelet/kubeadm-flags.env KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --pod-infra-container-image=k8s.gcr.io/pause:3.1" 2. 节点 NotReady 节点 NotReady 可能的原因有很多。通常会是网络、容器配置错误导致,需要逐一排查。 这里使用的是 使用 Kubeadm 安装 Kubernetes 集群 文
1. 搭建 Harbor 的要求 Harbor 硬件要求: CPU,最少 2 核,4 核更好 Mem,最少 4 GB,8 GB 更好 Disk,最少 40 GB,160 GB 更好 Docker 版本要求: 17.06.0 以上 在 Kubernetes 上搭建 Harbor ,可以参考文档,使用 Helm 搭建 harbor 。 2. Harbor 提供的功能 Harbor 是在 Docker Registry 的基础之上,进行了企业级扩展。Harbor
主要记录最近遇到的一些开发问题,解决方法。 1. Ingress 开启 HTTPS 准备好证书,domain.com.crt、domain.com.key 创建 Secret 1 kubectl create secret tls {SECRET_NAME} --key domain.com.key --cert domain.com.crt -n {NAMESPACE} 更新 Ingress 配置 1 2 3 4 5 spec: tls: - hosts: - domain.com secretName: {SECRET_NAME} 2. SSH 登陆失败,提示 ssh-dss SSH 登陆提示: 1 Unable to negotiate with 10.10.10.10 port 22: no matching
1. docker pull 拉取镜像 使用 docker pull {IMAGE_NAME} 拉取镜像时,有两种情况: IMAGE_NAME 前缀指向 registry Docker 会将 IMAGE_NAME 识别为指定仓库提供的镜像。例如,myregistry.io/space1/image1:latest ,Docker 会去 myregistry.io 指向的服务器请求镜像数据。一个 Docker 镜像分为很多层,如果
主要记录最近遇到的一些开发问题,解决方法。 1. Kubernetes 集群添加新的 Node 节点 在执行 kubeadm init 时,Console 会打印添加 Node 的命令。Token 默认的有效期为 24h 。当超过有效期时,需要重新创建 Token ,执行命令: 1 2 kubeadm token create --print-join-command kubeadm join 192.168.10.2:6443 --token ocyzce.3hv8y7w60lrvulir --discovery-token-ca-cert-hash sha256:7a86632f54de1004bb3f38124b663f837399d6ba9aa803d58c6707a76c02a6cb 使用 Console 输出的命令,即可将 Node 节点添
前提准备,(1)已经安装 Helm ,参考 Helm 安装 ,(2)集群有默认的动态存储可用,参数 使用StorageClass提供PV动态存储 1. 使用 Helm 安装 Ingress Ingress 由 Ingress 和 Ingress Controller 两部分组成。 在 Kubernetes 中,Ingress 对象描述路由规则;Ingress Controller 通过与 Apiserver 交互,将 Ingress 规则写入
主要记录最近遇到的一些开发问题,解决方法。 1. NodePort 服务仅指定 Node 可以访问 通过 NodePort 暴露的服务,在集群外可以使用 Kubernetes 任意 Node IP 加端口的形式访问。kube-proxy 会将访问流量以轮询的方式转发给 service 中的每个 Pod。 但是,发现并不是每一个 Node IP 加端口都可以访问,
1. S2I 能解决什么问题 可以预见的是,未来大量的应用会以容器的方式进行部署。 容器平台关注的是镜像和容器,应用开发关注的是业务代码,而最终代码需要以镜像的方式进行部署。从代码到镜像,就是 Source To Image ,即 S2I 。 在前面的文章 PaaS 部署之 buildpack 中,描述到一个应用运行起来
之前通过 Kubernetes 之 Volumes ,对 Volumes 有了一定的了解。本篇主要侧重实践,学习如何使用 emptydir、hostpath、localvolume 三种本地存储方案。 1. PV 的基本属性 1.1 PV 的生命周期 PV 的状态: Available:可用,还未被任何 PVC 绑定 Bound:已经被
主要记录最近遇到的一些开发问题,解决方法。 1. Kubernetes 中给 Node 增加 Role: worker 1 2 3 4 kubectl get nodes NAME STATUS ROLES AGE VERSION i-6fns0nua Ready master 6d3h v1.15.2 i-m69skuyd Ready <none> 6d2h v1.15.2 1 2 kubectl label node i-m69skuyd node-role.kubernetes.io/worker= node/i-m69skuyd labeled 1 2 3 4 kubectl get node NAME STATUS ROLES AGE VERSION i-6fns0nua Ready master 6d3h v1.15.2 i-m69skuyd Ready worker 6d2h v1.15.2 2. 删除 Kubernetes 的一个节点 查看当前节点: 1 2 3 4 kubectl get node NAME STATUS ROLES AGE VERSION i-6fns0nua Ready master 6d3h v1.15.2 i-m69skuyd Ready worker 6d2h
主要记录最近遇到的一些开发问题,解决方法。 1. 打开 OS X 原生 NTFS 支持 插上磁盘,查看盘符 1 2 3 4 5 6 diskutil list diskutil list /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *96.9 GB disk2 1: Windows_NTFS SSD 96.8 GB disk2s1 这里的 SSD 就是 Volume Name。 更新 /etc/fstab文件 1 sudo nano /etc/fstab 输入密码,然后输入 LABEL=SSD none ntfs rw,auto,n
1. 谁需要 SonarQube 代码审查是高质量软件开发过程中不可缺少的重要环节,能帮助开发者及时发现代码中的 Bug,提升代码质量、可维护性。 代码审查的维度包括,语言规范、代码风格、设计合理等。人工检查这些事项,会消耗大量的精力和时间。 代码质量分析工具为此而生,
1. 集群规划 准备三个主机,一个 Master ,两个 Node。 操作系统,CentOS 7 配置,2 Core 4 GB Docker 版本,18.06.3 Kubernetes 版本,1.15.3 如果是购买的云主机,请将以下端口打开: 1 2 3 4 5 6 7 8 9 10 11 12 # Master TCP 6443* Kubernetes API Server TCP 2379-2380 etcd server client API TCP 10250 Kubelet API TCP 10251 kube-scheduler TCP 10252 kube-controller-manager TCP 10255 Read-Only
1. main 和 init 函数 一个 package 里面可以写多个 init 函数,但必须仅包含一个 main 函数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package main import ( "fmt" ) func init() { fmt.Println("init 1") } func init() { fmt.Println("init 2") } func main() { fmt.Println("main") } // init 1 // init 2 // main 2. defer 函数 Go 不会立即执行 defer 修饰的代码,而是进行标记,在程序退出之前执行。 1 2
1. 不同种类的存储 1.1 文件存储 文件存储是,基于文件的存储。在访问数据时,需要提供相应的查找路径。 适用于,FTP、NFS 等服务。 1.2 块存储 块存储是,将数据拆分成块,并单独存储各个部分。在访问数据时,底层存储软件会将这些分散的数据组装起来。 块存储,通
1. Docker 的存储卷 1.2 Docker 中的 Volume Docker Volume 将宿主机目录,挂载到容器中。在容器中修改的文件内容,将会被持久化到宿主机中。即时容器被删除,宿主机中的文件也会被保留。 Docker 使用 /var/lib/docker/volumes/ 存储容器的 Volume。 查看本地 Volume : 1 2 3 4 5 6 7 8 9 tree /var/lib/docker/volumes/ -L 3 /var/lib/docker/volumes/ |-- 714450f353b26b5aa57aa352766c201c0851685e0e28c2e67ae1631f29c465b4 | `-- _data | |-- access.log -> /dev/stdout | `--
1. Labels 1.1 什么是 Labels Labels 是一对关联到对象的键值对。可以在创建对象时,直接添加 Labels ,也可以在创建之后动态修改。 Labels 格式: 1 2 3 4 "labels": { "key1" : "value1", "key2" : "value2" } 格式要求: Key,不能重复 Value,须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个
主要记录最近遇到的一些开发问题,解决方法。 1. VS Code 终端执行 .bash_profile 初始化脚本 通过添加启动命令参数,可以使得打开 shell 时,执行初始化脚本 .bash_profile 。 编辑 settings.json,以 OS X 为例,新增如下内容即可: 1 2 3 { "terminal.integrated.shellArgs.osx": ["-l"] } 2. VS Code 配置 zsh 后,图标无法显示 由于安装补
Adobe 以 16.7 亿美元收购 Magento,微软以 75 亿美元收购 GitHub,IBM 以 340 亿美元收购 Red Hat,开源原来也是一门好生意。本文主要是关于开源的一些记录和思考。 1. 什么是开源 1.1 发展史 1969 年,贝尔实验室将 Unix 代码共享给社区,为开源奠定了重要基础。 1984 年,R
1. Docker 的网络模型 1.1 bridge 模式 默认使用 bridge 模式,也可以使用 --net=bridge 指定 bridge 模式。 bridge 模式下,容器连接到同一个虚拟网桥 docker0 上。docker0 通常会占用 172.17.0.1/16 网段。同一个网桥上的容器之间,可以通过 ip 直接通信。 1.2 host 模式 使用 --net=host 指定 host 模式。 host 模式,容器与主机共享 Network Namesp
1. Kubernetes 中的对象 Kubernetes 对象是系统中的持久实体,用于表示集群的状态。用户通过操作对象,与 Kubernetes 进行交互,告诉系统自己期望的工作负载情况。 对象的操作是通过 Kubernetes API 来实现的。每个 Kubernetes 对象包含两个嵌套的对象字段,Spec 和 Status。Spec 描述了期望的对象状态,
Helm 是 Kubernetes 的包管理工具;Operator 用于管理 Kubernetes 的有状态分布式应用。本文主要描述如何使用 Helm、Operator 在 Minikube 集群上快速部署 Prometheus,并使用 Grafana 查看监控数据。Minikube 安装可以参考,搭建远程 Kubernetes 开发环境,Helm 配置可以
1. 缘起 最初,有两名 CoreOS 的员工,为了更方便部署 etcd 集群,在 etcdCluster 对象的增、删、改事件上绑定了相应的逻辑操作,借助 Kubernetes 来自动化管理 etcd 集群。 在几个月之后的 KubeCon 大会上,他们分享了这种称之为 Operator 的方案,得到社区的强烈回响。随后,大量项目宣布支持以 Operator 的方式进行运行和
1. 为什么需要 Helm Kubernetes 中一个重要的设计理念就是,声明式的操作。用户通过设置系统的预期状态来改变系统。例如,现在的副本数量是 2 ,需要调整为 3。声明式的处理方式是,修改配置文件中副本数量为 3 ;命令式的处理方式是,发送增加一个副本的命令,+1。 使用申明
1. Go 的包管理机制 1.1 GOPATH GOPATH 通过 go get 命令,拉取代码放到 GOPATH 目录中。 GOPATH 的问题是: 不能进行包版本的管理 使用全局仓库,不能有效进行隔离 1.2 Vendor 1.5 版本开始,Go 中加入了 Vendor 机制。Vendor 解决了 GOPATH 的部分问题。 Vendor 机制通过在项目目录下增加 vendor 文件夹,管理依赖包。 Vendor 的
从最开始写博客至今,已经过去四、五年。我写博客的初衷是记录、思考、整理,给自己看更多一点,如果能帮上其他人就更好了。从最开始的 csdn ,到使用 Ghost 在 Linode 部署,再到 Pages 托管,最后落脚在 CDN 上。起初是为了能专心写,而后是希望通过一个网站了解更多技术细节,最后
1. 什么是 kubectl kubectl 是 Kubernetes 的命令行工具,通过 API server 与集群进行交互。 2. 配置 kubectl kubectl 可以通过 ~/.kube/config 配置连接到一个或多个集群。 具体如何配置可以参考: 配置对多集群的访问 。如果需要配置远程集群,可以参考: 搭建远程 Kubernetes 开发环境。 查看配置的集群: 1 2 3 kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * minikube minikube minikube
1. 集群 1.1 Master Master 负责管理和维护 Kubernetes 集群信息,并向 Node 下放任务和接收反馈信息。 Master 上运行的组件有 kube-apiserver、kube-scheduler、kube-controller-manager、cloud-controller-manager
Minikube 是 Kubernetes 的单机发行版本,适用于产品体验和日常开发。这里使用 Minikube 搭建开发环境,将 Kubernetes 搭建在 CentOS 云服务器,本地使用 OS X 进行远程开发。 1. 云服务器安装 Minikube 在 Minikube 的 GitHub 版本页面,找到合适的版本,进行安装。 以 CentOS 为例,执行命令: 1 curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.2.0/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/local/bin/ && rm minikube minikube 是一
1. 关于 ToB 的认识 ToC 的钱越来越难赚,才导致了 ToB 的繁荣。 凭一个想法,做出好的产品,最终被大家普遍接受的时代已被巨轮碾过。在互联网发展早期,一个门户黄页就成就了搜狐,一个聊天工具就成就了腾讯,甚至一个只有几个跳转页面的 hao123 都能卖几千万。后来的移动互联
主要记录最近遇到的一些开发问题,解决方法。 1. pandoc 简单使用技巧 Pandoc 是由 John MacFarlane 开发的标记语言转换工具,可实现不同标记语言间的格式转换,堪称该领域中的 “瑞士军刀”。 Pandoc 使用 Haskell 语言编写,以命令行形式实现与用户的交互,可支持多种操作系统。 下载地址: https://github.com/jgm/pandoc/releases/ 。 Pandoc 的基
英文书名: The Way To Go 副标题: A Thorough Introduction To The Go Programming Language 作者: Ivo Balbaert 出版社: iUniverse 出版年: 2012-3-8 ISBN: 9781469769165 Notes: 这是一本个人比较推荐的 Go 入门书籍。由于 Go 最近几年发展迅速,原著中有部分内容已经过时。我阅读的是中文翻译版本。中文版根据当前 Go 语言版本进行了修改。 书中,作者对 Go 语言
1. Go 的数据结构 基础类型 布尔类型:bool 整型:byte、int、int8、int16、uint、uintptr 浮点类型:float32、float64 复数类型:complex64、complex128 字符串:string 字符类型:rune 错
1. XSS 原理和常见的几种攻击方式 XSS 攻击是指,通过执行恶意脚本,以实现窃取用户登陆态、劫持会话等目的的攻击方式。恶意脚本的输入源有,Cookies、Post 表单、Get 请求、HTTP 头内容等。通常,我们将一段 XSS 攻击的代码片段称之为 XSS 向量。 常见的 XSS
django-xss-cleaner 是一个基于 bleach 的 Django XSSFilter 工具包,实现了对 GET 和 POST 请求参数的 XSS 白名单过滤功能。包中内置了部分白名单 HTML 标签、属性设置,同时也支持自定义扩展。项目地址,https://github.com/shaowenchen/django-xss-cleaner 1.
作者: 王建国/吴斌 出版年: 2016-11-1 ISBN: 9787508668024 Notes: 书中主要想阐述,在互联网时代更适合在家工作,远程协同办公。由此,继续讨论企业主、工作者如何驾驭这种工作模式,作者提出了一些自己的思考。 书中的观点,可以作为一个思考社会变革的角度。实际上,我本人也强烈感受到整
1. Go 语言产生的背景 C/C++ 的发展速度没有跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言。为了解决这一问题,Google 开发了一门新的编程语言 – Go 。 Google 当时的现状: 项目中主要使用C++,也有 Java 和 Python 开发人员众多 代码量大 分布式编
我所在的小组,负责 SaaS 开发,有几个重点 SaaS ,也有一些支撑性的 SaaS 。重点 SaaS 架构复杂、技术挑战大,人力投入多,是 KPI 的重点。但重点项目不可能一直是重点,项目有生命周期,也有阶段性。疲于需求,没有远期规划,是危险的。既有战术,也有战略,才会走得更远。本文
1. Pages 功能 GitHub、GitLab、Bitbucket 等,都提供了免费的静态页面托管服务,称之为 Pages 。利用 Pages 服务,可以发布文档、博客等。 以 GitHub 为例,通常只需要简单几个步骤,就可以使用 Pages: 新建一个项目:[username].github.
1. 正在急剧变革的 IT 设施 传统的企业,正在基于互联网技术,构建更加高效的商业模式,以加强自身在行业的竞争力。更低的研发成本、更快的产品迭代、更近的客户距离、更好的服务质量… 这一系列的变化,将推动整个社会的生产效率、生活水平迈上新的
作者: [英] Sam Newman 出版年: 2016-5 ISBN: 9787115420268 Notes: 主要回答了一系列关于微服务的问题。什么是微服务,微服务具有什么特点,系统是如何演化的,如何划分服务,集成、部署、测试策略。 对整个微服务介绍比较全面,很多观点能引起我的共鸣。适合对现有项目不满,准备尝试微服务的
1. 谈跑步 谈跑步时,很容易联想到村上春树的 《当我谈跑步时我谈些什么》。“ 当我谈论 XX 时我谈些什么 ”,句式被广泛引用,也说明了这本书的影响力。 我第一次看完这本书,是好多年前的事了。现在除了标题,其他也就只记得,村上春树每天很早就起床,集中注意力几
主要记录最近遇到的一些开发问题,解决方法。 1. Linux 下设置 Git 访问凭证 Windows 或 OS X 上有 keychain 工具管理账户凭证,在 Linux 系统上使用 Http/Https 协议访问 Git 仓库时,每次都需要输入账户密码。通过下面的配置,可以省略这一过程。 新建凭证文件 1 touch ~/.git-credentials 编辑文件,添加凭证信息 1 https://{username}:{password}@git-domain.com 使凭证生效
1. 安全问题日趋严重 随着互联网对生活场景的层层渗透,我们越来越依赖于各种网络 ID。这些 ID 构成了数字版的我们,是极其重要的账户资产。 另一方面,各种账户信息泄露事件、安全事件却时有发生,CSDN、12306、华住酒店、Facebook、Twitt
本文主要提供了 Django 字段、查询方面的优化建议,同时还介绍了一个 Django-silk 性能分析工具。希望对你开发高性能的 Django 工程有所帮助。 1. DBA 的建议 1.1 表字段设计 避免出现 null 值,null 值难以查询优化且占用额外的索引空间 尽量使用 INT 而非 BIGINT,尽可能准确描述字段 使用枚
1. 碰到的问题 前端请求量大,并发高,访问速度慢,瓶颈主要表现在: 单表大 单库大 网络 IO 慢 磁盘 IO 慢 网络、磁盘 IO 优化,主要依靠硬件升级。理论上,数据库对单库、单表的大小没有限制,但是过大的单库、单表会导致更多的请求落到单机上,给 IO 造成压力。 理想情况是
1. 敏捷开发是什么 在传统的软件研发模型中,从提出需求到最后交付,时间周期较长。瀑布模型遵循需求分析、设计、编码、集成、测试、维护六个步骤进行。一旦需求发生变化,不仅浪费前期投入,还不易于调整。 敏捷开发是一种应对快速变化的需求的软件开发能力。特
1. 认知一致 在大的组织中,我们可以将小团队理解为一个微服务。 早在 1967 年,康威提出了微服务的概念。康威认为任何组织在设计一套系统时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。 在开发复杂系统时,我们通常会对系统进行模块拆分。一方面,个体
主要记录最近遇到的一些开发问题,解决方法。 1. Python2 和 Python3 中的异常处理 Python2,Python3 都支持的两种方式: 带参数 1 2 except (ExceptionType) as Argument: # 访问 Argument 不带参数 1 except ExceptionType: 仅 Python2 支持的方式: 1 2 except ExceptionType, Argument: # 访问 Argument 2.
1. 为什么需要 Mock 在做单元测试时,被测试函数有时并不是一个可执行的独立单元。被测试函数依赖于一些外部资源,比如另外一个函数的返回值、数据库中某一条数据值等。 为了屏蔽外部依赖的干扰,我们会采用 Mock 技术。通过模拟测试资源的方式,满足依赖条件。 从设计模
最近在学习 Go ,而常用的内部 PaaS 平台正好也支持 Go 以及相关 Web 框架。一套 PaaS 系统支持多种语言,其中就离不开 buildpack 机制。虽然 PaaS 平台不断在升级,但是 buildpack 机制却一直保留。本文主要是一些 buildpack 资料的整理和实践。 1. PaaS 如何部署应用 无论是基于原生 Docker,还是 Kubernetes 的 PaaS 平台
1. 常用环境变量 1.1 GOROOT $GOROOT 是安装 Go 程序包的本地目录。 1 2 3 4 cd /c/Go ls AUTHORS CONTRIBUTORS PATENTS VERSION bin favicon.ico misc robots.txt test CONTRIBUTING.md LICENSE README.md api doc lib pkg src 1.2 GOPATH $GOPATH 是 Go 的工程目录,用来存放代码、第三方库、编译中间文件等。 如果需要配置多个目录,在 Mac 和 Linux 下可以通过 : 分割,在 Windows 下可以使用 ; 分割表示。 需要注意的
1. 我在思考什么 在大公司,有更多机会了解行业动态,参与行业变革。 大平台的运行,不是依靠某一个人或几个人。如果这样真的能实现,那也就不能称之为大的平台。一个萝卜一个坑,各自分工,相互协同,才是现代的管理方式。 平台做得好,有影响力,个人也会有加持
Pytest 测试框架使用简单、插件丰富、功能强大,被广泛用于 Python 自动化测试。本文主要介绍一些 Pytest 的基本概念和使用方法。 1. 运行机制 第一步,Pytest 从命令行或文件中读取配置 第二步,在指定目录下查找并导入 conftest.py 文件 第三步,查找满足匹配条件的测试文件,通常是 test_ 开
主要记录最近遇到的一些开发问题,解决方法。 1. Python3 连接数据库 Python3 主要有两个数据库连接客户端: mysqlclient 和 PyMySQL 。 mysqlclient 是由 C 语言实现的 PyMySQL 是由 Python 实现的 在性能上, mysqlclient 比 PyMySQL 高一个数量级。但,在 PyPy 下,PyMySQL 与 mysqlclient 性能相差不大。 如果需要使用 gevent 或 eventlet 的 monkeypatched 处理 socket,
大公司的程序员,容易产生的错觉之一就是,误将平台能力当作自己的能力。在大团队,我们不应仅关注自己的一亩三分地,更需要了解平台的各个环节。一方面,有助于更好地利用平台相关特性,另一方面,也为了自我技术更好地成长。本文,介绍了如何使用 Jekin
主要记录最近遇到的一些开发问题,解决方法。 1. Python 内存分析方法 主要涉及四个工具: memory_profile:分析每一行代码的内存使用量 objgraph:跟踪内存中的对象的关系 guppy:在运行时跟踪堆的使用情况 pyrasite:向进程中注入代
1. Serializer 1.1 数据校验 在反序列化数据时,需要对数据的合法性进行校验。这时,可以调用 is_valid() 进行验证,如果发生验证错误,可以在 .errors 属性获取错误提示信息。例如: 1 2 3 4 serializer.is_valid() # False serializer.errors # {'created': [u'This field is required.']} .is_valid() 方法带有一个可选的 raise_exception 标志,如果存在验证错误,将抛出 serializers.ValidationError 异常。 1 serializer.is_valid(raise_exception=True) 除了使用
1. Django 中的 View Class 首先回忆一下,Django 对请求的处理逻辑。收到一次请求之后,Django 会生成一个 WSGIHandler 类型的 handler,由 handler 控制整个处理流程。 那么,请求的 URL 与 View 是如何关联的呢? Django 首先根据 ROOT_URLCONF 的配置加载 URLconf,按顺序逐个匹配 URLconf 的 URLp
由于数据量剧增,系统响应很慢。对应用系统进行了一系列的优化工作,系统响应时间得到了数量级级别的优化效果。总体看,在压缩文件、加快网络访问方面的优化,对前端性能有显著提升效果。在存储过程、缓存、逻辑代码方面的优化,对后端性能提升有显著效果。本
本人所在的团队正在打造一款 ToB 产品,在垂直领域颇有影响力。此文是对团队关键事件的梳理,同时也包含了一些个人思考。 1. 在熟悉的场景中做到最好 互联网上,粗制滥造的内容太多,能获得广泛关注和影响力的产品屈指可数。 只有基于对用户痛点的深入了解,才能够提
主要记录最近遇到的一些开发问题,解决方法。 1. WhiteNoise 转发静态文件 Django 内置的静态文件服务器效率很低,而 WhiteNoise 是一个不错的替代品。具有如下特点: 通常用于 PaaS 服务 支持 wsgi 应用程序,针对 Django 进行了特殊适配 配合 CDN 使用,更佳 在 Gunicorn 配合下,使用 sendfile 系统调用,处理效率非常高 相比
1. 什么是 frp frp 是一个高性能的反向代理应用,提供的功能有: 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务 对于 http、https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个 80 端口 利用处于内网或防火墙后的机器,对
主要记录最近遇到的一些开发问题,解决方法。 1. Python 的日志模块 Python 的 logging 模块主要由四个部分组成: Loggers: 可供程序直接调用的接口 Handlers: 将日志记录输出至合适的位置 Filters: 提供更细粒度的日志是否输出判断 Formatters: 定制最终记录打印的布局格式 看下面这个例子,log1.py 文件 1 2 3 4
主要记录最近遇到的一些开发问题,解决方法。 1. Python 中的序列化与反序列化 序列化,将内存对象转化为可存储或传输序列的过程。反序列化,把序列化序列重新转化为内存对象的过程。Json 和 Pickle 是 Python 中常用的两个序列化处理模块。 Json VS Pickle: Json 实现的是内存对象与 Json 字符串
1. 一个小需求 经常遇到一些小的需求,但是实现起来并不简单。这里就有一个文件上传的简单需求,分为下面几个步骤: 用户在页面上传一个大文件 大文件会被暂存在内网的 Ceph 后台任务,将 Ceph 中的大文件,下载到 Docker 内 后台任务,将 Docker 中的大文件,上传到外网的 COS 后台使用的
1. 更换镜像源 首先备份官方的源 1 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载新的源到 /etc/yum.repos.d/ CentOS 5 1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo CentOS 6 1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo CentOS 7 1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 生成元数据缓存 1 yum makecache 2. 访问 NTFS 文件系统 Linux 内核目前只支持对微软 NTFS 文件系统的读取。 ntfs-3g 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。 ntfs-3g 在 epel-release 源中,执行命令查
Python2 到 Python3 是一个较大的版本更新。目前,生产环境依然有大量项目使用的是 Python2。但,这并不意味着项目会一直停留在 Python2,开发者也需要考虑项目对 Python3 的兼容性,以方便迁移,同时也是对新知识的学习。下面是一些学习的知识点整理。 1. Python2 升级 Python3 贸然
主要记录最近遇到的一些开发问题,解决方法。 1. warning: LF will be replaced by CRLF Windows、Linux 和 Mac 在处理文件换行时,标示符是不一致的。Windows 使用 CRLF 作为结束符,而 Linux 和 Mac 使用 LF 作为结束符。 对待换行符,Git 有两种模式。查看 Git 配置。 1 git config core.autocrlf 如果显示
最近,我负责开发一个重后端的应用。这个应用数据流向复杂,处理逻辑冗余堆积。项目技术栈选择的是 Django + Vuejs。前端使用 Webpack 打包,模块化管理,主要是展示数据。后端涉及的模块多,处理规则多,数据表多,每次涉及之前功能修改时,都消耗大量时间 review 代码。这
1. Kubectl 基本命令 1.1 创建对象 1 2 3 4 5 6 7 8 # 创建资源,也可以使用远程 URL kubectl create -f ./my.yaml # 使用多个文件创建资源 kubectl create -f ./my1.yaml -f ./my2.yaml # 使用目录下的所有清单文件来创建资源 kubectl create -f ./dir # 启动一个 nginx 实例 kubectl run nginx --image=nginx 1.2 显示和查找资源 1 2 3 4 5 6 7 8 # 列出所有 namespace 中的 service kubectl get services # 列出所
1. 基本概念 1.1 Kubernetes Kubernetes(简称,K8s),前身是 Google 的 Borg,是用于自动部署、扩展和管理容器化应用程序的开源系统。 提供的功能有: 容器的自动化部署 自动化扩缩容 自动化应用/服务升级 容器成组,对外提供服务,支持负载均衡 服务的健康检查,自
最近操作服务器时,遇到了一些不同清楚的概率,查找了一些资料,整理如下。 1. BLP 安全模型 该模型将信息系统中的实体分为两部分: 主体(Subject),实时操作的,如用户和进程 客体(Object),被操作的对象,如文件和数据库等。 对主体和客体来说,有
1. 自定义 docker-machine 位置 Windows 7 下使用 docker ,默认将 docker-machine 存放在 C:\users\your name\.docker\machine\machines 目录。 为了不占用系统盘存储空间,可以通过如下方法修改: 如果还没有创建虚拟机,可以通过设置 MACHINE_STORAGE_PATH 环境变量指定。 然后,运行 Docker Quickstart Termina,创建运行 docker-machine。 如果已经创建虚拟机,则
1. 简介 Flask 诞生于 2010 年,是一个使用 Python 编写的轻量级 Web 应用框架。 Flask 依赖于两个库。 Jinja2,模板引擎,类似 mako Werkzeug,遵循 WSGI 协议的 Python 函数库,实现了很多 Web 框架底层的东西,比如 request 和 response 对象。 2. Web 框架比较 Flask、Tornado、Django 特
为了方便 CI 集成 UI 自动化测试,需要将 Robot Framework 运行环境打包为 Docker 镜像。本篇主要内容是一些与打包过程相关的配置和脚本。 1. 打包目录结构 1 2 3 4 5 6 tree . ├── docker-compose.yml ├── Dockerfile ├── google-chrome.repo ├── requirements_base.txt 1.1 Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 FROM centos:7 ADD ./google-chrome.repo /etc/yum.repos.d/google-chrome.repo
在团队中,开发流程相关的调整一定要相应的自动化工具配合。如果没有足够低的使用成本,这种调整将会是无意义的,因为根本就不会有人去使用。上一篇,我们提到 如何利用 CDN 进一步的前后端分离 , 这一篇主要讲,如何将这个流程结合到 CI 中。后端的配置,之前的 博客
最近在优化一下项目,梳理整个链路之后,开始逐步优化,发现了很多可以改进的点。下面是对开发模式、部署方式的一些思考,希望对你有所启发。 1. 开发背景 1.1 部署方式 如上图,简单描述一下应用的架构。 采用的是经典三层架构,接入层,逻辑层,存储层。其中,接入
1. node-sass 安装 安装 node-sass 时,在 node scripts/install 阶段会从 github.com 下载 .node 文件,由于网络问题,常常会导致失败。 可以在项目内添加一个 .npmrc 文件,配置代理安装: 1 2 sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ registry=https://registry.npm.taobao.org 或者使用 cnpm 安装 1 2 npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install node-sass 2. node-gyp 安装 node-gyp 是为 Nodejs 编译 C++ 扩展,使用的编译工具。这里 有详细的各个系统上的安装方法。 在
前面提到 Jupyter Notebook 是一个交互式笔记本,支持运行 40 多种编程语言,非常适合教学。最近,学习 Go 语言,就想起了 Jupyter。本文主要描述如何在 Jupyter 里面安装 Python3 和 Go 内核。 1. Jupyter 安装 在 CentOS 7 中,默认安装了 Python 2.7,有现成的 Python 环境可用。 安装 Jupyter 1 pip install jupyter 生成密码 在 IPython 中,
切水果 牛顿摆 汤姆猫
给大家分享一下,最近一个月,关注的一些技术动态。同时,也有一些工具、学习资料、小技巧等有意思的内容。 前端 Webpack 在今年 2 月份,Webpack 已经推出 4.0.0 的版本。Wepack 4 不再支持 Node.js 4,在编译速度上也有很大优化提升。同时,Webpack 4 移除了 commonchunk
作者: 范冰 副标题: 创业公司的用户与收入增长秘籍 出版年: 2015-7 ISBN: 9787121263606 Notes: 这是一本针对 ToC 互联网产品、比较 Marketing 的书。 通过各种真实案例,告诉你互联网产品的玩法。怎样创造产品,获取用户,激发活跃度,提高留存,增加收入,病毒传播。 如果你是从业人员,这本书能给你在
1. 下载镜像文件 点击进入,CloudReady 官网下载 DOWNLOAD 64-BIT 或 DOWNLOAD 32-BIT 版本镜像。解压后,得到 cloudready-free-xxx-bit.bin 文件 2. 安装 Chromebook 恢复工具 首先需要安装 Chrome 浏览器,然后打开页面,安装 Chromebook Recovery Utility。 3. 制作镜像 第一步,打开 Chromebook Recovery Utility 第二步,选择 Use local image,再选择刚才解压出来
1. 标准库 Robot Framework 可以直接导入使用的库,在目录 python\Lib\site-packages\robot\libraries 中。详细说明,可以查看说明文档。 Builtin,包含经常需要的关键字。自动导入无需 import,因此总是可用的。 Dialogs,提供了暂停测试执行和从用户的输入方式。 Collections,提供一组
配置表 Robot Framework 的配置表主要有两种用途。详细说明,请参考这里。 导入测试、资源文件和变量文件。 定义元数据。 在 Setting 表格中: 1 2 3 4 5 Library 引入库 Resource 引入资源文件 Variables 引入变量文件 Test Setup 指定缺省的 test setup Test Teardown 指定缺省的 test teardown 在测试用例中: 1 2 3 4 5 6 [Documentation] 测试用例描述 [Tags] 测试用
pybot 命令 执行所有测试用例 1 pybot . 执行某个测试套件 1 pybot testsuite.txt 执行某个测试套件中的测试用例 1 pybot --test case_name testsuit.txt 将测试结果输出到固定路径 1 pybot --ouputdir your_ouput_dir testsuit.txt 执行包含某个 tag 的测试用例 1 pybot --include tag_name testsuit.txt 关于日志 默认情况下,Robot Framework 中低于 INFO 级别的日志消息不会写日志。这个阈值可以通过命
之前使用过 Gygwin,也是用过 Git Bash。但在 Vim 面前,这两货都不好使,最终选择了 MSYS2 作为 Console 端。 1. Cygwin、MinGW、MSYS2 比较 在 Windows 下,使用 Vim 的关键在于找到一个合适的 Console。在安装 Vim 插件时,合适的 Console,能帮你避开大
1. nerdtree 生成文件目录树 1 2 " 文件目录树 Plugin 'scrooloose/nerdtree' 1 2 3 4 5 6 7 8 9 10 11 12 13 "===================================================== "" NERDTree 配置 "===================================================== let NERDTreeChDirMode=1 "显示书签" let NERDTreeShowBookmarks=1 "设置忽略文件类型" let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$','\.pyo$', '__pycache__$'] "窗口大小" let NERDTreeWinSize=40 autocmd VimEnter * if !argc() | NERDTree | endif " Load NERDTree only if vim is run without arguments "按
1. Vim 简介 Vim 是基于 vi 发展出来的一个编辑器,第一个版本由布萊姆·米勒在 1991 年发布。最初的名称是 Vi IMitation,随着功能的不断增加,正式更名为 Vi IMproved。 上面是常见编辑器的学习曲线。对于大多数用户, Vim 有着比较陡峭的学习曲线。也就是说刚
利用 Gitlab issue 进行项目管理是一件对 Dev 十分友好的事。录入issue、发起 Merge Request、创建 milestone,这些都是开发过程中动态推进的。但,每个新项目都需要创建一堆 Label ,是件让人头疼的事。本文主要就是为了解决这个问题。 1. GitLab Label 在创建 GitLab Label 之前,我
1. 安装无头浏览器 1.1 CentOS 安装 Phantomjs 下载并解压 访问 Phantomjs ,找到 Download phantomjs-2.1.1-linux-x86_64.tar.bz2 的下载链接,并拷贝。 在 CentOS 执行命令: 1 2 3 4 5 wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 # 如果没有安装 bzip2 可能会报错 yum install bzip2.x86_64 tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 mv phantomjs-2.1.1-linux-x86_64 /usr/local/ 添加到环境变量 1 vim /etc/profile 在行尾新增,如下内容 1 export PATH=$PATH:/usr/local/phantomjs-2.1.1-linux-x86_64/bin 使环境变量立即生效 1 source /etc/profile 查看 Phantomjs 版本号 1 phantomjs --version 安装完之
1. 关于键盘类型 键盘主要有三类: 机械键盘 机械键盘的每一颗按键都有一个单独的开关,也被称为轴。依照微动开关的分类,机械键盘分为茶轴、青轴、白轴、黑轴以及红轴。机械键盘手感舒适,但价格偏高。 薄膜键盘 薄膜键盘是按键较多且排列整齐有序的薄膜开关。日常
1. 机器面前人人平等 我们每天都接受着大量的数字信息,但真正对自己有帮助的很少。绝大部分信息像垃圾食品一样,并不提供什么养分,还挤占容量,使你无法深入了解真相、形成自己的思考和判断。 你可以一动不动,坐在那里刷一上午微博、抖音、今日头条、腾讯新闻
主要介绍 Robot Framework 的一些基本概念,如何写一个测试用例。 1. 基础元素 1.1 关键字 - keywords Robot Framework 关键字类似函数。分为系统关键字和用户自定义关键字。 系统关键字,通过加载 Library 引入 用户关键字,通过加载 Resource 引入 1.2 库 - Library 库用来封装和复用关键字。Robot Framework 库包括系统库和用户自
1. 简介 1.1 Robot Framework Robot Framework 是一个 Python 写的自动化功能测试框架。 具备良好的可扩展性,支持关键字驱动 可以同时测试多种类型的客户端或者接口 可以进行分布式测试 主要用于轮次很多的验收测试和测试驱动开发。 1.2 Robot Framework IDE (RIDE) Robot Framework IDE (RIDE) 是 Robot Framework 框架的集成开发环境。 值得注意的是,20
由于负责小组的 CI 公共事项,经常需要配置 CI 流程,或者帮助其他人解决一些问题,整理了一下常用的 CI 脚本,以方便查阅。 1. .gitlab-ci.yml 结构 下面是, GitLab CI 的配置文件结构。 .gitlab-ci.yml 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 一些前置脚本,完成激活环境等操作 before_script: - source /data/runner/node/bin/activate - which node && node --version - which npm
作者: [美] 爱德华·弗伦克尔 原标题: Love and Math: The Heart of Hidden Reality 出版年: 2016-3 ISBN: 9787508658070 Notes: 在来回旅途的高铁上,读完本书的。这是一本比较轻松的自传类型的数学读物。主要以作者求学为时间线,讲述了一个对物理感兴趣的男孩,怎样一步一步、通过不懈努力成为世界级的数学家的故
1. createElement 方法 HTML 中常见的 DOM 操作是,修改 DOM 节点,访问 DOM 节点。 除此之外,W3C 还发布了创建 DOM 节点、删除 DOM 节点的技术标准。 createElement 方法,被用于创建一个 DOM 节点。createElement() 通常需要与 appendChild() 或 insertBefore() 方法配合使用。 其中: appendChild() 方法,用来在指定的子节点列表末,
1. 提问的动机 提问的动机分为两种,被动型、主动型。 2 被动型 被动型的提问,是当你遇到问题之后,寻找问题的解法而不得时,被迫的行为。 2.1 尝试自己解决 遇到问题时,不要着急问别人。在时间允许的情况下,尝试自己解决。 一方面,可以锻炼自己分析问题和解决问题
在 Django 中,request 包含了一次请求的全部信息。后端处理逻辑经常需要用到 request 中的信息。比如, DRF 框架中想要随时能够获取到 request,或者将一些参数全局传递。Django 第三方 App 中有一些工具可以满足要求,但它们并不是安全可靠的。意思是,如果 Django
1. axios 安装 使用 npm 安装 1 npm install axios --save 全局注册有两种方法: 绑定到原型上 1 2 import axios from 'axios' Vue.prototype.axios = axios 这种方法,每个 Vue 对象都会新增一个 axios 对象。 1 2 3 this.axios.post(apiUrl).then((res) => { //do something }) 挂载到 windows 对象上 在 DOM 的任意地方,都能使用 axios 函数。 1 2 import axios from 'axios' window.axios = axios; 1 2 3 axios.post(apiUrl).then((res) => { //do something }) 2. axios 配置 为了配合 Django 的 CSRF
前面一部分主要讲乐观锁和悲观锁。锁从数据库层面,保证了并发时的数据一致性。了解锁,有助于对并发解决方案的理解。后面一部分主要讲的是 Django 中,并发场景下,保证数据一致性的解决办法。 1. 关于锁 1.1 乐观锁 乐观锁的出发点是,同一条数据很少会因为并发修改而产
1. 什么是 utf8 理论上,utf8 使用 1-6 个字符, 实际上,最新的 utf8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。 2. 什么是 utf8mb4 utf8mb4 是 utf8 的超集,理论上原来使用 utf8,然后将字符集修改为 utf8mb4,也不会对已有的utf8 编码读
** 默认执行命名时,针对的是当前目录环境。如果加上 -g 参数,则表示针对的是全局生效。** npm 升级 1 npm install npm -g 查看当前版本 1 npm -v 查看 npm 源配置 1 npm config get registry 修改 npm 源 1 2 npm config set registry http://registry.npm.taobao.org/ # npm config set registry https://registry.npmjs.org/ 临时指定 npm 安装源 1 npm install [package name] --registry=https://registry.npm.taobao.org 设置 proxy 1 npm config set proxy http://proxy.example.com:8080 查看 proxy 1 npm config get proxy 删除
主要记录的是分析方法。 1. 战略分析 麦肯锡七步成诗法 陈述问题 分析问题 优先排序 指定详细的工作计划 进行关键分析 综合结果并建立有结构的结论 讲故事 2. 认识问题 大部分的问题是不能认识问题,unknown unknown。能够认识到问题、陈述问题,是解决问题的
1. 下载并配置 Runner 1.1 下载 Runner GitLab-CI 的 Runner 是一个 Go 写的程序包,可以去官网下载到本地。 1 2 yum install -y wget wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 增加执行权限 1 chmod +x /usr/local/bin/gitlab-runner 1.2 新增 runner 用户 运行 Runner 时,以 runner:runner 账户运行。 1 2 groupadd -g 1234 runner useradd runner -u 1234 -g 1234 1.3 修改 pip 源 1 2 3 4 cat /etc/pip.conf [global] index-url= http://pypi.doubanio.com/simple/ trusted-host = pypi.doubanio.com 1.4 创建工作目录 1 mkdir -p /data/gitlab-data 2 注册 Runner 在项目
由于目前使用的 Git 仓库即将无法使用,需要将仓库代码迁移到新的 Git 仓库。具体操作方法如下: 1.登录新的仓库,然后创建仓库。 创建后,新仓库地址: http://gitlab.your-new-domain.com/project.git 2.克隆旧仓库镜像到本地: 1 2 3 git clone --mirror http://gitlab.your-old-domain.com/project.git # 如果仅需要克隆 Branch 和 Tag,可以使用 --bare 参数替换 --mirror
1. server_name 无效 现象:Nginx 反向代理了两个应用,配置详情如下。发现访问 b.chenshaowen.com 和 a.chenshaowen.com 时,返回的都是 A 服务的请求。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 server { listen 80; server_name a.chenshaowen.com; location / { proxy_pass http://A; } } server { listen 8080; server_name b.chenshaowen.com; location / { proxy_pass http://B; } } 原因:当所有 server 的规则都不匹配时,Nginx 会采用第一条
1. 非标准库 1.1 virtualenv virtualenv 是一个非常流行的用于创建独立的python libraries环境的工具。我强烈推荐你学习并了解它,因为他非常实用,并且应用广泛,很多人用它来搭建python开发环境。后面其他工具来主要与virtualenv来进行比较以说明差
1. 关于个人项目 为什么强调是个人项目?商业项目对代码托管、开发、运维部署等环节有着冗长的流程。而对于个人开发者,这样的流程成本过高,不利于快速项目迭代。 个人项目可能是一次学习的 Demo。完成一个领域 Demo 是很好的技术学习思路。从零开始搭建一个完整
最近参与了一个多人协作开发的项目,在开发过程中遇到不少问题。例如,前端提交冲掉后端代码、代码冲突无法解决直接返工、A 提交 B 分支、直接提交 Master 分支等。本文是记录,也是思考如何更高质量地管理项目、进行多人合作项目的开发。 1. 版本管理的需求 1.1 版本标记
创建 Django 工程 1 django-admin startproject your_project_name 创建应用 1 2 3 django-admin.py startapp your_app_name # 或者 python manage.py startapp your_app_name python manage.py 和 django-admin 的功能基本一样。不同的是 python manage.py 还设置了 DJANGO_SETTINGS_MODULE 环境变量、将项目的路径加入了 sys.path 中。建议除了创建项目使用 django-admin,其他情况使用 python manage.py。 初始化数据 1 python manage.py migrate 创建缓存表
1. 为什么字典比列表查询快 首先,请看下面这段代码 1 2 3 4 5 6 7 8 9 10 11 12 13 from time import time t = time() data = [chr(i) for i in range(97, 123)] # data = dict.fromkeys(data,True) print data for i in range(9999999): after_filter = [] for find in ['aa', 'b', 'cc', 'd', 'ee']: if find not in data: after_filter.append(find) print after_filter print time() - t 直接运行: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] ['aa', 'cc', 'ee'] 24.5699999332 去
1. Python 2 和 3 区别 特征\版本| Python 2| Python 3 | :-: | -: print 函数化 | print“abc”| print(“abc”) 统一类| 旧式类和新式类| 只有新式类 浮点运算| 1/2=0| 1/2=0.5 字符串格式化| %,Format| Format,% xrange 替代 range| xrange| range long 重命名为 int| Long,int| Int 包导入| 相对导入| 绝对导入 源文件编码| Ascii| utf8 Python 官方强烈建议直接学习 Python 3,
1. 编译器准备 准备 Python 源码 在 Python 的官网,下载需要进行编译的 Python 版本源代码。这里选择的是 Python 2 的最新版本 Python-2.7.14.tar.xz,点击前往。 准备编译器 在 Windows 上,Python 2.7 的源代码内置的项目工程,支持 Visual Studio 2008、2010 打开。当然,V
文中以 Python 2.7.8 版本源码为例。 1. Python 中常见的文件格式 py 文件 Python 源代码文件,可以使用文本编辑器进行修改。 pyc 文件 Python 源代码编译后,生成的字节码文件。 pyw 文件 pyc 文件执行时,会出现 console 窗口;pyw 文件执行时,不会出现。pyw 文件主要是用来运行纯 GUI 图形用户界面程序,
1. 关于名字 选择专业的词 避免泛泛的名字 用具体的名字代替抽象的名字 使用前缀或后缀给名字附带更多的信息 决定名字的长度 利用名字的格式来表达含义 2. 把信息装到名字里 通常来讲,加上像 is、has、can 或 should 这样的词,可以把布尔值变得更明确。 get 开头的方法,
1. 概况 课程前置条件:已经完成 PowerPoint 逻辑梳理和内容撰写。 课程主要从以下六个部分,来增强 PowerPoint 的表现力: 色彩 文字 图形 图表 母版 动画 2. 色彩 2.1 认识色彩 色相 彩色,如紫色、青色、品红等。中性色,如黑、白、灰。 亮度 色彩的明暗程度,亮度值越高,色彩越白,亮度越低,色
使用 pip 命令安装 Python 包时,默认去 https://pypi.python.org/simple/ 源查找相应的包,下载并安装。但是在内网环境,或者需要发布一些私有包提供给指定用户时,就需要搭建自己的 PyPI Server。本篇主要记录使用 devpi 工具搭建 PyPI Server 源的过程,以及记录一些常用命令。 1. PyPI Server 比较 PyPI Server PyPI 代理镜像 本地缓存
在需求逐步确认的过程中,系统的 DB 模型也逐步确认。有时使用,MySQL Workbench 这类工具绘制 E-R 图,然后生成 MySQL 数据库表,这时就需要反向生成 Django Models;有时直接写 Django Models ,但是又需要查看 E-R 图。本文主要解决上面两个需求,实现 Django Models 与 E-R 图之间的转换。 1. 生成 model 的
本篇主要阐述了为什么需要服务发现功能,对几种服务发现工具进行了比较。同时,在 CentOS 上,对 Etcd、Confd 、Nginx 实现服务发现功能进行了实践。 1. 服务注册与发现 1.1 为什么需要注册和发现服务 随着微服务的兴起,大量接口服务化。当新的微服务加入或微
互联网的服务常依赖于成千上万的主机,而这些主机又部署在世界各地,再加上错综复杂的用户环境,要保证服务的稳定可靠,就需要对服务进行监控。监控的目的可以从这几个方面考虑:从系统维度,了解CPU、内存、硬盘使用情况;从网络监控维度,了解网络上行、
本文主要简单介绍了 ELK 的技术栈,并给出了 Docker compose 的编排配置。阅读本文,可在本地通过 Docker 将 ELK 跑起来。后续会将 ELK 在服务器上进行部署,相关的配置再补充。 1. ELK 技术栈介绍 ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticse
1. 如何更好做 CodeReview 要求 事项 代码提交者的要求 小粒度 原子性 有注释 工具检查 对代码 Review 者的要求 一看规范 二看逻辑&性能 三看设计 对团队的要求 温故而知新 2. 制定CodeReview CheckList 要求 事项 命名 变量名字 类命名 方法命名 参数命名 代码长度 类长度不超过1000行
本文主要约定在 Django 开发过程中,需要注意的一些事项。统一的编码风格,良好的设计理念,有利于项目的开发和维护,值得开发人员不断地研究和探讨。 1. 编码声明 在 Python 解释器执行代码时,需要告诉解释器代码的编码方式。Python 代码实际上是文本数据,如果代码的
toastr 消息弹框提示 artDialog 对话框组件 DataTables 基于 jQuery 表格插件 KendoUI 非常全的 UI 框架,很多组件 wangEditor Web 富文本编辑器 jstree 网页树形结构组件 highcharts echarts D3js 数据图表 select2 下拉框 validate 基于jquery的表单验证 Vuejs 可以用于双向数据绑定,也可以用于构建单页应用
1. 文档 Pandoc Pandoc 是一个用 haskell 编写的文本转换工具,转换速度快,支持格式广泛。可以将 Markdown、LaTeX 等格式转换为 HTML、Docs 、PDF 等格式。 而只需要执行简单的语句: 1 pandoc mypaper.md -o mypaper.docx Graphviz 一个由 AT&T 实验室开发的开源工具包,用于绘制 DOT 语言脚本描述的图
1. 流控 缓存、降级和限流是保护高并发系统的常用方法。缓存以空间换时间、减少了 CPU 和网络调用的耗时;降级保护了核心服务的高可用,高峰时段延时或拒绝处理非核心请求;限流是通过限制并发请求来保护系统。 限流就是,在有限资源的情况下,每个 API 接口单位时间内
1. 背景 最近十多年来,C/C++ 在计算领域没有很好得到发展,没有跟上计算机发展的脚步。 现有的编程语言,开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译;要么执行效率低,但拥有高效的编译;所以需要一种拥有较高效的执行速
1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元。进程拥有自己独立的堆和栈,独立的地址空间,资源句柄。进程由 OS 调度,调度开销较大,在并发的切换过程效率较低。 Python 提供了一个跨平台的多进程模块 multiprocessing,模块中使用
1.问题描述 背景:一个 Django 开发的 SaaS 应用,对外提供文档服务功能。其中,搜索功能通过 Django Haystack 实现。 问题:搜索功能有时可用,有时不可用。多次测试,发现可用和不可用会交替出现,出现概率各占约 50%。 补充一下搜索功能实现的细节: Django Haystack 在提供搜索功能之前,需要
1. HTTP Header HTTP 协议是建立在 TCP/IP 协议之上的应用层规范,以 ASCII 码传输。HTTP 规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样: 1 2 3 4 5 <method><request-URL><version> <headers> <entity-body> HTTP Header 包括通用头、请求头、响应头和实体头这四个部分。每个头域由一个头域的域名,冒号和域值组成。
1. 函数方法 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码片段。函数能提高应用的模块性,代码的重复利用率。Python 提供了许多内建函数,比如 print()、str()。同时,Python 也允许用户创建函数,这被叫做自定义函数。
1. 简介 Jupyter Notebook(前称 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook 实际上是一个 Web 应用程序,可以创建和共享程序文档,支持实时代码,数学方程,可视化和 Markdown。 用途包括:数据清理和转换,数值模拟,统计建模
1. 消息队列的适用场景 1.1 异步处理 应用场景:用户注册后,需要发注册邮件和注册短信。同步的处理方法,系统的性能(并发量,吞吐量,响应时间)会有瓶颈。 1.2 应用解耦 应用场景:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口
1. 基本概念 Workspace:工作区,工程文件 Index:暂存区,也叫待提交更新区,在提交进入 repo 之前,把所有的更新放在暂存区 Local Repository:本地仓库,存放在本地的版本库,HEAD 指向当前的开发分支 Remote Repository:远程仓库,远
混沌工程与实践 高校培训第二周|DevOps 高校培训第一周|容器与云原生 中国 DevOps 社区分享|基于 Tekton 的 CICD 平台 KubeSphere 开源之研发流程思考 云原生下的 DevOps 平台 2020 云原生产业大会|跨集群构建企业级 DevOps 平台 SAAS 开发的思考 高效时间管理 编写可复用的 Django App ROBOT FRAMEWORK 基础篇 GitLab CI 与蓝盾 UI 自
1. Hexo 简介 Hexo 是使用 Node.js 开发的一个简洁、高效、开源的静态博客生成器。Hexo 能够以非常快的速度将 Markdown 渲染成静态的 HTML 文件。类似于 Jekyll、Ghost、Octopress,可以用于创建博客。 Hexo 具有如下优势: 使用 Node.js ,搭建环境简单。Jekyll 搭建环境
在 Web 应用开发的过程中,后端开发人员需要频繁的交付 API 接口,前端开发人员需要频繁的调用 API 接口。为了降低沟通成本、预防可能的安全风险,遵循约定优于配置的原则,有必要规范 API 的接口规范。Restful API 是以资源为核心的 API 设计思路,所有的操作都是针对特
从 GitLab 8.0 开始,GitLab 开始集成 CI(持续集成) 功能。只需要在服务器上添加一个 Runner,同时在项目中添加一个 .gitlab-ci.yml 文件,就可以进行 CI。在 GitLab 搭建与配置 中笔者记录了从零开始搭建 GitLab 服务的整个流程。在 GitLab CI 持续集成 中笔者交代了 GitLab CI 的一些基本概念,并
笔者目前使用 Django 从事 SaaS 开发,同时开发和维护多个 SaaS 应用。在很多 SaaS 应用中都约定了错误码,有的用于处理登录态,有的用于标记业务逻辑状态。对于这种项目共性很强的特征,花时间学习和研究是非常有必要的。本篇主要讨论了错误码的用途、如何设计错误码、使用 Django 中
1. 了解新语言产生的背景 ABC 是专门为非专业程序员设计的一种教学语言,但是由于其封闭,并未取得成功。1989年的圣诞节期间,吉多·范罗苏姆开发了一个新的脚本解释器,并命名为 Python,作为 ABC 语言的一种继承。新的脚本解释器开放,完美结合了 Unix Shell 和 C
最近笔者在思考,怎样提高开发效率。从网络爬虫到数据处理,然后到人工智能。Python 的强大之处在于:拥有一大批开箱即用的工具包,不必重复造轮子,极大地提高了开发的效率。那么为何不将项目中的功能模块化,打包成可复用的 Python 包呢?本文主要讲的是怎样
1. 关于 Django 的性能 Django 是一个 Python 写的 Web 应用框架。使用 Django ,可以非常简单、高效地开发复杂的数据驱动的网站。同时,Django 非常注重组件的重用性、可插拔、敏捷开发、DRY(Don’t Repeat Yourself)。从一定程度上讲,Django 是一个很
为了快速地响应用户的需求、满足运营活动的需要,互联网产品通常有着非常高的发布频率。采用敏捷开发的方式,缩短了交付的周期,加快了产品的迭代,也给项目的文件管理带来了挑战。前端工程直接面向用户,首当其冲,最值得重视。频繁更新的图片、样式、交互,
1. Django 静态文件分类 Django 静态文件分为两类:static 和 media。 static: 是页面引用的 JS、CSS、Image 等文件 media:是用户上传的文件 2. 生产环境配置 生产环境,通常配置 Nginx 转发静态文件请求,而 Django 处理动态请求。 nginx 配置 1 2 3 4 5 6 7 location /media
1. 直接返回文件 如果静态文件在工程根目录的 media/test.zip,需要先将文件读入内存,再进行传输。代码如下: settings.py 配置 1 2 PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media/') yourapp/views.py 1 2 3 4 5 6 7 8 9 10 11 12 from django.conf import settings from django.http import HttpResponse from django.core.files.storage import FileSystemStorage def download_file_direct_from_file(request): file_system = FileSystemStorage(settings.MEDIA_ROOT) file_name = 'test.zip' with file_system.open(file_name) as f: response = HttpResponse(f) response['Content-Type'] = 'application/%s' % file_name.split('.')[-1] response['Content-Disposition'] = 'attachment; filename="%s"'% file_name return
Docker 解决了同一机器上的环境隔离问题,提高了运维部署的效率。 Vagrant 给开发提供一个统一的开发、测试、接近于完全隔离的环境。本文,主要讨论如何使用 Vagrant 搭建 Django 开发环境。版本:VirtualBox 5.0,Vagrant 1.8。 1. 基本概念 1.1 Vagrant Vagrant 是一个用来构建虚
1. 目录结构 django-devops-uwsgi 目录是打包 uWSGI 和 Django 的镜像编译文件。在镜像中安装 uWSGI、pip、virtualenv等必要的程序包。 在使用镜像创建容器时,执行 start.sh 脚本, 创建 Python 虚拟运行环境,从 Django 的 requirements.txt 安装依赖包,最后启动 uWSGI 监听端口,等待请求。 django-devops-compose/www/app 目录,用于放置 Django 的代码
1. 目录结构 1 2 3 4 5 6 7 8 9 10 11 12 ├── django-devops-nginx │ ├── Dockerfile │ └── nginx.repo ├── django-devops-compose │ ├── docker-compose.yml │ ├── www │ ├── conf │ │ ├── nginx.conf │ ├── log │ │ ├── nginx │ │ │ ├── access.log │ │ │ ├── error.log 每个服务的镜像 Dockerfile,单独放在一个文件夹。django-devo
1. 部署架构 浏览器访问一个页面的程序处理流程: (1),浏览器向 Nginx 发起一个请求,如果匹配到 Nginx 的静态 URL,比如 /static 目录下的 js、css、404.html 等文件,那么 Nginx 直接返回文件。其他请求 URL,通过 uwsgi_pass 配置转给 uWSGI 处理。 (2),uWSGI 解析请求头
1. 基本概念 Docker Compose 是一个用来定义和运行复杂应用的 Docker 工具。使用 Docker Compose,可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。 Docker Compose 定位是 ‘defining and running complex applications with Docker’,前身是 Fig,兼容 Fig 的模板文件
1. 基本概念 Dockerfile 是一些列构建 Docker 镜像的指令集合。Docker 通过读取 Dockerfile 指令自动构建镜像。Dockerfile 类似于 Makefile,都是一种文本文件,按照构建镜像顺序组织所有的指令。 Docker 镜像的构建命令: 1 docker build . 这条命令中,Docker CLI 的处理流程如
Vagrant 适合用来管理虚拟机,而 Docker 适合用来管理应用环境。为了更好地模拟真实运行环境,本系列文章借助 Docker 和 Docker Compose 搭建 Nginx + uWSGI+ Django + MySQL + Redis + Rabbit 的开发环境。 1. 基本概念 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包应用以及依赖
1. 网站性能基础指标 并发数: 服务器单位时间内处理的会话数量 吞吐率: 服务器单位时间内处理的请求数 响应时间: 用户从发出请求到接受完响应之间的总耗时,由网络传输耗时、服务处理耗时等多个部分组成 平均响应时间: 所有请求响应时间的平均值 2. 测试工具 性能测试
服务商 域名 谷歌 Google App Engine appspot.com 二级域名 新浪 Sina App Engine sinaapp.com 二级域名 百度 Baidu App Engine duapp.com 二级域名 Heroku herokuapp.com 二级域名 AWS Elastic Beanstalk elasticbeanstalk.com 二级域名 OpenShift rhcloud.com 二级域名 DaoCloud daocloud.io 二级域名 时速云 TenxCloud tenxapp.com 二级域名 灵雀云 Alauda myalauda.cn 二级域名
1. 关于 PaaS 1.1 什么是 PaaS PaaS 是平台即服务(Platform as a Service)的简称,平台即服务是一种云计算服务,提供运算平台与解决方案服务。PaaS 的出现加快了 SaaS 的发展,尤其是加快了 SaaS 应用的开发速度。比如,SaaS 开发时,使用 PaaS 平台统一提供的登录
1. 混合云使用的用户场景 1.1 满足业务的爆发式增长 互联网业务呈指数型增长,很难预测基础设施的储备量。一般在业务成长初期很长一段时间,小规模的物理机托管就能满足业务需求。但是,随着市场的展开,业务规模爆发式增长,原有的物理机托管机房机位有限,只能通
1. 基本概念 master master 就是 Jenkins 安装和运行的地方,它负责解析 job 脚本,处理任务,调度计算资源。 agent agent 负责处理从 master 分发的任务,操作实际上是通过 executor 来执行的。 executor executor 就是执行任务的计算资源,它可以在 master 或者 agent 上运行。多个 executor 也可以合作执行一些任务。 step Jenkins 里面 job 中的最小单元
1. 基本概念 GitLab-CI:GitLab 提供的持续集成系统,管理项目的构建状态,通过 GitLab Runner 来执行构建任务。 GitLab-Runner:用于执行构建任务,.gitlab-ci.yml 的 script 部分的运行就是由 GitLab-Runner 来完成。 .gitlab-ci.yml:
1. 简介 GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现了自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。 它拥有与 GitHub 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团
1. 字段含义 1.1 u, 用户ID 1 2 3 4 5 6 if cookie.has(gr_user_id){ //使用 cookie 中的 gr_user_id 有效期十年 } else { //按照 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 格式,随机生成一个 gr_user_id } 1.2 s,会话ID 1 2 3 4 5 6 7 if cookie.has(gr_session_id_){ //使用 cookie 中的 gr_session_id_ //gr_session_id_,的有效期为 100 分钟 } else { //按照 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 格式,随机生成一个 gr_session_id_ }
1. Fixtures 特点 Fixtures 是一种新的提供初始化数据的方法,并且被 Django 的测试框架用来处理单元测试的测试数据。不同于 SQL 文件的是,使用 fixture 可以提供一个被 Django 的 serialization 系统所能识别的序列化文件,它会被读取并自动转换成对应的 model ,然后保存进数据库。 2. 数据导出 将 app_name 的数据导出为 ini
目前,本人使用的是 PyCharm ,作为前后端的集成开发工具。主要的技术栈有,JavaScript,CSS,ECMAScript 6,Vue,Python,Django,Mako,Markdown。近期的前端开发工作逐渐增加,PyCharm 似乎有些力不从心
1. Atom 简介 Atom 是支持 Windows、Mac、Linux 三大桌面平台,完全免费,并且在 GitHub 上开源的代码编辑器。立即前往 1.1 优缺点 主要优点 开发维护团队强大,开源项目,修复 Bug 速度快,生态圈成长速度快。 快捷键支持特别好,熟悉了各种快捷键后可以成倍提高生成效
1. 基本概念 1.1 Ajax Ajax 全称为 " Asynchronous JavaScript and XML “(异步 JavaScript 和 XML )。其核心由 JavaScript、XmlHttpRequest 、DOM 对象组成,通过 XmlHttpRequest 对象,向服务器发送异步请求,从服务器获得数据,然后用 JavaScript 来操作 DOM 而更新页面。 以 Jquery 为例: 1 2 3 4 5 6
1. UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 iview - 基于 Vuejs 的开源 UI 组件库 mint-ui - Vue 2的移动UI元素 muse-ui - 三端样式一致的响应式 UI 库 vue-material - 通过Vue Material和Vue 2建立精美的app应用 vuetify - 为移动而生的Vu
1. 应用场景 1.1 Mail 由于 RFC821 要求邮件内容必须为 ASCII 码。当邮件中有其他的非ASCII字符或二进制数据时,就需要 Content-Transfer-Encoding,Base64是其中的一种方法。 1.2 URL 有些应用需要把二进制数据放到URL里,而URL只允许特定
1. Font-family 网页上能使用的字体,限制在浏览器所在PC已经安装的几款字体。 Windows操作系统,中文字体: 黑体:SimHei 宋体:SimSun 新宋体:NSimSun 仿宋:FangSong 楷体:KaiTi 仿宋GB2312:FangSongGB2312
1. 什么是Docker Docker诞生于2013年初,是dotCloud( Docker.Inc前称)公司内部的一个业余项目,源代码托管在GitHub上,基于Go语言并遵从 Apache 2.0 开源协议。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础
1.基本概念 对称加密: 对称加密是,采用单密钥密码系统的加密方法,同一个密钥同时用作信息的加密和解密。由于速度快,常用于加密大量数据的传输。 DES(Data Encryption Standard),数据加密标准: DES的密钥长度是56比特,算法的理论安全强度是\
1. 方法篇 2. 实战篇
1. Selenium 简介 Selenium 是一个 Thoughtworks 公司的集成测试工具。Selenium 的核心 Selenium Core 基于 JSUnit,完全由 JavaScript 编写,可以运行于任何支持 JavaScript 的浏览器上。 1.1 主要功能和特点 开源、免费。 多浏览器支持:Firefox、Chrome、IE、Opera,可以用于兼容性测试。 多
1. 云服务的分类 IaaS,提供计算和存储服务。 PaaS,提供软件运行的平台环境服务。 SaaS,直接提供软件服务。 2. 云服务的应用场景 采用云服务可以显著减少 IT 支出。 在 IaaS 服务中,云主机、存储是用户采用率最高的服务产品,其次是数据库、网络加速。 IaaS 是当
1. 自动生成HTML表单元素 Widget,用来渲染成HTML元素的工具。 指定小部件 1 2 3 4 5 6 from django import forms class CommentForm(forms.Form): name = forms.CharField() url = forms.URLField() comment = forms.CharField(widget=forms.Textarea) CommentForm().as_table() 输出值 1 <tr><th><label for="id_name">Name:</label></th><td><input id="id_name" name="name" type="text" /></td></tr>\n<tr><th><label for="id_url">Url:</label></th><td><input id="id_url" name="url" type="url" /></td></tr>\n<tr><th><label for="id_comment">Comment:</label></th><td><textarea cols="40" id="id_comment" name="comment" rows="10">\r\n</textarea></td></tr> 指定表单字段为 Textarea 小部件,而不是默认的 TextInput 小部件。 自定义小部件的样式 1 2 3 4 class CommentFormClass(forms.Form):
1. 名词解释 xpath : 分为精确路径和概略路径两种做法。精确路径 : body>div[0]>div[3]>ul>li[5]>a[0] ,从被点击的元素不断向上查找到根节点,并记录过程中每个节点。概略路径:body>div.header>div.nav>a[23],在前者的基础上省略上溯路径中非白名
1. 基本概念 ORM:对象关系映射,Object Relational Mapping。它的作用是在关系型数据库和对象之间作一个映射。不需要复杂的 SQL 语句,操作数据如同操作对象一样简单。 QuerySet:给定模型的对象列表。QuerySet 允许从数据库中读取数据,对其
简单介绍一下项目需求: 项目组需要对外发布文档,文档撰写使用的是Markdown,对外需要使用HTML。起初,使用的是Nginx+Jekyll的解决方案。随着文档的增加,文档系统对搜索功能有了强烈的需求。笔者在另外一篇文章中有所讨论,但是这几
1. 基本概念 持续集成,Continuous Integration 持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。 持续交付,Continuous Delivery 持续交付在持续集成的基础上,将集成后
合作是一场旅程。 1. 跨部门合作的障碍 对新业务合作的抵触 职责存在模糊地带 员工的合作能力 信息不对称 跨部门合作的管理机制 目标和利益不一致 资源有限 2. 合作的核心理念 双赢思维 开放心态 合作核心的三个方面 寻找共同利益 学会换位思考 巩固长期合作关系 3. 合作关系核心
1. 简介 Graphviz是贝尔实验室开发的一个开源的绘图工具包。它使用一个特定的DSL(领域特定语言): DOT作为脚本语言。使用布局引擎来解析DOT脚本,完成自动布局。支持丰富的导出格式,例如:PNG、JPG、PostScript、SVG、P
简介:Jekyll是一套静态HTML生成工具。文档系统利用Jekyll进行部署,最终将Markdown转换为HTML文件输出。 搜索功能的需求是,根据关键字,匹配文档的标题或者内容,列出匹配的文档列表。 1. 方案一: Simple-Jekyll-Search 参考地址:https://g
1. 基本概念 Django内置了一个信号分发器。信号可以帮助解耦程序模块。在应用中其他地方发生某事件时,通知指定函数。信号允许某些 senders 通知一组 receivers 已经发生的行为。 2. 信号使用 2.1 声明信号 在使用信号之前,首先得创建信号实例,声明信号的接收参数列表。dja
1,初始化项目 vue-cli 是Vue官方发布的项目脚手架,使用 vue-cli 可以快速创建 Vue + Webpack项目。 1 2 3 4 5 6 7 8 9 10 npm install -g vue-cli # 全局安装vue-cli vue init webpack myproject # 创建vue项目,执行时,会提示输入项目的相关信息 cd myproject # 进入项目 npm install # 安装依赖包,新建nod
Django中有两种视图,一种是函数式视图,另一种是类视图。视图的作用主要是,用于填充逻辑,返回响应体。函数式视图难以扩展,代码复用率低。而类视图可以利用继承、Mixins,快速复用、扩展功能。本文主要讨论了,Django对类视图的处理逻辑
Django中写自动化测试可以使用:doctests或unit tests。自动化测试的逻辑是,将测试数据传入待测试函数,执行后,以输出结果与预期是否一致,作为判断测试是否通过的标准。这里有几个关键点,(1)需要测试数据,(2)需要指明待测试
1. DRF的权限管理 Django REST Framework的权限管理包括两个部分。 一个是认证Authentication方式。指定对用户进行鉴权的方式,获取request.user。 一个是权限控制Permissions。针对Django资源、用户类别进行权限
Awesome-Django Django应用、项目和资源集合 Django-Packages 大量Django第三方组件。 Django-Mptt 在数据库中存储层级数据结构。 Django-Rest-Framework 自动生成 RESTful API。 Django-Rest-Framework-Jwt 为Django-Rest-Framework提供Token鉴权。 Django-Tastypie 自动生成 RESTful API。 Django-Cors-Headers 解决跨域访问的问题。 Django-Ckeditor Django富文
1. 场景 在一个项目中,header、footer等元素经常被重复使用。为了避免,每个页面重写这些元素,同时,在修改时,不用去每个页面修改,需要将公共的部分抽离出来,这就是Django模板继承。 2. Django的复用模板标签 Django内建的复用
作者: 阮一峰 出版社: 电子工业出版社 出版年: 2014-8-1 ISBN: 9787121238369 电子版
在前后端分离开发过程中,提供给前端的 API 接口,有的使用 GET 请求,有的使用 POST 请求。为了避免,后端在 views.py 的 request 中取值报错,需要在每个 view 函数中判断请求头的方法。于是,提取了一个公共的函数放在 utils.py 中,以便 view 函数引用。使用时依然繁琐,最后,在 Django 文档中找到了re
1. Admin 自动注册全部 Model 字段 admin.py 1 2 3 4 5 6 7 8 9 10 # -*- coding: utf-8 -*- import inspect from django.contrib import admin from . import models for name, obj in inspect.getmembers(models): try: if inspect.isclass(obj): admin.site.register(getattr(models, name)) except Exception as e: pass 2. 获取全部 View Name 获取 Project 全部 View Name 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from django.conf import settings from django.core.urlresolvers import RegexURLResolver, RegexURLPattern root_urlconf = __import__(settings.ROOT_URLCONF) all_urlpatterns = root_urlconf.urlpatterns VIEW_NAMES = [] # maintain a global list def get_all_view_names(urlpatterns): global VIEW_NAMES for pattern in urlpatterns: if isinstance(pattern, RegexURLResolver): get_all_view_names(pattern.url_patterns) #
笔者从事的SaaS开发,对开发效率有着比较高的要求。从项目立项、原型设计评估、需求确定、前端设计、后台开发到最后的验收,几个星期完成一次迭代。在敏捷开发的指导下,开始推行前后端分离模式。前端专注于页面和交互,后端专注于API接口。后端提供A
最近几年,随着单页面Web应用的崛起,各种框架也不断涌现。 前端开始进入工程化、组件化的发展阶段。 单页面Web技术,扩展了前端的技术边界,前端也可以路由、渲染页面,不需要依赖后端。 后端的工作重点转向了单纯的数据API服务。 随着各种BaaS云服
技术输出型公司,一套优秀的文档管理、发布系统必不可少。文档系统是内容管理系统的一种,其对可访问性要求高、单文档更新频率低、发布频率高。笔者认为,以纯静态HTML对外发布文档是个不错的选择。但是,直接写HTML文档,费时费力、不好维护。能不能
前后端分离开发中,当后端 API 没有完成时,前端无法继续调试。为了前后端能并行开发,前端需要一套 API 的接口环境,这个就是 Mock API 。下面的图,对开发流程进行了很好的顺理。如果没有 Mock 数据的环节,前后端的联调会消耗非常多的时间。 1. 何为 Mock ,模拟也 通常,后端提供
Arachni是一个基于Ruby on Rails框架的Web安全漏洞扫描工具。 1. Ruby on Rails Ruby on Rails ,缩写ROR,是一个Web框架,包括两部分内容: Ruby 语言和 Rails 框架。Ruby一直以来流行于日本,直到2004年,26 岁的丹麦人 David Heinemeier Hansson 提出了Web框架 - Rai
在前后端分离框架中,API 文档频繁交接。如果涉及到第三方接口调用,多方合作场景下,API 和文档变更可能会更快。为了方便维护 API 和交接文档,这里给大家推荐一款文档生成工具 - apidoc 1.apidoc 简介 apidoc 是一个基于 nodejs 的 API 文档生成工具,从代码注释中提取特定格式的内容,
1. Restful REST,是Representational State Transfer的缩写,表现层状态转化。Restful,是一种开发理念,万维网软件架构风格。 1.1 Restful特点 抽象资源 图片、文本、歌曲、视频都是一种资源实体,在网络上,被抽象为资源。在Re
1. 同源策略 同源策略是浏览器的安全基石。 同源的定义,包括三个方面: 协议相同 域名相同 端口相同 限制范围: Cookie、LocalStorage 和 IndexDB 无法读取 DOM 无法获得 AJAX 请求不能发送 简单说,协议、域名、端口三者任意不同的两个 URL 之间不允许通信,范围包括
Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的,还是那些久经考验的、简单的小工具。下面是,系统性能专家 Brendan D.Gregg ,关于Linux性能方面的talk(Linux Performance Tools)中所整理的命令工具。 1. 总览 2. 监控 3. 测试 4. 优化 5. 静态 6. 追踪
副标题: 使用D3实际交互式图表 原作名: Interactive data visualization for the Web 作者: [美] Scott Murray 译者: 李松峰 出版社: 人民邮电出版社 出版年: 2013-6 ISBN: 9787115320117
1. 下载工具 - qshell qshell 是利用七牛文档上公开的 API 实现的一个方便开发者测试和使用七牛API服务的命令行工具,使用 Go 语言编写而成。目前该工具融合了七牛存储, CDN ,以及其他的一些七牛服务中经常使用到的方法对应的便捷命令。 | 版本 | 支持平台 | 链接 | 更新日志 | |
如果使用Chrome浏览器测试XSS向量,请关闭浏览器对XSS的拦截功能。首先,关闭所有Chrome浏览器进程,然后执行: 1 chrome.exe -args --disable-xss-auditor --args --disable-web-security 进入非Web安全模式。 1. 利用<>标记注入HTML/JavaScript 1 <script>alert('XSS')</script> 1 '';!--"<XSS>=&{()} 1 2 //SRC的
在Web开发中,常会遇到数据导出的需求。这篇主要介绍如何快速将数据导出,并保存为Excel文件。 1. 前端 Web开发中,格式化数据常以table的形式展示。下面是一个人员薪酬信息表,以导出这份数据为例。 姓名 职位 年龄 薪水 Tiger NixonTiger Nixon System Architect 61 $320,800 Garrett Winters Accountant 63 $170,750 Ashton
XSS是一种在前端执行JavaScript脚本的攻击方式。随着UGC站点的流行,用户产生数据剧增,数据块的网络连接越来越有利于XSS的实施与传播。XSS带来的危害有:窃取用户cookies,窃取个人信息;劫持会话,操纵用户网络数据;发起dd
每个Django项目中都会自动生成一个manage.py文件。manage.py是对django-admin的一个简单包装,其功能是将Django Project放到sys.path目录中,设置 DJANGO_SETTINGS_MODULE 环境变量为当前Project的setting.
通过一个内嵌类“class Meta”给model定义元数据,类似下面这样: 1 2 3 4 class Foo(models.Model): bar = models.CharField(max_length=30) class Meta: #...... Model元数据就是:不是一个字段的任何数据 比如排序选项,admin选项等等。 下面是所有可能用到的 Meta 选项。没有一个选项是必需的。 是否添加 class Meta 到
1. __init__(self) 在中间件类中, __init__() 方法用于执行系统范围的初始化设置。 出于性能的考虑,每个已启用的中间件在每个服务器进程中只初始化一次。 也就是说 __init__() 仅在服务进程启动的时候调用,而在针对单个request处理时并不执行。 对一个middleware而言,定义 __init__() 方
Django的标准库存放在 django.contrib 包中。每个子包都是一个独立的附加功能包。 这些子包一般是互相独立的,不过有些django.contrib子包需要依赖其他子包 在 django.contrib 中对函数的类型并没有强制要求 。其中一些包中带有模型(因此需要你在数据库中安装对应的数据
笔者所在的小组负责SaaS开发,几乎承载了中心的全部SaaS需求。其中,有长期维护的重点项目,也有短期突击的演示项目,每个人都身兼数职。当然,开发平台也开放给其他人员使用,整个平台有着成百上千的SaaS应用。这些应用中存在大量重复的功能块,
副标题: 核心原理与案例分析 作者: 李智慧 出版社: 电子工业出版社 出版年: 2013-9-1 ISBN: 9787121212000 Notes: 没有业务对技术的需求,培养不出优秀的架构师。 作者是伴随着淘宝业务增长,一起成长起来的。 书中主要从系统性能,可用性,伸缩性,扩展性,安全性几个方面阐述网站架构技术要点
登录的会话机制: http 是无状态协议,浏览器的每次请求都是相互独立。但并不是每次 http 请求都与状态无关,为此,浏览器和服务器需要共同维护一个状态,这就是会话机制。一种方法是,浏览器第一次向服务器发起请求,服务器会将浏览器返回 sessionID,后续浏
副标题: 生活、工作与思维的大变革 作者: [英] 维克托·迈尔·舍恩伯格 出版社: 浙江人民出版社 出版年: 2012-12 ISBN: 9787213052545
Python、Excel常用于数据处理,难免会产生相互的数据传递、计算处理。本文主要介绍Python-Excel系列的库,以及xlrd和xlwt两个库是使用。 1. 常用库 xlwings,openpyxl,pandas,win32com,xlsx
1. 经济 世界银行 Gapminder 世界卫生组织和世界银行覆盖经济、医疗和社会统计数据 美国中央情报局,世界概况 包含267个国家的历史信息、人口、经济、政府、基设施和军事等信息 中国统计局最新宏观经济数据 工业和信息化部较多数据在此发布,尤其是有关工业运行及信息化相
作者: 威廉·萨默塞特·毛姆 出版社: 天津人民出版社 出版年: 2016-1-20 ISBN: 9787201100159
作者: 王小波 出版社: 北方文艺出版社 出版年: 2006-4 ISBN: 9787531719199
作者: 李尚龙 出版社: 中国友谊出版公司 出版年: 2015-7 ISBN: 9787505735361 Notes: 比较适合迷茫的大学生看。作者从军校辍学,成为新东方英语老师,最后写剧本拍电影,通过自己的努力过着自己选择的生活。书中主要记录作者一路走过的历程、人生观、价值观,希望给予读者以启发。
Note: 简单说几句,组内同学的分享。App Engine 将开发从繁琐的部署、配置流程中解脱出来,提供全方位的自动化支持服务。其中的 Controller 是 App Engine 的大脑,协调控制整个引擎的运作。PPT 中主要讲的是 App Engine 的设计方案和演化过程,还对资源调度、故障容灾进行了考虑。 由于其是微
平台目前包括多个子系统、多个版本,不同版本都是使用相同的运营系统。为了方便用户使用多个版本,我们需要绑定用户的QQ、微信帐号。此外,为了最大限度地防止由于某个登录系统故障而导致用户无法使用APP的情况,我们需要一个统一的帐号管理&登
作者: 罗纳德·F·布什 / 阿尔文·C·伯恩斯 出版社: 中国人民大学出版社 出版年: 2011-3-1 ISBN: 9787300133362
作者: 时寒冰 出版社: 上海财经大学出版社 出版年: 2014-7-1 ISBN: 9787564219239
作者: 时寒冰 出版社: 上海财经大学出版社 出版年: 2014-7-1 ISBN: 9787564219352 Notes: 作者对中国的债务、房产、人口、粮食进行了分形,对现况充满焦虑。还对地缘政治国家的经济政治形势进行了分形,阐述了美国美元的影响力,金融战的独孤求败,周边的俄罗斯、印度、越南、日本等国家与中
1. jQuery特征 jQuery消除了浏览器的兼容问题 遍历DOM树、选择元素 大量的插件库 工具函数库,$.type()、$.extent()等 jQuery的核心函数,通常指的是一个工厂对象,即jQuery()函数,或者更为常用的别名$()函数。
英文名:Professional jQuery 作者: [美] 奥特罗,[美] 劳伦斯 出版社: 清华大学出版社出版 译者: 施宏斌 出版年: 2013-04 ISBN: 9787302317845
作者: 道格拉斯•W•哈伯德 副标题: 大数据时代,《财富》500强都在使用的量化决策法 出版社: 世界图书出版公司 译者: 邓洪涛 出版年: 2013-09-01 ISBN: 9787510067327 Note: 量化是用来减少不确定性,而不是消除。 量化关键在于要弄清楚要量化什么,以及被量化的事物为什么重要。 量化的目的
作者: [美]纳西姆•尼古拉斯•塔勒布 副标题: 从不确定性中获益 原作名: Antifragile: Things That Gain from Disorder 出版社: 中信出版社 出版年: 2014-01-01 ISBN: 9787508643335
作者: Mark Pilgrim 出版社: Apress 出版年: 2004-07-19 ISBN: 9781590593561
1. 什么是 DDoS 举个栗子,春节买票期间,高铁票一出,全国人民都向12306的服务器发送连接请求。然后,12306的服务器就会不响应或者较慢响应网页请求。这就构成了一次DDoS攻击。通过大量并发的请求,迫使目标服务受到影响,甚至终止。 DDoS攻击是
1. 应用场景 通过配置文件,控制程序运行时的流程。配置文件中常保存的是,字符串,而不是对象 调试程序时,查看对象的全部属性值 动态模块的导入 对于第一种场景,广泛被采用的是反射。在Java的很多框架中都使用了反射机制,Python实现的Web框架Dj
副标题: 让学习过程变得积极愉悦的成人培训新方法 作者: [美] Harold D.Stolovitch Erica J.Keeps 出版社: 企业管理出版社 出版年: 2012-1 ISBN: 9787802558861 Note: 主要论述了交互式培训能达到十分好的培训效果,分析了培训学习过程和心理,提出了四种培训的方法和一些建议。 培训的目标是,以学习者为中心,以绩
1. 社会是如何靠信用运作起来的 首先我们来做一个问答: @ask:为什么你用一张卡片就能乘坐公交? @answer:我充了钱啊 @ask:钱?那你哪里来的钱 @answer:每个月的工资啊 @ask:公司为什么每个月要给你发工资? @answer:签了合约
1. Black-Scholes 期权定价模型的意义 Black-Scholes 模型以及它的一些变形已被期权交易商、投资银行、金融管理者、保险人等广泛使用。衍生工具的扩展使国际金融市场更富有效率,但也促使全球市场更加易变。新的技术和新的金融工具的创造加强了市场与市场参与者的相互依赖,不仅限于一国
英文书名: The Black Swan 副标题: 如何应对不可预知的未来 作者: 纳西姆·尼古拉斯·塔勒布(Nassim Nicholas Taleb) 译者: 万丹 出版社: 中信出版社 出版年: 2009-8 ISBN: 9787508616018 Notes: 作者以自身经历,黎巴嫩战争,记者的战争日记,股票崩盘,叶夫根尼亚的书为切入。切身描述这个处于
函数 描述 abs(number) 返回一个数的绝对值 apply(function[, args[, kwds]]) 调用给定函数,可选择提供参数 all(iterable) 如果所有iterable的元素均为真则返回True, 否则返回False any(iterable) 如果有任一iterable的元素为真则返回True,否则返回False basestring() str和unicode抽象超类,
1. Quant的工作内容 Quant的工作就是设计并实现金融的数学模型,包括衍生物定价,风险估价或预测市场行为等。 2. Quant的种类 Desk quant,开发直接被交易员使用的价格模型。 优势是接近交易中所遇到的money和机会。劣势是压力很大。 Model validating qu
1. Koch曲线 瑞典数学家Helge von Koch,在1904年发表的“从初等几何构造的一条没有切线的连续曲线”的论文中提出Korch曲线。它的描述如下: 指定一条线段的长度\(l\)(可以理解为第0次迭代) 将这条线段三等分,并以中间的线段为底边构
1. 分形理论 1.1 分形的定义 分形,通常指一个几何形状,可以分成数个部分,而每一部分都近似地是整体缩小后的形状,即具有自相似的性质。 1.2 分形研究的历史 公元17世纪,莱布尼茨就思考过自相似的问题。公元18世纪卡尔·魏尔施特拉斯、格奥尔格·康托尔和费利克
1. Django内置权限管理 1.1 权限分类 Permission 用来定义用户User A对任务Task的权限。 User 如果User A 对Model B有权限,那么User A 对Mode B中的全部实例都有相应权限。User对象的user_permission 字段用于管理用户的权限。
1. 背景 在Web开发的过程当中,常会涉及多个环境(本地、测试、正式环境)之间数据的迁移。本文主要探讨在django开发过程中,可能涉及的数据迁移路径,并寻找可行的方法。 2. 场景 数据迁移对象,一共分为四个:测试环境数据库、正式环境数据库、本地开发
1. 工作场景 本人所在的小组,20+人的规模,兼具PaaS和SaaS开发的职责。 开发PaaS的人员PaaSer,主要负责PaaS平台的开发和维护,目标是对SaaS开发提供需要的API和文档。 开发SaaS的人员SaaSer,主要负责开发基于上述P
1. 遇到了什么问题 如果实现的功能简单,开发和维护容易,是不会有设计模式、框架等相关问题研究的。正是因为,Web系统复杂、需求变更快、复用多,开发人员多、人员交接频繁。我们需要一定的约定规则去规避,这些环节产生的风险。 其中大量的研究工作在,系统
副标题: 技术与最佳实践 英文书名:Automation Operations With Python Technique And Best Practices 作者: 刘天斯 出版社: 机械工业出版社 出版年: 2014-11-1 ISBN: 9787111483069 Notes: 作者以其运维经历,详细描述了以python为基础的各种工具的使用和配置,是一本适合python运维人员的资料书。
1. Django是什么 Django是一套由Python完成的Web开发框架,起初被开发者用于管理以新闻内容为主的网站,2005年7月在BSD许可证发布下开源,2008年6月17日正式成立基金会。与Django一起的Python Web框架还有,
1. 概览 DevOps(Development和Operations的组合词)是一种重视「软件开发人员(Dev)」和「IT运维技术人员(Ops)」之间沟通合作的文化、运动。透过自动化「软件交付」和「架构变更」的流程,来使得构建、测试、发布软件能
本人所在的岗位职责,涉及全栈开发,不仅要用 Python 写后台逻辑,还要自己写前端界面和交互。开发的程序部署于 Paas 平台,考虑到开发人员是非专业前端,为了降低开发门槛,提供了一种类似 Dreamweaver 的工具。使得开发人员可以通过,拖拽、拷贝等形式快速开发出页面,然后转向后
1. BWAPP简介 buggy web Application,简称BWAPP,这是一个集成了各种常见漏洞和最新漏洞的开源Web应用程序,目的是帮助网络安全爱好者、开发人员和学生发现并防止网络漏洞。包含了超过100种漏洞,涵盖了所有主要的已知Web漏洞,包括O
1. SOA 面向服务架构(SOA),阐述了对于复杂的企业IT系统,应按照不同的、可重用的粒度划分,将功能相关的一组功能提供者组织在一起为消费者提供服务,其目的是为了解决企业内部不同IT资源之间无法互联而导致的信息孤岛问题。 SOA的基本设计思想是:对
现在的企业,业务繁多,常常需要大量的域名来支持业务的发展,本文从企业域名的选择、域名与企业品牌建设、站点的SEO、站点的安全性四个方面考虑,企业应该怎样去规划和建设自己的域名体系。 1. 写在前面的一些话 如果是小公司可以暂时不用考虑域名群的建设,
副标题: 用失传的技艺练就强大的生存实力 英文书名: Convict Conditioning 作者: [美] 保罗·威德 出版社: 北京科学技术出版社 出版年: 2013-10-1 ISBN: 9787530467558
1. Burpsuite简介 Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。 所有的工具都共享一个能处理并显示HTTP 消息、持久性、认证、代理、日志、警报的一个强大的可扩展的框架
这篇围绕全部源代码的控制工具Git展开。 1. 为什么是Git? 为了深入探讨git和集中式源码版本控制系统的利弊,参见这里。这方面有太多的激烈争论。作为一个开发者,相比其他工具,当前我更喜欢Git。Git的确改变了开发者关于合并与分支的思考方式。
1. Chrome增强功能的方式:扩展、插件、应用 Google Chrome(谷歌浏览器)发展至今,已经不仅仅是一个浏览器,更像一个平台,可以个性化的安装自己需要的服务,同时也可以通过它来发布自己提供的服务。目前主要有三种方式来扩展浏览器的功能: 2. 扩展(E
英文书名: Professional JavaScript for Web 作者: [美] Nicholas C. Zakas 出版社: 图灵程序设计丛书 出版年: 2012-3-29 ISBN: 9787115275790
1. 事件处理模型:冒泡和捕获型 1 2 3 <div id="outer"> <p id="inner">Click!</p> </div> 上面的代码当中一个div元素当中有一个p子元素,如果两个元素都有一个click的处理函数,那么我们怎么才能知道哪一个函数会首先被触发呢? 为了解决这个问题微软和网景提出了两种几乎完全相反的概念。 事件
背景: 刚做完一个django的数据查询web项目,数据来源于内部API查询,每次查询都需要调用若干API查询数据渲染在前端页面。由于,相关的数据不会经常变动,为了提高前端响应速度、在API不可用时依然能够查询,设计了缓存。API查询到的数据
场景一:公司准备给全部员工推送一个邮件公告。采用封装的邮件库API,使用一次循环遍历全部员工推送邮件,会使主程序卡在循环处无法响应,这是我们不愿意看到的,我们希望点击执行之后,可以正常其他操作。场景二,量化程序的本地回测数据库每天都要更新。
1. 丙类账户 银行间债券市场结算成员分为甲类成员、乙类成员和丙类成员。甲类户主要为商业银行,乙类户为农信机构、券商、基金和保险等,丙类户主要为非金融机构法人,其交易结算需要委托甲类成员代为办理。丙类户开户门槛较低,缺乏实质性监管。 2. 银行间债市 银
副标题: 华尔街的投资游戏 英文书名: Liar’s Poker 作者: [美] 迈克尔·刘易斯 出版社: 中信出版社 出版年: 2007-1 ISBN: 9787508607559
美林投资时钟理论是一种将资产、行业轮动、债券收益率曲线以及经济周期四个阶段联系起来的方法,是一个非常实用的指导投资周期的工具。 美林投资时钟的分析框架,可以帮助投资者识别经济周期的重要转折点。而正确识 别经济增长的拐点,投资者可以通过转换资产以
中文书名: Python核心编程(第二版 英文书名: Core Python Programming, 2nd Edition 作者: [美]Wesley J. Chun 出版年: 2008-06 ISBN: 9787115178503
1. ICANN的前生今世 ICANN,The International Corporation for Assigned Names and Numbers,成立于1998年,负责分配域名和IP地址等互联网资源。ICANN的前身是IANA (Internet Assigned number Authority),之前一直受美国国防部直接资助,为了避免一国控制互联网的局面,19
作者: 渔阳 副标题: 一位华人交易员的经历 出版年: 2011-3-2 ISBN: 9787300132440 Notes: ROE = 净利润/股东权益(Net Profit / Equity) =(净利润/销售收入)*(销售收入/总资产)*(总资产/股东权益) (Net Profit / Sales) * (Sales / Assets) * (Assets / Equity) = 销售利润率 * 资产周转率 * 财务杠杆比率 (Profit Margin) * (Asset Turnover) * (Financial Leverage) 为了提高
1. 什么是域名 1.1 域名的构成 本站完整的域名应该是这样:www.chenshaowen.com. 注意最后面的点,通常可以省略。域名从后往前看,.com是顶级域名,chenshaowen是二级域名,www是通信协议。 域名可以英文字母和阿拉伯数字以及
很久很久以前,有一片有着很多很多大树的独角兽森林,森里面生活着一只独角兽妈妈和一只小独角兽,还有很多很多的小动物。 独角兽妈妈有着一个很漂亮的犄角,长在头上漂亮极了,她的犄角有魔法,小兔子受伤了,独角兽妈妈用她的犄角一碰,犄角上洒下的闪光落在
中文书名: 货币崛起:金融如何影响世界历史 英文书名: The Ascent of Money: A Financial History of the World 作者: [英]尼尔·弗格森 出版年: 2009-6 ISBN: 9787508615073 Notes: 货币实际上就是一个信任问题,甚至是一种信仰:信任体现于货币的发行中,个人使用或者机构兑现支票或转让支票。货币不是金属,而是一种记名
1. 综合交易平台(CTP)简介 综合交易平台是由上海期货信息技术有限公司以上海期货交易所的交易系统为基础,专门为期货经纪公司而开发的一套期货经纪业务管理系统,整个系统由交易、风险控制(简称为风控)和结算三大系统组成。系统能够同时连通国内四家期货
中文书名: 金融的本质:伯南克四讲美联储 英文书名: The Federal Reserve and the Financial Crisis 作者: 【美】伯南克 出版年: 2014-4 ISBN: 9787508644097 Notes: 2008年金融危机的主要原因在于:金融机构对自身风险管理能力过度自信,人人坚信房价会持续上涨,银行认为抵押贷款可以轻易转售出去,国际客户对“安全
中文书名: 定位 - 有史以来对美国营销影响最大的观念 英文书名: Positioning-The Battle for Your Mind 作者: 杰克·特劳特(Jack Trout) / 阿尔·里斯(AL Ries) Notes: 对于新的行业或产品,第一家公司是很容易在客户心中形成深入影响的,同时如果公司很成功,人们还会一个行业或
Ghost版本:“version”: “0.9.0-beta.2” |— content 内容目录 | |— apps 目录,暂时为空,以后可能Ghost上能直接部署app | |— data 数据库文件夹 | |— images 图片文件夹 | |— themes Ghost主题文件夹 |— core 核心模块目录 | |— client 客户端代码文件夹 | |— server 服务
1. 前端自动化构建工具 在处理前端场景时,用 Less 写 CSS,用 Jade 写 HTML,用 Browserify 模块化,为非覆盖式部署的资源加 MD5 戳等。这些工作如果纯手工来做,工作效率将会非常低。而前端自动化构建工具可以把这些重复工作一次配置,多次重复执行,极大的提高开发效率。 前端
1. SSL证书 先来了解几个概念 1.1 数字证书 包含加密用的公钥或私钥,还有一些身份附加信息。任何人都可以使用相关工具生成自己的数字证书,用来加密文件、邮件,或用于通讯加密。 1.2 SSL 协议 用于网络通讯的加密协议。通信过程需要一份数字证书,使用里面的公钥及私
本文主要介绍了Telnet、SSH 的通信原理,分析了其通信时的工作流程。 1. Telnet 无论Telnet协议连接的是什么类型终端,都会转换为NVT(Net Virtual Terminal)格式进行通信。网络虚拟终端NVT是Telnet异构跨平台的基础。 1.1 Telnet 的工作进程
匿名通信是由 Chaum 提出的,他提出了基于Mix节点的匿名通信算法,Mix 节点接收多个发送者的消息,并对这些消息进行混合处理,然后传输给接收者,因此掩盖了发送者和接受者的身份信息,实现了匿名。 1. 匿名通信的基本框架 1.1 匿名属性 匿名属性包括不可辨识性(u
中文书名: 共享经济: 重构未来商业新模式 英文书名: Peers Inc: How People and Platforms Are Inventing the Collaborative Economy and Reinventing Capitalism 作者: [美] 罗宾•蔡斯 出版年: 2015-9-25 ISBN: 9787213067853 Notes: 作者以自己创建的Zipcar公司为入口,通过分析当下知名共享公司Uber和Airbnb,对共享经济模式进行了详细深入的解读。共
本文主要介绍了在Linux上如何通过编译安装Nginx,并开启htttp2,还对使用http1.1和http2.0协议的访问本站的速度进行了比较。 1. 编译安装 Nginx 首先需要下载Nginx和它的几个依赖包。Zlib,Web请求传输时对数据进行压缩,
Recent content on 陈少文的网站
1. 链式提示系统(Prompt chaining) 提示链将任务分解为一系列步骤,其中每个 LLM 调用都会处理前一个步骤的输出。 2. 路由系统(Routing) 路由会对输入进行分类,并将其定向到专门的后续任务。 3. 并行化系统(Parallelization)
1. 处理确定故障 对于有具体处理方式的故障,直接使用 Agent 处理,发通知周知即可。 类似的自动处理,我们有应用层的异常负载删除、节点层的磁盘清理、GPU 掉卡屏蔽卡、屏蔽节点等。先找出团队中遇到得最多、需要最多人力的事情,对其进行自动化处理。你可以认为,
1. 原始模型测试 启动环境 1 2 3 4 5 6 7 8 9 10 nerdctl run -it \ --gpus all \ --ipc=host \ -p 8000:8000 \ --ulimit memlock=-1 \ --ulimit stack=67108864 \ --name vllm \ --volume /data/models:/data/models \ --entrypoint /bin/bash \ vllm/vllm-openai:v0.10.1.1 后面 vllm 相关的测试,都基于这个环境。 启动服务 1 2 3 4 5 6 export CUDA_VISIBLE_DEVICES=0 python3 -m vllm.entrypoints.openai.api_server \ --model /data/models/Qwen3-0.6B \ --served-model-name /data/models/Qwen3-0.6B \ --host 0.0.0.0 \ --port 8000 测试 1 2 3 4 5 6 7 8 curl -X POST "http://127.0.0.1:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ -d '{ "model": "/data/models/Qwen3-0.6B", "messages": [ {"role": "user",
1.为什么要 PD 分离部署大模型应用 在大模型推理的过程中,有两个串行阶段: 处理全量的输入上下文,生成 KV Cache(Prefill 阶段) 增量生成新的 token(Decode 阶段) 这两个阶段对资源的需求不一样。Prefill 阶段要计算大量的 KV Cac
1. LMCache 简介 TTFT 是指从请求发出到模型生成第一个 token 的时间。由于 Prefill 阶段需要把输入的上下文编码成 KV Cache,才能开始生成,在生成第一个 token 时需要大量的计算从而导致 TTFT 很高。 为了降低 TTFT,有一个思路就是将 Prefill 阶段计算出来的 KV Cache 缓存起来,下次遇到相同的上下
1. 什么是 Prefix Cache 在模型推理场景下,经常会使用缓存机制来提升吞吐和性能。常见的有两种缓存机制: Key-Value Cache (KV Cache),面向的是单次请求的内部,将 Transformer 模型中间计算结果(Key 和 Value)缓存起来,避免重复计算 Prefix Cache,面向的是多次请求时,利用 Prompt 的公
1. 安装驱动 下载驱动 访问 https://www.nvidia.com/en-us/drivers/ 选择对应的驱动版本下载 1 wget https://us.download.nvidia.com/XFree86/Linux-x86_64/580.76.05/NVIDIA-Linux-x86_64-580.76.05.run 安装驱动 1 bash NVIDIA-Linux-x86_64-580.76.05.run 查看显卡 1 nvidia-smi 1 2 3 GPU 0: NVIDIA GeForce RTX 5090 (UUID: GPU-92fcdc58-4754-73c7-af6c-56740936817d) GPU 1: NVIDIA GeForce RTX 5090 (UUID: GPU-e05cb455-7dd3-0db5-ac39-70794aa19d4e) ... 开启持久模式 1 nvidia-smi -pm 1 查看拓扑结构 1 nvidia-smi topo -m 1 2 3 4 5 6 7 8 9 GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 CPU Affinity NUMA Affinity GPU NUMA ID GPU0 X PIX NODE NODE SYS SYS SYS SYS 0-47,96-143 0 N/A GPU1 PIX X NODE NODE
1. 什么是模型量化 模型量化是将高精度的模型(通常为 32 位浮点数 FP32 或 16 位浮点数 FP16 )的权重和激活值转换为低精度模型(如 8 位整数 INT8)的过程。 FP32 的值范围为 -3.4*10^38 到 3.4*10^38,有 40 亿个值。而对于 INT8,我们只能看到可能值集内的 256 个值,值范围为
1. 基础包 Kubernetes 版本 ≥ 1.18 socat 必须安装 conntrack 必须安装 ebtables 可选,但推荐安装 ipset 可选,但推荐安装 ipvsadm 可选,但推荐安装 1 apt-get -y install socat conntrack ebtables ipset ipvsadm 2. 端口要求 2.1 基础节点服务 Service Protocol Action Start Port End Port Comment ssh TCP allow 22 22 节点远程管理 docker TCP allow 2375 2376 Docker 远程通信 etcd TCP allow 2379 2380 etcd 集群通信 2.2 Master/Control Plane 组件 Service Protocol Action Start Port End Port Comment apiserver
1. cgroup v1 与 v2 接口路径差别 v1 1 2 3 4 /sys/fs/cgroup/cpu/cpu.cfs_quota_us /sys/fs/cgroup/cpu/cpuacct.usage /sys/fs/cgroup/memory/memory.limit_in_bytes /sys/fs/cgroup/memory/memory.usage_in_bytes v2 1 2 3 4 /sys/fs/cgroup/cpu.max /sys/fs/cgroup/cpu.stat /sys/fs/cgroup/memory.max /sys/fs/cgroup/memory.current cgroup v2 是 v1 的升级版本,具有更统一的资层级管理、精准的资源隔离等优点。但也导致了,写代码时,读取相关接口文件时路径不一样,需要做兼容处理。另外,一个思路就是,统一到一个 cgroup 版本。 Kubernetes 默认支持
同样适用于桌面环境。 1. 准备 node.js 环境 安装 nvm 1 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash 1 2 echo 'export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"' >> ~/.bashrc echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc 1 source ~/.bashrc 查看 nvm 版本 1 nvm --version 安装 node.js 1 nvm install 20 升级 npm 1 npm install -g npm 2. 安装 claude-code 安装包 1 npm install -g @anthropic-ai/claude-code 查看版本 1 claude --version 1 1.0.96 (Claude Code) 3. 安装 claude-code-router claude-code 目前仅能调用 Claude 的 API。使
处理故障时,参考或者记录下的内容,持续更新中 1. 容器挂载设备 1 export IMAGE=ascendai/pytorch:2.1.0 1 2 3 4 5 6 7 8 9 10 nerdctl run --rm -it --ipc=host \ --device=/dev/davinci7 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ ${IMAGE} \ /bin/bash 2. 创建 Pod 1 2 export IMAGE=ascendai/pytorch:2.1.0 export NodeName= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 kubectl create -f - <<EOF apiVersion: v1 kind: Pod metadata: name: test-ascend-pod namespace: default spec: restartPolicy: Never nodeName: ${NodeName} containers: - name:
1. 什么是 DCGM DCGM (Data Center GPU Manager) 是 NVIDIA 提供的一个用于数据中心 GPU 管理和监控的工具集,提供了以下功能: GPU 行为监控 GPU 配置管理 GPU 策略监督 GPU 健康和诊断 GPU 计费和进程统计 NVSwitch 配置和监控 2. 安装 DCGM 2.1 安装 libnvidia-nscq 一般都是 NVLink 连接 GPU,可以通过 nvidia-smi topo -m 查看是否有 NVSwitch 字样输出判断是否需要安
1. 什么是僵尸进程 进程的创建过程: 父进程调用 fork() 创建子进程 子进程执行 exec() 加载新程序 子进程结束执行,调用 exit() 或返回 父进程调用 wait() 或 waitpid() 如果父进程没有调用 wait() 或 waitpid(),子进程结束后仍然保留在系统中,成为僵尸进程。 2. 怎么查看僵尸进程 可以使用 ps 命令查
VLLM Benchmark 是 VLLM 提供的一个用于测试模型性能的工具,支持多种推理后端。本文主要记录一些使用 VLLM Benchmark 进行模型性能测试的过程。 1. 启动模型服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 python -m vllm.entrypoints.openai.api_server \ --model /models/Qwen2.5-7B-Instruct \ --served-model-name /models/Qwen2.5-7B-Instruct \ --host 0.0.0.0 \ --port 8000 \ --trust-remote-code \ --dtype bfloat16 \ --gpu-memory-utilization 0.90 \ --max-model-len 4096 \ --max-seq-len-to-capture 8192 \ --max-num-seqs 128 \ --disable-log-stats \ --tensor-parallel-size 1 \ --no-enable-prefix-caching 2. 启动客户端
1. 打脸式删库删镜像删文档 发起人 Ray 在职青云科技的最后一天,开源项目 KubeSphere 的前端、文档、镜像被删除,用户在各种渠道收到【关于 KubeSphere 开源项目调整的公告】。 即使,这家公司管理层对 KubeSphere 分歧很大,对某些人有针对性、有敌意,也不至于如此粗暴与迅速。只能说,这事办得
1. 部署 NFS 存储 1.1 在存储节点配置 NFS 服务 存储节点安装 NFS 服务 1 apt-get install -y nfs-kernel-server 启动并设置 NFS 服务开机自启 1 systemctl start nfs-server.service & systemctl enable nfs-server.service 配置 NFS 共享目录 1 mkdir -p /data/nfs 1 vim /etc/exports /data/nfs *(rw,sync,no_root_squash,no_all_squash) 重启 NFS 服务 1 systemctl restart nfs-server.service 1.2 在全部节点配置 NFS 客户端 1 apt-get install -y nfs-common 2 配置 StorageClass 1 2 helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version v4.9.0 1 2 3 4 5 6 7 8
1. history 命令 使用 history 命令可以查看当前会话的命令历史记录,当退出 shell 时,命令历史会被保存到对应的历史文件中。 如果是 bash,则命令历史会保存在 ~/.bash_history 文件中;如果是 zsh,则保存在 ~/.zsh_history 文件中。也可以使用 HISTFILE 环境变量来指定历史记录文件的位置,export HISTFILE=/data/ops/bash_history 。 2. 如
2025 Intrinsic Fingerprint of LLMs [发布日期: 07-04] 点击查看 论文提出了一种基于注意力参数矩阵(Q/K/V/O)层间标准差分布模式的鲁棒指纹识别方法,用于检测大型语言模型(LLM)的血缘关系(如是否通过继续训练/微调/升级再造衍生自另一模型),并声称该方法揭示了华为 Pangu Pro
1. 获取项目 ID 和 API 密钥 访问 https://aistudio.google.com/apikey 获取项目 ID 和 API 密钥,并设置为环境变量 1 2 echo "export GOOGLE_CLOUD_PROJECT=" >> ~/.bashrc echo "export GEMINI_API_KEY=" >> ~/.bashrc 1 source ~/.bashrc 2. 准备 node.js 环境 安装 nvm 1 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash 1 2 echo 'export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"' >> ~/.bashrc echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc 1 source ~/.bashrc 查看 nvm 版本 1 nvm --version 安装 node.js 1 nvm install 20 升级 npm 1 npm install -g npm 3. 安装 gemini 1
1. 安装依赖 MindCluster ToolBox 是一套面向集群运维与硬件管理的系统级工具集,主要用于设备监控、性能测试、日志收集等运维操作。 MindCluster ToolBox 中包括 Ascend DMI 工具、日志收集工具和 Ascend Cert 工具。 MindCluster ToolBox 工具的原理是,通过调用底层 DCMI(设备控制管理接口)以及 AscendCL(Ascen
1. k8s-device-plugin https://github.com/NVIDIA/k8s-device-plugin 是 NVIDIA 官方提供的 Kubernetes 设备插件,用于在 Kubernetes 集群中管理和分配 NVIDIA GPU 资源。 k8s-device-plugin 通过与 kubelet 的交互,自动发现和注册 GPU 设备,并将其作为资源提供给 Kubernetes 调度器。它支持多种 GPU 型号,并能够处理 GPU 的分片和共享。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: restartPolicy: Never containers: - name: cuda-container
1. 设置环境变量 设置 foundationdb 集群名称和版本 1 2 3 4 5 export CLUSTER_NAME= export NAMESPACE= export DEPLOY_NAME=${CLUSTER_NAME}-deployment export SECRET_NAME=fdb-backup-secret export VERSION=7.1.26 设置 S3 备份存储桶和凭证 1 2 3 4 5 export BUCKET= export HOST=s3.us-west-2.amazonaws.com export AK=x export SK=x export S3_BACKUP_URI="blobstore://${AK}:${SK}@${HOST}/fdb-backup?bucket=${BUCKET}&sc=0" 2. 创建凭证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: ${SECRET_NAME} namespace: ${NAMESPACE} type: Opaque stringData: credentials: | { "accounts": { "${BUCKET}@${HOST}": { "access_key": "${AK}", "secret": "${SK}", "endpoint": "${HOST}" } } } EOF 3. 创
副标题: 开启自我改变的原动力 作者: 周岭 出版社: 人民邮电出版社 出版年: 2020-10 ISBN: 9787115543424 Notes: 这本书分为两个部分。 第一部分是向内的,认识自我。从三位一体脑理论出发,介绍脑的运作方式。本能脑维持基本生理需求,情绪脑负责情绪和社交,理性脑处理逻辑和决策。但大部分
1. 背景 Node Exporter 是 Prometheus 生态系统中用于收集主机指标的常用组件,但默认情况下不提供访问认证。本文介绍如何为 Kubernetes 环境中的 Node Exporter 添加基本认证,提高安全性。 2. Node Exporter 配置凭证 2.1 生成加密密码 使用 htpasswd 工具生成加密密码: 1 htpasswd -nBC 12 "" | tr -d ':\n' 这里需要输入密码,生成的输出将是一个
1. smokeping-prober 是什么 smokeping-prober 是一个用于探测网络质量的工具,它通过向目标节点发送 ICMP 请求来探测网络质量。 2. 部署 smokeping-prober 2.1 生成 smokeping-prober.yaml 配置文件 1 2 3 4 5 6 7 8 9 10 11 cat > smokeping_prober.yaml <<EOF --- targets: - hosts: - 1.2.3.4 interval: 1s # Duration, Default 1s. network: ip # One of ip, ip4, ip6. Default: ip (automatic IPv4/IPv6) protocol: icmp # One of icmp, udp. Default: icmp (Requires privileged operation) size: 56 # Packet data size in bytes. Default 56 (Range: 24 - 65535) tos:
1. Cline 使用 Ops 查询有哪些集群 获取节点的详情 Case 非常简单但数据真实,说明 Cline 已经能够对接 Ops 进行运维操作。至于更复杂的一些 Case 需要更多测试。具体的玩法可能在于: 给定一些特定的 Workspace 作为上下文信息、设置自定义的指令强化某些特征等。 2. Cline 配置 Ops MCP 2.1 前提条件 使用 Cline 需
1. 问题描述 相关 Pod 1 2 3 4 5 6 kubectl -n istio-system get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES istiod-647c7c9d95-7n7n6 1/1 Running 0 77m 10.244.173.51 docs-ai-a800-4 <none> <none> istiod-647c7c9d95-k6l88 1/1 Running 0 30m 10.244.210.160 ai-a40-2 <none> <none> istiod-647c7c9d95-pj82r 1/1 Running 0 51m 10.244.229.217 docs-ai-a800-2 <none> <none> 相关 Service 1 2 3 4 kubectl -n istio-system get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istiod ClusterIP 10.99.225.56 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 645d 1 2 3 4 kubectl -n istio-system get endpoints NAME ENDPOINTS AGE istiod 10.244.173.51:15012,10.244.210.160:15012,10.244.229.217:15012 + 9 more... 645d Endpoints 与 Pod 的 IP 是一致的。 测试结果 在异常节点
1. 背景 在测试 NFS Over RDMA 的性能时,发现 4M 的文件的读取性能竟然能达到 45GB/s。 1 2 3 fio -numjobs=128 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/data1/nfs READ: bw=42.3GiB/s (45.4GB/s), 42.3GiB/s-42.3GiB/s (45.4GB/s-45.4GB/s), io=1269GiB (1363GB), run=30019-30019msec 而磁盘的 4M 多线程读取性能只有 6 GB/s 1 2 3 fio -numjobs=128 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/data1/host READ: bw=6190MiB/s (6491MB/s), 6190MiB/s-6190MiB/s (6491MB/s-6491MB/s), io=182GiB (196GB), run=30152-30152msec 2. NFS Over RDMA VS NFS 3. 数据拷贝路径比较 3.1 NFS
1. Direct IO Direct IO 绕过了操作系统的页缓存(page cache),直接与硬件设备进行数据交互。 Direct IO 的特点: 新数据多,不需要缓存 内存占用少 大文件顺序读写 对于超过阈值(默认 1MB)的同步读取操作,3FS 的客户端会将其转为 AIO (以 Direct IO 方式打开文件)操作以提高
记录一些 DeepSeek 3FS 的运维操作,持续更新中。 1. 基本概念及注意事项 Chain 一个 Chain 是由若干个 Target 组成,每个 Target 是一个存储的副本。在全部提交就绪的情况下,一个 Chain 的所有 Target 都是一致的。 一个 Chain 上的 Target 不能在同一个节点上。 Chain 就是存储的空间,写文件是会被分配到一个 Chain 上,读文件
1. 部署方案 在开始容器化部署之前,先提几点要求: 为了简化交付,只需要一个镜像 为了可靠性,尽可能多副本部署 通过不同的参数启动不同的服务 通过环境变量注入配置,渲染到配置文件中 下面是 DeepSeek 3FS 的部署方案: 需要部署: 一个 Monitor 用来收集监控数据,数据存储在 ClickHouse 中 一
1. 硬件测试 有两块 NVMe SSD SAMSUNG MZQL27T6HBLA-00A07,两个节点组成的 3FS 集群,每个节点有 4 个 IB 网口。 1.1 单线程 磁盘 FIO 128 K,读 1 fio -numjobs=1 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=128K --group_reporting -size=100M -time_based -runtime=30 -name=fio-test -directory=/data/fio 1 Jobs: 1 (f=1): [R(1)][100.0%][r=2211MiB/s][r=17.7k IOPS][eta 00m:00s] 磁盘 FIO 128 K,写 1 fio -numjobs=1 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=write -bs=128K --group_reporting -size=100M -time_based -runtime=30 -name=fio-test -directory=/data/fio 1 Jobs: 1 (f=1): [W(1)][100.0%][w=3703MiB/s][w=29.6k IOPS][eta 00m:00s] 磁盘 FIO 4 M,
1. 为什么要将 3FS 对接到 Fluid 3FS 是 DeepSeek 开源的分布式存储系统,因其极优异的性能测试结果,而被津津乐道,star 量快速飙升。 我所在的团队也对 3FS 展开了技术上的跟踪,寻找合适的应用场景,发挥 AI 硬件基础设施的最大价值。 我们线上推理、训练服务使用的存储系统都是通
1. 前置条件 存储与使用存储的节点组成 RDMA 网络 RDMA 设备配置了 IP 地址 如果使用的是 Mellanox 网卡,在安装驱动时需要加上参数 -with-nfsrdma 1 ./mlnxofedinstall --with-nfsrdma 2. 服务端启动 安装依赖 1 apt install nfs-kernel-server rdma-core -y 加载内核模块 1 modprobe svcrdma 将端口加入 portlist 1 echo 'rdma 20049' | tee /proc/fs/nfsd/portlist 挂载目录 1 mkdir /data1/nfs 1 2 3 vim /etc/exports /data1/nfs *(rw,sync,no_root_squash,no_all_squash) 启动 NFS 服务 1 systemctl start nfs-server.service 检测挂载
1. 现象 能查看 Pod 的信息 1 2 3 4 kubectl -n my-testns get pod my-testpod NAME READY STATUS RESTARTS AGE my-testpod 1/1 Running 0 2d13h 不能查看 Pod 的日志 1 2 3 kubectl -n my-testns logs my-testpod -f Error from server (NotFound): the server could not find the requested resource ( pods/log my-testpod) 在 Pod 所在主机上可以通过 docker logs 查看容器日志。 测试 Kubelet 的健康状态 OK 1 curl -k https://x.x.x.x:10250/healthz 这里要使用主机的 IP 地址,kubectl logs 命名会直接
由于机房服务器绑定的带宽较小,本篇主要是借助 Dante 提供 SOCKS5 转发,借助一些大带宽的服务器进行流量转发,用以加快依赖包的下载速度。 1. 找一台大带宽的服务器 安装 speedtest-cli 1 pip3 install speedtest-cli 列出对端测试服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 speedtest-cli --secure --list Retrieving speedtest.net configuration... 5396) China Telecom JiangSu 5G (Suzhou, China) [747.08 km] 16204) JSQY - Suzhou (Suzhou,
1. 测试全部带宽 在目标主机上启动 iperf3 服务端 1 2 3 4 5 iperf3 -s ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- 在客户端主机上测试 1 iperf3 -c x.x.x.x -p 5201 -t 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Connecting to host x.x.x.x, port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 151 MBytes 1.27 Gbits/sec 3562 164 KBytes [ 5] 1.00-2.00 sec 134 MBytes 1.12 Gbits/sec 230 164 KBytes [ 5] 2.00-3.00 sec 124 MBytes 1.04 Gbits/sec 250 213 KBytes [ 5] 3.00-4.00 sec 122 MBytes 1.03 Gbits/sec 229
1. 什么是 Ray 2016 年,UC Berkeley 的 RISELab 发布了一个新的分布式计算框架 Ray。 2017 年,发布 Ray 相关论文之后,受到业内的广泛关注,国内主要是蚂蚁集团采用并贡献了 Ray。 2020 年,Ray 发布了 1.0 版本,引入 Placement Group 特性,增加了用户自定义任务编排的灵活性,为后续的 Ray AI Libraries 和 vLLM 等
1. Qwen 模型介绍 2023 年 4 月,阿里巴巴推出 Qwen 的测试版。 2023 年 12 月,阿里巴巴开源了 Qwen 的第一个版本。 2024 年 9 月,阿里巴巴发布了 Qwen2.5。 2025 年 1 月,阿里巴巴发布了 Qwen 2.5-Max。 Qwen 2.5 是 Qwen 大语言模型的目前最新系列。之所以说是系列,是因为在训练完一个预训
NVIDIA_VISIBLE_DEVICES 指定程序可见的 GPU 设备 1 CUDA_VISIBLE_DEVICES=0,1 可用值: 1,2,以逗号分隔的 GPU UUID 或索引列表 all,所有 GPU none,加载驱动,但无法访问 GPU void,不加载驱动 NVIDIA_DRIVER_CAPABILITIES 控制哪些驱动程序库/二进制文件将被安装在容器内 1 NVIDIA_DRIVER_CAPABILITIES=compute,utility 可用值: compute,CUDA 和 OpenCL 应用程序所需。 co
HCCL_IF_IP 配置 HCCL 的初始化 root 通信网卡 IP 。 环境变量 HCCL_IF_IP > 环境变量 HCCL_SOCKET_IFNAME > docker/lo 以外网卡(网卡名字典序升序) > docker 网卡 > lo 网卡。 1 export HCCL_IF_IP=10.10.10.1 HCCL_IF_BASE_PORT 指定 Host 网卡起始端口号,配置后系统默认占用以该端口起始的 16 个端口进行集群信息收集,取值范围为[1024,65520] 。 1 export HCCL_IF_BASE_PORT=50000 HCCL_SOCKET_IFNAME HCCL 可通
1. 设置环境变量 1 2 export NAMESPACE=xxx export PVC=xxx 2. Dataset 无法就绪 2.1 Fluid 组件问题 1 kubectl -n fluid-system get pod -o wide | grep -v "Running" 可能出现没有正常启动的情况。 2.2 有异常的 Dataset 异常的资源可能导致 Fluid 资源不断重启,需要人工介入删除。 2.3 检查 Worker \ Fuse 副本 worker 副本 1 kubectl -n ${NAMESPACE} get sts -l release=${PVC} 1 kubectl -n ${NAMESPACE} get pod -l release=${PVC},role=juicefs-worker fuse 副本 1 kubectl -n kas-job get ds -l
1. 环境准备 下载 Miniforge 1 wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" 安装 Miniforge 1 bash Miniforge3-$(uname)-$(uname -m).sh 1 2 echo "export PATH=$HOME/miniforge3/bin:$PATH" >> ~/.bashrc source ~/.bashrc 创建环境 1 conda create -n vllm python=3.12 目前 vllm 要求 Python 3.9+ 激活环境 1 conda activate vllm 安装依赖 1 conda install vllm 2. 推理测试 2.1 模型准备 设置模型地址 海外 1 export MODEL_REPO=https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat 国内 1 export MODEL_REPO=https://hf-mirror.com/Qwen/Qwen1.5-1.8B-Chat 下载模型 1 nerdctl run --rm -v ./:/runtime shaowenchen/git lfs clone $MODEL_REPO 2.2 Offline Batched Inference 这种推理方式适用于离线场景,比
1. Nerdctl 安装 安装 Opscli 1 curl -sfL https://raw.githubusercontent.com/shaowenchen/ops/main/getcli.sh |VERSION=latest sh - 安装 Nerdctl 1 opscli task -f install-nerdctl --arch amd64 2. BuildKit 下载 Buildkit 1 wget https://github.com/moby/buildkit/releases/download/v0.19.0-rc2/buildkit-v0.19.0-rc2.linux-amd64.tar.gz 安装 Buildkit 1 2 tar xvf buildkit-*.tar.gz mv bin/* /usr/local/bin/ 配置 Buildkitd 1 mkdir -p /etc/buildkit /data/buildkit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cat > /etc/buildkit/buildkitd.toml <<EOF debug = true root = "/data/buildkit" [worker.oci] enabled = false [worker.containerd] address = "/run/containerd/containerd.sock" enabled = true platforms = [ "linux/amd64", "linux/arm64" ] namespace = "buildkit" gc = true gckeepstorage = 9000 cniPoolSize = 16 EOF 生成 Systemd Unit 文件 1 2 3 4 5 6 7 8
1. 制作镜像 为了方便测试,这里将模型文件打包到镜像中。 下载模型 1 2 3 4 git clone https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat cd Qwen1.5-1.8B-Chat && git lfs pull rm -rf .git cd .. 编写 Dockerfile 1 2 3 4 5 cat <<EOF > Dockerfile FROM vllm/vllm-openai:latest RUN mkdir -p /models/Qwen1.5-1.8B-Chat COPY Qwen1.5-1.8B-Chat/* /models/Qwen1.5-1.8B-Chat EOF 编译镜像 1 nerdctl build --platform=amd64 -t registry-1.docker.io/shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 . 推送镜像 1 nerdctl push --platform=amd64 registry-1.docker.io/shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 2. 主机上推理服务 设置环境变量 国内 1 export IMAGE=shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 国外 1 export IMAGE=registry-1.docker.io/shaowenchen/demo:vllm-qwen-1.5-1.8b-chat-amd64 指定设备,运
Embedding 模型 Embedding 模式将高维度的数据映射到低维度的空间,这样有利于数据的处理和分析。 文本模型 这里有一个排行榜,https://huggingface.co/spaces/mteb/leaderboard 在上面的排行榜中,会给出模型的评分,模型的参数量
1. 部署 Jumpserver 需要提前准备好 StorageClass,用于存储 Jumpserver 的数据。除了下面提到的数据库,各个组件 jms-core、jms-web、jms-koko、jms-lion、jms-chen 都需要一个 PV 存储。 1.1 部署 MySQL 参考 https://github.com/shaowenchen/ops-hub/blob/main/database/mysql8.yaml ,部署 MySQL。 需要调整
https://github.com/shaowenchen/ops 1. 告警 Kubernetes 集群的事件 监控指定的关键字 1 2 3 4 5 6 7 8 9 10 11 apiVersion: crd.chenshaowen.com/v1 kind: EventHooks metadata: name: kube-pod-falid namespace: ops-system spec: type: xiezuo url: https://xz.wps.cn/api/v1/webhook/send?key= subject: "ops.clusters.*.namespaces.*.pods.*.event" keywords: - failed 一份简单的配置,即可收获大量的相关告警。 监控之后,自动化处理 1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: crd.chenshaowen.com/v1 kind: EventHooks metadata: name: kube-no-free-node namespace: ops-system spec: additional: "action: restart-kubelet-bypod" keywords: - no free node subject: ops.clusters.*.namespaces.*.pods.*.event type: webhook url: http://x.x.x.x/webhook 借助 Ops Copilot 的执
本文使用的是 Fluid 1.0 版本,高版本的配置文件路径发生了变化,需要根据实际情况调整。 1. 制作镜像 1.1 fluid_config_init.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/usr/bin/env python import json import os rawStr = "" with open("/etc/fluid/config.json", "r") as f: rawStr = f.readlines() rawStr = rawStr[0] script = """ #!/bin/sh set -ex MNT_TO=$targetPath trap "umount ${MNT_TO}" SIGTERM mkdir -p ${MNT_TO}
1. Jindo 挂载 S3 配置环境变量 1 2 3 4 export ENDPOINT=obs.ap-southeast-3.myhuaweicloud.com export BUCKET= export AK= export SK= 创建凭证 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: mys3secret type: Opaque stringData: fs.s3.accessKeyId: ${AK} fs.s3.accessKeySecret: ${SK} EOF 创建 Dataset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: mys3-jindo spec: mounts: - mountPoint: s3://${BUCKET}/test2/ options: fs.s3.endpoint: ${ENDPOINT} encryptOptions: - name: fs.s3.accessKeyId valueFrom: secretKeyRef: name: mys3secret key: fs.s3.accessKeyId - name: fs.s3.accessKeySecret valueFrom: secretKeyRef: name:
1. 什么是 TensorBoard TensorBoard 主要是用来监控模型的各种指标的变化,比如 accuracy、loss、各种层的权重分布等。 TensorBoard 是 TensorFlow 的一个可视化工具,支持标量、文本、图像、音频、视频和 Embedding 等多种数据可视化,但是 PyTorch 也可以使用 TensorBoard。 2. 安装 tensorboard 1 pip install tensorboard 3. 使用
1. 创建训练脚本 创建训练脚本 mnist.py,内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
1. 安装新的内核版本 推荐使用 apt 源安装,避免安装了不兼容的内核版本。 1.1 源安装 查看可用版本 1 2 3 4 apt list linux-headers-5.15.*-*-generic linux-image-5.15.*-*-generic linux-image-5.15.0-94-generic/focal-updates,focal-security 5.15.0-94.104~20.04.1 amd64 linux-image-5.15.0-97-generic/focal-updates,focal-security 5.15.0-97.107~20.04.1 amd64 安装内核 1 apt install linux-image-5.15.0-97-generic linux-headers-5.15.0-94-generic 1.2 自行下载安装 需要先确认下当前的系统与目标内核版本是否兼容。 下载内核 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 1 2 3 4 wget https://kernel.ubuntu.com/mainline/v5.19/amd64/linux-headers-5.19.0-051900-generic_5.19.0-051900.202207312230_amd64.deb wget amd64/linux-headers-5.19.0-051900_5.19.0-051900.202207312230_all.deb wget https://kernel.ubuntu.com/mainline/v5.19/amd64/linux-image-unsigned-5.19.0-051900-generic_5.19.0-051900.202207312230_amd64.deb wget https://kernel.ubuntu.com/mainline/v5.19/amd64/linux-modules-5.19.0-051900-generic_5.19.0-051900.202207312230_amd64.deb 安装内核 1 dpkg -i *.deb
1. 什么是 MPI MPI,Message Passing Interface 消息传递接口,是一种用于并行计算的通信协议。 MPI 提供了一组标准化的接口,用于在不同的计算节点之间传输数据,广泛应用于科学计算、机器学习、深度学习等领域。 MPI 有多个实现,常用实现有 MPICH 和 OpenMPI。MPICH
基于生产的真实需要,最近对 https://github.com/shaowenchen/ops 又进行了几个重要的更新,同时发布了 v1.0.0 版本。这里主要介绍一下这个版本的主要特性。 1. 多集群执行任务的支持 在实践中,建议: 将当前集群的主机创建为 Host 可以创建多个 Cluster,拥有的 Cluster 对象即为纳管的集群 Task、Pipe
1. Fat-Tree 1985 年 麻省理工学院的 Charles E. Leiserson 发明了 Fat-Tree 胖树网络。如下图,胖树网络是一颗二叉树,从更节点到叶子节点带宽逐步增加。 2008 年 8 月,加州大学圣地亚哥分校的一组计算机科学家发表了一个可扩展的网络架构设计,该设计采用受胖树拓扑启发的拓扑结构,实现了比以前的分
1. 什么是 RDMA RDMA(Remote Direct Memory Access,远程直接内存访问)是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。 TCP/IP 传输时,数据经过网络堆栈,再经过网卡发送,接收端接收后,按照序列号组装数据。 DMA 传输时,可以直接在设备和内存之间传输数据,不需要经过网
1. 什么是 SR-IOV 技术 SR-IOV(Single Root I/O Virtualization)是一种虚拟化技术,它允许虚拟机、容器直接访问物理硬件资源,从而提高 I/O 性能,还能减少主机 CPU 消耗。 如上图,SR-IOV 将单个物理设备(例如网络接口卡,NIC)划分成多个虚
1. InfiniBand 网络 InfiniBand(缩写 IB),是一个用于高性能计算的计算机网络通信标准,它具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。InfiniBand 也用作服务器与存储系统之间的直接或交换互连,以及存储系统之间的互连。 InfiniBand
1. Jindo 挂载 OBS 配置环境变量 1 2 3 4 export ENDPOINT=obs.cn-north-4.myhuaweicloud.com export BUCKET= export AK= export SK= 创建凭证 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: myobssecret type: Opaque stringData: fs.obs.accessKeyId: ${AK} fs.obs.accessKeySecret: ${SK} EOF 创建 Dataset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: myobs-jindo spec: mounts: - mountPoint: obs://${BUCKET}/test2/ options: fs.obs.endpoint: ${ENDPOINT} name: default path: "/" encryptOptions: - name: fs.obs.accessKeyId valueFrom: secretKeyRef: name: myobssecret key: fs.obs.accessKeyId
1. 数据处理架构 主要分为四层: 处理能力层,Spark on Kubernetes 提供流式的数据处理能力 数据管理层,Iceberg 提供 ACID、table 等数据集访问操作能力 存储层,Hive MetaStore 管理 Iceberg 表元数据,Postgresql 作为 Hive MetaStore 存储后端,S3 作为数据存储后端 资
1. 什么是 GDS(GPUDirectStorage) GDS 允许 RDMA 网卡直接访问 GPU 内存,有助于增加 GPU 应用读写文件的 IO 带宽,减少 IO 时延,并降低其 CPU 负载。 客户端在开启 GDS 特性后,文件将以 O_DIRECT 方式打开,客户端不会再缓存文件数据。应用层读写文件时,客户端通过 nvidia-fs.ko 将
Token 是一个与数据紧密相关的单位,可以用来度量训练模型所需的语料量,还可以用来度量推理时的输入和输出长度。 1. token 是什么 Token 可以是一个完整的单词、子词,甚至是一个字符。在语言模型中,文本被拆分为若干个 token,模型逐一处理这些 token 来生成预测或生成新文
1. 关于 FLOPs FLOPs(Floating Point Operations Per Second)指的是每秒执行的浮点数运算次数。 具体地说: 一次浮点加法:如 a + b,被计为一次浮点运算。 一次浮点乘法:如 a * b,也被计为一次浮点运算。 其他基本浮点运算:如除法和平方根,也可以被计为一次浮
1. 定义 LLM 推理过程中存在着两个截然不同的阶段,PD 分离就 计算密集型的 Prefill 阶段, LLM 处理所有用户的 input,计算出对应的 KV Cache 显存密集型的 Decode 阶段, 顺序的产生一个个的 token,每次访存只计算一个 token 2. 指标 2.1 prefill 性能评估指标 TTFT(Time To First Toke
本文使用的 DLRover 版本是 0.3.7 1. DLRover Operator 1.1 启动 ElasticJob 和 ScalePlan 的控制器 实现代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 创建 ElasticJob 的控制器 if err = controllers.NewElasticJobReconciler(mgr, masterImage).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ElasticJob") os.Exit(1) } // 创建 ScalePlan 的控制器 if err = controllers.NewScalePlanReconciler(mgr).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScalePlan") os.Exit(1) } // 启动控制器 if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) } 这部分代码是
1. 产品线 GeForce 面向游戏玩家,提供强大的图形处理能力、先进的游戏技术。 常见的有 NVIDIA GTX 系列、高端的 RTX 系列、Titan 系列。 Quadro 面向专业市场,如设计师、工程师、科学家和内容创作者。 常见的有 Quadro P 系列,高端的 Quadro RTX 系列 Tesla 面向数据中心和高性能计算(HPC)市场,
1. Parameter Server 架构 在 Parameter Server 架构中,集群中的节点被分为两类,参数服务器节点(Parameter Server)和工作服务器节点(Worker)。 1.1 Parameter Server Parameter Server 用于存放模型的参数。 每个参数服务器节点负责管理和更新模型的一部分参数,而每个工作节点则只处理与其对应
1. 分布式训练面临的问题 预估训练资源困难,无法自动化 需要多少算力、需要多少时间、需要多少带宽、需要多少 CPU、需要多少内存,如果没有足够的积累,很难估算准确。导致的结果就是,超额申请、超额分配,造成极大的资源浪费。 需要去沉淀和提供解决方案。 故
本篇内容主要来自内部的一次分享,也是最近工作的一些总结。 1. 常见的故障处理流程 如上图是一次典型的运维异常处理流程。 按照时间线,有如下关键时间点: 发生故障 发现故障 响应故障 定位故障 恢复故障 发生故障到发现故障,指的是被系统检测到,主要涉及到指标的采
1. 为什么将元数据存储从 Redis 迁移到 PGSQL PGSQL 成本低 Redis 使用内存存储元数据,PGSQL 使用磁盘存储元数据,成本差异显而易见。 PGSQL 性能可调节 不同的 PGSQL 提供了不同的性能 IOPS。如果对性能没有持续高的要求,使用 PGSQL 是不错的选择。 PGSQL 存储上限更高 如果按照元数据大小估算
1. 制作 hccl-test 镜像 下载依赖包 Python-3.8.18.tgz Ascend-cann-toolkit_8.0.RC2_linux-x86_64.run Ascend-cann-kernels-910b_8.0.RC2_linux.run mpich-3.2.1.tar.gz 如果不方便下载,也可以直接从我打包的镜像中拷贝出来。 编写 Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 FROM ubuntu:22.04 WORKDIR /home RUN sed -i -e 's/^APT/# APT/' -e 's/^DPkg/# DPkg/' /etc/apt/apt.conf.d/docker-clean RUN apt-get update && apt-get install
1. 制作 nccl-test 镜像 查看 CUDA 版本 1 2 3 nvidia-smi | grep "CUDA Version" | awk '{print $9}' 12.2 编写 Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cat > Dockerfile << EOF FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive ARG CONDA_VERSION WORKDIR /workspace ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt install -y openmpi-bin libopenmpi-dev ssh openssh-server net-tools vim git iputils-ping nfs-common RUN git clone https://github.com/NVIDIA/nccl-tests.git && \ cd nccl-tests && \ make MPI=1 MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi EOF 编译 nccl-test 镜像 1 docker build -t shaowenchen/nccl-test:12.1.0-ubuntu22.04 -f Dockerfile . 推送 nccl-test 镜像 1 docker push shaowenchen/nccl-test:12.1.0-ubuntu22.04 2. 运行 Volcano Job 给测试节点打
1. top 查看节点资源使用率超过 100% 1 2 3 4 5 6 kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master-1 995m 16% 13760Mi 118% master-2 827m 13% 10672Mi 92% master-3 889m 14% 10244Mi 88% 这是由于在计算使用率时,默认使用的是可分配的资源,排除了 Kubelet 保留的部分。在 kubectl 源码中可以看到: 1 2 3 4 5 6 7 for _, n := range nodes { if !o.ShowCapacity { availableResources[n.Name] = n.Status.Allocatable } else { availableResources[n.Name] = n.Status.Capacity } } 如果需要
1. 查看 CPU 查看 CPU 型号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 57 bits virtual CPU(s): 160 # 有 160 个 CPU On-line CPU(s) list: 0-159 Thread(s) per core: 2 # 每个核心支持 2 个线程 Core(s) per socket: 40 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 106 Model name: Intel(R) Xeon(R) Platinum 8380 CPU @ 2.30GHz Stepping: 6 CPU MHz: 3000.000 # 当前工作频率为 3000 MHz BogoMIPS:
本文内容整理自我在一次内部分享的部分内容。 1. 存储系统的核心要素 1.1 安全 对象存储桶的凭证、使用存储 PVC 时的授权、对访问来源的控制,这些都是安全需要关注的问题。 但这些又非常容易被忽视,出了问题就是大问题。 1.2 生命周期管理 存储系统是为业务使用数据服务的
1. 使用内存作为存储介质 如上图是存储金字塔,展示了存储介质价格与速度的关系。 目前,企业之所以广泛采用磁带和磁盘作为存储介质,主要是因为它们的价格优势。市场价格受市场供需影响,即便是价格较高的存储介质,如果生产成本低廉,具有足够大的市场,生产过
1. Jindo 直接加速 OSS 配置环境变量 1 2 3 4 5 6 7 export ENDPOINT=oss-cn-beijing-internal.aliyuncs.com export BUCKET= export AK= export SK= export NAMESPACE=default export PVC=myoss-jindo export URI=datacenter 创建凭证 1 2 3 4 5 6 7 8 9 10 11 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: ${PVC} namespace: ${NAMESPACE} type: Opaque stringData: fs.oss.accessKeyId: ${AK} fs.oss.accessKeySecret: ${SK} EOF 创建 Dataset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: ${PVC} namespace: ${NAMESPACE} spec: mounts: - mountPoint: oss://${BUCKET}/${URI}/
1. 关于 JuiceFS 的缓存 在主机上,预热的缓存是直接放在主机上的。 在集群中,分为两级缓存: Worker,提供集群级别共享的缓存 Fuse,提供仅当前节点级别的缓存 2. 使用 JuiceFS 客户端预热数据 需要注意的是在 Fuse 层预热,仅对当前节点有效,如果需要预热整个集群,需要在
1. 现象 基于 Kubernetes 的 Elasticsearch 频繁重启,导致服务几乎不可用。 在导入数据过程中,Pod 的内存使用持续增长 Pod 内存使用接近 Limit 之后,继续导入就会触发 Pod 异常退出,错误日志 ERROR: Elasticsearch exited unexpectedly Pod 内存使用率并不会下降,而是维持在 Limit 附近,不久又异常退出 Elasticsearch Pod 内存限制在 64GB,而 JVM 内
1. 在主机上挂载内存存储目录 创建目录用于挂载 1 mkdir /mnt/memory_storage 挂载 tmpfs 文件系统 1 mount -t tmpfs -o size=800G tmpfs /mnt/memory_storage 存储空间会按需使用,也就是使用 100G 存储时才会占用 100G 内存。主机节点上有 2T 内存,这里分配 800G 内存用于存储 Elasticsearch 数据。 提前创建好目录 1 2 3 mkdir /mnt/memory_storage/elasticsearch-data-es-jfs-prod-es-default-0 mkdir /mnt/memory_storage/elasticsearch-data-es-jfs-prod-es-default-1 mkdir /mnt/memory_storage/elasticsearch-data-es-jfs-prod-es-default-2 如果没有提前创建好目录,并
1. 安装驱动 创建 HwHiAiUser 用户 1 2 groupadd -g 1000 HwHiAiUser useradd -g HwHiAiUser -u 1000 -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash 添加目录权限 1 2 chown -R HwHiAiUser /usr/local/Ascend chmod -R 755 /usr/local/Ascend 下载驱动、固件 前往 https://www.hiascend.ru/hardware/firmware-drivers/community?product=1&model=30&cann=All&driver=1.0.26.alpha 找到对应的驱动和固件。 1 wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Ascend%20HDK/Ascend%20HDK%2024.1.RC2.2/Ascend-hdk-910b-npu-driver_24.1.rc2.2_linux-x86-64.run 1 wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Ascend%20HDK/Ascend%20HDK%2024.1.RC2.2/Ascend-hdk-910b-npu-firmware_7.3.0.2.220.run 安装驱动 1 bash ./Ascend-hdk-910b-npu-driver_24.1.rc2.2_linux-x86-64.run --full --install-for-all 安装固件 1 bash ./Ascend-hdk-910b-npu-firmware_7.3.0.2.220.run --full 2. 安装 ascend-docker-runtime 下载 ascend-docker-runtime 前往 https://gitee.com/ascend/ascend-docker-runtime/releases/tag/v5.0.0-RC3.2 找到对应架构的下载链接。 1 wget https://gitee.com/ascend/ascend-docker-runtime/releases/download/v5.0.0-RC3.2/Ascend-docker-runtime_5.0.RC3.2_linux-x86_64.run 安装 ascend-docker-runtime 1 bash ./Ascend-docker-runtime_5.0.RC3.2_linux-x86_64.run --install 3.
1. 基于对象存储的数据交付 如上图,在模型研发过程中,主要涉及三个子平台,分别是: 数据平台 数据平台主要负责数据相关的管理,比如: 数据接入、数据处理,最终生成训练所需的数据。 数据平台将原始数据存储到对象存储中,在处理时,从对象存储中获取数据,进行
1. 存储的分层与互联 2. 各种存储类型 存储类型 带宽 容量 响应延时 单位存储成本 存储原理 适用场景 CPU L1 Cache 256-512GB/s 32-64KB/核心 <1ns 约$2000/MB SRAM CPU 核心最近层缓存 CPU L2 Cache 64-256GB/s 256KB-2MB/核心组 2-5ns 约$1000/MB 部分 SRAM,部分嵌入式 DRAM CPU 下一级缓
1. 存储方案 三种存储方案: 基于目录隔离公用一个 JuiceFS Elasticsearch 的节点共用一个 JuiceFS,通过子目录挂载不同的 Elasticsearch 节点。 /0/ 对应节点 Node-0 /1/ 对应节点 Node-1 /2/ 对应节点 Node-2 这种方式的好处主要是,易于扩展、配置方便。 基于 JuiceFS 隔离节点数据 Elasticsearch 每个节点都对接一个独立的 JuiceF
1. 创建 Dataset 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: my-s3 type: Opaque stringData: aws.accessKeyId: xxx aws.secretKey: xxx EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: my-s3 spec: mounts: - mountPoint: s3://BUCKET/ name: s3 options: alluxio.underfs.s3.endpoint: ks3-cn-beijing-internal.ksyun.com alluxio.underfs.s3.disable.dns.buckets: "false" encryptOptions: - name: aws.accessKeyId valueFrom: secretKeyRef: name: my-s3 key: aws.accessKeyId - name: aws.secretKey valueFrom: secretKeyRef: name: my-s3 key: aws.secretKey accessModes: - ReadWriteMany EOF 2. 创建 Runtime 1 2 3 4 5 6 7 8 9
1. 分析 Fluid 挂载 NFS 存储 查看 Fuse Pod 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 kubectl get pod nfs-demo-fuse-f9wg8 -oyaml apiVersion: v1 kind: Pod metadata: generateName: nfs-demo-fuse- spec: containers: - command: - /usr/local/bin/entrypoint.sh env: - name: FLUID_RUNTIME_TYPE value: thin - name: FLUID_RUNTIME_NS value: default - name: FLUID_RUNTIME_NAME value: nfs-demo - name: MOUNT_POINT value: /runtime-mnt/thin/default/nfs-demo/thin-fuse - name: MOUNT_OPTIONS value: ro image: fluidcloudnative/nfs:v0.1 imagePullPolicy: IfNotPresent lifecycle: preStop: exec: command: - sh - -c - umount /runtime-mnt/thin/default/nfs-demo/thin-fuse name: thin-fuse securityContext: privileged: true volumeMounts:
1. 打包 Fluid Runtime 镜像 创建 fluid_config_init.py 脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/usr/bin/env python import json rawStr = "" with open("/etc/fluid/config.json", "r") as f: rawStr = f.readlines() rawStr = rawStr[0] script = """ #!/bin/sh set -ex MNT_FROM=$mountPoint MNT_TO=$targetPath trap "umount ${MNT_TO}" SIGTERM mkdir -p ${MNT_TO} mount -t lustre -o relatime,flock ${MNT_FROM} ${MNT_TO} sleep inf """ obj = json.loads(rawStr) with open("mount-lustre.sh", "w") as f: f.write('mountPoint="%s"\n' % obj["mounts"][0]["mountPoint"]) f.write('targetPath="%s"\n' % obj["targetPath"]) f.write(script) 只需调整一下 mount 命令即可。 创建启动脚本 entrypoint.sh 1 2 3
1. 创建 Dataset 1 2 3 4 5 6 7 8 9 10 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: nfs-demo spec: mounts: - mountPoint: x.x.x.x:/x-x/ name: nfs-demo EOF 2. 创建 Runtime 1 2 3 4 5 6 7 8 9 10 11 12 13 14 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: ThinRuntimeProfile metadata: name: nfs spec: fileSystemType: nfs fuse: image: fluidcloudnative/nfs imageTag: v0.1 imagePullPolicy: IfNotPresent command: - "/usr/local/bin/entrypoint.sh" EOF 1 2 3 4 5 6 7 8 kubectl apply -f - <<EOF apiVersion: data.fluid.io/v1alpha1 kind: ThinRuntime metadata: name: nfs-demo spec: profileName: nfs EOF 3. 创建测试 Pod 1 2 3 4 5 6 7 8 9 10 11 12
1. 让 Ops Copilot 成为 Ops Coilot 在 2023 年 09 月,我写过一版 Ops Copilot,也有文章发出 我在给 Ops 工具写 Copilot 。 实现的效果是这样的: 1 2 3 4 5 6 7 8 9 10 Opscli> 打开浏览器 Open a browser and navigate to 'https://www.google.com'. ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ import webbrowser webbrowser.open('https://www.google.com') ↑↑↑↑↑↑↑↑↑↑↑
1. 什么是 MLOps MLOps 是 Machine Learning Operations 的缩写,描述的是围绕模型研发整个生命周期过程的标准化和工程化。 MLOps 包括以下几个关键步骤: 数据管理,数据的存储、访问、清洗、转换 模型开发,算法开发、模型构建 模型训练与调优,使用数据训练模型,调整超参数优化模型,微调模型 模型评
1. 数据并行 训练步骤: master 设备加载模型,并将模型参数复制到每个 worker 设备 master 设备按照 batch 维度划分训练数据,将每个 batch 传递给每个 worker 设备 每个 worker 设备进行训练 master 设备汇总每个 worker 设备的梯度,更新模型参数 master 设备广播模型参数到每个 worker 设备,准备下一个 batch 训练 核心思想: 将训练
1. 镜像 Tag 标识的含义 base/cuda: 包括 CUDA 运行时 runtime: 在 base 的基础上,新增了 CUDA math 库和 NCCL、cuDNN 运行时 devel: 在 runtime 的基础上,新增了头文件和用于构建 CUDA 镜像的开发工具,对于多阶段构建特别有用 cuddn: 在上面基础上,新增了 cuDNN 神经网络加速库 py3: Python 3 环境 2. CUDA 镜像 镜像 AMD64 镜像大小 ARM64 镜
1. 安装 conda 1 2 3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh rm -rf Miniconda3-latest-Linux-x86_64.sh 但 Miniconda 不能免费大规模商用,可以使用 Miniforge 平替。 1 2 wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" bash Miniforge3-$(uname)-$(uname -m).sh 2. 修改默认配置 2.1 初始化 Shell 如果不进行初始化,激活环境时会报错 CondaError: Run 'conda init' before 'conda activate' 。 1 2 3 4 5 6 7 8 9 conda init --help usage: conda init [-h] [--all] [--user] [--no-user] [--system] [--reverse] [--json] [-v] [-q] [-d] [SHELLS ...] Initialize conda for shell interaction. positional arguments: SHELLS One or more shells to be
1. Argo Events 工作原理 上面是 Argo Events 官方网站上的架构图,对于事件处理系统,有三个重要的组成 事件源的接入,对应于 Event Source 事件的分发,对应于 Event Sensor 事件的消费,对应于 Event Trigger 事件消息存储在 EventBus 中,默认使用的 NATS。 2. 创建 ServiceAccount 给 Sensor 和 Workflow 创建 operate-workflow-sa operate-workflow-sa 用来授权 Sensor 操作 Workflow 。 1 2 3 4 5 6
1. Volcano 简介 Volcano 是华为开源的一个基于 Kubernetes 的资源调度系统,相较于原生的调度器,具有的显著特点有: 支持 gang scheduling 对于批量作业的调度,容易碰到死锁的问题,比如两个作业都需要同时运行 10 个 Pod 才能启动,当两个作业同时提交时,可能都只有部分 Pod 被调度,两个作业都无法正常
1. 什么是 npu-smi npu-smi 是华为提供的一个命令行工具,专门用于管理和监控华为昇腾(Ascend)系列神经网络处理器(NPU)的状态和性能,似于 NVIDIA 的 nvidia-smi。 2. npu-smi 字段含义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 npu-smi info +------------------------------------------------------------------------------------------------+ | npu-smi 23.0.2.1 Version: 23.0.2.1 | +---------------------------+---------------+----------------------------------------------------+ | NPU Name |
最近在研习模型训练相关的基础设施,发现 AI 芯片互连拓扑决定着训练集群任务的调度和资源分配,因此花了一点时间整理了一下常见的 AI 芯片互连方案。 1. 点对点互连 传统的 PCIe 系统下, AI 芯片与 AI 芯片之间的数据传输是通过 PCIe 传输,无法满足大规模数据传输的要求。 1.1 NVLink
处理故障时,参考或者记录下的内容,持续更新中 1. XID 错误事件 XID 是 NVIDIA 的错误码,可以通过命令: 1 dmesg -T | grep -i "NVRM: Xid" 或者 1 journalctl --since `date -d "10 days ago" "+%Y-%m-%d"`|grep Xid 根据 XID 可以定位故障,下面是一些常见的 XID 事件 XID 说明 13 Graphics Engine Exception。通常是数组越界、指令错误,小概率是硬件问
1. 不断尝试落地 AI 应用端 基于对运维的认知,我开发了一个开源的运维工具 https://github.com/shaowenchen/ops 。 Ops 工具将运维操作划分为脚本执行、文件分发两类,而运维对象主机和 Kubernetes 集群分别都实现了这两种运维操作。 Ops 对外提供的能力有,Ops Cli 命令行终端,Ops Server 服务端 API 接口,Ops Controller 集群
本篇主要记录创建企业版 JuiceFS PVC 的脚本,方便快速配置。 1. 设置环境变量 1.1 基础配置 1 2 3 export NAMESPACE= export PVC_NAME= export JUICEFS_VOLUME= 1.2 JuiceFS 认证信息 1 2 3 export TOKEN= export ACCESS_KEY= export SECRET_KEY= 1.3 JuiceFS 服务配置 1 2 export BASE_URL=http://x.x.x.x:8080/static export CFG_URL=http://x.x.x.x:8080/volume/%s/mount 1.4 镜像配置 1 2 3 4 export JUICEFS_IMAGE=juicedata/mount export JUICEFS_IMAGE_TAG=ee-5.2.13-7a0eb79 export DEMO_IMAGE=ubuntu 1.5 Worker 配置 1 2 3 export WORKER_REPLICAS=1 export NODE_SELECTOR_KEY= export NODE_SELECTOR_VALUE="true" 1.6 缓存配置 1 2 3 export CACHE_GROUP="${PVC_NAME}-cache-group" export CACHE_PATH=/data/jfs-cache export CACHE_QUOTA=2Ti 不同网络分区
本篇主要记录创建社区版 JuiceFS PVC 的脚本,方便快速配置。组件部署可以参考 使用 Fluid 和 JuiceFS 在 Kubernetes 管理数据 。 1. 设置环境变量 桶的配置 1 2 3 4 5 6 export ACCESS_KEY= export SECRET_KEY= export BUCKET= export ENDPOINT=ks3-cn-beijing-internal.ksyun.com export BUCKET_ENPOINT=$BUCKET.$ENDPOINT export PROVIDER=ks3 Workload 的配置 1 2 3 4 5 export NAMESPACE= export PVC_NAME= export NODE_SELECTOR_KEY= export NODE_SELECTOR_VALUE= 镜像的配置 export JUICEFS_IMAGE=juicedata/juicefs-fuse export DEMO_IMAGE=shaowenchen/demo:ubuntu 元数据的配置 如果是 Redis 配置 1 2 3 4 export REDIS_PASSWORD= #ip:port/database export REDIS_ENDPOINT=
1. argo 介绍 Argo 是一个开源项目,它在 Kubernetes 上提供了一系列工具,用于构建和运行应用程序。Argo 的核心组件主要包括以下几个: Argo CD Argo CD 是一个基于 GitOps 的持续交付工具,它允许用户声明式地管理 Kubernetes 集群中的应用部署。Argo CD 通过与 Git 仓库同步,确保集群状态与 Git 仓库中
1. 什么是 Ops 项目 我在之前的文章中介绍过一个常用的 Ops 工具。 Ops 的设计理念在于,运维工具的核心在于文本分发和脚本执行,实现了这两种能力就能够满足运维的功能诉求。 目前我主要的运维对象是 Host 主机、Kubernetes 集群,因此在 OpsObject 层实现了 Host 和 Cluster 对象,分别
1. 什么是 TensorRT TensorRT 是一个 C++ 库,主要用在 NVIDIA GPU 进行高性能的推理加速上,提供了 C++ API 和 Python API 用于集成。 TensorRT 支持的主流深度学习框架有: Caffe,TensorRT 可以直接读取 prototxt 格式 TensorFlow,需要将 TensorFlow 的 pb 转换为 uff 格式 PyTorch,需要将 PyTorch 的 pth 格式转
1. 项目简介 kind 是使用容器管理 Kubernetes 集群的工具。项目地址 https://github.com/kubernetes-sigs/kind 。 主要用在: 本地开发环境 学习时的临时环境 自动化测试 2. 安装 kind macOS 1 brew install kind Linux 1 2 curl -Lo /usr/local/bin/kind https://kind.sigs.k8s.io/dl/v0.21.0/kind-linux-amd64 chmod +x /usr/local/bin/kind 3. 创建 kind 集群 如果你本地配置有 PROXY,在创建之间建议重新设置一下环境变量: 1 2 export https_proxy=http://x.x.x.x:7890 export http_proxy=http://x.x.x.x:7890 本地代理通常设
1. dcgm-exporter dcgm-exporter 是 NVIDIA 官方社区提供的 GPU 监控工具。 项目地址 https://github.com/NVIDIA/dcgm-exporter 1.1 安装方式 添加 Helm 镜像仓库 1 helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts 1 helm repo update 安装 1 2 3 4 5 helm install dcgm-exporter gpu-helm-charts/dcgm-exporter --namespace monitor --create-namespace \ --set serviceMonitor.enabled=false \ --set image.tag=3.3.3-3.3.0-ubuntu22.04 \ --set nodeSelector."accelerator\/provider"=nvidia-gpu \ --version 3.3.1 需要给 NVIDIA GPU 节点打上标签 1 kubectl label node <node-name> accelerator/provider=nvidia-gpu 1.2 指标 GPU 利用率 指标名称 指标类型 单位 描述 DCGM_FI_DEV_GPU_UTIL Gauge % GPU 利用率 DCGM_FI_DEV_MEM_COPY_UTIL Gauge % GPU 内存
1. TensorRT-LLM 编译模型 1.1 TensorRT-LLM 简介 使用 TensorRT 时,通常需要将模型转换为 ONNX 格式,再将 ONNX 转换为 TensorRT 格式,然后在 TensorRT、Triton Server 中进行推理。 但这个转换过程并不简单,经常会遇到各种报错,需要对模型结构、平台算子有一定的掌握,具备转换和调试能力。而 TensorRT-LLM 的目标
1. 什么是 nvidia-smi nvidia-smi 全称是 NVIDIA System Management Interface,是 NVIDIA 提供的管理和监控 GPU 的接口。 nvidia-smi 调用的是 NVML。NVML 全称是 NVIDIA Management Library,提供了一组 C API,用于 NVIDIA GPU 监控和管理的库。 1.1 可查询的状态 ECC 错误计数 GPU 利用率 活动计算进程 时钟和 PState 温度和风扇速度 电
1. Fluid 简介 下面是来源于 https://github.com/fluid-cloudnative/fluid 的 Fluid 的架构图: Fluid 抽象了两个概念: Dataset,数据集合,用户视角的抽象 Runtime,数据存储、加速等真实服务的抽象 Fluid 主要解决了传统缓存系统在 Kubernetes 上使用的问题: 通过 CRD 对数据集合 Dataset 进行描述,提供生命周期管理 依赖于 Runtime 后端,
请注意文中的 --block-size 4096 为 4GB,如果使用 --block-size 4 会更合理,在写数据性能上会更好。 1. 环境准备 进入一个安全目录 1 mkdir -p /data/test && cd /data/test 在这个目录下完成全部的测试任务。 给 Redis 单独建一个目录 1 mkdir redis-data 建议新建一个目录,因为 Redis 会将当前目录文件的 Owner 改成 systemd-cored
使用 nvidia-container-runtime 的朋友可以重点关注下,特别是还有 JuiceFS 的情况。 1. 突然收到告警,我慌了 周末,学习 TensorRT LLM,顺便给线上最大的正式集群安装了一下 Dragonfly,然后就去买菜了。 下午发现有个节点的 Dragonfly Daemon 没起来,一直告警,就去所在节点重启了下 Kubelet。 大约
1. Dragonfly 简介 Dragonfly 的相关文档在社区 https://d7y.io/zh/docs/ 已经有详细说明。这里只是简单介绍一下,V2 版本的主要组件: Manager,提供 UI 界面、用户管理、集群监控、任务管理等功能 Scheduler,调度 Peer 之间的流量、提供预热等功能 Seed Peer,回源节点,用于从源站(Har
据统计容器中的大部分文件不会被使用。根据这一特征,Nydus 自定义了 Rafs 格式的文件系统,实现了镜像文件的按需加载,以解决大镜像导致的启动慢和占用存储的问题。而在 AI 场景下,无论是推理还是训练,镜像常常都是几个 G 起步,甚至几十个 G,Nydus 非常
1. 高速前进的轮子才能保持平衡 1.1 C 端红利期已经过去 截至 2023 年 6 月,我国网民规模达 10.79 亿人,较 2022 年 12 月增长 1109 万人,互联网普及率达 76.4%。C 端人口红利期已过,上网时长也增长缓慢,各类存量场景下的应用增长空间已经不大。 在经历了 C 端的 easy 模式之后,很多
1. 磁盘处理 1.1 查看磁盘 查看新磁盘 1 fdisk -l Disk /dev/nvme1n1: 3.91 TiB, 4294967296000 bytes, 8388608000 sectors 1.2 组建 RAID0 如果有多块小盘,更好的方式是组建一个 RAID0,这样不仅能获得更大的存储目录,还能获得更快的速度。 创建 RAID 1 mdadm --create --verbose /dev/md0 --level=0 --raid-devices=3 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 查看 RAID 1 mdadm --detail /dev/md0 1.3 挂载磁盘 创建文件系统 1 mkfs.xfs -f /dev/nvme1n1 xfs 适合大文件
提供有偿接入服务,200 RMB/年;另外,提供技术支持 200 RMB/次,不超过 1 hour;关注公众号,可获得联系方式。 1. 需要提供的信息 进入 https://mp.weixin.qq.com/ 在左侧菜单栏 【设置与开发】-> 【基本设置】,就能找到下面的信息 AppID 开发者 ID,可以明文直接查看到。 AppSecret
1. 直接使用大模型面临的问题 输出不稳定性 生成式 AI 的特点之一,输出结果的多样性。同样一个问题,问大模型多次,可能会得到不同的答案。 这种输出的不确定性,在对话、创作场景下,会给用户带来惊喜。但在确定性要求比较高的场景下,大模型进入不了采纳阶段。 数
两个月前,我在业务团队有过一次关于混沌工程实践的分享,这里主要整理下讲稿的内容。 点击查看演示文稿 1. 混沌产生 1.1 混沌学科的产生 在讲混沌之前,我们可以先思考一下混沌、混沌工程和我们线上服务之间的关联。 我们经常听到的故事是,一只在亚马逊河流中的蝴蝶
1. 两年前选了一条不一样的路 现在回顾,2021 年应该是近些年武汉互联网打工人跳槽的黄金年份。疫情过去,我们对未来充满期待;货币政策宽松,公司对市场前景满怀信心。 在这个背景下,当时一批做 Kubernetes 开源产品的同事纷纷跳槽,去云厂商继续做云基础设施。凭借过
主要用来规范自己写的 API,也是为了让 LLM 更好理解我的 API。 1. Domain 尽量单独使用一个域名,例如 api.example.com 。 2. Path 统一使用小写字母。 不用包含 /api 前缀。 不要包含扩展名。 / 不要出现在末尾。 对于 Restful API,/ 用来划分资源层级,末尾的 / 会导致混淆。 使用带版本的路径 /v1 。
由于定价和限制会随时间变化,本文仅供撰写当前时间参考。 1. 术语 RPM (requests per minute) 每分钟请求次数 RPD (requests per day) 每天请求次数 TPM (tokens per minute) 每分钟 Token 数 TPD (tokens per day), 每天 Token 数 在 https://platform.openai.com/tokenizer 可以根据文本查询对应的 token 数。在 https://github.com/openai/tiktoken/blob/main/tiktoken/model.py 可以发现 text-embedding-ada-002 与 gpt-3.5、gpt-4 的词表都是 cl100k_bas
1. EnvoyFilter 是什么 EnvoyFilter 是 Istio 的 CRD 资源,它允许用户修改 Envoy 的配置,以满足用户针对不同场景的定制需求。 1 2 3 4 5 6 7 8 9 kubectl get envoyfilter -A NAMESPACE NAME AGE istio-system add-request-id-into-ingressgateway 54d istio-system compression-gzip 18d istio-system custom-access-log 3d istio-system ingressgateway-settings 52d istio-system preserve-request-header-us-test-ingress-gateway 95d istio-system preserve-x-request-id 54d 通常在使用 istio 时,或多或少都会用到一些 EnvoyFilter。 EnvoyFilter 提供的功能是基于 Envoy 已有的内
1. 内存对齐 结构体内字段,从大到小排列 减少内存占用 安装 fieldalignment 工具 1 go install golang.org/x/tools/go/analysis/passes/fieldalignment/cmd/fieldalignment@latest 分析并修复内存对齐 1 2 3 4 5 6 7 8 9 fieldalignment -fix ./... /Users/shaowenchen/Code/app/config/config.go:136:14: struct with 32 pointer bytes could be 24 /Users/shaowenchen/Code/app/config/config.go:150:11: struct of size 96 could be 88 /Users/shaowenchen/Code/app/config/config.go:166:14: struct of size 152 could be 144 /Users/shaowenchen/Code/app/config/config.go:194:12: struct with 80 pointer bytes could be 72 /Users/shaowenchen/Code/app/config/config.go:209:12: struct with 56 pointer bytes could be 40 /Users/shaowenchen/Code/app/dao/gormx/gorm.go:12:13: struct with 16 pointer bytes could be 8 /Users/shaowenchen/Code/app/dao/gormx/entity/cluster.go:5:14: struct with 128 pointer bytes could be 104 查看 fieldalignment 进行
1. 查看 PCI 接口设备 使用 lspci 查看设备是否已经安装 1 2 3 lspci |grep storage d8:00.0 Mass storage controller: Shannon Systems Device 2275 这里发现了一块 Shannon Systems 的设备,说明已经安装了 SSD。 1 2 3 4 5 6 7 8 lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 893.8G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 892.8G 0 part └─ubu
1. 现象 业务反馈应用 app-a 的接口慢,查看日志发现是某一个 Pod 慢,删除该 Pod 让其更换节点就好。 从监控指标可以看到,Pod 的 CPU 使用率确实有剧增。 但该 Pod 没有达到 Limit 的限制,没有被限流 CPU。 接着看节点的 CPU 监控,发现节点的 CPU 使用率也有剧增。 并且增加的部分是 System C
1. kube-controller-manager 对网段的管理 在 kube-controller-manager 有众多控制器,与 Pod IP 相关的是 NodeIpamController。 NodeIpamController 控制器主要是管理节点的 podcidr,当有新节点加入集群时,分配一个子网段给节点;当节点删除时,回收子网段。 每个节点的子网段不会重叠,每个节点都能够独立
1. 安装 FFmpeg macOS 上执行命令: 1 brew install ffmpeg 2. FFmpeg 使用 1 ffmpeg {1} {2} -i {3} {4} {5} 五个部分的参数依次如下: 全局参数,-y、-loglevel、-preset 等用来控制的整体行为 输入文件参数,-i、-ss、-t、-stream_loop 等用来控制输入文件的读入方式 输入文
持续更新中… 1. Golang 使用 trimpath 移除编译路径,避免暴露编译路径信息 1 go build -gcflags="all=-trimpath=${PWD}" -asmflags="all=-trimpath=${PWD}" -o ./bin/opscli ./cmd/cli/main.go 添加之前异常输出路径 /Users/shaowenchen/Code/Github/ops/main.go,添加之后异常输出路径 main.go 。 -ldflags “-w -s” 移除调试信息,减小
1. 什么是 Ops 工具 https://www.chenshaowen.com/ops/ 是我日常运维最频繁使用的工具之一。 运维机器,我可以复用之前的脚本,批量进行操作。 运维集群,我可以复用之前的脚本,不用登录节点也可以操作机器。 如果遇到新的运维问题,我会马上编写 Task Yaml 对操作进行固化,方便下一次复用。 Ops 的核心操作是
1. 本地容器运行 启动 LLM 1 docker run --rm -p 8000:8000 shaowenchen/chinese-alpaca-2-7b-gguf:Q2_K 在 http://localhost:8000/docs 页面即可看到接口文档,如下图: 部署一个简单的 Chat UI 这里需要注意的是 OPENAI_API_HOST 参数,需要设置为你的宿主机 IP 地址,而不是 localhost 127.0.0.1,否则无法访问。 1 docker run -e OPENAI_API_HOST=http://{YOUR_HOST_IP}:8000 -e OPENAI_API_KEY=random -p 3000:3000 ghcr.io/mckaywrigley/chatbot-ui:main 页面效果如下: 2. K8s 快速部署 部署 LLM 应用 kubectl create
1. 大模型部署工具 llama.cpp 大模型的研究分为训练和推理两个部分。训练的过程,实际上就是在寻找模型参数,使得模型的损失函数最小化,推理结果最优化的过程。训练完成之后,模型的参数就固定了,这时候就可以使用模型进行推理,对外提供服务。 llama.cpp 主要解决的是推理过程
2024.06.26 已经下线 1. 申请到 GPT-4-32K API 了 之前在 Azure 上提交申请使用 GPT-4,前几天收到审核通过的邮件了。 价格收费如下: Context Length Prompt per 1,000 tokens (8k) Completion per 1,000 tokens (32k) 8k $0.03 $0.06 32k $0.06 $0.12 请求限速为 60K TPM,即每分钟最多能处理 60K 个 Tokens。 2. 使用方式 无需登录,直接访问 https://chatgpt.chenshaowen.com/ 点击设置 输入访问密
1. 配额限制 每种云上的资源,能用多少是有限制的。 这是云厂为了防止资源滥用,降低租户之间的相互影响。 比如,一个账户下的企业项目数、弹性主机的数量、弹性公网 IP 的数量、弹性公网 IP 带宽的大小等。 因配额不够导致的资源申请失败,很常见;但在弹性业务高峰期
transformers 是由 Hugging Face 开发的 Python 库,用于在自然语言处理(NLP)任务中使用和训练预训练的 Transformer 模型。它提供了许多强大的工具和功能,使得处理文本数据和构建 NLP 模型变得更加容易。该库广泛应用于各种 NLP 任务,如文本分类、命名实体识别、问答、文本生成等。 1. transformers 中的 pipeline pipeline 提供
HuggingFace 通过提供共享模型 model、数据集 dataset、在线托管 space 等服务,为 AI 研究人员和开发者提供了一个完整的生态。本篇文章将介绍如何使用 HuggingFace 的模型和数据集。 1. 模型操作与使用 1.1 自定义存储目录 1 export HF_HOME=/Volumes/Data/HuggingFace 否则默认在 ~/.cache/huggingface 目录下。 1.2 模型的下载 第一种方法,页面上
1. 为什么是 Transformer 全连接的自注意 以往的 RNN 模型,每个单词只能和邻近的单词产生联系,而 Transformer 模型中的 Attention 机制,单词可以和任意位置的单词产生联系,这样就可以捕捉到全局的上下文信息。 没有梯度消失问题 RNN 作用在同一个权值矩阵上,使得其最大的特征值小于 1 时,就会出现
1. 大模型到底是什么 先请两位大模型回答一下这个问题,看看他们的回答是什么。 Claude 说,大模型本质上是语言知识的概率表达,通过统计学习对语言各层次规律建模,表征语言生成的先验分布,从而具备语言预测生成能力。 ChatGPT 说,大模型本质是深度神经网络通过大量参数和
1. 关键字 机器学习(ML) 从数据中自动获取知识的技术 神经网络(NN) 模仿生物神经网络结构和学习机制的模型,是机器学习的分支之一 神经网络的结构包括,输入层、隐藏层、输出层 深度神经网络(DNN) 隐含层常常大于 2 层 DNN 的出众表现源于它使用统计学方法从
1. 大模型与 Langchain 很多人可能没有机会训练、甚至微调大模型,但对大模型的使用却是未来趋势。那么,我们应该如何拥抱这一变化呢?答案就是 Langchain。 大模型提供的是一种泛而通用的基础能力,目前,我看到的有两种主要落地方式: 基于生成能力的 AIGC,
1. 什么需要拨测服务 今年 GPT 大火,我也部署、开发了几个应用、小程序进行学习。当然,秉承帮助厂商测试功能的原则,目前只有 GPT 3.5 的 API 每天有少许费用,服务器、数据库、带宽都是免费的。 为了节省成本,我没有测试环境,每次提交代码,只要能编译成功就会直接发布
1. DNS 请求超时 原因: alpine 使用的是 musl 库,在 DNS 解析上会有一些限制[1] 解决方式: 不使用 apline 镜像,并在容器 resolv.conf 文件中增加 options single-request-reopen 配置。因为 single-request-reopen 配置项只对 glibc 库生效,但是 apline 镜像使用的是 musl 库 2. Docker 下无法解析 hosts 原因: alpine 没有 /etc/nsswitch.conf,导致依赖 hosts
在 client 中已经看到 Docker CLI 在给 Docker Daemon 发生构建上下文时,通过设置 X-Registry-Config 传递凭证,但在最近的构建反馈中,还是会出现一些无法解释的现象,本篇主要是进行一些基础的测试,以便于更好排查问题。 1. 宿主机 Docker 下构建 Docker Daemon 以 root 用户权限启动。 未登录任何账户 1 2 3 4 su ansible echo "FROM harbor.chenshaowen.com/private/test:v1" | sudo
1. 申请使用 GitHub Copilot Chat 申请链接 https://github.com/github-copilot/chat_waitlist_signup/join 申请通过之后,会收到一封邮件: 2. 什么是 VS Code insiders 什么是 VS Code insiders VS Code insiders 是 VS Code 的预览版本,提供一些最新的功能和改进,更新非常频繁。如果有更新强迫症,慎重使用,因为几乎每天都有更新。 VS Code 和 VS Code insiders 的区别 VS Code 的命令行是 code ,logo
1. 背景 微服务架构下,服务与服务的依赖关系复杂。在开发过程中,多个服务之间经常需要联调。此时有两种方式: 将服务部署到线上开发环境 Kubernetes 集群 使用 telepresence 打通本地与线上集群的通信,这样能获得一个比较稳定的联调环境。 缺点是,需要生成足够权限的凭证、需要研发人
1. 业务背景 当企业达到一定规模时,完全依赖于公有云基础设施,IT 成本会很高。 采购物理机器的成本可以摊薄到未来 3~5 年,之后机器并不会报废,而是会继续超期服役。私有云需要配比一定运维人员、购买专线带宽、机房费用等,IT 服务达到一定规模才能有效降低成
1. HPA VS KEDA HPA 也实现了: 自定义指标的弹性 Scale to Zero 这些与 KEDA 相比较,并不算劣势了。 真正的差别在于 HPA 只能利用监控数据进行伸缩,而 KEDA 可以利用更多数据来源进行伸缩,比如队列消息、数据库、Redis 等,当然也包括监控数据。 从 Kubernetes-based Event Driven Autoscaler (KEDA) 项目的名字就可以看出,K
1. WebAssembly 简介 跨平台性,可以在任何支持 WebAssembly 的平台上运行,包括 Web 浏览器、服务器、移动设备等 高性能,采用了一种紧凑的二进制格式,可以在浏览器中快速加载和解析,从而提高应用程序的性能 安全性,采用了一种沙箱模型,可以隔离运行在其中的代码,从而保护系统免受恶
1. 基于容器的 Serverless 无法支撑下一代应用的形态 如上图,我们正经历着一次运行时态的变革。 从裸金属机到虚拟机,应用不在受限于本地服务器的数量、机房稳定性,具有更好的弹性和可用性。 从虚拟机到容器,应用不再受限于操作系统、配置漂移,具有更好的可移植性和可扩
1. 受限的构建环境无法满足构建需求 Tekton 是基于 Kubernetes 集群的 CICD 引擎,相较于 Jenkins 更加云原生。说人话就是,更好开发插件、更好扩容、更好可观测性、更好玩儿。 由于代码仅能落盘公司内网,导致构建集群仅能部署于办公内网。这导致了很多受限: 硬件资源,没有弹性扩容能力 网
1. 关闭 affinity-assistant 之后 在前面的博文中,我通过关闭 affinity-assistant、使用 NFS 存储,平均每条流水线执行时间节约了近 30 秒。[1] affinity-assistant 的影响 在关闭之前,创建 Pod 的时序图如下: 由于 affinity-assistant 开启,每条流水线绑定在一个节点执行。 在关闭之后,创建 Pod 的时序图如
1. 创建 ChatGPT 账号 访问 https://chat.openai.com/ 测试网络 如果出现的是下面这个页面,说明你的网络不支持 ChatGPT 正常的应该是下面这个页面 解决办法是更换网络,幸运的是公司的网络是支持的,所以我就在公司的网络下注册了账号。 找一个接码平台 注册 openai 账户时,需要输入手机号,而 openai 不支持国内的手
1. 什么是文档工具化 文档工具化,工具产品化,是我之前博文中反复提过的一个口号。 好的文档,不如好用的工具。一个脚本、一条命令,比阅读文档更加直接,更能快速解决问题。同时,有很多文档会让读者对知识产生眩晕,在急于解决问题的窗口期无法补全知识体系的
Envoy 是第三个从 CNCF 毕业的项目,由于其动态生效、高性能等特性,已经成为云原生事实上的数据平面标准。很多项目都会借助于 Envoy 处理数据平面流量,而专注于控制面适配应用场景,将用户输入通过 xDS 协议写入 Envoy。 1. Envoy 数据处理流程 其中 Downstream,进 Envoy
wasme 只支持到 istio 1.9,而我使用的是 Istio 1.14,因此本篇直接使用 tinygo 进行验证和学习。 1. 安装 tinygo 要求 Go v1.18+ 安装 tinygo 1 2 brew tap tinygo-org/tools brew install tinygo 查看版本 1 2 3 tinygo version tinygo version 0.27.0 darwin/amd64 (using go version go1.19.3 and LLVM version 15.0.0) 2. 创建 wasm-istio 项目 初始化项目 1 2 3 mkdir wasm-istio cd wasm-istio go mod init wasm-istio 编辑 main.go 见 https://github.com/shaowenchen/demo/blob/master/wasm-istio/main.go 主要是下面这段 1 2 3 4 5 6 7
1. 安装 Ubuntu 1 apt-get install -y iperf3 CentOS 1 yum install -y iperf3 2. 参数 iperf3 的原理是通过客户端给服务端发送数据包来分析网络,有两种运行模式,客户端和服务端。 iperf3 的参数分为三部分,公共参数,客户端参数,服务端参数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Istio 注入 Sidecar 的模板在 istio-sidecar-injector ConfigMap 中。通过 annotations 可以对 Sidecar 的各种参数进行自定义配置,比如 CPU 使用、proxyImage 等。下面主要整理的是 Sidecar 的注入方式。 1. 给命名空间添加标签 -> 整个命名空间生效 注入标签 1 kubectl label namespace default istio-injection=enabled --overwrite 重启应用之后,会自动注入 Sidecar 容器。此时,访问流量将通
1. 常用对象配置 1.1 Gateway selector 选择规则生效的 Envoy servers 匹配的域名 端口 协议 TLS 证书 1.2 VirtualService gateways 指定生效的网关,默认值 mesh 为东西向流量;如果指定 Gateway 对象则为南北向流量 http 七层路由 重定向 重写 重试 条件规则 超时 故障注入 跨站策略 tcp 七层路由 tls 带证书路由 TLS 证书 1.3 DestinationRule host 路由 trafficPolicy 镜像流量 故障转
1. 积重难返的运维服务体系 针对明确的运维诉求,开发相应的运维服务以供运维、业务用户使用,本无可厚非。但如果仅满足于此,很容易出现下面的情况: 用户频繁地寻找各个系统的入口,在各个系统之间来回跳转,忙于寻找各种按钮、拷贝参数。 一旦这样的运维服务多
1. 现象 - Tekton 克隆代码任务慢 在执行克隆任务时,Tekton 很费时间,多仓库下一般都需要 2 分 30 秒左右。如下图: 仅克隆的流水线就需要执行 2 分钟 16 秒,而克隆脚本实际上仅执行 1-3 秒。其中大部分时间花在了哪里?能不能减少?这是本篇主要想讨论的问题。 2. 分析克
1. Falco 是什么 Falco 是由 Sysdig 贡献给 CNCF 的云原生运行时安全相关项目。 Falco 实现了一套可扩展的事件规则过滤引擎,通过获取事件、匹配安全规则、产生告警通知系列操作,能够发现系统中的安全问题。其中的事件来自系统调用,同时也支持 ebpf 探针,规则是开源的[1],可以自行定
1. 运行 Stable Diffusion 推荐配置 内存: 不低于 16 GB DDR4 或 DDR5 存储: 不低于 10 GB 可用空间 GPU: 不低于 6 GB 显存 N 卡 如果硬件达不到要求,也可以使用各种优化 fork 兼容更低配置的硬件,但生成时间会增长。 当前的开发主机配置为: 2.9 GHz 8-Core Intel Core i7 16 GB 2666 MHz DDR4 250 GB SSD 由于没有 GPU,生成图片时,
1. 跳过证书校验无法获取监控 如果指标抓取时,能跳过 TLS 认证是最便捷的。其 Prometheus 的 ConfigMap 配置如下: 1 2 3 4 5 6 7 8 9 - job_name: etcd metrics_path: /metrics scheme: https tls_config: insecure_skip_verify: true static_configs: - targets: [ '1.1.1.1:2379' ] - targets: [ '2.2.2.2:2379' ] - targets: [ '3.3.3.3:2379' ] 但 Prometheus Targets 报错 Get "https://3.3.3.3:2379/metrics": remote error: tls: bad certificate 在 targets 页面的报错如下图: 2. curl 验证抓取请求 跳过证书 1 2 3 curl https://1.1.1.1:2379/metrics -k curl: (35)
1. 部署 Ingress Controller 查看 Kubernetes 版本 1 2 3 4 kubectl version --short Client Version: v1.21.4 Server Version: v1.21.4 查找兼容的 Nginx Ingress 版本 Helm Chart version Helm Chart 最高可用版本 K8s 适配版本 3.x.x 3.36.0 1.16+ 4.x.x 4.4.2 1.19+ 参考: https://github.com/kubernetes/ingress-nginx 安装 Nginx Ingress Controller 1 2 3 helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx --create-namespace --version v4.4.2 查看服务 1 2 3 4 5 6 7 8 9 10 11 12 kubectl -n ingress-nginx get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.233.11.232 <pending> 80:30914/TCP,443:31493/TCP 14m ingress-nginx-controller-admission ClusterIP 10.233.56.67 <none> 443/TCP 14m kae@node1:~$
1. 遇到的问题 项目介绍: 文件大小 5.6 GB 文件数量 529352 Dockerfile 1 2 3 FROM golang:1.13 COPY ./ /go/src/code 构建命令及输入如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 time DOCKER_BUILDKIT=1 docker build --no-cache -t test:v3 -f Dockerfile . --progress=plain #1 [internal] load build definition from Dockerfile #1 sha256:2a154d4ad813d1ef3355d055345ad0e7c5e14923755cea703d980ecc1c576ce7 #1 transferring dockerfile: 37B done #1 DONE 0.1s #2 [internal] load .dockerignore #2 sha256:9598c0ddacf682f2cac2be6caedf6786888ec68f009c197523f8b1c2b5257b34 #2 transferring context: 2B
不同于 CentOS、Ubuntu,我们感受到 mv 比 cp 快;在使用 Dockerfile 构建镜像时,使用 Run cp 会比 Run mv 更快。本篇将给出相关的一些测试、验证的数据结果。 1. 测试准备 机器环境 Ubuntu 20.04.1 LTS 32C 125Gi 由于是生产机器,上面会有些负载,因此测试会有偏差。我会多次测试,等结果稳定
最近碰到两次,因故障需要重装主机系统。其中一次 Etcd 只剩下一个节点,导致整个集群宕机半个小时才恢复。本篇主要记录的是新系统 Ubuntu 20.04 初始化的过程,完成初始化之后采用优秀的集群安装工具 Kubekey 的 add nodes 命令,无需修改配置文件,一键就将节点重新加入了集群。 1. 恢复 Etcd
弹性伸缩主要有三个维度: HPA,根据利用率,自动伸缩 Pod 数量 VPA,根据历史数据,自动设置 Pod 的 Request、Limit CA,根据使用率,自动伸缩 Node 数量 本篇主要讨论的是节点扩缩容部分。 1. 自动扩缩容组件 autoscaler autoscaler 是 Kubernetes 社区维护的项目。目前 autoscaler 组件已经提供
1. 测试目的 调优构建集群的参数 探测 Tekton 并发流水线数量上限 给出单个集群最佳并发上限值 2. 相关组件及机器配置 Kubernetes 版本 v1.21.4 Tekton 版本 v0.24.1,与生产版本保持一致 OpenEBS 版本 localpv 版本 3.3.0,与生产版本保持一致 集群节点配置,共五个节点,四个用于构建 node1 master
1. 本地存储容量 所需磁盘大小(GB) = 数据保留时长 * 每秒获取指标数量 * 指标数据大小 / 1024 / 1024 / 1024 其中 每秒获取指标数量 rate(prometheus_tsdb_head_samples_appended_total[1d]) 一个小时内样本的平均大小 rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1d])/rate(prometheus_tsdb_compaction_chunk_samples_sum[1d]) 一天(86400 秒)的磁盘消耗,可以在 Prometheus 中直接查询: 86400 * (rate(prometheus_tsdb_head_samples_appended_total[1d]) * (rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1d]) / rate(prometheus_tsdb_compaction_chunk_samples_sum[1d]))) / 1024 /1024 / 1024 例如,返回 {instance="localhost:9090", job="prometheus"} 4.437
设置合理的 Req 和 Limit 不设置 Req 和 Limit,当应用的 CPU、MEM 暴涨时,会危害同一节点上的其他 Pod,甚至导致集群节点一个接一个被压垮。 Req 和 Limit 一共有四个值,如果只设置部分值,当节点资源使用率达到 Kubelet 预设值时,Kubelet 会驱逐 Pod,驱逐的顺序
FailedCreatePodSandBox 错误 Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:402: getting the final child's pid from pipe caused: EOF: unknown 处理 清理 cache 1 echo 3 > /proc/sys/vm/drop_caches 原因 内存碎片过多 calico-node 不停重启 increase max user 错误 runtime: failed to create new OS thread (have 11 already; errno=11),runtime: may need to increase max user processes (ulimit -u) 处理 增加 ulimit 限制额度 1 ulimit -u unlimited 原因 用户进程数耗尽 calico-node BIRD is not ready 错
记录一次因为 IP 变更导致集群故障的修复过程。有两个集群,一个是单节点(allinone),另一个是四节点(3 master 1 node)的集群。 1. 更新 Etcd 证书 【在每个 Etcd 节点】备份 Etcd 证书 1 cp -R /etc/ssl/etcd/ssl /etc/ssl/etcd/ssl-bak 查看 Etcd 证书中的域 1 2 3 openssl x509 -in /etc/ssl/etcd/ssl/node-node1.pem -noout -text|grep DNS DNS:etcd, DNS:etcd.kube-system, DNS:etcd.kube-system.svc, DNS:etcd.kube-system.svc.cluster.local, DNS:localhost, DNS:node1, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1, IP Address:x.x.x.1 需要
本文翻译自 https://learnk8s.io/kubernetes-network-packets,并没有逐字翻译,带入了些自己的理解。 阅读本文,你可以了解在 Kubernetes 内外,数据包是如何转发的,从原始的 Web 请求开始,到托管应用程序的容器。 Kubernetes 网络要
1,脱离职责的流程是没有意义的 软件架构与组织架构相匹配,不仅仅体现在功能边界,更体现在职责划分。 清晰的职责边界,才能构筑良好的团队协作与发展。每个团队、每个人都应该明白自己的目标,什么事情应该承担,什么事情应该回避,将时间和精力投入到对主要
1,接上一回,共享存储优化海外镜像的拉取 在基于 Harbor 和 Registry 的镜像管理分发方案的基础上,最近又做了一个优化。 之前的方案是,在每个区域,使用一台低配大磁盘的机器,部署一个 Mirror Cache 缓存镜像。这样带来一个问题,就是每个区域都需要拉取一个镜像,如果有 N 个区域,
最近有一个需求,收集 Kubernetes 的外网访问情况。因此对相关项目进行了调用和试用,本篇主要是介绍如何安装 Kindling,配置 Grafana 查看 Kubernetes 网络连接数据。 1. 什么是 Kindling Kindling 解决的是,在不入侵应用的前提下,如何观测网络的问题,其功能主要是通过暴露内核事件来实现观测。
1. 安装方式 1 2 kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' OpenEBS 主要用来给 Tekton 流水线作为默认的存储使用。之前,我也试过 Longhorn,但是高峰期扛不住,流水线 Pending。而卸载 Longhorn 之后有残留,导致 kube-apiserver 一直报错,最后花了很大力气才删除。 2. Kubernetes 集群证书过期之后,OpenE
1. 平台化才能让你走得更远 只要你比竞争对手响应市场快一点,活得久一点,就能争取更多生存的空间。绝妙的商业模式、市场机遇更像是魔法,能迅速壮大公司,但并不是人力可控的范畴。我们能做的是打磨好工具、平台,以待风起时变,稍能驾驭便能青云直上。 平台建
本文描述的监控指标,仅包含 Kubernetes 基础的指标,不包含业务相关指标,相关组件为 prometheus-server、kube-state-metrics、node-exporter,数据的保存周期为 3 天。 1. 集群中监控相关组件 1 2 3 4 helm -n monitor list NAME NAMESPACE REVISION UPDATED STATUS
主机 主机内存使用率超过阈值 1 - node_memory_MemAvailable_bytes{mode!="idle"} / node_memory_MemTotal_bytes 阈值:0.9 主机 CPU 使用率超过阈值 1 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (host_name) 阈值:0.85 主机硬盘使用率超过阈值 1 - avg without (fstype)(node_filesystem_free_bytes{fstype!='rootfs',mountpoint!~'/(run|var|snap).*'} / node_filesystem_size_bytes{fstype!='rootfs',mountpoint!~'/(run|var|snap).*'}) 阈值:0.8 Windows Windows 主机内存使用率超过阈值 1 - 1 * windows_os_physical_memory_free_bytes{job="windows_exporter",mode!="idle"} / windows_cs_physical_memory_bytes 阈值:0.9 Windows 主机 CPU 使用率超过阈值 1 - (avg by (host_ip,host_name) (irate(windows_cpu_time_total{job="windows_exporter",mode="idle"}[1m]))) 阈值:0.85
1. 主机服务端口 1 2 iptables -I INPUT -p tcp --dport 80 -j DROP iptables -I INPUT -p tcp -s 1.2.3.4 --dport 80 -j ACCEPT 这里仅允许 1.2.3.4 访问本地主机的 80 端口。 2. Docker 服务端口 对于类似 docker run -d -p 80:80 shaowenchen/demo:whoami 运行的服务,上面的方法无效,需要在 DOCKER-USER 链中添加规则。 Docker 会将 iptables 规则添加到 DOCKER 链中,如果需要在 Docker 之前添加规则需要添加到 DOCKER-USER 链中
1. Linux 下的流量控制原理 通过对包的排队,我们可以控制数据包的发送方式。这种控制,称之为数据整形,shape the data,包括对数据的以下操作: 增加延时 丢包 重新排列 重复、损坏 速率控制 在 qdisc-class-filter 结构下,对流量进行控制需要进行三个步骤: 创建 qdisc 队列 上面提到 Linux 是
1. 相关背景 早上 10:00 因同事需求,我通过工具在集群上创建 Kubernetes Job 执行任务。 工具创建 Job 时,会拿到集群上的全部节点,然后逐个绑定节点创建 Job。例如,如下集群: 1 2 3 4 5 6 7 8 9 10 kubectl get node NAME STATUS ROLES AGE VERSION node2 Ready control-plane,master,worker 64d v1.16.11 node3 Ready control-plane,master,worker 64d v1.16.11 node4 Ready control-plane,master,worker 64d v1.16.11 node5 Ready worker 64d v1.16.11 node6 Ready worker 64d v1.16.11 node7 NotReady,SchedulingDisabled worker 64d
1. 异构系统带来的认证鉴权问题 企业系统,可以分为以下几种类型: 购买的商业软件,比如 JumpServer 开源的软件,比如 Kibana、Grafana 自主研发的软件,比如应用管理平台 这里需要说明的是,认证和鉴权是两个功能: 认证,证明你是你 鉴权,你是管理员,而不是普
1. 自签 *.docker.io 域名证书 1.1 创建 CA 证书 生成 CA 证书私钥 1 openssl genrsa -out ca.key 4096 生成 CA 证书 1 2 3 4 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=chenshaowen.com" \ -key ca.key \ -out ca.crt 1.2 创建 *.docker.io 域名证书 生成私钥 1 openssl genrsa -out docker.io.key 4096 生成证书签名请求 CSR 1 2 3 4 openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=*.docker.io" \ -key docker.io.key \ -out docker.io.csr 生成 x509 v3 扩展 1 2 3 4 5 6 7 8 9 10 11 cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE
1. Harbor 跨区带来的挑战 如果只是简单的存放镜像数据, Registry 作为镜像仓库会是一个很好的选择。Registry 不仅支持多种存储后端,还可以配置 HTTPS 证书,访问凭证。值得一题的是,Harbor 也是使用 Registry 存储镜像数据。 如果团队需要进行角色管理,存储控制,对接 LDAP 认
如果采用 Logstash 集中接收 Filebeat 的日志输入,容易造成单点瓶颈;如果采用 Kafka 接收 Filebeat 的日志输入,日志的时效性又得不到保障。这里直接将 Filebeat 采集的日志直接输出到 Elasticsearch。 1. 准备工作 节点规划 这里没有区分 master、data、client 节点,而是
1. 创建负载时,通过 nodeSelector 指定 Node 给节点添加标签 1 kubectl label node node2 project=A 指定 nodeSelector 创建工作负载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx-nodeselector spec: replicas: 1 selector: matchLabels: app: nginx-nodeselector template: metadata: labels: app: nginx-nodeselector spec: nodeSelector: project: A containers: - name: nginx image: nginx EOF 查看工作负载 1 2 3 4 kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
如果你需要监控两个主机、主机与外部服务之间的网络状况,那么就可以试一试本文提到的 Blackbox Exporter。 1. 安装 Blackbox 1.1 在主机上部署 下载二进制包 1 2 3 4 5 wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.21.0/blackbox_exporter-0.21.0.linux-amd64.tar.gz tar -xzvf blackbox_exporter-0.21.0.linux-amd64.tar.gz mv blackbox_exporter-0.21.0.linux-amd64/blackbox_exporter /usr/bin/ mkdir /etc/prometheus mv blackbox_exporter-0.21.0.linux-amd64/blackbox.yml /etc/prometheus/ 清理安装包 1 rm -rf blackbox_exporter-0.21.0.linux-amd64* 新建 Systemd 服务 1 vim /usr/lib/systemd/system/blackbox_exporter.service 新增如下内容: [Unit] Description=blackbox_exporter After=network.target [Service] Restart=on-failure ExecStart=/usr/bin/blackbox_exporter \ --config.file=/etc/prometheus/blackbox.yml Restart=on-failure [Install] WantedBy=multi-user.target
1. 应用架构与业务发展、运维能力匹配 在行业会议、文档博客中,我们时常能见到各种优秀的解决方案,但是如果直接照搬到自己的业务,却又频频碰壁。因为,这些技术方案是特定的业务场景孵化出来的,不同的业务形态、不同的业务规模、不同的业务发展阶段都会影响
1. 为什么需要二次调度 Kubernetes 调度器的作用是将 Pod 绑定到某一个最佳的节点。为了实现这一功能,调度器会需要进行一系列的筛选和打分。 Kubernetes 的调度是基于 Request,但是每个 Pod 的实际使用值是动态变化的。经过一段时间的运行之后,节点的负载并不均衡。一些节点负载
在默认情况下,Kubernetes 的证书每隔一年需要 renew 一次,下面是记录的一次证书更新过程。 1. 查看证书 在 Master 节点上查看证书过期时间: 1 2 3 4 5 6 7 8 9 10 11 12 13 kubeadm certs check-expiration CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Apr 02, 2023 09:53 UTC 296d no apiserver Apr 02, 2023 09:53 UTC 296d ca no apiserver-kubelet-client Apr 02, 2023 09:53 UTC 296d ca no controller-manager.conf Apr 02, 2023 09:53 UTC
1. 抓取 Tekton Metrics 新增 ConfigMap 配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: config-observability namespace: tekton-pipelines labels: app.kubernetes.io/instance: default app.kubernetes.io/part-of: tekton-pipelines data: metrics.backend-destination: prometheus metrics.taskrun.level: "task" metrics.taskrun.duration-type: "histogram" metrics.pipelinerun.level: "pipeline" metrics.pipelinerun.duration-type: "histogram" EOF 修改 data 中的配置,会改变上报指标的粒度,甚至会严重影响 Prometheus 的性能,需要谨慎修改。 重启 Tekton 1 kubectl -n tekton-pipelines rollout restart deployment tekton-pipelines-controller [可选] 将 tekton-pipelines-controller 设置为 NodePort
1. 为什么需要 kube-status-metrics Kubernetes 的监控主要关注两类指标: 基础性能指标 CPU、内存、磁盘、网络等指标,可以通过 DaemonSet 部署 node-exporter,由 Prometheus 抓取相关指标。 资源对象指标 Deployment 的副本数量、Pod 的运行状态等。这些指标需要 kube-status-metrics 轮询 Kubernetes 的 API 查询,并暴露给 Prometheus 才能够看到
1. 含义 如果一个服务有多个域名入口,通过这些入口访问得到的内容一样,那么称这些域名为等价域名。 比如,通过等价域名,可以提供 3 个一模一样的文件或者接口服务。 https://server.chenshaowen.com/static/index.html https://server-peer-a.chenshaowen.com/static/index.html https://server-peer-b.chenshaowen.com/static/index.html 2. 用途 2.1 增加浏览器并发上限 浏览器通常会限制对单个域名最大并发数量不超过 6 个/秒。通
1. 关于流量分发 流量的治理分为南北向和东西向。在典型的 Network Diagrams 的绘图习惯中,核心网络组件绘制在顶部,客户端绘制在底部,不同的服务水平绘制,因此有了南北和东西流量的称呼。 其中,南北流量指的是从客户端发起的流量,东西流量指的是服务与服务之间的流量。目
1. 准备定时脚步 如果是 Bash 脚本,第一行需要指定解释器。 1 2 mkdir -p /root/scripts vim /root/scripts/quick-clear.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/sh /usr/local/bin/kubectl --kubeconfig /root/.kube/config get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs --no-run-if-empty -L1 /usr/local/bin/kubectl --kubeconfig /root/.kube/config delete pod -n || true /usr/local/bin/kubectl --kubeconfig /root/.kube/config get pods --all-namespaces -o wide | grep Error | awk '{print $1,$2}' | xargs --no-run-if-empty -L1 /usr/local/bin/kubectl --kubeconfig /root/.kube/config delete pod -n || true /usr/local/bin/kubectl --kubeconfig /root/.kube/config get pods --all-namespaces -o wide | grep Completed | awk '{print $1,$2}' | xargs --no-run-if-empty
1. 相关背景 待在工作岗位上,总得做点事,也想做点新鲜事。但并不是你想做就有机会去做,并能做好。 一个人做、还是能和大家一起做,最终的结果是不一样的。这就涉及到时机,大家能否达成一致的动机。 今年是降本增效的一年,很多公司在裁员、减配降本。因此,对
1. 下载二进制文件 1 2 3 4 wget https://github.com/thanos-io/thanos/releases/download/v0.26.0/thanos-0.26.0.linux-amd64.tar.gz tar xvf thanos-0.26.0.linux-amd64.tar.gz mv thanos-0.26.0.linux-amd64/thanos /usr/bin/ rm -rf thanos-0.26.0.linux-amd64* 2. 安装 Thanos Query 1 vim /etc/systemd/system/thanos-query.service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [Unit] Description=Thanos Query After=network-online.target [Service] Restart=on-failure ExecStart=/usr/bin/thanos query \ --log.level=debug \ --query.auto-downsampling \ --grpc-address=0.0.0.0:30091 \ --http-address=0.0.0.0:30092 \ --query.partial-response \ --query.replica-label=prometheus_replica \ --query.replica-label=rule_replica \ --store=1.0.0.0:30091 \ --store=2.0.0.0:30091 [Install] WantedBy=multi-user.target --store 参数添加需要聚合的全部源。 1 systemctl daemon-reload && systemctl enable thanos-query 1 systemctl start thanos-query && systemctl status thanos-query 3. 安装 Thanos Sidecar 1 vim /etc/systemd/system/thanos-sidecar.service 1 2 3 4 5
作者: 王伟 出版社: 中信出版社 出版年: 2017-10-15 ISBN: 9787508667751 Notes: 在万年内,地缘是无法改变的事实,也是各位战略家不断深入研究的领域。中国往东,经过日本,越过北太平洋就是美国;中国往西南,经过印度洋、大西洋,也与美国连通。 美国依靠的是本土的工业、科技能力,通过控制
1. 通信协议的选择 运维系统更适合 HTTP 而非 gRpc 。 熟悉 HTTP 的运维、研发人员比其他协议的人多。在掌握 HTTP 协议的基础上,学习 Restful 风格的 HTTP API 很快。更多人熟悉、更易于学习,意味着更好沟通、更低的交接成本,因为他们有着更多共同的领域背景。 支持 HTTP 调试的工具非常多。无论
1. 通过 kubectl create 添加 1 kubectl create secret docker-registry mypullsecret --docker-server=harbor.chenshaowen.com --docker-username=robot-test --docker-password=xxxxxx 通过 kubectl create 可以直接添加拉取镜像的凭证。 2. 通过 ~/.docker/config.json 添加 使用账户密码登录镜像仓库 1 docker login harbor.chenshaowen.com:5000 1 docker login harbor.chenshaowen.com 可以添加多个。 查看本地保存的凭证 1 2 3 4 5 6 7 8 9 10 11 12 cat ~/.docker/config.json { "auths": { "harbor.chenshaowen.com:5000": { "auth": "xxxxxx" }, "harbor.chenshaowen.com": { "auth": "xxxxxx" } } } 对凭证进行 base64 编码 1 2 3 cat ~/.docker/config.json |base64 -w
1. 容器的 ulimit 设置太小 报错信息: 1 2 3 4 5 6 7 CheckpointDir: /root/.obsutil_checkpoint OutputDir: /root/.obsutil_output runtime: mlock of signal stack failed: 12 runtime: increase the mlock limit (ulimit -l) or runtime: update your kernel to 5.3.15+, 5.4.2+, or 5.5+ fatal error: mlock failed 如果是 Docker 下,可以在启动时添加 ulimit 参数 1 docker run -it --ulimit memlock=-1 ... 如果是 Kubernetes 下,需要以特权模式启动 Pod 1 2 3 securityContext: privileged: true runAsUser: 0 在 yaml 配置中添加上面的片段,然后在启动脚
作者: [美] 李政道 出版社: 清华大学出版社 出版年: 2000-05 ISBN: 9787302038665 Notes: 以前还是挺喜欢阅读数学和物理领域知识的,参加工作之后疲于解决各种项目和技术问题,对世界本真的模样逐渐失去了好奇。得益于作者深厚的功力,这本书能够轻松将各领域、场景下的对称与不对称进行呈
1. 使用 Query 聚合数据 如上图,Thanos Query 可以对接的组件有: Thanos Store Gateway Thanos Query Thanos Receive Prometheus,借助于 Sidecar 利用 Thanos Query 之间的级联,我们可以实现跨组件的关联查询,组建超大型的监控系统。这也意味着,每个对接的组件应该提供足够快的 Prometheus API。整个接口的响应时
1. 全球的网络规划 很多面向全球的多区域基础设施,在设计之初并没有在网络规划上花费太多心思。当业务复杂到一定程度时,又被逼着进行网络调整和优化。而任何网络上的大调整,都将对业务产生巨大影响。最终会陷入进退两难之地,只能投入更多人力,背上历史包袱
1. 监控的分层 如上图,在建设监控系统时,会采用两种策略: 分层监控。IaaS、MySQL 中间件、App 层监控分开的好处是,系统之间具有高可用性、容错性。当 App 层监控无法工作时,IaaS 层监控立马就会体现出来。 长短期指标分离。短期指标用来提供给告警
1. 添加 key 的步骤 1.1 客户端生成 ssh key 有两种格式的 Key: 老格式,私钥以 -----BEGIN RSA PRIVATE KEY----- 开头 1 ssh-keygen -m PEM -t rsa -b 4096 -C "mail@chenshaowen.com" 新格式,私钥以 -----BEGIN OPENSSH PRIVATE KEY----- 开头 1 ssh-keygen -t rsa -b 4096 -C "mail@chenshaowen.com" 由于某些旧的系统不支持新格式的 Key,这里建议生成老格式的 Key。如果你已经在使用新格式的 Key,可以使用 puttygen
升级思路是,驱逐负载、摘除流量之后,先升级控制节点,后升级工作节点。 1. 查看集群版本 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:12:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T17:57:25Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"} 当前版本是 1.22,由于 kubeadm 不允许跨版本升级,这里准备升级到 1.23 。 2. 添加 Kubernetes 安装源 CentOS 操作系统: 1 2 3 4 5 6 7
1. Kubernetes Pod 引用环境变量的几种方式 1.1 直接 Key/Value 可以直接设置 Value 值,也可以将当前 Pod 的信息作为 Value 值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 apiVersion: v1 kind: Pod metadata: name: envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: gcr.io/google-samples/node-hello:1.0 env: - name: DEMO_GREETING value: "Hello from the environment" - name: DEMO_FAREWELL value: "Such a sweet sorrow" - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name 1.2 从 Secret 引用 有两
1. 给主机添加 DNS 1.1 CentOS 第一种方法: /etc/resolv.conf 管理 DNS 禁用 NetworkManager 如果不禁用 NetworkManager,在重启 NetworkManager 组件之后,直接在 /etc/resolv.conf 中添加的 DNS 记录会丢失。 1 2 3 4 vim /etc/NetworkManager/NetworkManager.conf [main] dns=none 在 [main] 部分添加 dns=none。 此时重启 NetworkManager,对已经添加到 /etc/resolv.conf 的记录无影
1. 硬盘格式化 查看新磁盘 1 fdisk -l 通常,第二块硬盘的名字会是 /dev/sdb 。 磁盘分区 1 fdisk /dev/sdb 会有提示输入参数: command (m for help):n Partition number(1-4):1 First cylinder (1-22800,default 1):Enter command (m for help):w 格式化磁盘为 ext4 1 mkfs.ext4 /dev/sdb 将磁盘挂载到指定目录 1 2 mkdir /data mount -t ext4 /dev/sdb /data 开机自动挂载目录 先找到设备的 UUID。 1 2 3 blkid |grep /dev/sdb /dev/sdb: UUID="328a9d32-abb6-492a-aabe-b6a63583674d" TYPE="ext4" 编辑 /etc/fstab 新
非分阶段构建场景下,使用容器进行构建时,我们可以将容器中的缓存目录挂载到构建主机上,执行构建任务;然后将产物拷贝到运行镜像,制作应用镜像。但是在分阶段构建时,构建镜像和运行镜像在同一个 Dockerfile 中,这给优化第三方依赖的缓存带来了难度。 1. 创建一个 Vue 实
1. 免密登录 修改 /etc/my.cnf,在 [mysqld] 中添加一行: skip-grant-tables=1 重启 mysqld 服务 1 systemctl restart mysqld 使用 root 用户登录到 MySQL 1 mysql -u root 2. 允许全部访问来源 登录 MySQL 1 mysql -u root -p 在 mysql 交互命令行中输入: 1 2 3 4 USE mysql; SELECT user, host FROM user; update user set host = '%' where user = 'root'; FLUSH PRIVILEGES; 3. 导出全部数据 1 mysqldump -uroot -proot --all-databases >/tmp/all.sql
监控系统的难点在于,存储大容量时序数据,提供高性能的查询能力;告警系统的难点在于,设计高效的告警引擎,实现灵活的告警升级机制。最近一直在跟踪监控告警系统,本篇主要是整理监控告警相关的一些概念、组件,调研方案。 1. 监控告警系统的组成 对于监控告警
1. 布卢姆分类学 布卢姆分类学 (Bloom’s taxonomy) 是美国教育心理学家本杰明·布鲁姆于1956年在芝加哥大学所提出的分类法,把教育者的教学目标分类,以便更有效的达成各个目标。根据布卢姆的理论析,知识可以分成以下三个范畴: 态度范畴(Affective Domain)
1. 面试流程 建立招人标准 对齐招人标准 简历分析 开场寒暄 胜任力评估 价值观评估 辨别真伪 动机评估 吸引优秀候选人 结束面试 填写面试评估表 协助入职跟进 2. 面试前 2.1 建立招人标准 why 使用统一的考核标准评估候选人 how 冰山模型,冰山上-当前(知识、技能),冰山下-未来(
最近在调研开源的 Kubernetes 管理平台,需求是能够管理内网的上百个集群。功能定位是辅助运维、向应用层提供能力,而非直接面向终端用户。 1. Kubernetes Dashboard 项目地址: https://github.com/kubernetes/dashboard 技术栈:Angular + Go 关键字: 单集群 K8s 资源管理 2. Kuboard 项目地址: https://github.com/eip-work/kuboard-press 技术栈:Vue 关键字: 多集群 K8s 资源管
1. 安装准备 一个安装好 PE 的 U 盘 如果是 MacOS,可以使用 balenaEtcher 刻录 wepe for mac 镜像。 下载 synoboot 文件 http://down.nas2x.com/synology/dsm/6.2/synoboot/ 下载 DSM.pat 文件 https://archive.synology.com/download/Os/DSM 2. 开始操作 通过 PE 引导,进入系统 将 synoboot 写入内置的 SSD 存储 如果使用 U 盘引导,可能还需要修改 grup.cfg 中的 PID、VID 值。 卸载 U 盘,重启系统,进入 Happy hacking 页面 同网络
1. 安装 node exporter 1 2 3 wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/ 如果访问不了 GitHub,可以参考: 国内访问 GitHub 的若干方法 。 2. 配置并启动 exporter 新增 Systemd 配置 1 vim /etc/systemd/system/node_exporter.service 增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 [Unit] Description=Node Exporter After=network.target [Service] User=root Group=root Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target 启动 exporter 1 2 systemctl daemon-reload systemctl start node_exporter 添加开机自启动 1 systemctl enable node_exporter 本地查看 Metric 接口 1 2
1. 背景和前置条件 Btrfs 文件系统相较于 Ext4 ,是一种更年轻的文件系统,具有更多可玩的特征,比如支持快照、子卷、校验和自检、软 RAID 甚至透明压缩等。 但是在没有运维能力的情况下,建议不要使用 Btrfs 文件系统。本文记录的是,在群辉 DSM 系统下,将 Btrfs 文件系统的磁盘拆下后,
1. 升级 Go 版本之后 go.sum 版本不匹配 执行命令 go build 报错。 错误提示: missing go.sum entry for module providing package golang.org/x/time/rate; to add 解决办法: 在 go build 之前更新 go.sum,执行命令 go mod tidy 2. tls 错误 执行命令 go mod download 报错。 错误提示: fatal: unable to access 'https://github.com/agiledragon/gomonkey/': GnuTLS recv error (-110): The TLS connection was non-properly terminated. 解决办法: 禁用证书校验执行命令,export
长时间运行的集群,常会面临各种资源耗尽的问题,另外磁盘不足时 Kubelet 还会主动清理镜像增加不确定因素,本文提供了一些命令片段用于清理工作。 1. Kubernetes 基础对象清理 清理 Evicted 状态的 Pod 1 sudo kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | sudo xargs -L1 kubectl delete pod -n 清理 Error 状态的 Pod 1 sudo kubectl get pods --all-namespaces -o wide | grep
1. 时间与时区 1.1 时间标准 UTC,世界标准时间,是现在的时间标准,以原子时计时。 GMT,格林威治时间,是以前的时间标准,规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午 12 点。 UTC 时间更加准确,但如果对精度要求不高,可以视两种标准等
1. Logstash 的基本原理 Logstash 是一个用于数据传输和处理的组件。 通过插件的组合,Logstash 可以满足各种日志采集的场景: logstash->elasticsearch filebeat->logstash->elasticsearch filebeat->kafka->logstash->elasticsearch filebeat->redis->logstash->elasticsearch 2. Logstash 的基本配置 下面是一个 Logstash 的配置格式: 1 2 3 4 5 6 7 8 9 10 11 12 # 数据源,例如 Kafka、MySQL input { } # 过滤器,用于处理数
1. 错误提示 在拉取镜像时,偶尔会碰到如下错误: 1 2 3 4 5 6 7 8 docker pull node:10.16-alpine 10.16-alpine: Pulling from library/node e7c96db7181b: Already exists 50958466d97a: Pulling fs layer 56174ae7ed1d: Pulling fs layer 284842a36c0d: Pulling fs layer error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2 /docker/registry/v2/blobs/sha256/b9/b95baba1cfdbfa8b789137179d8e fff08b9768f1906725a8758cf0c431b59621/data? verify=1636603895-lbb1QIruPZBdfgfhBZ95ArGK0wU%3D: dial tcp 104.18.124.25:443: i/o timeout 2. 主要解决办法 2.1 修改 DNS 地址 如果是 CentOS ,直接修改 /etc/resolv.conf 文件,新增一行 nameserver 8.8.8.8 即可。 如果是 Ubuntu ,需要修改 /etc/syste
应用配置管理强调的是,应用运行时依赖的配置管理,不同于项目的静态配置。本文是实际开发过程中的一些总结,以供大家参考,也欢迎交流。 1. 关于配置管理 1.1 名称解释 配置项 一个 key=value 组合 配置集 一组配置项的集合,key1=value, key2=value2 配置实例 一份完整的,可供
从调研数据来看,大家选择小集群的比较较高。下面是从节点数、节点配置角度提供的一份对比列表。 下面是选择少量大集群,还是多个小集群的对比列表: 特征 少量大集群 多个小集群 资源利用率 高 低 管理节点开销 低 高 资源伸缩范围 大 小 资源调度范围 大 小 应用间通信效率 高
1. SSH 连接方向: Master 主动连接 Agent 要求: Master 能通过 SSH 直连 Agent Agent 上启动了 SSHD 服务 Jenkins 安装 SSH Credentials Plugin、SSH Build Agents 插件 2. JNLP 连接方向: Agent 主动连接 Master 要求: Agent 能访问 Master Agent 需要 JVM 环境运行 Master 需要放开 50000(默认值)端口用于 Agent 通信 50000 端口是 Jenkins Master 的服务端口,不需要再运行
副标题: 让谷歌、亚马逊实现爆炸性增长的工作法 作者: (美) 约翰·杜尔(John Doerr) 出版社: 中信出版社 出版年: 2018-12 ISBN: 9787508696881 Notes: OKR 即目标与关键成果法,是 Intel 创始人安迪·葛洛夫发明的一种用于管理目标和完成的工作方法。O 代表着目标,它应该是重要且具体、
1. 缺少发自内心的渴望 有了渴望才会有动力。对生存的渴望、对美好的渴望,是推动人类进步的源泉。渴望愈加强烈,动力才会愈加强烈。强烈的渴望会让人不顾一切地冲向目标。想要突破,激情比理性更加重要。 2. 疲于满足日常的生理 无法突破的身体和精神极限。太在意
1. 关于两地三中心 如上图,两地三中心的架构,是为了提高系统的容错、容灾的能力。当一个数据中心不可用时,能够将关键业务的流量切换到其他数据中心,可以抵御城市级的自然灾害。 两地指的是,地理上不同的两座城市,而三中心指的是: 生产中心 同城灾备中心 异地
副标题: 如何从智商衰退中跳脱出来 作者: (日) 大前研一 出版社: 中信出版社 出版年: 2010-4 ISBN: 9787508619262 Notes: 值得注意的是这本书的形成时间。十多年后的今天,阅读这本书依然可以感受到其分量。 网络越发达,大脑越懒惰。年轻人只关注自己的片瓦之地,不再有欲望和向上的动力。
1. 为什么需要定义应用运行时 运行时更多选择。传统的应用运行时有,物理机、虚拟机、云主机。容器时代,常见的运行时有 Docker、Kubernetes。这些运行时,提供给我们的不再是一个单一的运行时选择。 应用拓扑更复杂。如果由 CMDB 统一存储应用的拓扑
Kubevela 目前处于 1.1 版本。通常,我们认为 1.x 的版本是相对稳定的,可以尝试引入生产。在不断地跟踪和学习过程中,也感受到 Kubevela 的一些好的地方,这是一篇小结性的文档。 1. Kubevela 能解决什么问题 面向平台开发者 需要区分几个角色: 开发、运维、运维开发。开发面向的是业务需求,
1. 系统要求 Kubernetes, >= 1.16.0-0 Helm, >= 3.0 Linux 内核 >= 4.9.17 CentOS 7 升级内核过程,可以参考 Calico 下如何切换数据面到 eBPF 。 2. 卸载 Calico 删除集群资源 1 2 3 4 5 6 kubectl -n kube-system delete ds calico-node kubectl -n kube-system delete deploy calico-kube-controllers kubectl -n kube-system delete sa calico-node kubectl -n kube-system delete sa calico-kube-controllers kubectl -n kube-system delete cm calico-config kubectl -n kube-system delete secret calico-config 1 kubectl get crd | grep calico | awk '{print $1}' | xargs
1. 环境准备 1.1 Calico eBPF 要求 系统要求 Ubuntu 18.04.4+ Red Hat v8.2 Linux kernel v5.3+ 如果 Calico 没有检测到兼容的内核,将会回退到标准模式。 每个节点的 /sys/fs/bpf 都需要挂载有 BPF 文件系统 Calico 版本不低于 3.13 1.2 升级内核 这里使用的是 CentOS 7 操作系统: 1 2 3 uname -rv 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 内核版本不满足要求,因此需要升级内核
1. Calico 1.1 BIRD is not ready 1 kubectl -n kube-system get pod calico-node-xxx 0/1 一直起不来,报错 calico/node is not ready: BIRD is not ready: BGP not established with 解决办法: Calico 默认使用 first-found,也就是从第一个找到的网卡中获取 NodeIP。虽然排除了 lo、docker0 等网卡,但是依然有一定概率会识别失败。需要手动修改,
nload 是一个流量监控的终端工具,读取 /proc/net/dev 文件,绘制流量图。下面是一个简单的使用简介。 1. 安装 CentOS 1 yum install -y nload 如果系统的源找不到 nload 包,可以执行如下命令添加新源: 1 yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm Ubuntu 1 apt-get install -y nload 2. 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 nload --help Command line syntax: nload [options] [devices] nload --help|-h Options: -a
1. 本地怎么访问远程集群 在研发时,需要直接连接远端 Kubernetes 集群。通常的做法是,将 /etc/kubernetes/admin.conf 拷贝到本地 ~/.kube/kubeconfig。 但是 kubeconfig 的 server 地址是 kubernetes.default.svc。因此,我们需要配置一个 hosts: 1 1.1.1.1 kubernetes.default.svc 如果需要在不同集群之间切换
Prometheus 社区更新太快,之前写的一些文档有些过时。最近又开始关注可观测性,补齐运维方面的一些知识点。 1. 名词解释 Grafana 一个可视化工具,提供各种可视化面板,支持各种数据源,包括 Prometheus、OpenTSDB、MySQL 等。 Prometheus 一个时间序列数据库,主要
1. 问题背景 在 Jenkins 中添加了很多个构建节点使用同一个 Label 以供流水线使用,但是 Jenkins 却每次都倾向于在同一个节点进行构建。 这导致了并发问题,单个节点的压力过大,而其他节点空闲,负载极其不均衡。 2. 业务流水线的设计 上述问题的产生和业务流水线的设计有一定的关系。
1. 几种常见网关的比较 Nginx, 模块化设计的反向代理软件,C 语言开发 OpenResty, 以 Nginx 为核心的 Web 开发平台,可以解析执行 Lua 脚本 Kong, OpenResty 的一个应用,是一个 API 网关,具有 API 管理和请求代理的功能,使用 PostgreSQL 存储 APISIX, 替换了 Kong 的 PostgreSQL 为 Etcd,基于 Nginx 的核心库实现 APISIX 的优势在于提供了 API 的管理
1. Serverless 的使用场景 如果说云计算是希望资源能够像自来水一样,隋开随用、随关随停,那么 Serverless 就是云计算的未来方向之一。相较于 IaaS、Kubernetes 这些运行时,Serverless 提供更细粒度资源控制的同时,还能提供更大的弹性,允许开发者快速交付
1.背景 1.1 目前使用 Jenkins 遇到的问题 编排引擎不稳定 Jenkins 是由 Java 编写的编排引擎,在 Full GC 时会 Stop The World(STW)。在大规模构建时,STW 可能会导致 Jenkins 无法处理新的请求。 大量构建卡顿 Jenkins 使用磁盘文件存储数据,每条流水线、每次构建都会占用一个文件目录,产生大
通常,我们需要在 GitHub 上进行一些操作,才能触发 GitHub Action。本篇将介绍一种通过 API 远程调用触发 GitHub Action 的方法。 1. 常见的几种触发 GitHub Action 的方式 下面是一个 GitHub Action 的示例: 1 2 3 4 5 6 7 name: GitHub Actions Demo on: [push, pull_request] jobs: Explore-GitHub-Actions: runs-on: ubuntu-latest steps: - run: echo "Hello World!" 在 on 关键字下,定义的就是触发 Workflow 执行的事件。
1. 多集群构建 Tekton 的优势 借助于 Kubernetes, Tekton 已经具备很好的弹性, 能够支持大规模构建。同时, 开发 Task 主要使用 Yaml 和 Shell, 这扩大了 Tekton 的各种场景适配范围。 上面是一张 Tekton 在多集群下的示意图。为什么 Tekton 需要多集群执行流水线? 随时可变的 Kubernetes 集群。单一的 Kubernetes 集群, 无法满足运维的要求,
1. 创建一个 Go Modules 项目 创建目录 1 2 mkdir go-test cd go-test 初始化包 1 2 3 4 5 go mod init gitlab.private.com/shaowenchen/go-test go: creating new go.mod: module gitlab.private.com/shaowenchen/go-test go: to add module requirements and sums: go mod tidy 添加业务代码 main.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello world.", }) }) r.Run() } 下载依赖到 vendor 1 2 go mod tidy go mod vendor 本地运行 1 2 3 4 5 go run
1. CICD 平台的基本功能 常见的 CICD 引擎并不适合直接提供给业务方使用。主要原因在于用户学习成本高、缺乏必要的鉴权、维护升级难度大。 我们通常会基于流程引擎,针对业务进行适配提高易用性,针对场景进行封装收敛复杂度,那么一个 CICD 平台需要具备哪些基本的功能呢?
1. 编辑 Kubelet 配置文件 1 vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 修改 Kubelet 相关参数 ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS 可以通过如下命令查看可选的参数: 1 kubelet --help 例如需要修改,KUBELET_KUBECONFIG_ARGS 的 --sync-frequency , 同步容器配置的时钟周期,默认值是 1 min。其含义是,更新了容器挂载的配置文件 1 min 之后,容器
1. 需求背景 如上图,业务方需要隔离 namespae 的服务,禁止 bar 空间的负载访问,而允许用户从 Load Balancer (LB) 通过 NodePort 访问服务。可以很容易地写出一个网络策略: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: foo spec: podSelector: matchLabels: {} policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.2.3.4/32 - namespaceSelector: matchExpressions: - key: region operator: NotIn values: - bar 然而
不能 1. 问题背景 基于 Kubernetes 构建可靠、稳定的运维系统时,虚拟机 (VM) 的销毁和新建是一种常态。VM 提供的是计算和内存资源,而使用外部存储,通过 StorageClass 提供给集群中的 PVC 消费。 在这样的背景下,如何快速初始化 VM 成为新的挑战。常见的思路是制作 Node 节点的 VM 镜像,提前将依赖
1. 如何部署 Jenkins 为了方面进行下面的测试,先介绍两种部署 Jenkins 的方式,这里使用的是 shaowenchen/jenkins:2.277.4 镜像。在生产环境中,需要替换为官方 jenkins/jenkins 镜像或自己定制的镜像。 1.1 docker-compose 运行 docker-compose.yaml 文件 version: '3' services: jenkins: image: shaowenchen/jenkins:2.277.4 container_name: jenkins restart: always network_mode: "bridge" environment: - JAVA_OPTS="-Xms1Gi -Xmx4Gi" ports: - 8080:8080 - 50000:50000 - 2222:2222 environment: TZ: Asia/Shanghai volumes: - /Volumes/Data/jenkins_home:/var/jenkins_home 在本地创建一个目录 /Volumes/Data/jenkins_home 用于存储 Jenkins 的数据
1. 配置较大的 -Xms -Xmx 参数 Jenkins 是由 Java 编写的编排引擎, 在 Full GC 时会 Stop The World(STW)。在大规模构建时, STW 可能会导致 Jenkins 无法处理新的请求。 为了避免频繁的 STW, 同时增大并发量, 建议设置较大的堆, -Xms3g -Xmx6g -XX:MaxRAM=6g。具体数值可以根据监控值来设置,
1. 解耦引擎释放流水线能力 在设计系统时,我们常面临两难。是内敛复杂度,对外提供单一易用的功能;还是释放复杂度,将灵活归还用户。这非常考验产品能力。 设计 CICD 系统时,我们可以直接将 Jenkinsfile、PipelineRun 等概念直接抛给用户,让
1. Kubernetes 中的网络隔离 Kuberntes 自 1.3 引入了 Network Policy(网络策略) ,通过 ipBlock、podSelector、namespaceSelector 定义实体,控制其 From(Ingress)、To(Egress)的流量行为。 但 Kubernetes 只是定义了网络策略,具体实
1. 我的平台建设经历 毕业之后,我加入了腾讯蓝鲸,主要参与 SaaS 的开发。待了近三年之后,回武汉老家,加入青云,负责 DevOps 的研发。待了近两年之后,加入新的公司,参与业务支撑平台建设,思考业务侧对 Kubernetes 的落地实践。 我写过很多关于平台的文档,领域输出才是 PaaS 的核心
由于众所周知的原因,在国内的网络环境下,访问 Github 时,网络会阻断或者很慢。本文提供了若干访问方法。 1. 使用 Github Mirror 下载 直接在 GitHub 仓库前面拼接 Proxy 地址,不同的 Mirror 拼接方式可能有所不同。下面以拉取 https://github.com/shaowenchen/scripts 仓库为例。 https://ghproxy.chenshaowen.com 1 git clone https://github.com/shaowenchen/ops 2. 通过 Gitee 导入 GitHub 项目 可以参考文档: GitHu
下面是一个 Jenkins 与 Tekton 对比的列表: 功能 Jenkins Tekton 编程语言 Java Golang 开发插件语言 Java Shell、Yaml 流水线描述语言 Groovy、Shell Yaml、Shell 插件生态 很多插件,LDAP、GitLab 不足 插件数量 1500+ 100+ 插件之间的兼容性 可能会有冲突,不能随便升级 完
使用的是 CentOS 7,内核版本 3.10.0-327 。 1. 查看当前 Docker 的版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 docker version Client: Docker Engine - Community Version: 20.10.6 API version: 1.41 Go version: go1.13.15 Git commit: 370c289 Built: Fri Apr 9 22:46:01 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.6 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 8728dd2 Built: Fri Apr 9 22:44:13 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.4 GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e runc: Version: 1.0.0-rc93
Docker 的 Mirror 仅能加速 docker.io 的镜像,而不能加速私有仓库的镜像。 1. 为什么需要一个私有的镜像仓库 mirror 公网限速 dockerhub 拉取限制频率 减少拉取镜像时间 2. 创建一个 Registry 镜像加速服务 生成一个配置文件 version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3 但这样启动的服务只能作为 Registry
1. 为什么需要物理构建机 在文章《如何接入远程 macOS 物理机进行 Jenkins 流水线构建》中,我描述了在 Jenkins 中添加物理构建机的方法。这并不是我拍脑袋想的需求,而是当时真的有 ToB 的商业客户在咨询方案。 对于多端开发商来说,构建 Android、IOS、macOS、Arm 、
计算机基础 堆和栈 什么时候用堆?什么时候用栈?栈有什么作用?Golang 的变量在栈还是堆?堆、栈有没有上限?有的话和什么有关? 数据结构 Slice 空间是怎样分配的?双倍扩容,原来数据复制过去。 Golang 的 map 是什么结构 Golang 的 map 是什么结构,遍历是否有序, 什么是 Hash 表?
大概是十年前,我在笔记本上安装过 macOS。当时最头疼的是只有特定的硬件才能安装成功,而且还缺各种驱动程序。后来自己买了 Mac 笔记本,很长时间没有关注如何在通用机器上安装 macOS 。最近拿到了一台 Dell 台式机,配置还不错,又尝试了一下。本文主要是记录这一过
1. 本文主要讨论什么 勿在浮沙筑高台。业务量的增长、业务形态的进化都需要坚实强劲的 IT 系统支撑。业务内容对市场是透明的,但是 IT 系统不是一朝一夕能建设完善的。未来公司之间的竞争主要也会来自于 IT 系统之间的竞争,能不能快速响应业务需求是决胜的关键。 IT 系
本文主要描述在 CentOS 8.2 下,如何使用本地工具编译 https://github.com/istio/istio 项目。另外一种方法是通过 BUILD_WITH_CONTAINER 参数控制,使用容器编译,仅依赖于 make 和 docker。 1. 安装并升级 Ruby >= 2.6 安装 Ruby 1 yum install -y ruby 查看 Ruby 版本 1 2 3 ruby -v ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux] 安装 RVM 1 2 3 4 yum install -y tar gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB curl -sSL https://get.rvm.io | bash -s stable source /etc/profile.d/rvm.sh 安
1. 以开源为核心的商业模式 开源的魅力之一在于其包容性。它能接受怀揣各种意图的人,无论是执着技术的的工程师,还是心怀鬼胎的商人,亦或是热心公益的志愿者,甚至茶余饭后的看客,都能在这里碰撞、交融,形成一股力量。 围绕开源做商业,应该被允许和接受。开
1. 安装 zsh 1 sudo yum install -y zsh 2. 安装 oh-my-zsh 1 sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 建议将 Zsh 设置为默认的 Shell。 3. 安装插件 3.1 安装 autojump 1 sudo yum install -y epel-release 1 sudo yum install -y autojump-zsh 3.2 安装 zsh-autosuggestions 1 git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions 3.3 安装 zsh-syntax-highlighting 1 git clone git://github.com/zsh-users/zsh-syntax-highlighting $ZSH_CUSTOM/plugins/zsh-syntax-highlighting 4. 添加 .zshrc 配置 1 sed -i 's/^plugins=(\(.*\)/plugins=(autojump zsh-autosuggestions zsh-syntax-highlighting \1/' ~/.zshrc 退出 Terminal, 再次登录即可。
在 CentOS 下安装包时,通常需要寻找各种源,使用 Homebrew 就没这样的烦恼。本文使用的是 CentOS 7.6,不同的系统版本可能会有差异。 1. 创建非 root 用户 Homebrew 不允许以 root 身份运行,因此需要创建一个新的用户。 新建用户 1 adduser shaowenchen 设置密码 1 passwd shaowenchen 给新用户添加 sudo 权限 编辑权限配置文件: 1 2 chmod
1. 什么是云原生 云原生是一个快速发展的领域。 2013 年, Pivotal 提出云原生的概念,并不断对其进行解读。下面是 Pivotal 对云原生架构的特征描述: 2015年,12-Factor、面向微服务、抗脆弱 2017年,可观测性、模块化、可替代性、可处理性 2019年,DevOp
作者: [美] Eric S·Raymond 出版社: 机械工业出版社 原作名: The Cathedral & the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary 译者: 卫剑钒 出版年: 2014-5 ISBN: 9787111452478 PDF: 点击查看 Notes: 大教堂隐喻由少数专家封闭式创作,不完成不发布的开发模式; 集市隐喻群策群力,小步快跑的敏捷开发模式。 从 Linux ,到 Fetchmail ,
在 《大公司和小公司的 ToB 思路》 中,我对大公司的 ToB 策略进行了较多的分析,本篇将从另外一个角度补充关于小公司 ToB 策略的思考。 1. 什么是 ToB 服务 一家商业公司通常维护着至少一条价值链,并从中获取利润。国内的中小企业平均寿命只有 2.5 年,新公司成立、旧公司破产是
本文介绍一个 ChatOps 工具 Lighthouse, 主要内容来自官方文档 。Kubernetes 社区使用 Prow 驱动其在 GitHub 上的协作, 但是不适用于其他仓库。Lighthouse 普适于更多类型的 Git 仓库。 1. 什么是 Lighthouse Lighthouse 是一个基于 webhooks 的轻量级 ChatOps 工具 , 通过 Git 仓库的 webhooks 可以触发 Jenkins X 流水线 、Tekt
从原理上看,在 Kubernetes 集群中,Jenkins 都可以使用 Podman 进行镜像构建,本文主要以 Containerd 为例。 1. 去 Docker 给 CICD 带来新的挑战 在 CICD 场景下, 我们经常需要在流水线中构建和推送镜像。 在之前的文档 《在 Kubernetes 上动态创建 Jenkins Slave》 中, 我描述了通过挂载 /var/run/docker.sock 文件, 允许在 Docker 驱动的 Kubernetes
原文由来自 Red Hat (CDF 成员) 的 Puneet Punamiya 撰写。 Tekton 是持续交付基金会 (CDF) 下的一个开源项目。它提供了一个以云原生构建 CI/CD 系统的框架。简单点说, 人们可以将整个 CI/CD 流水线定义为 Kubernetes 资源。 Tekton Pipelines 的核心是一个可复用的组件 - Task, 很容易共享。在 Tekton Catalog 仓库中包含了这些 Task 的列表。这些 Task 可
1. Buildpack 老树开新花 Buildpacks 项目最早是由 Heroku 在 2011 年发起, 被以 Cloud Foundry 为代表的 PaaS 平台广泛采用。在之前的文档 《PaaS 部署之 buildpack》 中, 我演示了如何将一个 Django 应用部署到 Heroku 上。 Buildpacks 不足的是产出包是 Droplet 格式, 不能直接适配容器平台。 在 2018 年 1 月, Pivotal 和 Heroku 发起了一个项
1. Argo CD 能解决什么问题 1.1 从 GitOps 说起 GitOps 起源于 Weaveworks 公司在 2017 年发表的一篇博客, GitOps - Operations by Pull Request 。在文中,Alexis 介绍了一种以 Git 为唯一事实来源的部署方式。 在 GitOps 实践中,我们需要将软件设施定义在 Git 仓库中进行管理。其中的软件设施,包括 IaaS、Kubernet
1. 什么是 pyfiglet pyfiglet 是一个用 Python 实现的 ASCII 艺术字生成工具。可以根据字符生成如下图形: 1 2 3 4 5 6 _ _ _ _ _ _ | |__ ___| | | ___ __ _____ _ __| | __| | | | '_ \ / _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | | | | | | __/ | | (_) | \ V V / (_) | | | | (_| |_| |_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_) |/ 在编写 CLI 工具时,可
1. 一个令人困惑的问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 name: Go on: [push, pull_request] jobs: build: name: CI runs-on: ubuntu-latest steps: - name: Set up Go 1.13 uses: actions/setup-go@v1 with: go-version: 1.13 - name: Check out code into the Go module directory uses: actions/checkout@v2 - name: Check pr is properly formatted run: diff -u <(echo -n) <(gofmt -d ./pkg ./cmd ./tools ./test) - name: Test & Build run: make all 上面是项目中 workflow 的一部分, 主要用来检测代码风格、执行单元测试、
如果你已经在使用 GitHub Actions ,那么阅读本文你将获得更多有趣而有用的打开方式。阅读完,我又给仓库新增了几个 workflow 。 1. workflow 执行时,传入参数 在执行 workflow 时, 允许在 GitHub Actions 页面输入参数,控制执行逻辑。我们可以将人工处理的逻辑,在 GitHub Actions 参数化执行,适用于持续部署场景。 1 2 3
本文档主要用于展示 Docker 特权模式的危害,请谨慎操作。对于没有 CLI 操作权限的用户,可以拷贝示例的 Yaml,直接创建集群负载 Pod、Job、DaemonSet 等进行操作。 1. 直接删除全部资源 如果能登陆机器,收拾好东西,执行命令: 1 kubectl delete all --all --all-namespaces 但是也有可能
1. 登录 Ngrok 获取一个 Authtoken 1.1 登陆 Ngrok 官网,获取 Authtoken 访问 Ngrok 官网,https://dashboard.ngrok.com/ , 可以使用 GitHub 或者 Google 账户登陆。 进入 Authentication 页面,找到自己的 Authtoken,如下图: 1.2 在 GitHub 项目下,配置 Secrets 在项目的 Settings 页面中,新增 Secrets
1. 什么是 Ngrok Ngrok 是一个内网穿透工具,能够将内网的服务,发布到公网上。下面这张图,可以很好地展示其功能: 相较于同类工具 Frp (需要同时运行 Server 和 Client ),Ngrok 将内网穿透做成了一个服务。只需要在 Ngrok 注册账户,获得 Authtoken ,启动 Client 就可以对外提供,本地服务的公网地
1. Debug 到想跑路 GitHub Actions 是 GitHub 在 2018 年 10 月推出的持续集成服务。对于开源项目,免费提供无限时长的构建时间,同时支持 Linux、MacOs、Windows 系统,非常招人喜爱。 但是,最近的一次经历改变了我的看法。我给同事的仓库,提交了一个 improvement: build and ci 的 commit ,用于完
1. 一个奇怪的需求 老板有个奇怪的需求,通过一个 kubeconfig 文件,获取主机的各种状态信息,比如进程列表、进程状态等。 第一反应就是,老板是不是不懂容器,容器怎么能这样玩,这样玩还要什么容器,内心万马奔腾。 直到最近遇到了一个命令行工具,才发现原来小丑是我自己
1. 写作如写代码一般重要 从行为上看写作和写代码都是在 Typing (打字),只不过,写作面向的是人,写代码面向的是机器。 写代码是为了能控制机器的状态,让其按照预设的指令转换;而写作是为了传达知识,让其他人能够按照预设的逻辑理解。 因此,写代码和写作其实是两
在上一篇文档 《使用 ChatOps 改进研发流程》中,通过 ChatOps 给 Pull Requests 提供预览链接提升了敏捷速度。本篇主要描述如何快速实现这个功能。 1. 第一步: 配置一个触发器 1.1 选择一个触发器 在 GitHub 中有三类 Workflows 触发器,定时、人工、自动触发器。我们需要选择一个自动触发器,用于触发执行逻
1. 什么是 ChatOps GitOps、ChatOps、AIOps 等(以下简称 NewOps )是近几年出现的新兴运维理念。NewOps 将 Ops 从混沌的状态离析为两个部分:一个面向用户,趋势是更加人性化、可审计、可回溯;另一个面向基础设施,趋势是更加程序化、自动化、智能化。
1. 行业规范 [TPSA19-22]SRC行业安全测试规范: https://security.tencent.com/announcement/msg/180 2. SRC 列表 序号 上线时间 SRC名称 01 2012 TSRC(腾讯) 02 2013 ZSRC(猪八戒) 03 2013 NSRC(网易) 04 2013 KSRC(金山) 05 2013 JSRC(京东) 06 2013 BSRC(百度) 07 2013 ASRC(阿里巴巴) 08 2013 3
1. Terraform 如何管理资源状态 在执行 terraform init 之后,Terraform 会将依赖的插件下载到本地 plugins 目录。 1 2 3 4 5 6 7 8 9 10 11 12 13 tree -aL 5 . |-- myresource.tf |-- .terraform | `-- plugins | |-- registry.terraform.io | | |-- hashicorp | | | `-- null | | `-- shaowenchen | | `-- qingcloud | `-- selections.json `-- var.tf 在执行 terraform apply 之后,Terraform 会使用 terraform.tfstate 文件存储资源的
1. 什么是 Workshop Workshop ( 工作坊 ) 是以领域富有经验的主讲人为核心,通过活动、讨论、演讲等方式,指导成员共同讨论某个话题的学习形式。 相较于传统的方式,Workshop 具有如下特点: 更具有针对性 有点像研习班,可以针对某一类问题,集中、充分地进行讨论。 组织更
更多的技巧,请持续关注本文的更新。 1. 运营不再是拍脑袋的事 万物互联,互联网对物理世界的建模越来越准确。我们的地理位置、行动轨迹、在电子设备上的操作都在被记录。如果能汇集各大厂商的用户画像,我们的数字版就出来了。 你只能代表此刻的你,而数字人可以
1. 测试是海上的航标 项目越复杂、规模越大,越能体现测试的价值和重要性。 测试保证了方向的正确性。就像航行时,海上出现的航标,可以用来检验、纠正路线。便于掌舵人,随时了解动态,做出调整。 测试决定了迭代的速度。随着 Scrum 等敏捷开发方法的实践,交付的节奏
1. 谈谈对 CICD 工具的审美 我在文档 软件产品是团队能力的输出 中提到,软件产品是解决方案的交付承载物,其优劣取决于团队对核心问题的理解。对领域有深入理解,交付的产品才有好的可能。CICD 是一个应用很广泛的领域,在不同的场景下,总有人在琢磨重复造轮子,
1. daemon-less 镜像构建工具 1.1 什么是 daemon-less 镜像构建工具 在 CICD 流程中,经常会涉及镜像构建,常规的做法是使用 Docker in Docker 或者 Docker out of Docker 进行构建。详情可以参考文档:如何在 Docker 中使用 Docker 实际上,为了避免垄断,促进行业发展,基于 Docker 的镜像格式,早就指定了统一的 OCI 镜像格式规范。也就是
1. DockerHub 限制 终究还是绕不过下面这个报错: 1 Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit DockerHub 从 2020 年 11 月 2 日,正式开始限制非付费用户的拉取频率: 匿名用户,每 6 小时只允许 pull 100 次 已登录用户,每 6 小时只允许 pull 200 次 好吧,正常情况下,到这里就友尽了,不让用就不
很多云原生的开源组件是先有服务,后有可视化。今天开了个脑洞,反其道而行,先有可视化交互,再设计底层。 1. 一张画布搞定半壁云原生 用户只需要一张画布,定义好 Workflow,就可以自由地游走在各种高大上的 Cloud Native 应用之上。 2. 为什么会这种奇怪的想法 2.1 看
对于互联网行业的工程师,常思考的是系统的 Scalable,例如,流量、计算、存储增长时如何改进系统,有各种水平、垂直扩容的方案。除了服务,团队的 Scalable 也是十分关键的。本篇主要思考的是,如何组织团队,在一定规模下,通过加人能够提升团队的事务处理能
1. 什么是 GitHub Actions 在前面的文档中,我对 GitLab 提供的 CI 功能进行了实践,点击查看 。使用 GitLab 的好处是可以私有化部署、无限的私有仓库数量、CI 配置简单、能接入自建的 Runner 。但随着 GitHub 越来越开放,GitLab 的这些优势在逐步丧失。 从 CICD 的角度看,越接近 Git 仓库的功能,越贴
1. 什么是布隆过滤 布隆过滤(Bloom Filter)是布隆在 1970 年提出的一种数据结构。 将元素(x、y、z)通过一系列函数,映射到一个二进制向量(0101 序列),用于快速判断元素 w 是否在一个集合当中。如下图(来自维基百科): 相较于使用单个映射函数
揭秘《DevOps 能力成熟度模型》 研发运营(DevOps)解决方案能力分级要求 - PDF 下载 第1部分:总体架构 - PDF 下载 第2部分:敏捷开发管理过程 - PDF 下载 第3部分:持续交付过程 - PDF 下载 第4部分:技术运营 - PDF 下载 第5部分:应用设计 - PDF 下载 第6部分:安
本文同样适用于接入 ARM、MIPS 架构,FreeBSD、Windows 系统的物理机,如果 Jenkins 能连上构建机,可以跳过 Frp 部分。 1. 遇到的问题 在以 Kubernetes 为基础设施的场景下,Jenkins 构建流水线时,将为每一条流水线单独创建一个 Pod 用于构建。Pod 中的容器
1. 典型适用场景 在 CI 中,通常会有一个 CI Engine 负责解析流程,控制整个构建过程,而将真正的构建交给 Agent 去完成。例如,Jenkins 、GitLab 均是如此。 如下图, 连接 CI Engine 的 Agent, 种类很多。这是为了满足不同项目对构建环境的要求。 同时 Agent 是动态的,构建时才需要,
Kubernetes 依靠 kube-proxy 组件实现 Service 的通信与负载均衡。在这个过程中,由于使用了 SNAT 对源地址进行了转换,导致 Pod 中的服务拿不到真实的客户端 IP 地址信息。本篇主要解答了在 Kubernetes 集群中负载如何获取客户端真实 IP 地址这个问题。 1. 创建一个后端服务 1.1 服务选择 这里选择 containous/whoami 作为后端服务镜
1. 开源越来越受欢迎 2019 年的 IDC 北美开源软件使用调查显示,71% 的企业正在使用开源软件,54% 的企业计划扩大使用范围。2020 年的 RedHat 企业开源现状调查显示,有 95% 的 IT 领导者认为企业开源对于企业基础架构软件战略至关重要。 一方面企业越来越接受开源软件,另
作者: [美] 约翰·D·洛克菲勒 出版社: 吉林出版集团有限责任公司 出版年: 2012-1-1 ISBN: 9787546369785 Notes: 成功的路直接而明亮,失败的路却是各有不同。
1. 曾经的尝试 在博文没有标签的你,让人无法想起中,我强调在趋同的群体中,个体成为了背景噪声,而标签成为了有效的信息。 在下面这张图中,我们很难记住某一个人,但是却很容易通过 A、B、C、D、E 标签找到某一个人。 标记之后,人与人之间会形成网络,而所
作者: 杜军 出版社: 电子工业出版社 出版年: 2019-10 ISBN: 9787121373398 Notes: 网络是 Kubernetes 中不易掌握的一个难点。网络故障会直接影响现有的负载,通常是十分紧急的问题。而网络相关的知识相较于应用开发更底层,很多的细节,需要长期的积累。 书中相关的要点之前陆续都有所接触,通过阅读这
本篇主要介绍如何运维 DevOps 流水线,怎么解决一些常见的问题。问题主要分为两大类,一类是 Kubernetes 相关的,具有一定通用性;另一类是与业务相关,需要对领域有所了解,解决问题时才能事半功倍。文档内容,会不断滚动更新。 1. Kubernetes 问题排查 1.1 基本的创建流程 如上图所示,是用
KubeSphere DevOps 包含 S2I 和 Pipeline 两部分。在社区中,openshift 提供了一个打包应用的工具 S2I,具体请参考 使用 S2I 构建云原生应用 。KubeSphere 将其做成了服务,采用 CRD 使用一个单独的 Operator 对其进行管理,功能比较独立。而在 3.0 中 Pipeline 与 KubeShere Core 耦合依然十分紧密,在搭建
1. 重剑出鞘问天下 自 1840 开始,中国经历了百余年的屈辱;而自 1978 开始,中国只花了四十余年就从一个贫弱的大国变成一个富足的强国。 这是民族坚韧与智慧的体现。悠久的文化历史,提供给人们足够的养分。在微观上,人们可以找到各自人生的归处;在宏观上,推动着国家
Kubernetes 平台管理软件运行在 Kubernetes ,用于管理运行在 Kubernetes 上的资源对象。 1. 测试思路 测试在一定负载一定集群规模下,平台软件的管理能力,而不是 Kubernetes 的管理能力。平台软件的管理能力主要体现在能通过 UI 对负载、PV 进行增删改查,在 UI 上能够直接查看负载的监控和日志。 明确测试
联系方式 邮箱:mail(at)chenshaowen.com 微信号 关注我的微信公众号,可以获取我的微信号。 免费咨询 请发送邮件或者加微信后留言,避免过多寒暄,直接给出问题,我一般都会回复,但通常并不会非常即时。 付费咨询 200 RMB/0.5 小时,限一个大类方向
1. 为什么采用镜像独立部署 更好的 SEO 使用 Github Pages ,部署静态网站非常方便。一次配置,每次提交都可以自动部署更新。再加上 jsDelivr、Cloudflare 加速,在免费方案中,已经生产可用。 无奈的是,百度搜索引擎对 Github Pages 网站,收录极慢,甚至不收录。即使
1. Github Container Registry 9 月 1 日,GitHub 宣布 Github Container Registry 开始公测,测试期间提供免费、无限容量的 Docker 镜像仓库服务。 再也不用担心,docker.io 一言不合清理镜像了。真好真香! GitHub 正在以托管代码仓库为切入点,逐步覆盖整个研发工具链,打造一站式 DevOps 平台。项目管理有 Issues
1. 面向接口编程 1.1 特征 面向接口编程,强调的是模块之间通过接口进行交互。首先,调用方指定一组方法签名,然后,由被调用方实现这组方法。 接口编程与其他编程显著不同的一点是,接口编程关注的是方法,而不是属性。在很多的编程场景中,方法是围绕属性进行定义
1. Go 中的并发模型 1.1 通信模型 CSP CSP 全称 Communicating Sequential Process ,通信顺序进程,描述的是一种并发通信模型。Process 可以使用很多个 Channel ,而 Channel 不关心谁在使用它,只负责收发数据。 Go 社区中,有一句非常著名的论断: 不要通过共享内存来通信,要通过通信来共享内存。意思是,不
1. 什么是编程范式 编程范式是一类典型的编程规范。一方面提供了工程师对实体的建模方法,将物理世界与代码关联起来;另一方面也提供了工程师对代码程序的理解思路。 编程范式与编程语言属于多对多的关系。一种编程语言中,可能包含多种编程范式,例如,C++ 包
1. Kata 解决什么问题 安全性和隔离性是 Kata Container 显著区别于 Docker Container 的地方。 Kata Container 来源于 Intel Clear Containers 和 Hyper runV 项目的合并。Intel Clear Containers 借助 Intel VT-x 技术使用轻量级虚拟机提供容器,解决安全性问题,同时性能优异。而 Hyper runV 对标的是 Docker 的 runc ,提供容器的运行时,遵循 OCI runtime 规范。 2. Kubernetes 中的 Kata 2.1
1. 什么是柯里化 根据维基百科词条定义,在计算机科学中,柯里化(Currying)是把接受多个参数的函数转变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 英文版定义是一个两层的定语从句,翻译
1. Terraform Vs Kubernetes 基础架构即代码(Iac) 基于不可变的基础架构,使用编排工具将基础架构文本化,允许像管理代码一样管理基础设施。 2018 年,我在从事 SaaS 开发,使用 Kubernetes 平台进行部署,这一年 Terraform 很火。2019 年,我开始从事 Kubernetes 的二次开发,才听说 Terraform 。现在网上 Terraform 相关的文档增
1. 钱少事多受人欺 运维部门是成本部门。有个词叫,成本优化。CXO 看到机器的负载这么低,就会想着裁撤机器,能少花就少花点,运维也就来活儿了。优化成本是运维的职责之一。 运维是研发的服务团队。不能够创造营收,就意味着没有话语权,运维在公司的地位可想
1. Jenkins X 简介 Jenkins 依靠庞大的插件生态,占据了目前大部分的企业级 CICD 引擎的份额。但在云原生时代,Jenkins 也暴露出很多的问题,单点服务、磁盘存储、内存占用等。 Jenkins X 围绕 Kubernetes,提供了一种更适合云原生时代的 DevOps 方式。Jenkins X 不是 Jenkins
1. Etcd 基本介绍 Etcd 是一个分布式 Key/Value 的存储系统,通过分布式锁、leader 选举、写屏障(write barriers) 实现了分布式协作,提供高可用、持久化数据存储和检索服务。 工作原理 每个 Etcd 节点都存储了一份完整的数据,任意时刻至多存在一个主节点。主节点处理所有来自客户
前面的文档中,我们利用 Kubernetes 提供的弹性,在 Kubernetes 上动态创建 Jenkins Slave 。本篇文档主要是对 Jenkins 进行大规模构建的压力测试。 1. 集群配置 1.1 Kubernetes 版本 这里使用的是 v1.16.7 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.7", GitCommit:"be3d344ed06bff7a4fc60656200a93c74f31f9a4", GitTreeState:"clean", BuildDate:"2020-02-11T19:34:02Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.7", GitCommit:"be3d344ed06bff7a4fc60656200a93c74f31f9a4", GitTreeState:"clean", BuildDate:"2020-02-11T19:24:46Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"} 1.2 节点数量 集群节点总数, 16 个 1 2 3 kubectl get node |grep "Ready" | wc -l 16
最近离职的小伙伴有点多,比较缺人。陆陆续续面试了近十位候选人,一面通过率大约 50 % ,还没有确定的 HC 。 1. 准备工作 搜集简历。发帖、邮件公告、朋友圈、招聘网站,都是简历来源。离开的人有各种各样的理由,待遇差、不喜欢的工作方式、不开心、不受重视,当然
1. 开启 Docker 的 experimental 特性 这里先开启 Docker 的 experimental 特性,方便下文使用相关命令。 编辑文件 vim ~/.docker/config.json ,增加如下内容: 1 2 3 4 { "experimental": "enabled", "debug": true } 注意,这里不是 /etc/docker/daemon.json 文件,也不需要重启 Docker 。 2. Docker 镜像 从 Docker 1.10 、 Registry 2.3 开始,Docker 引入了 manifest 用于描述镜像的元数据。 2.1 Dockerfile 如何转换成镜像 如上图,
1. 编译报错:java.nio.file.NoSuchFileException 在编译 Jenkins 插件时,提示错误信息如下: 1 2 3 4 mvn package Compilation failure [ERROR] java.nio.file.NoSuchFileException: /root/java/target/classes/META-INF/annotations/hudson.Extension 原来 Maven 使用的是 JAVA_HOME 而不是 PATH,找不到 Java 运行环境导致,而且 Java 11 不行,Java 1.8 才能正常编译。 2. 安装 JDK 安装 Java
作者:(俄)奥列格·斯克伦尼科(Oleg Skrynnik) 出版社: 清华大学出版社 出版年: 2020-05-01 ISBN: 9787302547143 Notes: 内容如题,书中主要阐述了业务视角中的 DevOps 。从起源到基础,从原则到实践,你都可以从中有所收获。DevOps 的基础是精益生产(丰田流水线)和敏捷开发,
1. 遇到了什么问题 Jenkins 执行日志报错: 1 2 3 4 5 6 Started by user admin Lightweight checkout support not available, falling back to full checkout. Checking out git https://github.com/shaowenchen/pipeline-test.git into /var/jenkins_home/workspace/abc@script to read Jenkinsfile ... ... Unable to access '.git/index.lock': File exists. 原因分析: 简单介绍一下 Jenkins 的部署情况,Jenkins 使用 Helm Chart 部署在 Kubernetes,使用 Kubernetes 动态 Pod 进行构建。Jenkins 的 /var/jenkins_home 挂载到 PV
在 CICD 的流程中,需要保存的产物主要有两类,构建产物和缓存。构建产物是最终的执行结果,缓存是为了优化下一次的构建速度。本篇主要描述的是在 Jenkins 中如何对构建产物和缓存进行归档,并结合对象存储进行实践。有部分示例使用的是 在 Kubernetes 上动态创建 Jenkins Slave 进行构建,配置
使用 Jenkins 总是离不开各种各样的插件,为了更好的实践 DevOps ,我们也应该具备开发插件的能力,使整个流程都能够在 Jenkins 中汇合。 1. Jenkins 插件 1.1 插件的生态 Jenkins 前身 Hudson 始于 2004 ,历经 16 年,依然作为主流的 CI/CD 引擎。除了,Jenkins 提供了 Master-Agent 分布式构建、Pipeline 编排的功
在前面两篇文档,在 Kubernetes 上动态创建 Jenkins Slave 和 Kubernetes 添加 Windows 节点提供 Jenkins 构建动态 Agent 的基础之上,本篇文档主要尝试在 Kubernetes 上动态提供 Windows 构建 Agent 。 1. 新增流水线 Kubernetes 与 Jenkins 集成部分可以参考上面的两篇文档,这里直接新建两条流水线进行测试。 windows - jenkins 内置的流水线示例 1 2 3 4 5 6 7 8 9 10
1. 思想驱动行为 思想驱动行为,行为产生效益。接人、待物、处事来源于文化,不会因为技术的迅猛发展而产生跃变。拥有悠久历史的中华民族,沉淀了极具韧性的思想智慧。王朝更迭,政治更替,都打不到她。即使用武力征服,最终也会被同化。 汲取更多先哲智慧、历史
这里主要使用 Windows 节点作为 Worker,而 Master 控制平面依然在 Linux 。 1. 系统配置 1.1 Kubernetes 控制平面 Kubernetes 自 1.14 版本,增加了对 Windows 节点生产级的支持。由于微软官方文档主要提供的是 flannel 网络插件的安装方式,这里建议 Kubernetes 也采用 flannel 插件。 查看当前集群 Kubernetes 版本 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.6", GitCommit:"d32e40e20d167e103faf894261614c5b45c44198", GitTreeState:"clean", BuildDate:"2020-05-20T13:16:24Z",
在对 JWT 进行 Base64 解码时,发现 JSON 数据不完整。本文主要介绍相关知识点并解决这个问题。 1. JWT 简介 JWT 通过在 Header 中设置 Authorization: Bearer <token> 进行认证的传递。 JWT Token 是一个 . 连接的 Base64 编码字符串,类似这样 Header.Payload.Signature ,有三部分组成: Header ,定义 Token 类型和加密算法 1 2 3 4 { "alg": "HS256", "typ": "JWT" } Payload ,负载信息,通
1. 批量删除 Evicted 状态的 Pod 1 kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n 2. 批量删除指定空间指定状态的 Pod 根据 field-selectors ,可以删除指定空间指定状态的 Pod 。 1 kubectl get pods --field-selector=status.phase!=Running -n default | cut -d' ' -f 1 | xargs kubectl delete pod -n default
1. 提高自动化水平 远端构建通常需要借助一定的 CI 工具,比如 Github Actions 、Travis CI 等。如果是内网环境,可以借助 GitLab CI ,添加一个 CI 节点进行自动化构建,可以参考 我的 GitLab 文档 。 自动化的好处不言而喻,能规范流程、节约大量时间,具有明显的收益。 2. 有利于其他人参与
1. Kubernetes 中的调度器 kube-scheduler 是 Kubernetes 中决定 Pending 状态的 Pod 运行在哪个 Node 的组件,被称之为调度器。 Kubernetes 中内置了大量的调度策略,也提供了一些高级调度策略(nodeAffinity、podAffinity 等),以供用户使用,基本能够满足绝大部分的业务需求。 前面的文档 Kubernetes 之 L
这也是一个给开源项目提交 PR 的完整 Git 流程。 1. 本地配置 提交用户信息 1 2 git config --global user.name "username" git config --global user.email "user@email.com" GPG 配置 参考:GPG 验证提交 2. 克隆代码 首先 fork 原仓库 克隆 fork 的仓库代码 1 git clone https://github.com/yourname/django-xss-cleaner.git 添加原仓库 1 git remote add upstream https://github.com/shaowenchen/django-xss-cleaner.git 查看本地配置的远程源 1 2 3 4 git remote -v origin xxx upstream xxx 3. 日常开发 拉取最新
1. Create a merge commit PR Commit 记录: 1 2 commit c1 commit c2 集成分支 Commit 记录: 1 2 3 commit PR #NUM commit c2 commit c1 Create a merge commit 会将 PR 中的全部 Commit 记录完整带到集成分支中,同时增加一条 PR Commit 信息。 2. Squash and merge PR Commit 记录: 1 2 commit s1 commit s2 集成分支 Commit 记录: 1 commit PR #NUM Squash and merge 合并之后,集成分支只会增加一条 Commit 记录。观感
1. 当我们值工单时,在值什么 一般人可能只提过工单,没值过工单。值过工单的人一般不会轻易提工单。 工单就是客户花钱买产品,赠送的一服务,专门解决各种使用上的问题。在云基础设施的厂商很常见,IaaS、CDN、Domain、Container 等,不会
1. 问题描述 配置 Webhook 自动触发执行 Jenkins 流水线时,报错: 1 2 3 hudson.plugins.git.GitException: Command "git checkout -f 23b446ea" returned status code 128: stdout: stderr: fatal: reference is not a tree: 23b446ea 2. Git 如何管理版本 Git 是一个内容寻址文件系统。Git 维护着一棵 sha tree ,通过 sha 值可以回溯到任何一个历史节点。先看看提交记录: 执行命令: 1 2 3 4 5 6 7 8 9 10 11 12
磨刀不误砍柴工,无论什么时候,花点时间在工具链上都是值得的。 1. 自动补全 - kubectl OS X 安装命令: 1 brew install bash-complete@2 不仅仅是 kubectl ,也给其他命令行提供自动补全的命令提示。 在 .zshrc 中添加如下内容: 1 2 # kubectl complete source <(kubectl completion zsh) 在输入 kubectl get pod 命令时,键入 Tab 会自动列举当前类型下的资源,如
Homebrew 是 OS X 下的包管理工具,类似 CentOS 的 yum ,Ubuntu 的 apt-get 。在 OS X 命令行下,可以通过 brew 和 brew cask 命令安装应用。 1. 安装 brew cask 1 brew install brew-cask-completion 2. brew 和 brew cask 区别 brew 与 brew cask 的区别在于偏向的应用类型。brew 更偏向于开发人员,主要安装命令行工具;brew cask 偏向日常用户,主要
1. Restful 请求 1 curl -X POST --data 'keyword=value' http://domain.com/mypath/ -X 后面还可以是 DELETE PUT 等。 2. 添加头部 1 curl -H 'Content-Type:application/json' -H 'Authorization: bearer MyToken' http://domain.com/mypath/ 3. Basic 验证访问 1 curl -u username:password http://domain.com/mypath/ 4. 下载并执行 curl -sSL http://domain.com/my.sh | bash 5. 忽略证书校验 1 curl -k https://domain.com/mypath/ 6. 设置代理 1 curl -x socks5://proxyuser:proxypassword@proxy.domain.com:8001 https://domain.com/mypath/ 7. 指定 Host 使用 IP 访问 1 curl -H 'Host: www.domain.com' 1.2.3.4:8000
最近用 Surface ,找出触控笔发现没电。换了一个 AAAA 电池,又发现笔尖触控失效。 网上很多文档介绍的是卸载 Marvell AVASTAR Bluetooth ,重启生效。但这种方法对我无效,卸载 Precise Touch Device 之后反而生效。 在设备管理里面找到下图选项,右键卸载,不用勾选删除,直接确定,然后重启生效。
大家是否思考过如何设计大型企业级系统?在进行主要的软件开发之前,我们先得选择一个合适的架构。这个架构要给我们所需的功能和质量保证。因此,在将这些架构用于我们的设计之前,我们应该理解不同的架构体系。 1. 什么是架构模式 根据 Wikipedia 解释, 一个架构模式就是
通常,我们在主机上执行 export http_proxy/https_proxy 格式的命令,即可设置 Proxy 。但是主机上的设置在容器中并不会生效,下面提供了几种配置方法。 1. 配置 Docker 的代理 - Node 级 在需要使用 Proxy 的节点进行配置,下面以 Docker 为例: 创建配置文件 1 2 mkdir -p /etc/systemd/system/docker.service.d touch /etc/systemd/system/docker.service.d/https-proxy.conf 编辑配置文件,配置代理 [Service] Environment="HTTP_PROXY=http://proxy.example.com:80/" Environment="HTTPS_PROXY=https://proxy.example.com:443/" Environment="NO_PROXY=localhost,127.0.0.1" 重启 Docker 1 2 systemctl
1. 关于 Label 在前面的文档 如何使用 python-gitlab 自动创建 GitLab Label 中,我已经阐述了 Label 可以用于简单的项目管理。 一个团队,通常不止一个代码仓库,为了减轻沟通和学习成本,除了使用一致的工具链,还应该达成一定的基础共识。这些基础共识,促使大家达成最佳的实践方式。同一个大项
1. 人越来越重要 为什么互联网行业的估值显著高于制造业?同样优秀的行业公司,腾讯的 PE 高达 30+,而格力的 PE 只有 10+。 互联网行业的特点是轻资产,没有昂贵的复杂设备,不需要大的生产厂房。除非准备收藏,设备的价值每年都有减损,还少不了维护费用,不定
Helm 3 终于发布了。我们可以告别 Tiller 了,但 Helm 3 的改变不仅于此。让我们继续探讨其他的变化。 1. 告别 Tiller Helm 3 移除了 Tiller ,是个不错的决定。但是要理解为什么不错,我们还需要了解一下 Tiller 产生的背景。Tiller 是 Helm 的服务端组件(运行在 Kubernetes 集群上),主要目的是为了让多
副标题: 物联网创利模型和全新实践 作者: 【日】大前研一 译者: 朱悦玮 出版社: 北京时代华文书局有限公司 出版年: 2019-2-1 ISBN: 9787569932171 Notes: 作者是非常著名的管理学家,我之前读过他写的另外一本书 《思考的技术》。 本书主要阐述的是 IoT 的重要性和如何将 IoT 落地产生效益。万物感知,
1. 关于 DNS 1.1 DNS 服务的用途 DNS 提供的是域名到 IP 的映射服务。例如,在浏览器输入 https://www.chenshaowen.com 访问页面,但数据链路是基于 IP 的通信,无法识别 www.chenshaowen.com 。这时就需要进行 DNS 查询,输入参数是 www.chenshaowen.com ,返回结果是 IP 地址。 可以看到 DNS 提供了一种助记方法,我们不必关注 IP 地址以及其变动,而只需
helm 官方源 https://charts.helm.sh/stable ,国内的某些机器无法访问,需要配置镜像源。 1. 官方镜像源 1 helm repo add stable https://charts.helm.sh/stable 2. Git Pages 镜像 1 helm repo add stable https://burdenbear.github.io/kube-charts-mirror/ 可以参考 kube-charts-mirror ,搭建一个自主可控的镜像源。 3. Aliyun 镜像 长时间未更新,版本较旧 1 helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts/ 4. Azure 镜像源 已经不可用,2021.07.08 更新。 1 2 helm repo add stable http://mirror.azure.cn/kubernetes/charts/
在之前的文章 使用 Helm 安装 harbor 中,我已经详细描述了安装 Ingress 、Harbor ,最后成功推送镜像的步骤。其中的域名是公网可以访问的,证书是认证机构签发的。但是在内网环境下,我们需要使用内网域名进行访问。本文主要解决使用自签证书通过 Https 访问 Harbor 的问题。 1. 生成自
1. 关于 Prow 在 Kubernetes、Istio 等知名项目的 Github 仓库中,我们经常会看到 xxx-bot 用户,给 issues 添加标签、合并 PR 。这个机器人账户就是被 Prow 驱动的。 Prow 是 Kubernetes 测试特别兴趣小组的项目,目前是 kubernetes/test-infra 的一部分。Prow 是一个基于 Kubernetes 使用各类事件驱动执行 Job 的 CI/CD 系统。 除
1. 安装基础环境 安装 Kubernetes 参考链接:使用 Kubeadm 安装 Kubernetes 集群 。值得注意的是 Kubeflow 并不是对每个版本的 Kubernetes 兼容,system-requirements。 1 2 3 4 kubectl version Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.12", GitCommit:"e2a822d9f3c2fdb5c9bfbe64313cf9f657f0a725", GitTreeState:"clean", BuildDate:"2020-05-06T05:17:59Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.12", GitCommit:"e2a822d9f3c2fdb5c9bfbe64313cf9f657f0a725", GitTreeState:"clean", BuildDate:"2020-05-06T05:09:48Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"} 安装 kustomize 1 2 curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash mv kustomize /usr/local/bin/ 1 2 3 kustomize version {Version:kustomize/v3.5.5 GitCommit:897e7b6e61e65188d846c32bd3af9ef68b0f746a BuildDate:2020-05-11T16:51:33Z GoOs:linux GoArch:amd64} 2. 安装 Kubefolow 确
VS Code 安装 Go 插件之后,打开 Go 项目时,编辑器会提示安装工具包。 但是 golang.org 无法直接访问,我们需要将包手动下载到 GOPATH 目录,进行安装。 创建包目录 1 2 cd $GOPATH mkdir -p src/golang.org/x 下载包 1 2 3 cd src/golang.org/x git clone https://github.com/golang/tools.git git clone https://github.com/golang/lint.git 安装包 1 2 go get golang.org/x/tools/... go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.27.0
1. 关于服务业 第一产业是以农业为代表的,解决生存问题;第二产业是以工业为代表的,解决效率问题;第三产业是以服务业为代表的,解决别人的问题。 除非某种因素导致人的生理存在受到威胁,服务业具有极其广阔的成长空间。因为人的欲望是没有天花板的,人与人之
1. 分阶段构建 编译项目需要借助一系列特定的工具,但在运行阶段并不需要这些工具。为了减小镜像体积,可以分阶段构建。在第一阶段进行构建,然后将编译生成的文件传入下一个阶段,生成更小体积的镜像。 1 2 3 4 5 6 7 8 9 10 11 FROM golang:1.12 as builder COPY / /go/src/github.com/shaowenchen/goproject WORKDIR /go/src/github.com/shaowenchen/goproject RUN CGO_ENABLED=0 GO111MODULE=on GOOS=linux GOARCH=amd64 GOFLAGS=-mod=vendor go
前面写过一篇文档,如何在 CentOS 安装 GPU 驱动 ,这篇就来看看怎么利用 Docker 运行 Tensorflow 。 1. 检查当前 CPU 支持的 Tensorflow 版本 在不支持 AVX 指令的 CPU 上,运行 Tensorflow > 1.15 版本时,会报错,Illegal instruction (core dumped)。 执行检测命令: 1 2 3 cat /proc/cpuinfo | grep avx flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
原作名: On China 作者: [美]基辛格 译者: 胡利平/林华/杨韵琴/朱敬文 出版社: 中信出版社 出版年: 2012-10 ISBN: 9787508635583 Notes: 作者是美国著名的学者、政治家,给予本书不一样的视角,记录了中国近代、当代、现代的外交政策与决策机制。书中描述的各类事件很多,领导人之前相互博弈
1. 什么是左移 需要说明的是,这里的左不是政治上代表保守或激进的左,而是表意流程的左、时间的提前。 在调研自动化测试时,我第一次接触 “左移” 。提法很吸引,落地很简单。翻译一下就是,之前测试的工作是开发完成之后,现在要求提前
这里以清空 main 历史提交记录为例。 切换到 main 分支 1 git checkout main 创建一个干净的分支 1 git checkout --orphan new_main 提交全部文件 1 2 git add -A git commit -m "msg" 删除 main 分支 1 git branch -D main 将新分支重命名为 main 1 git branch -m main 强制推动到远程仓库 1 git push -f origin main
作者: 一禅小和尚 出版社: 江苏凤凰文艺出版社 出版年: 2017-09 ISBN: 9787559411013 Notes: 简明的画风,一禅小和尚带领大家走进了一个充满善意与智慧的世界。 如果你身陷囹圄、烦恼于生活琐屑,这本书定能给予你启发。 但知易行难,人生就是一场修行,愿与小和尚同在。
作者: 食家饭 出版社: 北京联合出版公司 出版年: 2017-3-2 ISBN: 9787550294509 Notes: 有风吹过的厨房,夹带着人间的气息。一道道美味的菜品,让人边看边流口水。作者对生活一定也充满了热爱。 写的是寻常可见的菜,但文字十分俏皮、乃至有些可爱,角度不凡,细腻动人。看完对上海人平添了几
作者: 但斌 副标题: 但斌投资札记 出版社: 中信出版社 出版年: 2018-06 ISBN: 9787508688640 Notes: 本书主要收录 200X 年,作者关于投资的思考和分析。北岛的《时间的玫瑰》陪伴作者度过了最艰难的时光,遂取同名。 一个人过往的经历,决定了未来选择的路。经历过艰苦,思考过死亡,作者的思维非
以 CentOS 7.7,Tesla P100 GPU 为例。 1. 基础环境准备 安装 lspci 命令 1 yum install -y pciutils 检查 GPU 是否支持 CUDA 1 2 3 lspci | grep -i nvidia 00:09.0 3D controller: NVIDIA Corporation GP100GL [Tesla P100 PCIe 12GB] (rev a1) 支持 CUDA 的 GPU 列表:https://developer.nvidia.com/cuda-gpus 检查系统是否支持 CUDA 1 2 3 4
主要记录最近遇到的一些开发问题,解决方法。 1. macOS 快速切换不同 Kubernetes 环境 涉及 Kubernetes 相关开发时,经常需要在多个集群之间切换。配置多集群 context 是一个选择,但是如果集群在不断重置,可以试下如下方法: 在 ~/.profile 文件中定义一系列相关 function,切换时只需要执行 on_cluster_name 即可
1. Velero 简介 Velero 是 heptio 团队(被 VMWare 收购)开源的 Kubernetes 集群备份、迁移工具。 Velero 使用对象存储保存集群资源。默认支持的对象存储有 AWS、Azure、GCP ,兼容 S3 协议,也可以通过插件来扩展到其他平台,比如 Aliyun OSS。 目前,Velero 不具备版本管理功能,只能进行增
主要记录最近遇到的一些开发问题,解决方法。 1. Azure 镜像代理 在国内的服务器上,拉取某些镜像速度较慢,或根本就无法拉取。Azure 提供了容器仓库的镜像代理服务。 无法拉取的镜像源 替换之后的镜像源 k8s.gcr.io gcr.azk8s.cn/google_containers docker.io dockerhub.azk8s.cn gcr.io gcr.azk8s.cn quay.io quay.azk8s.cn 2. watch 命令 watch 命令可以周期性地执行指定的命令
首先,编译器需要将 .java 文本文件编译为 .class 字节码,然后 JVM 执行 .class 字节码文件。流程并不复杂,本文主要记录一些在编译、运行时的相关过程。 1. 单个文件源代码 新建文本文件 Hello.java 1 2 3 4 5 public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } } 编译源码 1 javac Hello.java 执行字节码 1 java Hello 2. 多个源码文件 使用
主要记录最近遇到的一些开发问题,解决方法。 1. 重启 Kubernetes 中的 Job 任务 1 kubectl -n {NAMESPACE} get job {JOB_NAME} -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f - 如果提示没有找到 jq 命令,需要先按照 jq ,yum install -y jq。 2. DNS 的 SPF 记录 在发送邮件时,由于发件人可以任意指定,收件人无法验证发件人是否真实。SP
使用 KubeSpray 安装 Kubernetes 时,报错 1 2 3 4 5 6 fatal: [node0]: FAILED! => { "assertion": "ip in ansible_all_ipv4_addresses", "changed": false, "evaluated_to": false, "failed": true } 查看 inventory.ini 配置 1 2 3 4 5 6 7 cat inventory.ini # ## Configure 'ip' variable to bind kubernetes services on a # ## different ip than the default iface # ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value. [all] node0 ansible_host=139.168.12.4 ip=139.168.12.4 ... 查找报错信息来源 kubespray/extra_playbooks/roles/network_plugin/calico/tasks/pre.yml 1 2 3 4 5 6 7 8 9 ---
1. 测试分层 测试的目的是为了验证预期的功能,发现潜在的缺陷。测试增强了交付合格产品的信心,也给敏捷迭代带来了可能。可以说,测试决定了产品的开发进度。 网络模型有七层的 OSI 、四层的 TCP,而开发模式有 MTV、MVC、MVP、MVVM 等。高内聚、低耦
1. Jenkins 的工作模式 Jenkins 是一个单 Master,多 Slave 架构。Master 负责分配任务、管理服务。 Slave 负责执行具体任务。 即使部署了多个 Master,这些 Master 之间依然相互独立,无法协同调度。在高可用的 Jenkins 方案中,需要借助外部的任务分发框架,协调多 Master 之间的调度,比
1. 为什么要拨测 对于系统中的一些关键服务,我们通常会配置监控服务。当故障发生时,能够尽快被检测到,发送通知给关注人。当故障发生后,能够有效地追溯故障过程。 拨测是监控系统中的一个重要环节,能够检测服务的网络质量,并提供实时告警。 在公有云上,云厂
主要记录最近遇到的一些开发问题,解决方法。 1. Kubernetes 服务仅在负载节点可用 正常情况下 NodePort 类型的 Service ,任意 Node 节点 IP + 端口,都可以访问。但是,也有可能仅负载的 Node 节点 IP + 端口可以访问。 首先,可以尝试配置转发相关参数: 1 2 3 4 5 6 cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward=1 vm.swappiness=0 EOF 1 sysctl
1. 自动签发 Ingress 证书 安装 cert-manager 1 2 3 4 5 6 7 8 9 10 kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml kubectl create namespace cert-manager kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true helm repo add jetstack https://charts.jetstack.io helm repo update helm install \ --name cert-manager \ --namespace cert-manager \ --version v0.10.0 \ jetstack/cert-manager 创建一个全局的签发机构 新建文件 issuer.yaml 1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod namespace: cert-manager spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: admin@domain.com privateKeySecretRef: name: letsencrypt-prod http01: {} 创建签发机构 1 kubectl apply -f issuer.yaml 签发证书 新建
Deployment 通过创建 ReplicaSet 控制 Pod 的数量、状态。本篇主要介绍一些 Deployment 常用的操作。 1. Deployment yaml 格式 带上 --dry-run 参数表示并不执行命令,仅生成 yaml 输出: 1 kubectl create deployment nginx --image=nginx --dry-run -o yaml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: nginx name: nginx spec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx name: nginx resources: {} status: {} 2. 创建 使用 run 参数 1 kubectl run nginx --image=nginx 使用
我使用的是 Kubernetes 1.15.3 ,不同版本的处理方法可能会有不同。 1. 关于证书 根证书是自签的 根证书是由自己签发的。在浏览器中,内置了常见的证书服务商的 CA 证书。因此,浏览器才会信任这些证书服务商签发的下一级证书。 我们也可以生成根证书,但是需要将根证书添加到系统信
通过 Operator 的方案,可以对 Kubernetes 的功能进行友好地扩展。Operatpr = CRD + Controller。首先通过 yaml 定义,生成 CRD ,然后 Controller 不断地监听 etcd 中的数据,执行相应动作。开发 Operator 时,有很多繁琐且重复的事情。KubeBuilder 可以帮助我们快速生成骨架代码,
1. CNI 问题 错误日志 1 2 journalctl -u kubelet ...Unable to update cni config: No networks found in /etc/cni/net.d 由于没有安装 CNI ,需要移除 /var/lib/kubelet/kubeadm-flags.env 参数中的--network-plugin=cni 1 2 cat /var/lib/kubelet/kubeadm-flags.env KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --pod-infra-container-image=k8s.gcr.io/pause:3.1" 2. 节点 NotReady 节点 NotReady 可能的原因有很多。通常会是网络、容器配置错误导致,需要逐一排查。 这里使用的是 使用 Kubeadm 安装 Kubernetes 集群 文
1. 搭建 Harbor 的要求 Harbor 硬件要求: CPU,最少 2 核,4 核更好 Mem,最少 4 GB,8 GB 更好 Disk,最少 40 GB,160 GB 更好 Docker 版本要求: 17.06.0 以上 在 Kubernetes 上搭建 Harbor ,可以参考文档,使用 Helm 搭建 harbor 。 2. Harbor 提供的功能 Harbor 是在 Docker Registry 的基础之上,进行了企业级扩展。Harbor
主要记录最近遇到的一些开发问题,解决方法。 1. Ingress 开启 HTTPS 准备好证书,domain.com.crt、domain.com.key 创建 Secret 1 kubectl create secret tls {SECRET_NAME} --key domain.com.key --cert domain.com.crt -n {NAMESPACE} 更新 Ingress 配置 1 2 3 4 5 spec: tls: - hosts: - domain.com secretName: {SECRET_NAME} 2. SSH 登陆失败,提示 ssh-dss SSH 登陆提示: 1 Unable to negotiate with 10.10.10.10 port 22: no matching
1. docker pull 拉取镜像 使用 docker pull {IMAGE_NAME} 拉取镜像时,有两种情况: IMAGE_NAME 前缀指向 registry Docker 会将 IMAGE_NAME 识别为指定仓库提供的镜像。例如,myregistry.io/space1/image1:latest ,Docker 会去 myregistry.io 指向的服务器请求镜像数据。一个 Docker 镜像分为很多层,如果
主要记录最近遇到的一些开发问题,解决方法。 1. Kubernetes 集群添加新的 Node 节点 在执行 kubeadm init 时,Console 会打印添加 Node 的命令。Token 默认的有效期为 24h 。当超过有效期时,需要重新创建 Token ,执行命令: 1 2 kubeadm token create --print-join-command kubeadm join 192.168.10.2:6443 --token ocyzce.3hv8y7w60lrvulir --discovery-token-ca-cert-hash sha256:7a86632f54de1004bb3f38124b663f837399d6ba9aa803d58c6707a76c02a6cb 使用 Console 输出的命令,即可将 Node 节点添
前提准备,(1)已经安装 Helm ,参考 Helm 安装 ,(2)集群有默认的动态存储可用,参数 使用StorageClass提供PV动态存储 1. 使用 Helm 安装 Ingress Ingress 由 Ingress 和 Ingress Controller 两部分组成。 在 Kubernetes 中,Ingress 对象描述路由规则;Ingress Controller 通过与 Apiserver 交互,将 Ingress 规则写入
主要记录最近遇到的一些开发问题,解决方法。 1. NodePort 服务仅指定 Node 可以访问 通过 NodePort 暴露的服务,在集群外可以使用 Kubernetes 任意 Node IP 加端口的形式访问。kube-proxy 会将访问流量以轮询的方式转发给 service 中的每个 Pod。 但是,发现并不是每一个 Node IP 加端口都可以访问,
1. S2I 能解决什么问题 可以预见的是,未来大量的应用会以容器的方式进行部署。 容器平台关注的是镜像和容器,应用开发关注的是业务代码,而最终代码需要以镜像的方式进行部署。从代码到镜像,就是 Source To Image ,即 S2I 。 在前面的文章 PaaS 部署之 buildpack 中,描述到一个应用运行起来
之前通过 Kubernetes 之 Volumes ,对 Volumes 有了一定的了解。本篇主要侧重实践,学习如何使用 emptydir、hostpath、localvolume 三种本地存储方案。 1. PV 的基本属性 1.1 PV 的生命周期 PV 的状态: Available:可用,还未被任何 PVC 绑定 Bound:已经被
主要记录最近遇到的一些开发问题,解决方法。 1. Kubernetes 中给 Node 增加 Role: worker 1 2 3 4 kubectl get nodes NAME STATUS ROLES AGE VERSION i-6fns0nua Ready master 6d3h v1.15.2 i-m69skuyd Ready <none> 6d2h v1.15.2 1 2 kubectl label node i-m69skuyd node-role.kubernetes.io/worker= node/i-m69skuyd labeled 1 2 3 4 kubectl get node NAME STATUS ROLES AGE VERSION i-6fns0nua Ready master 6d3h v1.15.2 i-m69skuyd Ready worker 6d2h v1.15.2 2. 删除 Kubernetes 的一个节点 查看当前节点: 1 2 3 4 kubectl get node NAME STATUS ROLES AGE VERSION i-6fns0nua Ready master 6d3h v1.15.2 i-m69skuyd Ready worker 6d2h
主要记录最近遇到的一些开发问题,解决方法。 1. 打开 OS X 原生 NTFS 支持 插上磁盘,查看盘符 1 2 3 4 5 6 diskutil list diskutil list /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *96.9 GB disk2 1: Windows_NTFS SSD 96.8 GB disk2s1 这里的 SSD 就是 Volume Name。 更新 /etc/fstab文件 1 sudo nano /etc/fstab 输入密码,然后输入 LABEL=SSD none ntfs rw,auto,n
1. 谁需要 SonarQube 代码审查是高质量软件开发过程中不可缺少的重要环节,能帮助开发者及时发现代码中的 Bug,提升代码质量、可维护性。 代码审查的维度包括,语言规范、代码风格、设计合理等。人工检查这些事项,会消耗大量的精力和时间。 代码质量分析工具为此而生,
1. 集群规划 准备三个主机,一个 Master ,两个 Node。 操作系统,CentOS 7 配置,2 Core 4 GB Docker 版本,18.06.3 Kubernetes 版本,1.15.3 如果是购买的云主机,请将以下端口打开: 1 2 3 4 5 6 7 8 9 10 11 12 # Master TCP 6443* Kubernetes API Server TCP 2379-2380 etcd server client API TCP 10250 Kubelet API TCP 10251 kube-scheduler TCP 10252 kube-controller-manager TCP 10255 Read-Only
1. main 和 init 函数 一个 package 里面可以写多个 init 函数,但必须仅包含一个 main 函数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package main import ( "fmt" ) func init() { fmt.Println("init 1") } func init() { fmt.Println("init 2") } func main() { fmt.Println("main") } // init 1 // init 2 // main 2. defer 函数 Go 不会立即执行 defer 修饰的代码,而是进行标记,在程序退出之前执行。 1 2
1. 不同种类的存储 1.1 文件存储 文件存储是,基于文件的存储。在访问数据时,需要提供相应的查找路径。 适用于,FTP、NFS 等服务。 1.2 块存储 块存储是,将数据拆分成块,并单独存储各个部分。在访问数据时,底层存储软件会将这些分散的数据组装起来。 块存储,通
1. Docker 的存储卷 1.2 Docker 中的 Volume Docker Volume 将宿主机目录,挂载到容器中。在容器中修改的文件内容,将会被持久化到宿主机中。即时容器被删除,宿主机中的文件也会被保留。 Docker 使用 /var/lib/docker/volumes/ 存储容器的 Volume。 查看本地 Volume : 1 2 3 4 5 6 7 8 9 tree /var/lib/docker/volumes/ -L 3 /var/lib/docker/volumes/ |-- 714450f353b26b5aa57aa352766c201c0851685e0e28c2e67ae1631f29c465b4 | `-- _data | |-- access.log -> /dev/stdout | `--
1. Labels 1.1 什么是 Labels Labels 是一对关联到对象的键值对。可以在创建对象时,直接添加 Labels ,也可以在创建之后动态修改。 Labels 格式: 1 2 3 4 "labels": { "key1" : "value1", "key2" : "value2" } 格式要求: Key,不能重复 Value,须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个
主要记录最近遇到的一些开发问题,解决方法。 1. VS Code 终端执行 .bash_profile 初始化脚本 通过添加启动命令参数,可以使得打开 shell 时,执行初始化脚本 .bash_profile 。 编辑 settings.json,以 OS X 为例,新增如下内容即可: 1 2 3 { "terminal.integrated.shellArgs.osx": ["-l"] } 2. VS Code 配置 zsh 后,图标无法显示 由于安装补
Adobe 以 16.7 亿美元收购 Magento,微软以 75 亿美元收购 GitHub,IBM 以 340 亿美元收购 Red Hat,开源原来也是一门好生意。本文主要是关于开源的一些记录和思考。 1. 什么是开源 1.1 发展史 1969 年,贝尔实验室将 Unix 代码共享给社区,为开源奠定了重要基础。 1984 年,R
1. Docker 的网络模型 1.1 bridge 模式 默认使用 bridge 模式,也可以使用 --net=bridge 指定 bridge 模式。 bridge 模式下,容器连接到同一个虚拟网桥 docker0 上。docker0 通常会占用 172.17.0.1/16 网段。同一个网桥上的容器之间,可以通过 ip 直接通信。 1.2 host 模式 使用 --net=host 指定 host 模式。 host 模式,容器与主机共享 Network Namesp
1. Kubernetes 中的对象 Kubernetes 对象是系统中的持久实体,用于表示集群的状态。用户通过操作对象,与 Kubernetes 进行交互,告诉系统自己期望的工作负载情况。 对象的操作是通过 Kubernetes API 来实现的。每个 Kubernetes 对象包含两个嵌套的对象字段,Spec 和 Status。Spec 描述了期望的对象状态,
Helm 是 Kubernetes 的包管理工具;Operator 用于管理 Kubernetes 的有状态分布式应用。本文主要描述如何使用 Helm、Operator 在 Minikube 集群上快速部署 Prometheus,并使用 Grafana 查看监控数据。Minikube 安装可以参考,搭建远程 Kubernetes 开发环境,Helm 配置可以
1. 缘起 最初,有两名 CoreOS 的员工,为了更方便部署 etcd 集群,在 etcdCluster 对象的增、删、改事件上绑定了相应的逻辑操作,借助 Kubernetes 来自动化管理 etcd 集群。 在几个月之后的 KubeCon 大会上,他们分享了这种称之为 Operator 的方案,得到社区的强烈回响。随后,大量项目宣布支持以 Operator 的方式进行运行和
1. 为什么需要 Helm Kubernetes 中一个重要的设计理念就是,声明式的操作。用户通过设置系统的预期状态来改变系统。例如,现在的副本数量是 2 ,需要调整为 3。声明式的处理方式是,修改配置文件中副本数量为 3 ;命令式的处理方式是,发送增加一个副本的命令,+1。 使用申明
1. Go 的包管理机制 1.1 GOPATH GOPATH 通过 go get 命令,拉取代码放到 GOPATH 目录中。 GOPATH 的问题是: 不能进行包版本的管理 使用全局仓库,不能有效进行隔离 1.2 Vendor 1.5 版本开始,Go 中加入了 Vendor 机制。Vendor 解决了 GOPATH 的部分问题。 Vendor 机制通过在项目目录下增加 vendor 文件夹,管理依赖包。 Vendor 的
从最开始写博客至今,已经过去四、五年。我写博客的初衷是记录、思考、整理,给自己看更多一点,如果能帮上其他人就更好了。从最开始的 csdn ,到使用 Ghost 在 Linode 部署,再到 Pages 托管,最后落脚在 CDN 上。起初是为了能专心写,而后是希望通过一个网站了解更多技术细节,最后
1. 什么是 kubectl kubectl 是 Kubernetes 的命令行工具,通过 API server 与集群进行交互。 2. 配置 kubectl kubectl 可以通过 ~/.kube/config 配置连接到一个或多个集群。 具体如何配置可以参考: 配置对多集群的访问 。如果需要配置远程集群,可以参考: 搭建远程 Kubernetes 开发环境。 查看配置的集群: 1 2 3 kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * minikube minikube minikube
1. 集群 1.1 Master Master 负责管理和维护 Kubernetes 集群信息,并向 Node 下放任务和接收反馈信息。 Master 上运行的组件有 kube-apiserver、kube-scheduler、kube-controller-manager、cloud-controller-manager
Minikube 是 Kubernetes 的单机发行版本,适用于产品体验和日常开发。这里使用 Minikube 搭建开发环境,将 Kubernetes 搭建在 CentOS 云服务器,本地使用 OS X 进行远程开发。 1. 云服务器安装 Minikube 在 Minikube 的 GitHub 版本页面,找到合适的版本,进行安装。 以 CentOS 为例,执行命令: 1 curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.2.0/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/local/bin/ && rm minikube minikube 是一
1. 关于 ToB 的认识 ToC 的钱越来越难赚,才导致了 ToB 的繁荣。 凭一个想法,做出好的产品,最终被大家普遍接受的时代已被巨轮碾过。在互联网发展早期,一个门户黄页就成就了搜狐,一个聊天工具就成就了腾讯,甚至一个只有几个跳转页面的 hao123 都能卖几千万。后来的移动互联
主要记录最近遇到的一些开发问题,解决方法。 1. pandoc 简单使用技巧 Pandoc 是由 John MacFarlane 开发的标记语言转换工具,可实现不同标记语言间的格式转换,堪称该领域中的 “瑞士军刀”。 Pandoc 使用 Haskell 语言编写,以命令行形式实现与用户的交互,可支持多种操作系统。 下载地址: https://github.com/jgm/pandoc/releases/ 。 Pandoc 的基
英文书名: The Way To Go 副标题: A Thorough Introduction To The Go Programming Language 作者: Ivo Balbaert 出版社: iUniverse 出版年: 2012-3-8 ISBN: 9781469769165 Notes: 这是一本个人比较推荐的 Go 入门书籍。由于 Go 最近几年发展迅速,原著中有部分内容已经过时。我阅读的是中文翻译版本。中文版根据当前 Go 语言版本进行了修改。 书中,作者对 Go 语言
1. Go 的数据结构 基础类型 布尔类型:bool 整型:byte、int、int8、int16、uint、uintptr 浮点类型:float32、float64 复数类型:complex64、complex128 字符串:string 字符类型:rune 错
1. XSS 原理和常见的几种攻击方式 XSS 攻击是指,通过执行恶意脚本,以实现窃取用户登陆态、劫持会话等目的的攻击方式。恶意脚本的输入源有,Cookies、Post 表单、Get 请求、HTTP 头内容等。通常,我们将一段 XSS 攻击的代码片段称之为 XSS 向量。 常见的 XSS
django-xss-cleaner 是一个基于 bleach 的 Django XSSFilter 工具包,实现了对 GET 和 POST 请求参数的 XSS 白名单过滤功能。包中内置了部分白名单 HTML 标签、属性设置,同时也支持自定义扩展。项目地址,https://github.com/shaowenchen/django-xss-cleaner 1.
作者: 王建国/吴斌 出版年: 2016-11-1 ISBN: 9787508668024 Notes: 书中主要想阐述,在互联网时代更适合在家工作,远程协同办公。由此,继续讨论企业主、工作者如何驾驭这种工作模式,作者提出了一些自己的思考。 书中的观点,可以作为一个思考社会变革的角度。实际上,我本人也强烈感受到整
1. Go 语言产生的背景 C/C++ 的发展速度没有跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言。为了解决这一问题,Google 开发了一门新的编程语言 – Go 。 Google 当时的现状: 项目中主要使用C++,也有 Java 和 Python 开发人员众多 代码量大 分布式编
我所在的小组,负责 SaaS 开发,有几个重点 SaaS ,也有一些支撑性的 SaaS 。重点 SaaS 架构复杂、技术挑战大,人力投入多,是 KPI 的重点。但重点项目不可能一直是重点,项目有生命周期,也有阶段性。疲于需求,没有远期规划,是危险的。既有战术,也有战略,才会走得更远。本文
1. Pages 功能 GitHub、GitLab、Bitbucket 等,都提供了免费的静态页面托管服务,称之为 Pages 。利用 Pages 服务,可以发布文档、博客等。 以 GitHub 为例,通常只需要简单几个步骤,就可以使用 Pages: 新建一个项目:[username].github.
1. 正在急剧变革的 IT 设施 传统的企业,正在基于互联网技术,构建更加高效的商业模式,以加强自身在行业的竞争力。更低的研发成本、更快的产品迭代、更近的客户距离、更好的服务质量… 这一系列的变化,将推动整个社会的生产效率、生活水平迈上新的
作者: [英] Sam Newman 出版年: 2016-5 ISBN: 9787115420268 Notes: 主要回答了一系列关于微服务的问题。什么是微服务,微服务具有什么特点,系统是如何演化的,如何划分服务,集成、部署、测试策略。 对整个微服务介绍比较全面,很多观点能引起我的共鸣。适合对现有项目不满,准备尝试微服务的
1. 谈跑步 谈跑步时,很容易联想到村上春树的 《当我谈跑步时我谈些什么》。“ 当我谈论 XX 时我谈些什么 ”,句式被广泛引用,也说明了这本书的影响力。 我第一次看完这本书,是好多年前的事了。现在除了标题,其他也就只记得,村上春树每天很早就起床,集中注意力几
主要记录最近遇到的一些开发问题,解决方法。 1. Linux 下设置 Git 访问凭证 Windows 或 OS X 上有 keychain 工具管理账户凭证,在 Linux 系统上使用 Http/Https 协议访问 Git 仓库时,每次都需要输入账户密码。通过下面的配置,可以省略这一过程。 新建凭证文件 1 touch ~/.git-credentials 编辑文件,添加凭证信息 1 https://{username}:{password}@git-domain.com 使凭证生效
1. 安全问题日趋严重 随着互联网对生活场景的层层渗透,我们越来越依赖于各种网络 ID。这些 ID 构成了数字版的我们,是极其重要的账户资产。 另一方面,各种账户信息泄露事件、安全事件却时有发生,CSDN、12306、华住酒店、Facebook、Twitt
本文主要提供了 Django 字段、查询方面的优化建议,同时还介绍了一个 Django-silk 性能分析工具。希望对你开发高性能的 Django 工程有所帮助。 1. DBA 的建议 1.1 表字段设计 避免出现 null 值,null 值难以查询优化且占用额外的索引空间 尽量使用 INT 而非 BIGINT,尽可能准确描述字段 使用枚
1. 碰到的问题 前端请求量大,并发高,访问速度慢,瓶颈主要表现在: 单表大 单库大 网络 IO 慢 磁盘 IO 慢 网络、磁盘 IO 优化,主要依靠硬件升级。理论上,数据库对单库、单表的大小没有限制,但是过大的单库、单表会导致更多的请求落到单机上,给 IO 造成压力。 理想情况是
1. 敏捷开发是什么 在传统的软件研发模型中,从提出需求到最后交付,时间周期较长。瀑布模型遵循需求分析、设计、编码、集成、测试、维护六个步骤进行。一旦需求发生变化,不仅浪费前期投入,还不易于调整。 敏捷开发是一种应对快速变化的需求的软件开发能力。特
1. 认知一致 在大的组织中,我们可以将小团队理解为一个微服务。 早在 1967 年,康威提出了微服务的概念。康威认为任何组织在设计一套系统时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。 在开发复杂系统时,我们通常会对系统进行模块拆分。一方面,个体
主要记录最近遇到的一些开发问题,解决方法。 1. Python2 和 Python3 中的异常处理 Python2,Python3 都支持的两种方式: 带参数 1 2 except (ExceptionType) as Argument: # 访问 Argument 不带参数 1 except ExceptionType: 仅 Python2 支持的方式: 1 2 except ExceptionType, Argument: # 访问 Argument 2.
1. 为什么需要 Mock 在做单元测试时,被测试函数有时并不是一个可执行的独立单元。被测试函数依赖于一些外部资源,比如另外一个函数的返回值、数据库中某一条数据值等。 为了屏蔽外部依赖的干扰,我们会采用 Mock 技术。通过模拟测试资源的方式,满足依赖条件。 从设计模
最近在学习 Go ,而常用的内部 PaaS 平台正好也支持 Go 以及相关 Web 框架。一套 PaaS 系统支持多种语言,其中就离不开 buildpack 机制。虽然 PaaS 平台不断在升级,但是 buildpack 机制却一直保留。本文主要是一些 buildpack 资料的整理和实践。 1. PaaS 如何部署应用 无论是基于原生 Docker,还是 Kubernetes 的 PaaS 平台
1. 常用环境变量 1.1 GOROOT $GOROOT 是安装 Go 程序包的本地目录。 1 2 3 4 cd /c/Go ls AUTHORS CONTRIBUTORS PATENTS VERSION bin favicon.ico misc robots.txt test CONTRIBUTING.md LICENSE README.md api doc lib pkg src 1.2 GOPATH $GOPATH 是 Go 的工程目录,用来存放代码、第三方库、编译中间文件等。 如果需要配置多个目录,在 Mac 和 Linux 下可以通过 : 分割,在 Windows 下可以使用 ; 分割表示。 需要注意的
1. 我在思考什么 在大公司,有更多机会了解行业动态,参与行业变革。 大平台的运行,不是依靠某一个人或几个人。如果这样真的能实现,那也就不能称之为大的平台。一个萝卜一个坑,各自分工,相互协同,才是现代的管理方式。 平台做得好,有影响力,个人也会有加持
Pytest 测试框架使用简单、插件丰富、功能强大,被广泛用于 Python 自动化测试。本文主要介绍一些 Pytest 的基本概念和使用方法。 1. 运行机制 第一步,Pytest 从命令行或文件中读取配置 第二步,在指定目录下查找并导入 conftest.py 文件 第三步,查找满足匹配条件的测试文件,通常是 test_ 开
主要记录最近遇到的一些开发问题,解决方法。 1. Python3 连接数据库 Python3 主要有两个数据库连接客户端: mysqlclient 和 PyMySQL 。 mysqlclient 是由 C 语言实现的 PyMySQL 是由 Python 实现的 在性能上, mysqlclient 比 PyMySQL 高一个数量级。但,在 PyPy 下,PyMySQL 与 mysqlclient 性能相差不大。 如果需要使用 gevent 或 eventlet 的 monkeypatched 处理 socket,
大公司的程序员,容易产生的错觉之一就是,误将平台能力当作自己的能力。在大团队,我们不应仅关注自己的一亩三分地,更需要了解平台的各个环节。一方面,有助于更好地利用平台相关特性,另一方面,也为了自我技术更好地成长。本文,介绍了如何使用 Jekin
主要记录最近遇到的一些开发问题,解决方法。 1. Python 内存分析方法 主要涉及四个工具: memory_profile:分析每一行代码的内存使用量 objgraph:跟踪内存中的对象的关系 guppy:在运行时跟踪堆的使用情况 pyrasite:向进程中注入代
1. Serializer 1.1 数据校验 在反序列化数据时,需要对数据的合法性进行校验。这时,可以调用 is_valid() 进行验证,如果发生验证错误,可以在 .errors 属性获取错误提示信息。例如: 1 2 3 4 serializer.is_valid() # False serializer.errors # {'created': [u'This field is required.']} .is_valid() 方法带有一个可选的 raise_exception 标志,如果存在验证错误,将抛出 serializers.ValidationError 异常。 1 serializer.is_valid(raise_exception=True) 除了使用
1. Django 中的 View Class 首先回忆一下,Django 对请求的处理逻辑。收到一次请求之后,Django 会生成一个 WSGIHandler 类型的 handler,由 handler 控制整个处理流程。 那么,请求的 URL 与 View 是如何关联的呢? Django 首先根据 ROOT_URLCONF 的配置加载 URLconf,按顺序逐个匹配 URLconf 的 URLp
由于数据量剧增,系统响应很慢。对应用系统进行了一系列的优化工作,系统响应时间得到了数量级级别的优化效果。总体看,在压缩文件、加快网络访问方面的优化,对前端性能有显著提升效果。在存储过程、缓存、逻辑代码方面的优化,对后端性能提升有显著效果。本
本人所在的团队正在打造一款 ToB 产品,在垂直领域颇有影响力。此文是对团队关键事件的梳理,同时也包含了一些个人思考。 1. 在熟悉的场景中做到最好 互联网上,粗制滥造的内容太多,能获得广泛关注和影响力的产品屈指可数。 只有基于对用户痛点的深入了解,才能够提
主要记录最近遇到的一些开发问题,解决方法。 1. WhiteNoise 转发静态文件 Django 内置的静态文件服务器效率很低,而 WhiteNoise 是一个不错的替代品。具有如下特点: 通常用于 PaaS 服务 支持 wsgi 应用程序,针对 Django 进行了特殊适配 配合 CDN 使用,更佳 在 Gunicorn 配合下,使用 sendfile 系统调用,处理效率非常高 相比
1. 什么是 frp frp 是一个高性能的反向代理应用,提供的功能有: 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务 对于 http、https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个 80 端口 利用处于内网或防火墙后的机器,对
主要记录最近遇到的一些开发问题,解决方法。 1. Python 的日志模块 Python 的 logging 模块主要由四个部分组成: Loggers: 可供程序直接调用的接口 Handlers: 将日志记录输出至合适的位置 Filters: 提供更细粒度的日志是否输出判断 Formatters: 定制最终记录打印的布局格式 看下面这个例子,log1.py 文件 1 2 3 4
主要记录最近遇到的一些开发问题,解决方法。 1. Python 中的序列化与反序列化 序列化,将内存对象转化为可存储或传输序列的过程。反序列化,把序列化序列重新转化为内存对象的过程。Json 和 Pickle 是 Python 中常用的两个序列化处理模块。 Json VS Pickle: Json 实现的是内存对象与 Json 字符串
1. 一个小需求 经常遇到一些小的需求,但是实现起来并不简单。这里就有一个文件上传的简单需求,分为下面几个步骤: 用户在页面上传一个大文件 大文件会被暂存在内网的 Ceph 后台任务,将 Ceph 中的大文件,下载到 Docker 内 后台任务,将 Docker 中的大文件,上传到外网的 COS 后台使用的
1. 更换镜像源 首先备份官方的源 1 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载新的源到 /etc/yum.repos.d/ CentOS 5 1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo CentOS 6 1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo CentOS 7 1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 生成元数据缓存 1 yum makecache 2. 访问 NTFS 文件系统 Linux 内核目前只支持对微软 NTFS 文件系统的读取。 ntfs-3g 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。 ntfs-3g 在 epel-release 源中,执行命令查
Python2 到 Python3 是一个较大的版本更新。目前,生产环境依然有大量项目使用的是 Python2。但,这并不意味着项目会一直停留在 Python2,开发者也需要考虑项目对 Python3 的兼容性,以方便迁移,同时也是对新知识的学习。下面是一些学习的知识点整理。 1. Python2 升级 Python3 贸然
主要记录最近遇到的一些开发问题,解决方法。 1. warning: LF will be replaced by CRLF Windows、Linux 和 Mac 在处理文件换行时,标示符是不一致的。Windows 使用 CRLF 作为结束符,而 Linux 和 Mac 使用 LF 作为结束符。 对待换行符,Git 有两种模式。查看 Git 配置。 1 git config core.autocrlf 如果显示
最近,我负责开发一个重后端的应用。这个应用数据流向复杂,处理逻辑冗余堆积。项目技术栈选择的是 Django + Vuejs。前端使用 Webpack 打包,模块化管理,主要是展示数据。后端涉及的模块多,处理规则多,数据表多,每次涉及之前功能修改时,都消耗大量时间 review 代码。这
1. Kubectl 基本命令 1.1 创建对象 1 2 3 4 5 6 7 8 # 创建资源,也可以使用远程 URL kubectl create -f ./my.yaml # 使用多个文件创建资源 kubectl create -f ./my1.yaml -f ./my2.yaml # 使用目录下的所有清单文件来创建资源 kubectl create -f ./dir # 启动一个 nginx 实例 kubectl run nginx --image=nginx 1.2 显示和查找资源 1 2 3 4 5 6 7 8 # 列出所有 namespace 中的 service kubectl get services # 列出所
1. 基本概念 1.1 Kubernetes Kubernetes(简称,K8s),前身是 Google 的 Borg,是用于自动部署、扩展和管理容器化应用程序的开源系统。 提供的功能有: 容器的自动化部署 自动化扩缩容 自动化应用/服务升级 容器成组,对外提供服务,支持负载均衡 服务的健康检查,自
最近操作服务器时,遇到了一些不同清楚的概率,查找了一些资料,整理如下。 1. BLP 安全模型 该模型将信息系统中的实体分为两部分: 主体(Subject),实时操作的,如用户和进程 客体(Object),被操作的对象,如文件和数据库等。 对主体和客体来说,有
1. 自定义 docker-machine 位置 Windows 7 下使用 docker ,默认将 docker-machine 存放在 C:\users\your name\.docker\machine\machines 目录。 为了不占用系统盘存储空间,可以通过如下方法修改: 如果还没有创建虚拟机,可以通过设置 MACHINE_STORAGE_PATH 环境变量指定。 然后,运行 Docker Quickstart Termina,创建运行 docker-machine。 如果已经创建虚拟机,则
1. 简介 Flask 诞生于 2010 年,是一个使用 Python 编写的轻量级 Web 应用框架。 Flask 依赖于两个库。 Jinja2,模板引擎,类似 mako Werkzeug,遵循 WSGI 协议的 Python 函数库,实现了很多 Web 框架底层的东西,比如 request 和 response 对象。 2. Web 框架比较 Flask、Tornado、Django 特
为了方便 CI 集成 UI 自动化测试,需要将 Robot Framework 运行环境打包为 Docker 镜像。本篇主要内容是一些与打包过程相关的配置和脚本。 1. 打包目录结构 1 2 3 4 5 6 tree . ├── docker-compose.yml ├── Dockerfile ├── google-chrome.repo ├── requirements_base.txt 1.1 Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 FROM centos:7 ADD ./google-chrome.repo /etc/yum.repos.d/google-chrome.repo
在团队中,开发流程相关的调整一定要相应的自动化工具配合。如果没有足够低的使用成本,这种调整将会是无意义的,因为根本就不会有人去使用。上一篇,我们提到 如何利用 CDN 进一步的前后端分离 , 这一篇主要讲,如何将这个流程结合到 CI 中。后端的配置,之前的 博客
最近在优化一下项目,梳理整个链路之后,开始逐步优化,发现了很多可以改进的点。下面是对开发模式、部署方式的一些思考,希望对你有所启发。 1. 开发背景 1.1 部署方式 如上图,简单描述一下应用的架构。 采用的是经典三层架构,接入层,逻辑层,存储层。其中,接入
1. node-sass 安装 安装 node-sass 时,在 node scripts/install 阶段会从 github.com 下载 .node 文件,由于网络问题,常常会导致失败。 可以在项目内添加一个 .npmrc 文件,配置代理安装: 1 2 sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ registry=https://registry.npm.taobao.org 或者使用 cnpm 安装 1 2 npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install node-sass 2. node-gyp 安装 node-gyp 是为 Nodejs 编译 C++ 扩展,使用的编译工具。这里 有详细的各个系统上的安装方法。 在
前面提到 Jupyter Notebook 是一个交互式笔记本,支持运行 40 多种编程语言,非常适合教学。最近,学习 Go 语言,就想起了 Jupyter。本文主要描述如何在 Jupyter 里面安装 Python3 和 Go 内核。 1. Jupyter 安装 在 CentOS 7 中,默认安装了 Python 2.7,有现成的 Python 环境可用。 安装 Jupyter 1 pip install jupyter 生成密码 在 IPython 中,
切水果 牛顿摆 汤姆猫
给大家分享一下,最近一个月,关注的一些技术动态。同时,也有一些工具、学习资料、小技巧等有意思的内容。 前端 Webpack 在今年 2 月份,Webpack 已经推出 4.0.0 的版本。Wepack 4 不再支持 Node.js 4,在编译速度上也有很大优化提升。同时,Webpack 4 移除了 commonchunk
作者: 范冰 副标题: 创业公司的用户与收入增长秘籍 出版年: 2015-7 ISBN: 9787121263606 Notes: 这是一本针对 ToC 互联网产品、比较 Marketing 的书。 通过各种真实案例,告诉你互联网产品的玩法。怎样创造产品,获取用户,激发活跃度,提高留存,增加收入,病毒传播。 如果你是从业人员,这本书能给你在
1. 下载镜像文件 点击进入,CloudReady 官网下载 DOWNLOAD 64-BIT 或 DOWNLOAD 32-BIT 版本镜像。解压后,得到 cloudready-free-xxx-bit.bin 文件 2. 安装 Chromebook 恢复工具 首先需要安装 Chrome 浏览器,然后打开页面,安装 Chromebook Recovery Utility。 3. 制作镜像 第一步,打开 Chromebook Recovery Utility 第二步,选择 Use local image,再选择刚才解压出来
1. 标准库 Robot Framework 可以直接导入使用的库,在目录 python\Lib\site-packages\robot\libraries 中。详细说明,可以查看说明文档。 Builtin,包含经常需要的关键字。自动导入无需 import,因此总是可用的。 Dialogs,提供了暂停测试执行和从用户的输入方式。 Collections,提供一组
配置表 Robot Framework 的配置表主要有两种用途。详细说明,请参考这里。 导入测试、资源文件和变量文件。 定义元数据。 在 Setting 表格中: 1 2 3 4 5 Library 引入库 Resource 引入资源文件 Variables 引入变量文件 Test Setup 指定缺省的 test setup Test Teardown 指定缺省的 test teardown 在测试用例中: 1 2 3 4 5 6 [Documentation] 测试用例描述 [Tags] 测试用
pybot 命令 执行所有测试用例 1 pybot . 执行某个测试套件 1 pybot testsuite.txt 执行某个测试套件中的测试用例 1 pybot --test case_name testsuit.txt 将测试结果输出到固定路径 1 pybot --ouputdir your_ouput_dir testsuit.txt 执行包含某个 tag 的测试用例 1 pybot --include tag_name testsuit.txt 关于日志 默认情况下,Robot Framework 中低于 INFO 级别的日志消息不会写日志。这个阈值可以通过命
之前使用过 Gygwin,也是用过 Git Bash。但在 Vim 面前,这两货都不好使,最终选择了 MSYS2 作为 Console 端。 1. Cygwin、MinGW、MSYS2 比较 在 Windows 下,使用 Vim 的关键在于找到一个合适的 Console。在安装 Vim 插件时,合适的 Console,能帮你避开大
1. nerdtree 生成文件目录树 1 2 " 文件目录树 Plugin 'scrooloose/nerdtree' 1 2 3 4 5 6 7 8 9 10 11 12 13 "===================================================== "" NERDTree 配置 "===================================================== let NERDTreeChDirMode=1 "显示书签" let NERDTreeShowBookmarks=1 "设置忽略文件类型" let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$','\.pyo$', '__pycache__$'] "窗口大小" let NERDTreeWinSize=40 autocmd VimEnter * if !argc() | NERDTree | endif " Load NERDTree only if vim is run without arguments "按
1. Vim 简介 Vim 是基于 vi 发展出来的一个编辑器,第一个版本由布萊姆·米勒在 1991 年发布。最初的名称是 Vi IMitation,随着功能的不断增加,正式更名为 Vi IMproved。 上面是常见编辑器的学习曲线。对于大多数用户, Vim 有着比较陡峭的学习曲线。也就是说刚
利用 Gitlab issue 进行项目管理是一件对 Dev 十分友好的事。录入issue、发起 Merge Request、创建 milestone,这些都是开发过程中动态推进的。但,每个新项目都需要创建一堆 Label ,是件让人头疼的事。本文主要就是为了解决这个问题。 1. GitLab Label 在创建 GitLab Label 之前,我
1. 安装无头浏览器 1.1 CentOS 安装 Phantomjs 下载并解压 访问 Phantomjs ,找到 Download phantomjs-2.1.1-linux-x86_64.tar.bz2 的下载链接,并拷贝。 在 CentOS 执行命令: 1 2 3 4 5 wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 # 如果没有安装 bzip2 可能会报错 yum install bzip2.x86_64 tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 mv phantomjs-2.1.1-linux-x86_64 /usr/local/ 添加到环境变量 1 vim /etc/profile 在行尾新增,如下内容 1 export PATH=$PATH:/usr/local/phantomjs-2.1.1-linux-x86_64/bin 使环境变量立即生效 1 source /etc/profile 查看 Phantomjs 版本号 1 phantomjs --version 安装完之
1. 关于键盘类型 键盘主要有三类: 机械键盘 机械键盘的每一颗按键都有一个单独的开关,也被称为轴。依照微动开关的分类,机械键盘分为茶轴、青轴、白轴、黑轴以及红轴。机械键盘手感舒适,但价格偏高。 薄膜键盘 薄膜键盘是按键较多且排列整齐有序的薄膜开关。日常
1. 机器面前人人平等 我们每天都接受着大量的数字信息,但真正对自己有帮助的很少。绝大部分信息像垃圾食品一样,并不提供什么养分,还挤占容量,使你无法深入了解真相、形成自己的思考和判断。 你可以一动不动,坐在那里刷一上午微博、抖音、今日头条、腾讯新闻
主要介绍 Robot Framework 的一些基本概念,如何写一个测试用例。 1. 基础元素 1.1 关键字 - keywords Robot Framework 关键字类似函数。分为系统关键字和用户自定义关键字。 系统关键字,通过加载 Library 引入 用户关键字,通过加载 Resource 引入 1.2 库 - Library 库用来封装和复用关键字。Robot Framework 库包括系统库和用户自
1. 简介 1.1 Robot Framework Robot Framework 是一个 Python 写的自动化功能测试框架。 具备良好的可扩展性,支持关键字驱动 可以同时测试多种类型的客户端或者接口 可以进行分布式测试 主要用于轮次很多的验收测试和测试驱动开发。 1.2 Robot Framework IDE (RIDE) Robot Framework IDE (RIDE) 是 Robot Framework 框架的集成开发环境。 值得注意的是,20
由于负责小组的 CI 公共事项,经常需要配置 CI 流程,或者帮助其他人解决一些问题,整理了一下常用的 CI 脚本,以方便查阅。 1. .gitlab-ci.yml 结构 下面是, GitLab CI 的配置文件结构。 .gitlab-ci.yml 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 一些前置脚本,完成激活环境等操作 before_script: - source /data/runner/node/bin/activate - which node && node --version - which npm
作者: [美] 爱德华·弗伦克尔 原标题: Love and Math: The Heart of Hidden Reality 出版年: 2016-3 ISBN: 9787508658070 Notes: 在来回旅途的高铁上,读完本书的。这是一本比较轻松的自传类型的数学读物。主要以作者求学为时间线,讲述了一个对物理感兴趣的男孩,怎样一步一步、通过不懈努力成为世界级的数学家的故
1. createElement 方法 HTML 中常见的 DOM 操作是,修改 DOM 节点,访问 DOM 节点。 除此之外,W3C 还发布了创建 DOM 节点、删除 DOM 节点的技术标准。 createElement 方法,被用于创建一个 DOM 节点。createElement() 通常需要与 appendChild() 或 insertBefore() 方法配合使用。 其中: appendChild() 方法,用来在指定的子节点列表末,
1. 提问的动机 提问的动机分为两种,被动型、主动型。 2 被动型 被动型的提问,是当你遇到问题之后,寻找问题的解法而不得时,被迫的行为。 2.1 尝试自己解决 遇到问题时,不要着急问别人。在时间允许的情况下,尝试自己解决。 一方面,可以锻炼自己分析问题和解决问题
在 Django 中,request 包含了一次请求的全部信息。后端处理逻辑经常需要用到 request 中的信息。比如, DRF 框架中想要随时能够获取到 request,或者将一些参数全局传递。Django 第三方 App 中有一些工具可以满足要求,但它们并不是安全可靠的。意思是,如果 Django
1. axios 安装 使用 npm 安装 1 npm install axios --save 全局注册有两种方法: 绑定到原型上 1 2 import axios from 'axios' Vue.prototype.axios = axios 这种方法,每个 Vue 对象都会新增一个 axios 对象。 1 2 3 this.axios.post(apiUrl).then((res) => { //do something }) 挂载到 windows 对象上 在 DOM 的任意地方,都能使用 axios 函数。 1 2 import axios from 'axios' window.axios = axios; 1 2 3 axios.post(apiUrl).then((res) => { //do something }) 2. axios 配置 为了配合 Django 的 CSRF
前面一部分主要讲乐观锁和悲观锁。锁从数据库层面,保证了并发时的数据一致性。了解锁,有助于对并发解决方案的理解。后面一部分主要讲的是 Django 中,并发场景下,保证数据一致性的解决办法。 1. 关于锁 1.1 乐观锁 乐观锁的出发点是,同一条数据很少会因为并发修改而产
1. 什么是 utf8 理论上,utf8 使用 1-6 个字符, 实际上,最新的 utf8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。 2. 什么是 utf8mb4 utf8mb4 是 utf8 的超集,理论上原来使用 utf8,然后将字符集修改为 utf8mb4,也不会对已有的utf8 编码读
** 默认执行命名时,针对的是当前目录环境。如果加上 -g 参数,则表示针对的是全局生效。** npm 升级 1 npm install npm -g 查看当前版本 1 npm -v 查看 npm 源配置 1 npm config get registry 修改 npm 源 1 2 npm config set registry http://registry.npm.taobao.org/ # npm config set registry https://registry.npmjs.org/ 临时指定 npm 安装源 1 npm install [package name] --registry=https://registry.npm.taobao.org 设置 proxy 1 npm config set proxy http://proxy.example.com:8080 查看 proxy 1 npm config get proxy 删除
主要记录的是分析方法。 1. 战略分析 麦肯锡七步成诗法 陈述问题 分析问题 优先排序 指定详细的工作计划 进行关键分析 综合结果并建立有结构的结论 讲故事 2. 认识问题 大部分的问题是不能认识问题,unknown unknown。能够认识到问题、陈述问题,是解决问题的
1. 下载并配置 Runner 1.1 下载 Runner GitLab-CI 的 Runner 是一个 Go 写的程序包,可以去官网下载到本地。 1 2 yum install -y wget wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 增加执行权限 1 chmod +x /usr/local/bin/gitlab-runner 1.2 新增 runner 用户 运行 Runner 时,以 runner:runner 账户运行。 1 2 groupadd -g 1234 runner useradd runner -u 1234 -g 1234 1.3 修改 pip 源 1 2 3 4 cat /etc/pip.conf [global] index-url= http://pypi.doubanio.com/simple/ trusted-host = pypi.doubanio.com 1.4 创建工作目录 1 mkdir -p /data/gitlab-data 2 注册 Runner 在项目
由于目前使用的 Git 仓库即将无法使用,需要将仓库代码迁移到新的 Git 仓库。具体操作方法如下: 1.登录新的仓库,然后创建仓库。 创建后,新仓库地址: http://gitlab.your-new-domain.com/project.git 2.克隆旧仓库镜像到本地: 1 2 3 git clone --mirror http://gitlab.your-old-domain.com/project.git # 如果仅需要克隆 Branch 和 Tag,可以使用 --bare 参数替换 --mirror
1. server_name 无效 现象:Nginx 反向代理了两个应用,配置详情如下。发现访问 b.chenshaowen.com 和 a.chenshaowen.com 时,返回的都是 A 服务的请求。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 server { listen 80; server_name a.chenshaowen.com; location / { proxy_pass http://A; } } server { listen 8080; server_name b.chenshaowen.com; location / { proxy_pass http://B; } } 原因:当所有 server 的规则都不匹配时,Nginx 会采用第一条
1. 非标准库 1.1 virtualenv virtualenv 是一个非常流行的用于创建独立的python libraries环境的工具。我强烈推荐你学习并了解它,因为他非常实用,并且应用广泛,很多人用它来搭建python开发环境。后面其他工具来主要与virtualenv来进行比较以说明差
1. 关于个人项目 为什么强调是个人项目?商业项目对代码托管、开发、运维部署等环节有着冗长的流程。而对于个人开发者,这样的流程成本过高,不利于快速项目迭代。 个人项目可能是一次学习的 Demo。完成一个领域 Demo 是很好的技术学习思路。从零开始搭建一个完整
最近参与了一个多人协作开发的项目,在开发过程中遇到不少问题。例如,前端提交冲掉后端代码、代码冲突无法解决直接返工、A 提交 B 分支、直接提交 Master 分支等。本文是记录,也是思考如何更高质量地管理项目、进行多人合作项目的开发。 1. 版本管理的需求 1.1 版本标记
创建 Django 工程 1 django-admin startproject your_project_name 创建应用 1 2 3 django-admin.py startapp your_app_name # 或者 python manage.py startapp your_app_name python manage.py 和 django-admin 的功能基本一样。不同的是 python manage.py 还设置了 DJANGO_SETTINGS_MODULE 环境变量、将项目的路径加入了 sys.path 中。建议除了创建项目使用 django-admin,其他情况使用 python manage.py。 初始化数据 1 python manage.py migrate 创建缓存表
1. 为什么字典比列表查询快 首先,请看下面这段代码 1 2 3 4 5 6 7 8 9 10 11 12 13 from time import time t = time() data = [chr(i) for i in range(97, 123)] # data = dict.fromkeys(data,True) print data for i in range(9999999): after_filter = [] for find in ['aa', 'b', 'cc', 'd', 'ee']: if find not in data: after_filter.append(find) print after_filter print time() - t 直接运行: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] ['aa', 'cc', 'ee'] 24.5699999332 去
1. Python 2 和 3 区别 特征\版本| Python 2| Python 3 | :-: | -: print 函数化 | print“abc”| print(“abc”) 统一类| 旧式类和新式类| 只有新式类 浮点运算| 1/2=0| 1/2=0.5 字符串格式化| %,Format| Format,% xrange 替代 range| xrange| range long 重命名为 int| Long,int| Int 包导入| 相对导入| 绝对导入 源文件编码| Ascii| utf8 Python 官方强烈建议直接学习 Python 3,
1. 编译器准备 准备 Python 源码 在 Python 的官网,下载需要进行编译的 Python 版本源代码。这里选择的是 Python 2 的最新版本 Python-2.7.14.tar.xz,点击前往。 准备编译器 在 Windows 上,Python 2.7 的源代码内置的项目工程,支持 Visual Studio 2008、2010 打开。当然,V
文中以 Python 2.7.8 版本源码为例。 1. Python 中常见的文件格式 py 文件 Python 源代码文件,可以使用文本编辑器进行修改。 pyc 文件 Python 源代码编译后,生成的字节码文件。 pyw 文件 pyc 文件执行时,会出现 console 窗口;pyw 文件执行时,不会出现。pyw 文件主要是用来运行纯 GUI 图形用户界面程序,
1. 关于名字 选择专业的词 避免泛泛的名字 用具体的名字代替抽象的名字 使用前缀或后缀给名字附带更多的信息 决定名字的长度 利用名字的格式来表达含义 2. 把信息装到名字里 通常来讲,加上像 is、has、can 或 should 这样的词,可以把布尔值变得更明确。 get 开头的方法,
1. 概况 课程前置条件:已经完成 PowerPoint 逻辑梳理和内容撰写。 课程主要从以下六个部分,来增强 PowerPoint 的表现力: 色彩 文字 图形 图表 母版 动画 2. 色彩 2.1 认识色彩 色相 彩色,如紫色、青色、品红等。中性色,如黑、白、灰。 亮度 色彩的明暗程度,亮度值越高,色彩越白,亮度越低,色
使用 pip 命令安装 Python 包时,默认去 https://pypi.python.org/simple/ 源查找相应的包,下载并安装。但是在内网环境,或者需要发布一些私有包提供给指定用户时,就需要搭建自己的 PyPI Server。本篇主要记录使用 devpi 工具搭建 PyPI Server 源的过程,以及记录一些常用命令。 1. PyPI Server 比较 PyPI Server PyPI 代理镜像 本地缓存
在需求逐步确认的过程中,系统的 DB 模型也逐步确认。有时使用,MySQL Workbench 这类工具绘制 E-R 图,然后生成 MySQL 数据库表,这时就需要反向生成 Django Models;有时直接写 Django Models ,但是又需要查看 E-R 图。本文主要解决上面两个需求,实现 Django Models 与 E-R 图之间的转换。 1. 生成 model 的
本篇主要阐述了为什么需要服务发现功能,对几种服务发现工具进行了比较。同时,在 CentOS 上,对 Etcd、Confd 、Nginx 实现服务发现功能进行了实践。 1. 服务注册与发现 1.1 为什么需要注册和发现服务 随着微服务的兴起,大量接口服务化。当新的微服务加入或微
互联网的服务常依赖于成千上万的主机,而这些主机又部署在世界各地,再加上错综复杂的用户环境,要保证服务的稳定可靠,就需要对服务进行监控。监控的目的可以从这几个方面考虑:从系统维度,了解CPU、内存、硬盘使用情况;从网络监控维度,了解网络上行、
本文主要简单介绍了 ELK 的技术栈,并给出了 Docker compose 的编排配置。阅读本文,可在本地通过 Docker 将 ELK 跑起来。后续会将 ELK 在服务器上进行部署,相关的配置再补充。 1. ELK 技术栈介绍 ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticse
1. 如何更好做 CodeReview 要求 事项 代码提交者的要求 小粒度 原子性 有注释 工具检查 对代码 Review 者的要求 一看规范 二看逻辑&性能 三看设计 对团队的要求 温故而知新 2. 制定CodeReview CheckList 要求 事项 命名 变量名字 类命名 方法命名 参数命名 代码长度 类长度不超过1000行
本文主要约定在 Django 开发过程中,需要注意的一些事项。统一的编码风格,良好的设计理念,有利于项目的开发和维护,值得开发人员不断地研究和探讨。 1. 编码声明 在 Python 解释器执行代码时,需要告诉解释器代码的编码方式。Python 代码实际上是文本数据,如果代码的
toastr 消息弹框提示 artDialog 对话框组件 DataTables 基于 jQuery 表格插件 KendoUI 非常全的 UI 框架,很多组件 wangEditor Web 富文本编辑器 jstree 网页树形结构组件 highcharts echarts D3js 数据图表 select2 下拉框 validate 基于jquery的表单验证 Vuejs 可以用于双向数据绑定,也可以用于构建单页应用
1. 文档 Pandoc Pandoc 是一个用 haskell 编写的文本转换工具,转换速度快,支持格式广泛。可以将 Markdown、LaTeX 等格式转换为 HTML、Docs 、PDF 等格式。 而只需要执行简单的语句: 1 pandoc mypaper.md -o mypaper.docx Graphviz 一个由 AT&T 实验室开发的开源工具包,用于绘制 DOT 语言脚本描述的图
1. 流控 缓存、降级和限流是保护高并发系统的常用方法。缓存以空间换时间、减少了 CPU 和网络调用的耗时;降级保护了核心服务的高可用,高峰时段延时或拒绝处理非核心请求;限流是通过限制并发请求来保护系统。 限流就是,在有限资源的情况下,每个 API 接口单位时间内
1. 背景 最近十多年来,C/C++ 在计算领域没有很好得到发展,没有跟上计算机发展的脚步。 现有的编程语言,开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译;要么执行效率低,但拥有高效的编译;所以需要一种拥有较高效的执行速
1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元。进程拥有自己独立的堆和栈,独立的地址空间,资源句柄。进程由 OS 调度,调度开销较大,在并发的切换过程效率较低。 Python 提供了一个跨平台的多进程模块 multiprocessing,模块中使用
1.问题描述 背景:一个 Django 开发的 SaaS 应用,对外提供文档服务功能。其中,搜索功能通过 Django Haystack 实现。 问题:搜索功能有时可用,有时不可用。多次测试,发现可用和不可用会交替出现,出现概率各占约 50%。 补充一下搜索功能实现的细节: Django Haystack 在提供搜索功能之前,需要
1. HTTP Header HTTP 协议是建立在 TCP/IP 协议之上的应用层规范,以 ASCII 码传输。HTTP 规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样: 1 2 3 4 5 <method><request-URL><version> <headers> <entity-body> HTTP Header 包括通用头、请求头、响应头和实体头这四个部分。每个头域由一个头域的域名,冒号和域值组成。
1. 函数方法 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码片段。函数能提高应用的模块性,代码的重复利用率。Python 提供了许多内建函数,比如 print()、str()。同时,Python 也允许用户创建函数,这被叫做自定义函数。
1. 简介 Jupyter Notebook(前称 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook 实际上是一个 Web 应用程序,可以创建和共享程序文档,支持实时代码,数学方程,可视化和 Markdown。 用途包括:数据清理和转换,数值模拟,统计建模
1. 消息队列的适用场景 1.1 异步处理 应用场景:用户注册后,需要发注册邮件和注册短信。同步的处理方法,系统的性能(并发量,吞吐量,响应时间)会有瓶颈。 1.2 应用解耦 应用场景:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口
1. 基本概念 Workspace:工作区,工程文件 Index:暂存区,也叫待提交更新区,在提交进入 repo 之前,把所有的更新放在暂存区 Local Repository:本地仓库,存放在本地的版本库,HEAD 指向当前的开发分支 Remote Repository:远程仓库,远
混沌工程与实践 高校培训第二周|DevOps 高校培训第一周|容器与云原生 中国 DevOps 社区分享|基于 Tekton 的 CICD 平台 KubeSphere 开源之研发流程思考 云原生下的 DevOps 平台 2020 云原生产业大会|跨集群构建企业级 DevOps 平台 SAAS 开发的思考 高效时间管理 编写可复用的 Django App ROBOT FRAMEWORK 基础篇 GitLab CI 与蓝盾 UI 自
1. Hexo 简介 Hexo 是使用 Node.js 开发的一个简洁、高效、开源的静态博客生成器。Hexo 能够以非常快的速度将 Markdown 渲染成静态的 HTML 文件。类似于 Jekyll、Ghost、Octopress,可以用于创建博客。 Hexo 具有如下优势: 使用 Node.js ,搭建环境简单。Jekyll 搭建环境
在 Web 应用开发的过程中,后端开发人员需要频繁的交付 API 接口,前端开发人员需要频繁的调用 API 接口。为了降低沟通成本、预防可能的安全风险,遵循约定优于配置的原则,有必要规范 API 的接口规范。Restful API 是以资源为核心的 API 设计思路,所有的操作都是针对特
从 GitLab 8.0 开始,GitLab 开始集成 CI(持续集成) 功能。只需要在服务器上添加一个 Runner,同时在项目中添加一个 .gitlab-ci.yml 文件,就可以进行 CI。在 GitLab 搭建与配置 中笔者记录了从零开始搭建 GitLab 服务的整个流程。在 GitLab CI 持续集成 中笔者交代了 GitLab CI 的一些基本概念,并
笔者目前使用 Django 从事 SaaS 开发,同时开发和维护多个 SaaS 应用。在很多 SaaS 应用中都约定了错误码,有的用于处理登录态,有的用于标记业务逻辑状态。对于这种项目共性很强的特征,花时间学习和研究是非常有必要的。本篇主要讨论了错误码的用途、如何设计错误码、使用 Django 中
1. 了解新语言产生的背景 ABC 是专门为非专业程序员设计的一种教学语言,但是由于其封闭,并未取得成功。1989年的圣诞节期间,吉多·范罗苏姆开发了一个新的脚本解释器,并命名为 Python,作为 ABC 语言的一种继承。新的脚本解释器开放,完美结合了 Unix Shell 和 C
最近笔者在思考,怎样提高开发效率。从网络爬虫到数据处理,然后到人工智能。Python 的强大之处在于:拥有一大批开箱即用的工具包,不必重复造轮子,极大地提高了开发的效率。那么为何不将项目中的功能模块化,打包成可复用的 Python 包呢?本文主要讲的是怎样
1. 关于 Django 的性能 Django 是一个 Python 写的 Web 应用框架。使用 Django ,可以非常简单、高效地开发复杂的数据驱动的网站。同时,Django 非常注重组件的重用性、可插拔、敏捷开发、DRY(Don’t Repeat Yourself)。从一定程度上讲,Django 是一个很
为了快速地响应用户的需求、满足运营活动的需要,互联网产品通常有着非常高的发布频率。采用敏捷开发的方式,缩短了交付的周期,加快了产品的迭代,也给项目的文件管理带来了挑战。前端工程直接面向用户,首当其冲,最值得重视。频繁更新的图片、样式、交互,
1. Django 静态文件分类 Django 静态文件分为两类:static 和 media。 static: 是页面引用的 JS、CSS、Image 等文件 media:是用户上传的文件 2. 生产环境配置 生产环境,通常配置 Nginx 转发静态文件请求,而 Django 处理动态请求。 nginx 配置 1 2 3 4 5 6 7 location /media
1. 直接返回文件 如果静态文件在工程根目录的 media/test.zip,需要先将文件读入内存,再进行传输。代码如下: settings.py 配置 1 2 PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media/') yourapp/views.py 1 2 3 4 5 6 7 8 9 10 11 12 from django.conf import settings from django.http import HttpResponse from django.core.files.storage import FileSystemStorage def download_file_direct_from_file(request): file_system = FileSystemStorage(settings.MEDIA_ROOT) file_name = 'test.zip' with file_system.open(file_name) as f: response = HttpResponse(f) response['Content-Type'] = 'application/%s' % file_name.split('.')[-1] response['Content-Disposition'] = 'attachment; filename="%s"'% file_name return
Docker 解决了同一机器上的环境隔离问题,提高了运维部署的效率。 Vagrant 给开发提供一个统一的开发、测试、接近于完全隔离的环境。本文,主要讨论如何使用 Vagrant 搭建 Django 开发环境。版本:VirtualBox 5.0,Vagrant 1.8。 1. 基本概念 1.1 Vagrant Vagrant 是一个用来构建虚
1. 目录结构 django-devops-uwsgi 目录是打包 uWSGI 和 Django 的镜像编译文件。在镜像中安装 uWSGI、pip、virtualenv等必要的程序包。 在使用镜像创建容器时,执行 start.sh 脚本, 创建 Python 虚拟运行环境,从 Django 的 requirements.txt 安装依赖包,最后启动 uWSGI 监听端口,等待请求。 django-devops-compose/www/app 目录,用于放置 Django 的代码
1. 目录结构 1 2 3 4 5 6 7 8 9 10 11 12 ├── django-devops-nginx │ ├── Dockerfile │ └── nginx.repo ├── django-devops-compose │ ├── docker-compose.yml │ ├── www │ ├── conf │ │ ├── nginx.conf │ ├── log │ │ ├── nginx │ │ │ ├── access.log │ │ │ ├── error.log 每个服务的镜像 Dockerfile,单独放在一个文件夹。django-devo
1. 部署架构 浏览器访问一个页面的程序处理流程: (1),浏览器向 Nginx 发起一个请求,如果匹配到 Nginx 的静态 URL,比如 /static 目录下的 js、css、404.html 等文件,那么 Nginx 直接返回文件。其他请求 URL,通过 uwsgi_pass 配置转给 uWSGI 处理。 (2),uWSGI 解析请求头
1. 基本概念 Docker Compose 是一个用来定义和运行复杂应用的 Docker 工具。使用 Docker Compose,可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。 Docker Compose 定位是 ‘defining and running complex applications with Docker’,前身是 Fig,兼容 Fig 的模板文件
1. 基本概念 Dockerfile 是一些列构建 Docker 镜像的指令集合。Docker 通过读取 Dockerfile 指令自动构建镜像。Dockerfile 类似于 Makefile,都是一种文本文件,按照构建镜像顺序组织所有的指令。 Docker 镜像的构建命令: 1 docker build . 这条命令中,Docker CLI 的处理流程如
Vagrant 适合用来管理虚拟机,而 Docker 适合用来管理应用环境。为了更好地模拟真实运行环境,本系列文章借助 Docker 和 Docker Compose 搭建 Nginx + uWSGI+ Django + MySQL + Redis + Rabbit 的开发环境。 1. 基本概念 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包应用以及依赖
1. 网站性能基础指标 并发数: 服务器单位时间内处理的会话数量 吞吐率: 服务器单位时间内处理的请求数 响应时间: 用户从发出请求到接受完响应之间的总耗时,由网络传输耗时、服务处理耗时等多个部分组成 平均响应时间: 所有请求响应时间的平均值 2. 测试工具 性能测试
服务商 域名 谷歌 Google App Engine appspot.com 二级域名 新浪 Sina App Engine sinaapp.com 二级域名 百度 Baidu App Engine duapp.com 二级域名 Heroku herokuapp.com 二级域名 AWS Elastic Beanstalk elasticbeanstalk.com 二级域名 OpenShift rhcloud.com 二级域名 DaoCloud daocloud.io 二级域名 时速云 TenxCloud tenxapp.com 二级域名 灵雀云 Alauda myalauda.cn 二级域名
1. 关于 PaaS 1.1 什么是 PaaS PaaS 是平台即服务(Platform as a Service)的简称,平台即服务是一种云计算服务,提供运算平台与解决方案服务。PaaS 的出现加快了 SaaS 的发展,尤其是加快了 SaaS 应用的开发速度。比如,SaaS 开发时,使用 PaaS 平台统一提供的登录
1. 混合云使用的用户场景 1.1 满足业务的爆发式增长 互联网业务呈指数型增长,很难预测基础设施的储备量。一般在业务成长初期很长一段时间,小规模的物理机托管就能满足业务需求。但是,随着市场的展开,业务规模爆发式增长,原有的物理机托管机房机位有限,只能通
1. 基本概念 master master 就是 Jenkins 安装和运行的地方,它负责解析 job 脚本,处理任务,调度计算资源。 agent agent 负责处理从 master 分发的任务,操作实际上是通过 executor 来执行的。 executor executor 就是执行任务的计算资源,它可以在 master 或者 agent 上运行。多个 executor 也可以合作执行一些任务。 step Jenkins 里面 job 中的最小单元
1. 基本概念 GitLab-CI:GitLab 提供的持续集成系统,管理项目的构建状态,通过 GitLab Runner 来执行构建任务。 GitLab-Runner:用于执行构建任务,.gitlab-ci.yml 的 script 部分的运行就是由 GitLab-Runner 来完成。 .gitlab-ci.yml:
1. 简介 GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现了自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。 它拥有与 GitHub 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团
1. 字段含义 1.1 u, 用户ID 1 2 3 4 5 6 if cookie.has(gr_user_id){ //使用 cookie 中的 gr_user_id 有效期十年 } else { //按照 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 格式,随机生成一个 gr_user_id } 1.2 s,会话ID 1 2 3 4 5 6 7 if cookie.has(gr_session_id_){ //使用 cookie 中的 gr_session_id_ //gr_session_id_,的有效期为 100 分钟 } else { //按照 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 格式,随机生成一个 gr_session_id_ }
1. Fixtures 特点 Fixtures 是一种新的提供初始化数据的方法,并且被 Django 的测试框架用来处理单元测试的测试数据。不同于 SQL 文件的是,使用 fixture 可以提供一个被 Django 的 serialization 系统所能识别的序列化文件,它会被读取并自动转换成对应的 model ,然后保存进数据库。 2. 数据导出 将 app_name 的数据导出为 ini
目前,本人使用的是 PyCharm ,作为前后端的集成开发工具。主要的技术栈有,JavaScript,CSS,ECMAScript 6,Vue,Python,Django,Mako,Markdown。近期的前端开发工作逐渐增加,PyCharm 似乎有些力不从心
1. Atom 简介 Atom 是支持 Windows、Mac、Linux 三大桌面平台,完全免费,并且在 GitHub 上开源的代码编辑器。立即前往 1.1 优缺点 主要优点 开发维护团队强大,开源项目,修复 Bug 速度快,生态圈成长速度快。 快捷键支持特别好,熟悉了各种快捷键后可以成倍提高生成效
1. 基本概念 1.1 Ajax Ajax 全称为 " Asynchronous JavaScript and XML “(异步 JavaScript 和 XML )。其核心由 JavaScript、XmlHttpRequest 、DOM 对象组成,通过 XmlHttpRequest 对象,向服务器发送异步请求,从服务器获得数据,然后用 JavaScript 来操作 DOM 而更新页面。 以 Jquery 为例: 1 2 3 4 5 6
1. UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 iview - 基于 Vuejs 的开源 UI 组件库 mint-ui - Vue 2的移动UI元素 muse-ui - 三端样式一致的响应式 UI 库 vue-material - 通过Vue Material和Vue 2建立精美的app应用 vuetify - 为移动而生的Vu
1. 应用场景 1.1 Mail 由于 RFC821 要求邮件内容必须为 ASCII 码。当邮件中有其他的非ASCII字符或二进制数据时,就需要 Content-Transfer-Encoding,Base64是其中的一种方法。 1.2 URL 有些应用需要把二进制数据放到URL里,而URL只允许特定
1. Font-family 网页上能使用的字体,限制在浏览器所在PC已经安装的几款字体。 Windows操作系统,中文字体: 黑体:SimHei 宋体:SimSun 新宋体:NSimSun 仿宋:FangSong 楷体:KaiTi 仿宋GB2312:FangSongGB2312
1. 什么是Docker Docker诞生于2013年初,是dotCloud( Docker.Inc前称)公司内部的一个业余项目,源代码托管在GitHub上,基于Go语言并遵从 Apache 2.0 开源协议。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础
1.基本概念 对称加密: 对称加密是,采用单密钥密码系统的加密方法,同一个密钥同时用作信息的加密和解密。由于速度快,常用于加密大量数据的传输。 DES(Data Encryption Standard),数据加密标准: DES的密钥长度是56比特,算法的理论安全强度是\
1. 方法篇 2. 实战篇
1. Selenium 简介 Selenium 是一个 Thoughtworks 公司的集成测试工具。Selenium 的核心 Selenium Core 基于 JSUnit,完全由 JavaScript 编写,可以运行于任何支持 JavaScript 的浏览器上。 1.1 主要功能和特点 开源、免费。 多浏览器支持:Firefox、Chrome、IE、Opera,可以用于兼容性测试。 多
1. 云服务的分类 IaaS,提供计算和存储服务。 PaaS,提供软件运行的平台环境服务。 SaaS,直接提供软件服务。 2. 云服务的应用场景 采用云服务可以显著减少 IT 支出。 在 IaaS 服务中,云主机、存储是用户采用率最高的服务产品,其次是数据库、网络加速。 IaaS 是当
1. 自动生成HTML表单元素 Widget,用来渲染成HTML元素的工具。 指定小部件 1 2 3 4 5 6 from django import forms class CommentForm(forms.Form): name = forms.CharField() url = forms.URLField() comment = forms.CharField(widget=forms.Textarea) CommentForm().as_table() 输出值 1 <tr><th><label for="id_name">Name:</label></th><td><input id="id_name" name="name" type="text" /></td></tr>\n<tr><th><label for="id_url">Url:</label></th><td><input id="id_url" name="url" type="url" /></td></tr>\n<tr><th><label for="id_comment">Comment:</label></th><td><textarea cols="40" id="id_comment" name="comment" rows="10">\r\n</textarea></td></tr> 指定表单字段为 Textarea 小部件,而不是默认的 TextInput 小部件。 自定义小部件的样式 1 2 3 4 class CommentFormClass(forms.Form):
1. 名词解释 xpath : 分为精确路径和概略路径两种做法。精确路径 : body>div[0]>div[3]>ul>li[5]>a[0] ,从被点击的元素不断向上查找到根节点,并记录过程中每个节点。概略路径:body>div.header>div.nav>a[23],在前者的基础上省略上溯路径中非白名
1. 基本概念 ORM:对象关系映射,Object Relational Mapping。它的作用是在关系型数据库和对象之间作一个映射。不需要复杂的 SQL 语句,操作数据如同操作对象一样简单。 QuerySet:给定模型的对象列表。QuerySet 允许从数据库中读取数据,对其
简单介绍一下项目需求: 项目组需要对外发布文档,文档撰写使用的是Markdown,对外需要使用HTML。起初,使用的是Nginx+Jekyll的解决方案。随着文档的增加,文档系统对搜索功能有了强烈的需求。笔者在另外一篇文章中有所讨论,但是这几
1. 基本概念 持续集成,Continuous Integration 持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。 持续交付,Continuous Delivery 持续交付在持续集成的基础上,将集成后
合作是一场旅程。 1. 跨部门合作的障碍 对新业务合作的抵触 职责存在模糊地带 员工的合作能力 信息不对称 跨部门合作的管理机制 目标和利益不一致 资源有限 2. 合作的核心理念 双赢思维 开放心态 合作核心的三个方面 寻找共同利益 学会换位思考 巩固长期合作关系 3. 合作关系核心
1. 简介 Graphviz是贝尔实验室开发的一个开源的绘图工具包。它使用一个特定的DSL(领域特定语言): DOT作为脚本语言。使用布局引擎来解析DOT脚本,完成自动布局。支持丰富的导出格式,例如:PNG、JPG、PostScript、SVG、P
简介:Jekyll是一套静态HTML生成工具。文档系统利用Jekyll进行部署,最终将Markdown转换为HTML文件输出。 搜索功能的需求是,根据关键字,匹配文档的标题或者内容,列出匹配的文档列表。 1. 方案一: Simple-Jekyll-Search 参考地址:https://g
1. 基本概念 Django内置了一个信号分发器。信号可以帮助解耦程序模块。在应用中其他地方发生某事件时,通知指定函数。信号允许某些 senders 通知一组 receivers 已经发生的行为。 2. 信号使用 2.1 声明信号 在使用信号之前,首先得创建信号实例,声明信号的接收参数列表。dja
1,初始化项目 vue-cli 是Vue官方发布的项目脚手架,使用 vue-cli 可以快速创建 Vue + Webpack项目。 1 2 3 4 5 6 7 8 9 10 npm install -g vue-cli # 全局安装vue-cli vue init webpack myproject # 创建vue项目,执行时,会提示输入项目的相关信息 cd myproject # 进入项目 npm install # 安装依赖包,新建nod
Django中有两种视图,一种是函数式视图,另一种是类视图。视图的作用主要是,用于填充逻辑,返回响应体。函数式视图难以扩展,代码复用率低。而类视图可以利用继承、Mixins,快速复用、扩展功能。本文主要讨论了,Django对类视图的处理逻辑
Django中写自动化测试可以使用:doctests或unit tests。自动化测试的逻辑是,将测试数据传入待测试函数,执行后,以输出结果与预期是否一致,作为判断测试是否通过的标准。这里有几个关键点,(1)需要测试数据,(2)需要指明待测试
1. DRF的权限管理 Django REST Framework的权限管理包括两个部分。 一个是认证Authentication方式。指定对用户进行鉴权的方式,获取request.user。 一个是权限控制Permissions。针对Django资源、用户类别进行权限
Awesome-Django Django应用、项目和资源集合 Django-Packages 大量Django第三方组件。 Django-Mptt 在数据库中存储层级数据结构。 Django-Rest-Framework 自动生成 RESTful API。 Django-Rest-Framework-Jwt 为Django-Rest-Framework提供Token鉴权。 Django-Tastypie 自动生成 RESTful API。 Django-Cors-Headers 解决跨域访问的问题。 Django-Ckeditor Django富文
1. 场景 在一个项目中,header、footer等元素经常被重复使用。为了避免,每个页面重写这些元素,同时,在修改时,不用去每个页面修改,需要将公共的部分抽离出来,这就是Django模板继承。 2. Django的复用模板标签 Django内建的复用
作者: 阮一峰 出版社: 电子工业出版社 出版年: 2014-8-1 ISBN: 9787121238369 电子版
在前后端分离开发过程中,提供给前端的 API 接口,有的使用 GET 请求,有的使用 POST 请求。为了避免,后端在 views.py 的 request 中取值报错,需要在每个 view 函数中判断请求头的方法。于是,提取了一个公共的函数放在 utils.py 中,以便 view 函数引用。使用时依然繁琐,最后,在 Django 文档中找到了re
1. Admin 自动注册全部 Model 字段 admin.py 1 2 3 4 5 6 7 8 9 10 # -*- coding: utf-8 -*- import inspect from django.contrib import admin from . import models for name, obj in inspect.getmembers(models): try: if inspect.isclass(obj): admin.site.register(getattr(models, name)) except Exception as e: pass 2. 获取全部 View Name 获取 Project 全部 View Name 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from django.conf import settings from django.core.urlresolvers import RegexURLResolver, RegexURLPattern root_urlconf = __import__(settings.ROOT_URLCONF) all_urlpatterns = root_urlconf.urlpatterns VIEW_NAMES = [] # maintain a global list def get_all_view_names(urlpatterns): global VIEW_NAMES for pattern in urlpatterns: if isinstance(pattern, RegexURLResolver): get_all_view_names(pattern.url_patterns) #
笔者从事的SaaS开发,对开发效率有着比较高的要求。从项目立项、原型设计评估、需求确定、前端设计、后台开发到最后的验收,几个星期完成一次迭代。在敏捷开发的指导下,开始推行前后端分离模式。前端专注于页面和交互,后端专注于API接口。后端提供A
最近几年,随着单页面Web应用的崛起,各种框架也不断涌现。 前端开始进入工程化、组件化的发展阶段。 单页面Web技术,扩展了前端的技术边界,前端也可以路由、渲染页面,不需要依赖后端。 后端的工作重点转向了单纯的数据API服务。 随着各种BaaS云服
技术输出型公司,一套优秀的文档管理、发布系统必不可少。文档系统是内容管理系统的一种,其对可访问性要求高、单文档更新频率低、发布频率高。笔者认为,以纯静态HTML对外发布文档是个不错的选择。但是,直接写HTML文档,费时费力、不好维护。能不能
前后端分离开发中,当后端 API 没有完成时,前端无法继续调试。为了前后端能并行开发,前端需要一套 API 的接口环境,这个就是 Mock API 。下面的图,对开发流程进行了很好的顺理。如果没有 Mock 数据的环节,前后端的联调会消耗非常多的时间。 1. 何为 Mock ,模拟也 通常,后端提供
Arachni是一个基于Ruby on Rails框架的Web安全漏洞扫描工具。 1. Ruby on Rails Ruby on Rails ,缩写ROR,是一个Web框架,包括两部分内容: Ruby 语言和 Rails 框架。Ruby一直以来流行于日本,直到2004年,26 岁的丹麦人 David Heinemeier Hansson 提出了Web框架 - Rai
在前后端分离框架中,API 文档频繁交接。如果涉及到第三方接口调用,多方合作场景下,API 和文档变更可能会更快。为了方便维护 API 和交接文档,这里给大家推荐一款文档生成工具 - apidoc 1.apidoc 简介 apidoc 是一个基于 nodejs 的 API 文档生成工具,从代码注释中提取特定格式的内容,
1. Restful REST,是Representational State Transfer的缩写,表现层状态转化。Restful,是一种开发理念,万维网软件架构风格。 1.1 Restful特点 抽象资源 图片、文本、歌曲、视频都是一种资源实体,在网络上,被抽象为资源。在Re
1. 同源策略 同源策略是浏览器的安全基石。 同源的定义,包括三个方面: 协议相同 域名相同 端口相同 限制范围: Cookie、LocalStorage 和 IndexDB 无法读取 DOM 无法获得 AJAX 请求不能发送 简单说,协议、域名、端口三者任意不同的两个 URL 之间不允许通信,范围包括
Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的,还是那些久经考验的、简单的小工具。下面是,系统性能专家 Brendan D.Gregg ,关于Linux性能方面的talk(Linux Performance Tools)中所整理的命令工具。 1. 总览 2. 监控 3. 测试 4. 优化 5. 静态 6. 追踪
副标题: 使用D3实际交互式图表 原作名: Interactive data visualization for the Web 作者: [美] Scott Murray 译者: 李松峰 出版社: 人民邮电出版社 出版年: 2013-6 ISBN: 9787115320117
1. 下载工具 - qshell qshell 是利用七牛文档上公开的 API 实现的一个方便开发者测试和使用七牛API服务的命令行工具,使用 Go 语言编写而成。目前该工具融合了七牛存储, CDN ,以及其他的一些七牛服务中经常使用到的方法对应的便捷命令。 | 版本 | 支持平台 | 链接 | 更新日志 | |
如果使用Chrome浏览器测试XSS向量,请关闭浏览器对XSS的拦截功能。首先,关闭所有Chrome浏览器进程,然后执行: 1 chrome.exe -args --disable-xss-auditor --args --disable-web-security 进入非Web安全模式。 1. 利用<>标记注入HTML/JavaScript 1 <script>alert('XSS')</script> 1 '';!--"<XSS>=&{()} 1 2 //SRC的
在Web开发中,常会遇到数据导出的需求。这篇主要介绍如何快速将数据导出,并保存为Excel文件。 1. 前端 Web开发中,格式化数据常以table的形式展示。下面是一个人员薪酬信息表,以导出这份数据为例。 姓名 职位 年龄 薪水 Tiger NixonTiger Nixon System Architect 61 $320,800 Garrett Winters Accountant 63 $170,750 Ashton
XSS是一种在前端执行JavaScript脚本的攻击方式。随着UGC站点的流行,用户产生数据剧增,数据块的网络连接越来越有利于XSS的实施与传播。XSS带来的危害有:窃取用户cookies,窃取个人信息;劫持会话,操纵用户网络数据;发起dd
每个Django项目中都会自动生成一个manage.py文件。manage.py是对django-admin的一个简单包装,其功能是将Django Project放到sys.path目录中,设置 DJANGO_SETTINGS_MODULE 环境变量为当前Project的setting.
通过一个内嵌类“class Meta”给model定义元数据,类似下面这样: 1 2 3 4 class Foo(models.Model): bar = models.CharField(max_length=30) class Meta: #...... Model元数据就是:不是一个字段的任何数据 比如排序选项,admin选项等等。 下面是所有可能用到的 Meta 选项。没有一个选项是必需的。 是否添加 class Meta 到
1. __init__(self) 在中间件类中, __init__() 方法用于执行系统范围的初始化设置。 出于性能的考虑,每个已启用的中间件在每个服务器进程中只初始化一次。 也就是说 __init__() 仅在服务进程启动的时候调用,而在针对单个request处理时并不执行。 对一个middleware而言,定义 __init__() 方
Django的标准库存放在 django.contrib 包中。每个子包都是一个独立的附加功能包。 这些子包一般是互相独立的,不过有些django.contrib子包需要依赖其他子包 在 django.contrib 中对函数的类型并没有强制要求 。其中一些包中带有模型(因此需要你在数据库中安装对应的数据
笔者所在的小组负责SaaS开发,几乎承载了中心的全部SaaS需求。其中,有长期维护的重点项目,也有短期突击的演示项目,每个人都身兼数职。当然,开发平台也开放给其他人员使用,整个平台有着成百上千的SaaS应用。这些应用中存在大量重复的功能块,
副标题: 核心原理与案例分析 作者: 李智慧 出版社: 电子工业出版社 出版年: 2013-9-1 ISBN: 9787121212000 Notes: 没有业务对技术的需求,培养不出优秀的架构师。 作者是伴随着淘宝业务增长,一起成长起来的。 书中主要从系统性能,可用性,伸缩性,扩展性,安全性几个方面阐述网站架构技术要点
登录的会话机制: http 是无状态协议,浏览器的每次请求都是相互独立。但并不是每次 http 请求都与状态无关,为此,浏览器和服务器需要共同维护一个状态,这就是会话机制。一种方法是,浏览器第一次向服务器发起请求,服务器会将浏览器返回 sessionID,后续浏
副标题: 生活、工作与思维的大变革 作者: [英] 维克托·迈尔·舍恩伯格 出版社: 浙江人民出版社 出版年: 2012-12 ISBN: 9787213052545
Python、Excel常用于数据处理,难免会产生相互的数据传递、计算处理。本文主要介绍Python-Excel系列的库,以及xlrd和xlwt两个库是使用。 1. 常用库 xlwings,openpyxl,pandas,win32com,xlsx
1. 经济 世界银行 Gapminder 世界卫生组织和世界银行覆盖经济、医疗和社会统计数据 美国中央情报局,世界概况 包含267个国家的历史信息、人口、经济、政府、基设施和军事等信息 中国统计局最新宏观经济数据 工业和信息化部较多数据在此发布,尤其是有关工业运行及信息化相
作者: 威廉·萨默塞特·毛姆 出版社: 天津人民出版社 出版年: 2016-1-20 ISBN: 9787201100159
作者: 王小波 出版社: 北方文艺出版社 出版年: 2006-4 ISBN: 9787531719199
作者: 李尚龙 出版社: 中国友谊出版公司 出版年: 2015-7 ISBN: 9787505735361 Notes: 比较适合迷茫的大学生看。作者从军校辍学,成为新东方英语老师,最后写剧本拍电影,通过自己的努力过着自己选择的生活。书中主要记录作者一路走过的历程、人生观、价值观,希望给予读者以启发。
Note: 简单说几句,组内同学的分享。App Engine 将开发从繁琐的部署、配置流程中解脱出来,提供全方位的自动化支持服务。其中的 Controller 是 App Engine 的大脑,协调控制整个引擎的运作。PPT 中主要讲的是 App Engine 的设计方案和演化过程,还对资源调度、故障容灾进行了考虑。 由于其是微
平台目前包括多个子系统、多个版本,不同版本都是使用相同的运营系统。为了方便用户使用多个版本,我们需要绑定用户的QQ、微信帐号。此外,为了最大限度地防止由于某个登录系统故障而导致用户无法使用APP的情况,我们需要一个统一的帐号管理&登
作者: 罗纳德·F·布什 / 阿尔文·C·伯恩斯 出版社: 中国人民大学出版社 出版年: 2011-3-1 ISBN: 9787300133362
作者: 时寒冰 出版社: 上海财经大学出版社 出版年: 2014-7-1 ISBN: 9787564219239
作者: 时寒冰 出版社: 上海财经大学出版社 出版年: 2014-7-1 ISBN: 9787564219352 Notes: 作者对中国的债务、房产、人口、粮食进行了分形,对现况充满焦虑。还对地缘政治国家的经济政治形势进行了分形,阐述了美国美元的影响力,金融战的独孤求败,周边的俄罗斯、印度、越南、日本等国家与中
1. jQuery特征 jQuery消除了浏览器的兼容问题 遍历DOM树、选择元素 大量的插件库 工具函数库,$.type()、$.extent()等 jQuery的核心函数,通常指的是一个工厂对象,即jQuery()函数,或者更为常用的别名$()函数。
英文名:Professional jQuery 作者: [美] 奥特罗,[美] 劳伦斯 出版社: 清华大学出版社出版 译者: 施宏斌 出版年: 2013-04 ISBN: 9787302317845
作者: 道格拉斯•W•哈伯德 副标题: 大数据时代,《财富》500强都在使用的量化决策法 出版社: 世界图书出版公司 译者: 邓洪涛 出版年: 2013-09-01 ISBN: 9787510067327 Note: 量化是用来减少不确定性,而不是消除。 量化关键在于要弄清楚要量化什么,以及被量化的事物为什么重要。 量化的目的
作者: [美]纳西姆•尼古拉斯•塔勒布 副标题: 从不确定性中获益 原作名: Antifragile: Things That Gain from Disorder 出版社: 中信出版社 出版年: 2014-01-01 ISBN: 9787508643335
作者: Mark Pilgrim 出版社: Apress 出版年: 2004-07-19 ISBN: 9781590593561
1. 什么是 DDoS 举个栗子,春节买票期间,高铁票一出,全国人民都向12306的服务器发送连接请求。然后,12306的服务器就会不响应或者较慢响应网页请求。这就构成了一次DDoS攻击。通过大量并发的请求,迫使目标服务受到影响,甚至终止。 DDoS攻击是
1. 应用场景 通过配置文件,控制程序运行时的流程。配置文件中常保存的是,字符串,而不是对象 调试程序时,查看对象的全部属性值 动态模块的导入 对于第一种场景,广泛被采用的是反射。在Java的很多框架中都使用了反射机制,Python实现的Web框架Dj
副标题: 让学习过程变得积极愉悦的成人培训新方法 作者: [美] Harold D.Stolovitch Erica J.Keeps 出版社: 企业管理出版社 出版年: 2012-1 ISBN: 9787802558861 Note: 主要论述了交互式培训能达到十分好的培训效果,分析了培训学习过程和心理,提出了四种培训的方法和一些建议。 培训的目标是,以学习者为中心,以绩
1. 社会是如何靠信用运作起来的 首先我们来做一个问答: @ask:为什么你用一张卡片就能乘坐公交? @answer:我充了钱啊 @ask:钱?那你哪里来的钱 @answer:每个月的工资啊 @ask:公司为什么每个月要给你发工资? @answer:签了合约
1. Black-Scholes 期权定价模型的意义 Black-Scholes 模型以及它的一些变形已被期权交易商、投资银行、金融管理者、保险人等广泛使用。衍生工具的扩展使国际金融市场更富有效率,但也促使全球市场更加易变。新的技术和新的金融工具的创造加强了市场与市场参与者的相互依赖,不仅限于一国
英文书名: The Black Swan 副标题: 如何应对不可预知的未来 作者: 纳西姆·尼古拉斯·塔勒布(Nassim Nicholas Taleb) 译者: 万丹 出版社: 中信出版社 出版年: 2009-8 ISBN: 9787508616018 Notes: 作者以自身经历,黎巴嫩战争,记者的战争日记,股票崩盘,叶夫根尼亚的书为切入。切身描述这个处于
函数 描述 abs(number) 返回一个数的绝对值 apply(function[, args[, kwds]]) 调用给定函数,可选择提供参数 all(iterable) 如果所有iterable的元素均为真则返回True, 否则返回False any(iterable) 如果有任一iterable的元素为真则返回True,否则返回False basestring() str和unicode抽象超类,
1. Quant的工作内容 Quant的工作就是设计并实现金融的数学模型,包括衍生物定价,风险估价或预测市场行为等。 2. Quant的种类 Desk quant,开发直接被交易员使用的价格模型。 优势是接近交易中所遇到的money和机会。劣势是压力很大。 Model validating qu
1. Koch曲线 瑞典数学家Helge von Koch,在1904年发表的“从初等几何构造的一条没有切线的连续曲线”的论文中提出Korch曲线。它的描述如下: 指定一条线段的长度\(l\)(可以理解为第0次迭代) 将这条线段三等分,并以中间的线段为底边构
1. 分形理论 1.1 分形的定义 分形,通常指一个几何形状,可以分成数个部分,而每一部分都近似地是整体缩小后的形状,即具有自相似的性质。 1.2 分形研究的历史 公元17世纪,莱布尼茨就思考过自相似的问题。公元18世纪卡尔·魏尔施特拉斯、格奥尔格·康托尔和费利克
1. Django内置权限管理 1.1 权限分类 Permission 用来定义用户User A对任务Task的权限。 User 如果User A 对Model B有权限,那么User A 对Mode B中的全部实例都有相应权限。User对象的user_permission 字段用于管理用户的权限。
1. 背景 在Web开发的过程当中,常会涉及多个环境(本地、测试、正式环境)之间数据的迁移。本文主要探讨在django开发过程中,可能涉及的数据迁移路径,并寻找可行的方法。 2. 场景 数据迁移对象,一共分为四个:测试环境数据库、正式环境数据库、本地开发
1. 工作场景 本人所在的小组,20+人的规模,兼具PaaS和SaaS开发的职责。 开发PaaS的人员PaaSer,主要负责PaaS平台的开发和维护,目标是对SaaS开发提供需要的API和文档。 开发SaaS的人员SaaSer,主要负责开发基于上述P
1. 遇到了什么问题 如果实现的功能简单,开发和维护容易,是不会有设计模式、框架等相关问题研究的。正是因为,Web系统复杂、需求变更快、复用多,开发人员多、人员交接频繁。我们需要一定的约定规则去规避,这些环节产生的风险。 其中大量的研究工作在,系统
副标题: 技术与最佳实践 英文书名:Automation Operations With Python Technique And Best Practices 作者: 刘天斯 出版社: 机械工业出版社 出版年: 2014-11-1 ISBN: 9787111483069 Notes: 作者以其运维经历,详细描述了以python为基础的各种工具的使用和配置,是一本适合python运维人员的资料书。
1. Django是什么 Django是一套由Python完成的Web开发框架,起初被开发者用于管理以新闻内容为主的网站,2005年7月在BSD许可证发布下开源,2008年6月17日正式成立基金会。与Django一起的Python Web框架还有,
1. 概览 DevOps(Development和Operations的组合词)是一种重视「软件开发人员(Dev)」和「IT运维技术人员(Ops)」之间沟通合作的文化、运动。透过自动化「软件交付」和「架构变更」的流程,来使得构建、测试、发布软件能
本人所在的岗位职责,涉及全栈开发,不仅要用 Python 写后台逻辑,还要自己写前端界面和交互。开发的程序部署于 Paas 平台,考虑到开发人员是非专业前端,为了降低开发门槛,提供了一种类似 Dreamweaver 的工具。使得开发人员可以通过,拖拽、拷贝等形式快速开发出页面,然后转向后
1. BWAPP简介 buggy web Application,简称BWAPP,这是一个集成了各种常见漏洞和最新漏洞的开源Web应用程序,目的是帮助网络安全爱好者、开发人员和学生发现并防止网络漏洞。包含了超过100种漏洞,涵盖了所有主要的已知Web漏洞,包括O
1. SOA 面向服务架构(SOA),阐述了对于复杂的企业IT系统,应按照不同的、可重用的粒度划分,将功能相关的一组功能提供者组织在一起为消费者提供服务,其目的是为了解决企业内部不同IT资源之间无法互联而导致的信息孤岛问题。 SOA的基本设计思想是:对
现在的企业,业务繁多,常常需要大量的域名来支持业务的发展,本文从企业域名的选择、域名与企业品牌建设、站点的SEO、站点的安全性四个方面考虑,企业应该怎样去规划和建设自己的域名体系。 1. 写在前面的一些话 如果是小公司可以暂时不用考虑域名群的建设,
副标题: 用失传的技艺练就强大的生存实力 英文书名: Convict Conditioning 作者: [美] 保罗·威德 出版社: 北京科学技术出版社 出版年: 2013-10-1 ISBN: 9787530467558
1. Burpsuite简介 Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。 所有的工具都共享一个能处理并显示HTTP 消息、持久性、认证、代理、日志、警报的一个强大的可扩展的框架
这篇围绕全部源代码的控制工具Git展开。 1. 为什么是Git? 为了深入探讨git和集中式源码版本控制系统的利弊,参见这里。这方面有太多的激烈争论。作为一个开发者,相比其他工具,当前我更喜欢Git。Git的确改变了开发者关于合并与分支的思考方式。
1. Chrome增强功能的方式:扩展、插件、应用 Google Chrome(谷歌浏览器)发展至今,已经不仅仅是一个浏览器,更像一个平台,可以个性化的安装自己需要的服务,同时也可以通过它来发布自己提供的服务。目前主要有三种方式来扩展浏览器的功能: 2. 扩展(E
英文书名: Professional JavaScript for Web 作者: [美] Nicholas C. Zakas 出版社: 图灵程序设计丛书 出版年: 2012-3-29 ISBN: 9787115275790
1. 事件处理模型:冒泡和捕获型 1 2 3 <div id="outer"> <p id="inner">Click!</p> </div> 上面的代码当中一个div元素当中有一个p子元素,如果两个元素都有一个click的处理函数,那么我们怎么才能知道哪一个函数会首先被触发呢? 为了解决这个问题微软和网景提出了两种几乎完全相反的概念。 事件
背景: 刚做完一个django的数据查询web项目,数据来源于内部API查询,每次查询都需要调用若干API查询数据渲染在前端页面。由于,相关的数据不会经常变动,为了提高前端响应速度、在API不可用时依然能够查询,设计了缓存。API查询到的数据
场景一:公司准备给全部员工推送一个邮件公告。采用封装的邮件库API,使用一次循环遍历全部员工推送邮件,会使主程序卡在循环处无法响应,这是我们不愿意看到的,我们希望点击执行之后,可以正常其他操作。场景二,量化程序的本地回测数据库每天都要更新。
1. 丙类账户 银行间债券市场结算成员分为甲类成员、乙类成员和丙类成员。甲类户主要为商业银行,乙类户为农信机构、券商、基金和保险等,丙类户主要为非金融机构法人,其交易结算需要委托甲类成员代为办理。丙类户开户门槛较低,缺乏实质性监管。 2. 银行间债市 银
副标题: 华尔街的投资游戏 英文书名: Liar’s Poker 作者: [美] 迈克尔·刘易斯 出版社: 中信出版社 出版年: 2007-1 ISBN: 9787508607559
美林投资时钟理论是一种将资产、行业轮动、债券收益率曲线以及经济周期四个阶段联系起来的方法,是一个非常实用的指导投资周期的工具。 美林投资时钟的分析框架,可以帮助投资者识别经济周期的重要转折点。而正确识 别经济增长的拐点,投资者可以通过转换资产以
中文书名: Python核心编程(第二版 英文书名: Core Python Programming, 2nd Edition 作者: [美]Wesley J. Chun 出版年: 2008-06 ISBN: 9787115178503
1. ICANN的前生今世 ICANN,The International Corporation for Assigned Names and Numbers,成立于1998年,负责分配域名和IP地址等互联网资源。ICANN的前身是IANA (Internet Assigned number Authority),之前一直受美国国防部直接资助,为了避免一国控制互联网的局面,19
作者: 渔阳 副标题: 一位华人交易员的经历 出版年: 2011-3-2 ISBN: 9787300132440 Notes: ROE = 净利润/股东权益(Net Profit / Equity) =(净利润/销售收入)*(销售收入/总资产)*(总资产/股东权益) (Net Profit / Sales) * (Sales / Assets) * (Assets / Equity) = 销售利润率 * 资产周转率 * 财务杠杆比率 (Profit Margin) * (Asset Turnover) * (Financial Leverage) 为了提高
1. 什么是域名 1.1 域名的构成 本站完整的域名应该是这样:www.chenshaowen.com. 注意最后面的点,通常可以省略。域名从后往前看,.com是顶级域名,chenshaowen是二级域名,www是通信协议。 域名可以英文字母和阿拉伯数字以及
很久很久以前,有一片有着很多很多大树的独角兽森林,森里面生活着一只独角兽妈妈和一只小独角兽,还有很多很多的小动物。 独角兽妈妈有着一个很漂亮的犄角,长在头上漂亮极了,她的犄角有魔法,小兔子受伤了,独角兽妈妈用她的犄角一碰,犄角上洒下的闪光落在
中文书名: 货币崛起:金融如何影响世界历史 英文书名: The Ascent of Money: A Financial History of the World 作者: [英]尼尔·弗格森 出版年: 2009-6 ISBN: 9787508615073 Notes: 货币实际上就是一个信任问题,甚至是一种信仰:信任体现于货币的发行中,个人使用或者机构兑现支票或转让支票。货币不是金属,而是一种记名
1. 综合交易平台(CTP)简介 综合交易平台是由上海期货信息技术有限公司以上海期货交易所的交易系统为基础,专门为期货经纪公司而开发的一套期货经纪业务管理系统,整个系统由交易、风险控制(简称为风控)和结算三大系统组成。系统能够同时连通国内四家期货
中文书名: 金融的本质:伯南克四讲美联储 英文书名: The Federal Reserve and the Financial Crisis 作者: 【美】伯南克 出版年: 2014-4 ISBN: 9787508644097 Notes: 2008年金融危机的主要原因在于:金融机构对自身风险管理能力过度自信,人人坚信房价会持续上涨,银行认为抵押贷款可以轻易转售出去,国际客户对“安全
中文书名: 定位 - 有史以来对美国营销影响最大的观念 英文书名: Positioning-The Battle for Your Mind 作者: 杰克·特劳特(Jack Trout) / 阿尔·里斯(AL Ries) Notes: 对于新的行业或产品,第一家公司是很容易在客户心中形成深入影响的,同时如果公司很成功,人们还会一个行业或
Ghost版本:“version”: “0.9.0-beta.2” |— content 内容目录 | |— apps 目录,暂时为空,以后可能Ghost上能直接部署app | |— data 数据库文件夹 | |— images 图片文件夹 | |— themes Ghost主题文件夹 |— core 核心模块目录 | |— client 客户端代码文件夹 | |— server 服务
1. 前端自动化构建工具 在处理前端场景时,用 Less 写 CSS,用 Jade 写 HTML,用 Browserify 模块化,为非覆盖式部署的资源加 MD5 戳等。这些工作如果纯手工来做,工作效率将会非常低。而前端自动化构建工具可以把这些重复工作一次配置,多次重复执行,极大的提高开发效率。 前端
1. SSL证书 先来了解几个概念 1.1 数字证书 包含加密用的公钥或私钥,还有一些身份附加信息。任何人都可以使用相关工具生成自己的数字证书,用来加密文件、邮件,或用于通讯加密。 1.2 SSL 协议 用于网络通讯的加密协议。通信过程需要一份数字证书,使用里面的公钥及私
本文主要介绍了Telnet、SSH 的通信原理,分析了其通信时的工作流程。 1. Telnet 无论Telnet协议连接的是什么类型终端,都会转换为NVT(Net Virtual Terminal)格式进行通信。网络虚拟终端NVT是Telnet异构跨平台的基础。 1.1 Telnet 的工作进程
匿名通信是由 Chaum 提出的,他提出了基于Mix节点的匿名通信算法,Mix 节点接收多个发送者的消息,并对这些消息进行混合处理,然后传输给接收者,因此掩盖了发送者和接受者的身份信息,实现了匿名。 1. 匿名通信的基本框架 1.1 匿名属性 匿名属性包括不可辨识性(u
中文书名: 共享经济: 重构未来商业新模式 英文书名: Peers Inc: How People and Platforms Are Inventing the Collaborative Economy and Reinventing Capitalism 作者: [美] 罗宾•蔡斯 出版年: 2015-9-25 ISBN: 9787213067853 Notes: 作者以自己创建的Zipcar公司为入口,通过分析当下知名共享公司Uber和Airbnb,对共享经济模式进行了详细深入的解读。共
本文主要介绍了在Linux上如何通过编译安装Nginx,并开启htttp2,还对使用http1.1和http2.0协议的访问本站的速度进行了比较。 1. 编译安装 Nginx 首先需要下载Nginx和它的几个依赖包。Zlib,Web请求传输时对数据进行压缩,