- 博客(49)
- 资源 (1)
- 收藏
- 关注
原创 CI/CD平台,部署中空格引发的两个血案
1. 前端static部署 微服务前端js,编译打包成的tar包,在部署阶段,需要解压缩到与这个微服务对应的location,这个过程分别在流水线的“代码打包”和“部署”这两个阶段完成。 代码打包: 通过下面的命令完成: cd xxx-yyy&& yarn --update-checksums && yarn && yarn build_test &...
2021-02-19 16:08:11
321
原创 k8s部署环境,蓝绿发布的两种实现方法
蓝绿发布,是部署过程中并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量全部切换到新版本上。新版本验证通过,删除老版本,否则流量重新切换到旧版本。过程中新旧两版本同时部署,需要考虑资源的使用情况。 如下图所示,是一种基于现在微服务架构,来实现蓝绿发布。微服务以代理Service提供对外服务,Service通过Selector的标签选择其代理的微服务。微服务通过环境变量发现Service,然后在Eureka上注册Service的服务地址和端口。Service选...
2021-01-21 17:09:15
2324
1
原创 基于k8s Deployment和API网关实现的滚动发布
滚动发布基于Kubernetes原生的Deployment具备的滚动更新、多版本管理和API网关负载均衡能力实现。滚动更新的好处是显而易见的,比如,在升级刚开始的时候,集群里只有1个新版本的容器。如果这时,新版本容器有问题(环境或者程序本身有bug)启动不起来,那么“滚动更新”就会停止。而在这个过程中,由于应用本身还有两个旧版本的容器在线,所以服务并不会受到太大的影响。新版本部署好,测试验证如果不成功,通过回滚机制,可以快速滚动回退到最新的历史版本。 API网关不支持流量转移,所...
2021-01-21 17:05:04
439
原创 API访问etcd, kv对增删改查
package etcdimport ( "context" "fmt" "github.com/golang/glog" "go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/pkg/transport" "sync" "time")type ThreadSafeEtcd struct { client *clientv3.Client lock sync.Mutex certdir string endpoints []strin.
2020-08-06 16:35:20
444
原创 cicd平台,升级gitlab带来的一些配置、接口变化
gitlab软件版本需要从GitLab Community Edition8.9.11升级到GitLab Community Edition12.10.11,记录下本次升级所做的改动以及遇到的坑。 涉及到的各个服务见下图:1. 版本跨度太大,没有采用软件更新升级的方式;同样也没有采用备份/还原的方式。2. 安装部署了一新的gitlab服务器,从旧gitlab服务器迁移项目到新gitlab服务器。3. 更新"通过API方式访问gitlab"的认证方式和接口版本...
2020-07-16 15:00:30
471
原创 runtime error: invalid memory address or nil defrference goroutine
go routine panic with:invalid memory address or nil defrference goroutine查看源代码:正确的写法是:
2020-06-21 15:39:16
712
原创 go panic (runtime error: slice bounds out of range) 分析
如图,go程序出现panic下面来看看这个导致panic的方法:1)定义了一个nil的切片 var job []string定义的是一个分配了却未初始化的对象,它的值是nil,上面的方法,如果 if strings.Contains(subName, env) 这个条件一直不成立,返回的jobs就是nil ...
2019-12-11 18:18:37
13782
原创 k8s环境下etcd分布式数据库集群配置,数据存储与发现
1. 什么是etcd? etcd是一个分布式一致性键值存储系统,用于共享配置和服务发现, etcd基于raft协议实现数据同步(K-V数据),集群由多个节点组成。 raft协议理解起来相比paxos并没有简单到哪里,因为都很难理解,所以我简单描述一下: 每次写入都是在一个事务(tx)中完成的。 一个事务(tx)可以包含若干put(写入k-v键值对)操作...
2019-06-25 16:13:04
1249
原创 Docker容器的capability
linux capability是啥?资料来源:http://man7.org/linux/man-pages/man7/capabilities.7.html“For the purpose of performing permission checks, traditional UNIXimplementations distinguish two catego...
2019-04-26 17:33:12
3647
原创 容器Namespace - 2
容器通过namespace建立属于自己的一个相对隔离的环境,从上一篇《容器Namespace - 1》我们知道centos7默认没有启用user namespace。 上图显示容器的user namespace与宿主机是同一个ID:4026531837,接下来简单分析下docker创建namespace的代码。vendor/github.com/...
2019-04-26 16:47:21
378
原创 容器Namespace - 1
Namespace是怎么回事? Linux namespace,可以理解为将全局的操作系统资源,逻辑上划分成功能独立的单元。如进程号PID,这些个单元有各自独立的PID空间,还比如网络栈,这些个独立的单元有各自独立的路由表,网络接口。linux实现了mount、UTS、IPC、network、pid、user这六种namespace。下面先用unshare来测试实验梳理一...
2019-04-26 14:19:11
2053
1
原创 进程 vs 容器 vs 虚拟机
进程: 互相隔离的虚拟地址空间 运行中的程序,由操作系统调度执行 共享操作系统管理的资源(内存、网络栈、I/O) 版本管理、可移植性差容器: 命名空间实现资源隔离(UTS、IPC、PID、Network、Mount、User) 运行中的镜像,以服务的形式呈现,由操作系...
2019-04-19 17:25:25
325
原创 raw格式的镜像,如何在网络传输、备份时减少拷贝
raw 格式的镜像,不带matadata,就像一块空白的磁盘,读写效率比qcow2快近10~30%。 本文探讨下,在将这个镜像进行网络传输备份时,如何减少数据拷贝。如果一个近50G大小的文件在网络中进行传输的话,即占用带宽,拷贝花的时间也是比较漫长的。1. 看看创建raw镜像的一些参数root@test:~# qemu-img create -f raw a.img...
2019-04-03 10:52:30
1680
原创 kubernetes容器底层网络要求
容器可能部署在云上(公有云或者私有云),也可能部署在数据中心物理宿主机上。云的场景涉及到虚拟网络,数据中心场景就是传统的物理网络,这些环境的网络架构以及底层技术有着很大的差异,这一节分析下。 不管是云的场景还是传统的数据中心场景,部署容器的宿主机之间的网络,抽象归纳起来需要具备下面的两个条件:可以通过二层交换机、或者三层路由器互相访问。 源容器的“原始IP包”,经...
2019-03-22 17:35:22
818
原创 socket收包函数 buffer大小的设置
Ip_ssize_t recv(Ip_fd sock, void *buf, Ip_size_t len, int flags);Ip_ssize_t recvfrom(Ip_fd fd, void *buf, Ip_size_t len, int flags,struct Ip_sockaddr *from, Ip_socklen_t *fromlen);这个buf大小需要考虑啥,有啥...
2019-03-22 16:57:25
5773
原创 Calico网络方案
Fannel纯三层路由的方式实现不同宿主机间的容器通信,这种方式工作的前提是宿主机之间是二层连通的。需要注意的是,宿主机之间二层不连通的情况也是广泛存在的,这就不得不提到calico网络方案了。Calico网络方案同时解决了宿主机二层连通和不连通的的场景下,容器之间通过纯三层路由通信的问题。 Fannel通过etcd和宿主机上的fanneld维护路由信息,calico使用了BG...
2019-03-22 14:39:29
3646
原创 Flannel网络方案
这里讲一下Flannel网络方案,梳理下其工作方式,各个环节配置,以及转发包流程。Fannel项目是CoreOS公司主推的容器网络方案。目前实现的技术有三种,分别是:UDP Vxlan Host-GW1. UDP方式 Udp方式是Flannel项目最早支持的,也是性能最差的一种。目前已经被弃用,不过,这种方式最直接、也是最容易理解的跨主机实现。...
2019-03-22 11:48:37
1821
原创 Docker容器及kubernetes网络
本文讲述下docker容器以及k8s部署环境下,与网络相关的知识。读者需要对tcp/ip网络,交换/路由,网络虚拟化以及容器技术需要有一定的基础。1. 浅谈容器网络 容器container,就是一个被隔离的环境(Namespace)下,同时限制了访问权限(Cgroup)的进程运行时,它配置了属于自己的网卡,网络栈,就像物理机一样,可以访问外部网络,同时外...
2019-03-22 11:20:59
1104
4
原创 PF_PACKET说开去
什么PF_PACKET类型的socket PF_PACKET类型socket应用场合 数据层面:驱动程序怎么把报文送到相应的socket buffer 数据层面:内核驱动可以与用户态零拷贝吗? 1. 什么PF_PACKET类型的socket 创建socket的函数如下: fd = socket(int domain, int type, int prot...
2018-11-28 18:10:54
7228
原创 Socket Conception
N年前写的一篇旧文,讲了socket的基本概念,socket地址,编程模型,各种API的使用。对初学者可以起到入门的作用,想进一步学习的,可以看看TCP/IP协议栈,Socket本身的实现。(阻塞是用信号量实现的,select用到的fd_set是怎么回事,epoll对比select的优越性,libevent是怎么dispatch的,socket buffer大小会引起任务等待,多线程...
2018-11-20 15:51:57
744
原创 gdb适用场景和不适用场景
工程中,经常用gdb调试bug,谈谈其适用性和不适用性。适合的场景:1)验证程序的逻辑 给定条件,得到正确的结果2)查看现场 各种全局、局部变量,对象的值 寄存器、内存 调用栈 不适合的场景:1)每次crack现象不一样的场景,即异常产生的场景不能反映导致异常...
2018-11-14 11:36:17
760
原创 gdb调试中两种令人费解的情况解释
gdb这个调试工具怎么使用,在于相关的命令的使用(break、watch、print、continue、next、step等),gdb如何调试,需要结合程序的设计,代码的逻辑,多实践总结。这里解释两个在实践中遇到的令初学者费解的问题: 1)为啥设置了断点 b write_pipe,gdb调试中,在断点处没有停下? 设想下面的情况,一个进程在后台运行过程中CPU占有率1...
2018-11-13 17:47:49
545
原创 Docker的容器镜像和存储驱动
Docker作为一种容器技术,已经在工程实践中被广泛的应用,这里讲讲其镜像的管理和后端的存储驱动。 1. 什么是Docker镜像 镜像,英文单词为image,在计算机世界的很多领域里都曾经出现,常见的image有下面这些:Linux内核镜像(vmlinuz) 各种iso文件 虚拟机磁盘镜像(有qcow2、raw格式的文件,或者ceph块镜像) 这...
2018-11-05 10:17:27
1608
原创 Python实现网络爬虫
#!/usr/bin/env python# -*- coding: UTF-8 -*-# Author: GuangJun.Lv# Date: 2018/07/06import urllib2import jsonimport osimport timeimport datetimeimport csvts = '\t'Non = 'N/A'Date_CST = ...
2018-08-07 11:29:58
420
原创 Python脚本实现bonding,bridge管理(创建,端口Join/Leave)和配置(IP地址...)
#!/usr/bin/env python## author: guangjun.lv# V 1.0## bonding interface, bridge interface management utility# bonding create, destroy, port join bonding, leave bonding# bridge create, destroy,...
2018-08-07 11:28:44
507
原创 C++,实现Vector类,Vector实现Stack
#include <iostream>#include <cassert>#include <string.h>using namespace std;template <class Type>class vector{ public: vector(); vector(int i); ...
2018-08-06 11:30:33
1095
原创 Vmware虚拟机 静态手动迁移到Kvm
分别迁移了Guest OS基于CentOS和Window的VM,过程中,遇到的磁盘驱动问题:虚拟化磁盘控制有基于IDE、Virtio、SCSI诸如这些,不同虚拟化平台有差异,导致VM迁移后,虚拟机磁盘不能识别,系统蓝屏的现象。解决步骤:1)修改虚拟机模板,虚拟磁盘总线为IDE后,启动虚拟机 在/etc/sysconfig/modules/目录下,添加一个文件virti...
2018-08-03 17:00:07
1688
原创 C语言,用数组实现stack,用stack实现pipe
#include <stdio.h>#include <string.h>#include <stdlib.h>#define TRUE 1#define FALSE 0#define STACK_SIZE 1024typedef int bool;struct istack{ unsigned int top; unsi...
2018-08-02 11:50:03
492
原创 P2v, V2v 实践
P2V(物理机转虚拟机)p2v,就是physical machine to virtual machine,物理机转换成虚拟机,物理机有硬件和软件资源两部分,虚拟机同样也有硬件和软件资源,只是硬件是虚拟出来的。p2v是把物理机的软件资源(操作系统,数据等)迁移到虚拟机,虚拟机的物理资源(CPU、内存、磁盘等),根据现场情况分配创建。 p2v,一般会通过转换整个物理磁盘,或者某个分区成某种格式的镜像...
2018-03-21 15:04:45
10016
原创 windows虚拟机对应的qemu进程cpu占有率116%
1.1 现象 在公有云平台,openstack计算节点上,如图Figure-1所示,一台windows虚拟机的qemu-kvm进程116%的占用cpu资源,如果Figure-2所示,该虚拟机仅有一个vcpu,因此该虚拟机已经满负荷的运行。 Figure-1 Figure-21.2 分析步骤 通过下面步骤的分...
2018-03-16 17:53:30
7083
1
原创 openstack计算节点,CPU占用率100%
1.1 现象在openstack计算节点上,如Figure-1所示,使用top工具发现某些个虚拟机的进程占用cpu核一直在100%,系统的负载load average:5.32,表明有5个task处于(可运行+不可中断阻塞状态);使用sar -q 2,如果Figure-2所示,runq-sz(Run queue length (number of tasks waiting for run ti...
2018-03-16 17:26:54
3478
原创 网卡中断平衡,网卡多队列
分析网络的工具1)发包程序 内核源代码在 net/core/pktgen.c,make menuconfig,make -j 8 编译出pktgen工具,编译好的程序在目录samples/pktgen2)执行发包 执行脚本 ./pktgen_sample03_burst_single_flow.sh,会列出相关的帮助信息 下面两个命令是具体的执行发包命令 ./pktgen_...
2018-03-16 15:58:27
3344
原创 qemu cracks when shutdown vm
如上图,Qemu创建的XP虚拟机,用spicec连接到该虚拟机的桌面,关闭该虚拟机时,Qemu的主线程异常。(qemu版本:1.3.1,spice版本:0.12.5)用gdb 查看crash dump文件,发现是非法访问内存地址0x100000000导致,'Cannot access memory at address 0x100000000',该地址已经超过进程可以访问的范围根据
2016-02-14 17:59:35
662
原创 C语言,数的表示(整数)
编写test.c#include int main(){ long int a,b; printf("sizeof int is %lu, sizeof long int is %lu\n", sizeof(int), sizeof(long int)); // the size of long int in 64bit machine is 8byt
2015-03-13 18:57:27
2406
原创 字符串倒序
编写测试程序,test.c#include char *reverse_str1(char *s){ int i; unsigned int len; char ch; if (NULL == s) return NULL; len = strlen(s); for(i=0; i {
2015-03-10 11:20:03
549
原创 C语言,数组,数组名,数组地址
编写test.c#include #include typedef struct STUDENT_S{ char name[12]; int grade; int score;} __attribute__ ((__packed__))STUDENT_T;int main(){ STUDENT_T *p; S
2015-03-04 17:21:39
969
原创 usbredir client设计实现
介绍关于usbredir client功能的描述,可以参考文档《usbredir client 功能说明书》,这个文档,分析了在不同操作系统平台,如何实现这个功能。跨平台支持基于不同操作系统平台Windows和Linux,对于支持分门别类众多的usb外设,重定向都会用到libusb这个库来访问usb设备,也可以说重定向usb设备的驱动程序是基于libusb实现的。在仔细分析阅读了lib
2014-09-15 18:23:18
4420
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人