自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(147)
  • 资源 (4)
  • 收藏
  • 关注

原创 Go语言垃圾回收机制详解

Go语言垃圾回收机制采用并发三色标记法,通过写屏障和并发标记-清扫算法实现高效内存管理。GC触发条件包括内存分配阈值、定时检查和手动触发,工作流程分为标记准备、并发标记、标记终止和并发清扫四个阶段。优化策略包括调整GOGC参数、使用GOMEMLIMIT内存限制和减少内存分配。Go GC从1.0到1.26持续演进,最新Green Tea GC通过SIMD加速和并行化优化性能。开发者可通过GODEBUG和pprof工具监控GC行为,分析性能瓶颈。

2025-12-03 10:17:51 245

原创 Go语言协程机制详解

Go语言协程(Goroutine)是其并发编程的核心,具有轻量级、高并发和高效调度的特点。协程由Go运行时管理,相比传统线程创建成本极低,可轻松创建数百万个协程。采用GPM调度模型(Goroutine-Processor-Machine)实现高效调度,通过channel实现安全的协程间通信,避免共享内存问题。协程特别适合Web服务器、网络爬虫等IO密集型场景,能高效处理大量并发请求。其轻量级栈(初始2-4KB)和动态扩展机制,配合抢占式调度,显著提升了并发性能和资源利用率。

2025-11-26 10:35:24 234

原创 Velero原理及限制

场景是否适合公有云 + 支持 snapshot✔ 强烈推荐本地存储 + Restic✔ 中小规模可以跨云备份恢复✖ 不推荐恢复整个集群✔ 可行,但需要处理 webhook & CRD多租户大规模集群✔ 需要优化备份策略。

2025-11-19 10:08:51 619

原创 Kubernetes Operator开发

