go proxy athens 部署到k8s

之前将项目的代码迁移到了新的git,然后利用公司内部k8s结和gitlab进行ci/cd,但是由于编译时每次都需要重头开始build镜像,每次go mod都会去下载第三方包很耗费时间。在网上找了一些资料发现athens正好满足我的需求,就把这个服务给部署到和gitlab-runner一起了,这样就可以完美解决了下载慢的问题。毕竟局域网内下载还是很快的。

一、athens简介

Athens 是一个开源项目,旨在为 Go 模块(Go modules)创建首个代理服务器。将联合 Athens 社区继续致力于改善模块体验,重点是确保 Go 模块与所有代理服务器能无缝协作,并努力建立一个联合的、组织多样化的代理网络 。

项目官方网址: https://github.com/gomods/athens

文档地址: https://docs.gomods.io/

二、部署

1、创建 PersistentVolume

创建pv.yaml的文件如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
namespace: prj-name # 修改为您自己的命名空间
labels:
app: gomod-athens
spec:
storageClassName: sc-rbd-hb06 #storageClass这个必须写明, 否则创建不出对应的pv
volumeMode: Block # k8s 1.9 版本支持的,总共两种,Filesystem,Block。默认Filesystem,我司内部平台仅支持Block,所以这样写,具体可以自己修改
accessModes:
- ReadWriteOnce # 这里可以有3种模式挂载到节点上,ReadWriteMany多点读写,ReadWriteOnce单点读写,ReadOnlyMany 多点只读, 目前只支持ReadWriteOnce和ReadOnlyMany
resources:
requests:
storage: 10Gi # 存储空间大小,这里不能超过配额限制100G

执行:

[root@linux]$ kubectl apply -f pv.yaml
[root@linux]$ kubectl get pv -n project_name

2、创建service

service.yml

apiVersion: v1
kind: Service
metadata:
name: athens-proxy
namespace: project_name # 根据自己的修改
spec:
ports:
- port: 80
targetPort: 3000
selector:
app: gomod-athens # 要和deployment中的对应一样
type: ClusterIP

执行:

[root@linux]$ kubectl apply -f service.yml
[root@linux]$ kubectl get svc -n project_name
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
athens-proxy ClusterIP 2002:ac1f:91c5:1::2eed <none> 80/TCP 157m

3、创建deployment

athens.yml

apiVersion: apps/v1
kind: Deployment
metadata:
name: gomod-athens-deploy
namespace: project_name #根据自己的修改
spec:
selector:
matchLabels:
app: gomod-athens
replicas: 1
template:
metadata:
labels:
app: gomod-athens # 要和service中的对应一样
spec:
containers:
- name: athens
image: gomods/athens:latest #使用官方最新镜像
ports:
- containerPort: 3000
env:
- name: ATHENS_DISK_STORAGE_ROOT
value: /var/lib/athens
- name: ATHENS_STORAGE_TYPE
value: disk
volumeMounts:
- name: gomodcache
mountPath: /var/lib/athens
readOnly: false
imagePullSecrets:
- name: abcdhub # 拉取镜像的secret key
volumes:
- name: gomodcache
persistentVolumeClaim:
claimName: pvc #第一步创建的PersistentVolume 名字
readOnly: false

执行:

[root@linux]$ kubectl apply -f athens.yml
[root@linux]$ kubectl get pod -n project_name
NAME READY STATUS RESTARTS AGE
gomod-athens-deploy-d9d7978bb-7sbww 1/1 Running 0 159m

curl http://<service-name>.<namespace>.svc.<cluster-domain>:80 测试服务正常工作,正常的话会返回"Welcome to The Athens Proxy"

4、ci/cd中使用

我是按照下面这样使用的,配置proxy,然后将公司内部的代码库排除在外

利用域名进行访问, Kubernetes Service 的域名格式如下:

<service-name>.<namespace>.svc.<cluster-domain>

export GOPROXY= http://<service-name>.<namespace>.svc.<cluster-domain>:80

export GOPRIVATE=gitlab.mycompany.com

5、踩坑记录

由于一开始不太清楚怎么部署,所以service 的metadata中的 name字段填了athens,这个就是一个坑,后续步骤一直报

time="2019-12-09T07:04:13Z" level=info msg="Exporter not specified. Traces won't be exported"
2019-12-09 07:04:13.539829 I | Starting application at port tcp://[2002:ac1f:91c5:1::b5fe]:80
2019-12-09 07:04:13.539852 I | listen tcp: address tcp://[2002:ac1f:91c5:1::b5fe]:80: too many colons in address

到github上面查看issue还真发现有人遇到了和我一样的问题:too many colons in address,

然后按照上面的方法: https://github.com/gomods/athens/issues/1038 来就完美解决了。

最新文章

  1. 利用django创建一个投票网站(三)
  2. 用Redis存储session
  3. C#字符串排序效率
  4. ASP.NET Identity - LockoutEnabled
  5. Spring事务管理(转)
  6. php实现回复图文,图片,文字
  7. SQL语句调优 - 统计信息的含义与作用及维护计算
  8. iOS Storyboard 的基本用法
  9. TEET
  10. 独立硬盘冗余阵列与HDFS
  11. JQuery调用iframe父页面元素与方法
  12. @RequestParam
  13. POJ 2367 topological_sort
  14. python自动化--语言基础1--数据类型及类型转换
  15. aix 6.1系统怎么安装?这里有详细图文教程
  16. 从 Python 快速启动 CGI 服务器
  17. 关于Android UI 优化
  18. Python中的Numpy入门教程
  19. linux 安装sqlite3
  20. [z]重建索引

热门文章

  1. linux下的压缩解压命令
  2. Scss的使用场景
  3. 二叉搜索树BST(C语言实现可用)
  4. C++中对封装的语法支持——重载运算符
  5. [剑指offer]删除链表中重复的结点(把重复的都删掉,1个不留)
  6. python 做一个简单的登录接口
  7. 微信web协议,群成员唯一uin,获取群成员唯一标识
  8. 面试官问我:谈谈对Java GC的了解?回答完让我回家等消息....
  9. 力扣(LeetCode)按奇偶排序数组II 个人题解
  10. PHP常用的三种输出语句