通过Jenkins Pipeline在Dockerfile内自动构建包含私有模块的golang项目

以前写的golang项目一直使用的都是公开的module,最近使用私有gitlab仓库的module时,发现go get mod时需要输入用户名密码,开发环境还好解决,手动输一次让他记住就好了。但是项目正式上线,通过公司统一的jenkins Pipeline执行构建时,没有办法去手动输用户名密码。

Dockerfile配置

要解决这个问题,可以通过.netrc文件来处理。Dockerfile如下:

重点在3,4行和15行,3,4行通过传入GIT_USR和GIT_PWD两个参数到docker构建内,第15行生成.netrc配置。

现在我们就可以通过传参的方式来构建了:

docker build -t hub.docker.com/xxx/knative-audit-log:v0.1 --build-arg GIT_USR=**** --build-arg 'GIT_PWD=****' -f ./Dockerfile .

继续阅读

如何删除一个tcp长连接

有时端口被占用导致服务起不来,发现本机端口被另一个程序使用了。这个时候我们可以使用tcpkill命令来删除这个长连接,让其自动重连换一个端口。然后再启动想启动的服务。

安装tcpkill:

查询这个连接:

删除连接:

继续阅读

Traefik 2.5 源码分析1 – 程序启动部分

1. 前言

Traefik版本为2.5.2,从今天开始,计划陆续看完Traefik的核心部分的源码。
本文是第一部分,Traefik的程序启动分析。

2. 主流程

main.go在cmd/traefik/traefik.go内,其主要流程为:

先构造3个Command启动器,分别是traefik,healthcheck,version,Command结构如下:

源码文件:github.com/traefik/paerser@v0.1.4/cli/commands.go

可以看到,每个Command都可以配置名字,资源,Run函数等。

然后通过cli.Execute(cmdTraefik)来启动上面3个服务,也就是调用Command内的Run函数。

ResourceLoader是用于配置的加载,有文件,参数,环境变量3种加载方法,下面会提到。

继续阅读

linux kernel 4.8以上内核NR_KERNEL_STACK的改变

1. NR_KERNEL_STACK是干什么用的?

通过下面的命令,我们可以查看内核栈的数量:

这个值在内核中的宏为:NR_KERNEL_STACK,表示当前内核中有多少个内核栈。

我们使用这个数字来监控K8S节点上使用PID的数量,以避免PID被耗尽。

2. 那么PID与内核栈有什么关系呢?

在linux系统中,每个进程、子进程和线程在运行时都会有一个PID。这些进程或线程在运行时,因为CPU需要进行任务切换,在任务切换时就需要上下文交换,在上下文交换时就需要把当前进程的上下文压到内核栈内去,以便下次再运行时取出继续执行。

所以可以确定:每个进程、子进程和线程都会有一个内核栈。内核栈的数量与PID的数量大致相当。

注:基于linux内核的线程,比如java的线程与linux的线程是一一对应的,nodejs只使用了linux的进程,线程模型是其自己实现的,golang最特别,使用了多进程,每个进程上有多线程(基于内核),线程上还是自己实现的协程或者说goroute(可以理解为自己实现的线程)

继续阅读

PVC在K8S集群迁移或恢复需注意地方

目前在做同城双活,每个机房都有一个k8s集群,其中一些共享卷需要做到双活的2个集群上都可用。

比如我们现在在主机房的集群上有一个PVC:

以及对应的PV:

继续阅读

k8s源码分析:kube-apiserver –admission-control及–enable-admission-plugins –disable-admission-plugins参数差异

kubernetes源码分支:1.18

先说结论,kube-apiserver启动时:

  1. –admission-control参数带的插件将是apiserver启动的插件,不包括默认插件
  2. –admission-control和–enable-admission-plugins –disable-admission-plugins不能同时使用
  3. –enable-admission-plugins参数不需要按加载顺序填写
  4. 不使用–admission-control参数时,api server会同时启动默认插件
  5. –enable-admission-plugins参数启用时,api server会同时启动默认插件,除非使用了–disable-admission-plugins显示的关闭某个插件
  6. –enable-admission-plugins和–disable-admission-plugins如果同时填写了某一个插件,这个插件将会被加载

继续阅读

istio 1.6新特性:istio自身灰度发布功能测试

1. istio 1.6灰度功能测试

istio 1.6新增了istio自身的灰度测试特性,我先测试其灰度功能。

在官网下载并解压istio 1.6,并把istioctl复制到对应目录:

继续阅读

istio 1.5版本升级

之前测试的istio是1.5.1,现在升级到1.5.2。可以参考之前的istio定制安装的文章。http://www.huilog.com/?p=1299

  • 下载新版本,并准备好之前安装时的配置文件

  • 查看支持的版本列表,验证 istoctl 命令是否支持从当前版本升级

继续阅读

istio-init容器Init:CrashLoopBackOff故障解决

最近在测试istio时,经常发现注入过sidecar的pod过段时间就变成了Init:CrashLoopBackOff状态。如:

我的kubernetes版本为1.14.10,istio版本为:1.5.1
查看istio-init容器的日志,发现有如下的报错:

继续阅读

istio 1.5 定制安装

在istio 1.5,已经不支持helm方式安装,因为helm已经弃用。helm部分的代码已不在更新。只支持istioctl的方式安装istio。

istioctl在安装包内,可通过下面的链接下载安装包。
https://istio.io/docs/setup/getting-started/#download

安装包解压后,直接将istioctl复制到执行目录就可以用了:
cp bin/istioctl /usr/local/bin/

以下命令可以默认配置安装istio:
istioctl manifest apply

如果想安装demo:
istioctl manifest apply --set profile=demo

但是默认配置有些部件是没有选中的。参考下图:

继续阅读