CRD是Operator的核心,它定义了用户期望的状态和Operator管理的实际状态。import (// +kubebuilder:印刷列:名称="副本数",类型="整数",JSONPath=".spec Replicas"// +kubebuilder:印刷列:名称="状态",类型="字符串",JSONPath=".status Phase"// +kubebuilder:印刷列:名称="更新时间",类型="字符串",JSONPath=".metadata.creationTimestamp"

2025-11-18 10:27:09 374

原创 自定义实现Kubernetes CSI

Kubernetes CSI自定义实现摘要 Kubernetes CSI(容器存储接口)通过标准化接口解决了存储插件与核心代码耦合问题,实现了存储系统与容器编排平台的解耦。CSI架构包含CSI Driver(Controller/Node服务)、Sidecar控制器和Kubernetes核心组件,采用gRPC协议交互完成存储卷的全生命周期管理。自定义CSI驱动开发需实现Identity、Controller和Node三个gRPC接口,涉及环境准备、接口实现、打包部署等步骤,最终通过Kubernetes资源对

2025-11-13 18:00:40 907

原创 wsl安装ubuntu 18.04

安装完成后会提示输入Unix用户名和密码,之后就可以使用了。退出后如想再次使用,直接输入。但由于网络问题,一直会报错,因此改用安装包离线安装。GitHub官网下载。由于当前wsl版本安装ubuntu会报错,因此升级wsl到最新版。对于没有网络的环境,可以下载。首先使用在线升级wsl。

2024-12-23 16:01:31 1371

原创 pvcreate错误 Can‘t open exclusively. Mounted filesystem

因为/dev/vdb曾经是lvm pv,这次异常之后,曾经的lv信息可能还存在于device mapper表中,那么需要先删除device mapper表中对应的项。曾经使用过/dev/vdb设备创建过lvm pv,但是因为一些异常操作,导致pv丢失,pvs无法查看到对应的pv。如下所示,有些残存项可能有先后顺序,如果不能删除,就先删除其他的,最后再来删除之前删除失败的即可。如上所示,在异常之前,曾经通过/dev/vdb的pv创建了名为lvmvg的vg,并在此vg上创建了一些lv卷。

2024-09-09 15:30:55 1070 1

原创 Kubernetes CSI livenessprobe探活

这里需要注意的是探测端口虽然由边车容器提供,但livenessProbe的具体配置却需要在CSI驱动容器中。其原理很简单,就是暴露一个HTTP服务,探测该服务时,该服务会向CSI驱动发送GRPC Probe请求,Probe成功则返回探测成功。下载适合版本的csi.proto刀镜像中(这里以/root/csi.proto)为例。命令,livenessprobe的配置中,使用grpccurl来访问CSI的Probe接口;这里也需要制作镜像,首先是CSI镜像中,增加grpcurl命令。2、CSI镜像中,增加。

2024-06-26 17:04:06 521

原创 Golang交叉编译

Golang交叉编译主要依赖几个参数:GOOS、GOARCH和CGO_ENABLED。

2023-08-08 14:51:13 722

原创 下载外网容器镜像

个人常用第四种方法,第四种方法失败时会使用第三种方法。没梯子的情况下,还是用第二种吧,就是经常会失败。方法优点缺点挂载梯子,设置docker daemon代理简单受限于梯子的速度和稳定性,很可能会下载到一半超时。薅阿里云羊毛不用翻墙。编辑代码后,可自动触发拉取镜像。阿里云做了限制,一段时间内的构建次数有限;拉取后的镜像需要修改tag,digest值也会变更。挂载梯子,使用google cloud shell操作和shell界面完全一致。

2023-07-28 14:47:53 970

原创 Kubesphere之ks-installer介绍

Kubesphere提供两个部署工具,KubeKey和ks-installer。其中,ks-installer部署Kubesphere,KubeKey安装Kubernetes和ks-installer。代码框架controller:shell-operator的两个脚本deploy:部署ks-installer的yaml文件docs:文档env:变量playbooks:各个playbookalerting.yaml:部署报警模块auditing:部署审计模块common:部署通用模块,

2022-05-07 09:55:39 3183 1

原创 执行shell脚本报错Syntax error: “(“ unexpected

背景更新容器镜像后,通过容器执行shell脚本报错。命令如下,其中portal-container 为容器名。# docker exec -i portal-container /bin/bash -c 'sh /data/kubespray/tools/deploy/deploy_k8s.sh'Syntax error: "(" unexpected原因更换的新容器镜像,使用了和原来不同的基础镜像,原来的sh命令最终是指向bash的。而现在的sh指向了dash,而bash和dash的语法是不

2022-03-25 17:30:29 3415

原创 Go语言泛型工具go2go

背景Go语言从1.18开始,初步支持泛型。要探索Go是如何实现泛型的,就需要使用工具go2go,这里介绍下如何编译该工具。正文go2go是以工具的形式来使用的,可通过go tool go2go <subcommand>来执行命令。Go的工具链由Go语言编写,所以需要提前安装GO,并配置好GOPATH等。下载代码代码在Go语言源码的dev.go2go分支,该分支于2020年发布,现在已经不再维护。代码量偏大,如果网络不佳,可以考虑通过gitee来中转。git clone https

2022-03-15 14:19:45 1983

原创 Go语言通道

背景Golang与其他语言最大的区别是什么呢?在我看来,一个是goroutine,另一个就是通道channel了。其他语言,一般通过共享内存的方式实现不同线程间的通信,也就是说,把数据放在共享内存以供多个线程来使用。这种方法思路简单,但却使得并发控制变得复杂和低效。Golang不建议使用这种方式(虽然也提供了这种传统方式),而是推荐使用通道,也就是channel。详解声明一个通道类型如下:var intChan chan int通道是一种引用类型,和切片、字典相同。初始化引用类型,都需要用到m

2022-03-03 17:00:41 824

原创 Go语言协程

概述Golang中,协程可以简单理解为轻量级的线程。协程开销比线程低,M个协程运行在N个线程上,也就是通常所说的M:N模型。协程完全由Golang运行时管理,而不是由操作系统管理。线程是抢占式的多任务,而协程是非抢占式的任务。通过以上这些方法,从而实现了协程的轻量化。使用Golang创建协程非常简单,只需要go FuncName()即可。package mainimport ( "fmt")func print(name string) { for i := 0; i < 5;

2022-03-02 09:57:17 763

原创 HPA的target显示unknown

背景HPA显示异常,TARGETS部分显示unknown。[root@a1 ~]# kubectl get hpa -n istio-system NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEistio-ingressgateway Deployment/istio-ingressgateway

2022-03-02 09:39:36 2754 1

原创 Go语言中init函数作用

init函数作用执行Golang的sync.Once操作;有些不能使用初始化表达式的变量,可以在init函数中初始化;先于普通函数执行一些操作。init函数特点init函数是先于main函数执行;package mainimport "fmt"func init() { fmt.Println("init...")}func main() { fmt.Println("main...")}输出:init...main...init函数没有入参;

2022-03-02 09:38:02 569

原创 g——Windows下安装多版本golang

有三种方法,推荐使用第三种。方法一:官方方法 , golang/dl。该方法要求能科学上网,我试过一些国内的代理网站,都不可行。方法二:gvm已经好几年不更新了,有很多错误,但优点是可以同时运行多个版本的Golang。方法三:g国内可以使用该方法,安装速度较快,但同一个时刻只能运行一个版本的Golang。这里主要讲述该方法。我这里以在windows下安装为例,将golang安装在目录E:\g下,GOPATH为E:\gopath。从1.2.1开始,支持自定.

2022-03-02 09:24:41 4014 2

原创 Kubernetes配置多个local-path-provisioner

背景常规的本地卷,一般使用hostpath和local volume,但hostpath问题较多( 参考),而local volume布置成动态卷,使用起来较为复杂。因此,rancher开发了 local-path,可以实现动态卷功能。但如果想实现IO隔离,就需要一套Kubernetes环境下部署多个local-path-provisioner。配置local-path-provisioner可设置环境变量PROVISIONER_NAME,只要该环境变量的值,与新创建local-pat.

2022-03-02 09:23:15 1899

原创 Docker容器网络代理设置

之前已经讲过如何设置Docker守护进程如何设置网络代理,那么如何设置运行的Docker容器的网络代理呢?设置环境变量设置容器环境变量,这也是最直接的一种方式。启动容器时,通过设置–env的flag,将环境变量传入容器。变量名Dockerfile示例Docker run示例HTTP_PROXYENV HTTP_PROXY “http://127.0.0.1:3001”–env HTTP_PROXY=“http://127.0.0.1:3001”HTTPS_PROXYE

2020-05-18 11:21:40 42652 2

原创 Kubernetes Krew简介

概念Krew是kubectl插件的包管理工具。借助Krew,可以轻松地使用kubectl plugin:发现插件、安装和管理插件。使用类似apt、dnf或者brew。对于kubectl用户:krew能帮助用户搜索、安装和管理kubectl插件;对于插件开发者:krew可以帮助你在多种平台上打包和发布插件。使用krew的使用:kubectl krew search ...

2019-01-11 11:01:49 4282

原创 calico在docker上的部署及验证

1. 背景以下的部署以五台服务器环境为例:服务器1: hostname为etcdnode1, IP为192.168.56.100服务器2: hostname为etcdnode2, IP为192.168.56.101服务器3: hostname为etcdnode3, IP为192.168.56.102服务器2: hostname为hostnode1, IP为192.168.56....

2018-05-07 06:51:41 3078

原创 docker-maven-plugin插件设置Docker的buildArgs

docker-maven-plugin是spotify出品的一款针对spring boot项目的docker插件,可将spring boot项目打包到docker镜像中。如果在编译docker镜像时需要设置build arg,只需要在maven的配置文件pom.xml中,configuration下增加buildArgs。标签的key和值对应build arg的key和值,如下所示,dock...

2018-03-22 21:50:49 3845

原创 dcos下rexray服务的配置

在dcos环境下,rexray服务的默认配置文件为/opt/mesosphere/etc/rexray.conf,而其服务文件则是/etc/systemd/system/dcos-rexray.service。 # vim /etc/systemd/system/dcos-rexray.service[Unit]Description=REX-Ray: A vendor agno...

2018-03-18 22:35:14 732

原创 calicoctl命令简介

背景在calico中,有多种网络资源。以v1.6.1为例,网络资源包含:node,bgpPeer,hostEndpoint,workloadEndpoint,ipPool,policy,profile等。 下面我将讲解如何使用calicoctl命令行工具来控制这些网络资源。 用法create创建一个网络资源。比如说我们要创建一个“profile” 的网络资源,那么...

2018-03-01 05:41:36 11649

原创 使用Rest api管理Ceph网关

背景  开发基于Ceph RadosGW的微服务,需要实现调用方可以通过rest api就能创建用户,获取用户信息等功能。 实现  Ceph的RadosGW自身就有该功能,这些创建用户、获取用户信息、获取使用情况等的功能被称为Admin Operation(管理操作)。我们直接通过RadosGW的URL再加上/admin就可以访问执行管理操作了,比如RadosGW的URL为htt

2018-02-05 05:36:32 2337 1

原创 CentOS7.0安装Ceph(jewel)及以上版本

背景  由于docker的Ceph插件rexray对Ceph版本有一定的要求,当Ceph版本为hammer (0.94.10)时,rexray无法成功创建rbd设备。CentOS 7及以上版本,默认安装的就是hammer版本,因此,我们需要安装更高的jewel版本。Ceph的版本可参见。 安装  为了安装速度,我们可以选用国内源。通常大家使用的国内源包括:   网易 ht

2018-02-01 06:23:25 4791 1

原创 rexray在CentOS上不能创建ceph rbd的docker volume问题定位

背景  我们通过docker的rexray插件来创建ceph rbd设备的docker volume,但总提示创建失败。 # docker volume create --driver=rexray --opt=size=5 --name=cephrbd-bookError response from daemon: create test_cephrbd_volume: Volu

2018-01-24 06:49:10 1489

原创 制作ssh互信的docker镜像

DockerfileFROM ubuntu:16.04# packageRUN apt-get update; apt-get -y install sshCOPY ssh_config /etc/ssh/ssh_config# sshRUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && sed -i 's

2018-01-12 07:04:09 647

原创 CI脚本异常退出问题定位

背景  在CI脚本中,使用类似如下脚本进行项目编译的计时,但在执行过程中,有时会出现CI脚本(命名为ci.sh)未完全执行的情况: #!/bin/bash -esleep_time=$1start_time=`date "+%s"`# do sth, this sleep would simulate project compilationsleep $sleep_timeend_time

2017-11-06 23:39:42 919

原创 容器中使用iptables报错can't initialize iptables table Permission denied (you must be root)

背景  在docker容器中部署了一微服务,该服务需要docker push镜像到docker registry。因此,docker容器中需要安装docker服务。但在启动容器的时候,却报错: can't initialize iptables table `filter': Permission denied (you must be root)Perhaps iptables or your

2017-10-19 07:00:27 30204 2

原创 nohup介绍

背景  我们通常使用&将前台任务变为后台任务执行,但是如果只是使用&,那么在突然断网或者关闭启动该任务的终端(ps:可使用putty来测试,部分软件如mobaxterm做了优化,关闭终端是友好关闭的)时,内核就会给后台任务发送SIGHUP信号,从而导致后台任务停止。这时,我们就需要使用nohup来启动该后台任务。 简介  nohup,顾名思义,就是使得运行的命令可以忽略HANGUP信号。因此,即使

2017-09-05 06:54:43 8776

原创 docker创建ceph集群

背景  Ceph官方现在提供两类镜像来创建集群,一种是常规的,每一种Ceph组件是单独的一个镜像,如ceph/daemon、ceph/radosgw、ceph/mon、ceph/osd等;另外一种是最新的方式,所有的Ceph组件都集成在一个镜像ceph/daemon中,如果要创建对应的Ceph组件容器,只需要指定类型即可。这里,我们使用第一种方式来创建Ceph集群。   另外,这里所有的容器,都

2017-08-17 07:44:24 3524

原创 maven单元测试设置代理

背景  环境需要设置代理才能够访问外部网络,如果只是运行java程序来访问网络,我们可以通过java -jar test.jar -DproxyHost=proxy_ip -DproxyPort=proxy_port,但如果是java的maven项目中,单元测试需要访问网络,只执行mvn test则会导致单元测试的代码无法访问网络。 解决  Maven单元测试,使用的是Surefire Maven

2017-08-02 07:41:30 920

原创 Kubernetes服务之“运行单实例的有状态服务”

目标  在你的环境中创建一个PV   创建一个MySQl的Deployment   在集群中以DNS名称的方式,将MySQL暴露给其他的pod 开始之前  你需要一个Kubernetes集群,一个可以连接到集群的kubectl命令行工具。如果你没有集群,你可以使用Minikube来创建。   我们会创建一个PV(PersistentVolume)用于数据存储。点击这里来查看PV支持的类型,该

2017-07-11 06:57:11 2515

原创 关闭chrome浏览器的developer tools

背景  Chrome使用过程中,很容易启动Chrome developer tools,一些误触如按到F12、CTRL+Shift+C等都会启动developer tools。对于不开发Web的人来说,并不需要这个功能,但是又却很容器启动该功能。然而,Chrome本身并没有提供关闭该功能的设置。下面介绍下网友总结出的经验。 方法打开Chrome  按下F12,打开devloper tools,并通

2017-07-03 06:51:25 8898

原创 Kubernetes服务之StatefulSets简介

StatefulSets在v1.5时还是个beta特性,它取代了v1.4的PetSets特性。PetSets的用户可以参考v1.5的升级指导,将正在运行的PeetSets升级到StatefulSets。   StatefulSet是一个给Pod提供唯一标志的控制器,它可以保证部署和扩展的顺序。 使用StatefulSet  当应用有以下任意要求时,StatefulSet的价值就体现出来了。

2017-06-26 06:25:20 16886

原创 Kubernetes存储之Persistent Volumes简介

注意  以下内容适用于Kubernetes v1.6.0及以下。简介  管理存储和管理计算有着明显的不同。PersistentVolume子系统给用户和管理员提供了一套API,从而抽象出存储是如何提供和消耗的细节。在这里,我们介绍两种新的API资源:PersistentVolume(简称PV)和PersistentVolumeClaim(简称PVC)。   PersistentVolume(持久卷

2017-05-16 06:32:00 11436

原创 Kubernetes v1.6开始支持RBAC

Kubernetes v1.6的一个亮点就是RBAC认证特性成为了beta版本。RBAC,基于角色的访问控制(Role-Based Access Control),是用于管理Kubernetes资源访问权限的认证机制。RBAC支持灵活的认证策略配置,使得集群在不重启的情况下就可以升级权限。   本文重点聚焦在一些有趣的新特性和实践上。 RBAC vs ABAC  当前Kubernetes已经支持

2017-04-20 06:54:29 1575

原创 Docker aufs存储驱动layer、diff、mnt目录的区别

Docker基础信息  首先,先查询Docker使用的后端存储。使用命令docker info,主要关注Storage Driver相关的部分。 $ docker info...Server Version: 1.12.6Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs:

2017-04-18 07:00:06 8393

Introduction To Algorithms,算法导论英文版

Introduction To Algorithms,算法导论英文版

2015-07-20

etcd-v2.2.1-linux-amd64.tar.gz

etcd-v2.2.1-linux-amd64.tar.gz

2017-03-26

重构改善既有代码的设计

重构改善既有代码的设计,代码重构优化。

2015-07-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除