go proxy athens 部署到k8s

Posted 0pandas0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go proxy athens 部署到k8s相关的知识,希望对你有一定的参考价值。

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 来就完美解决了。

以上是关于go proxy athens 部署到k8s的主要内容,如果未能解决你的问题,请参考以下文章

微服务从代码到k8s部署应有尽有大结局(k8s部署)

微服务从代码到k8s部署应有尽有系列全集

exec: "go": executable file not found in $PATH异常的原因

微服务从代码到k8s部署应有尽有系列(十一日志收集)

k8s部署nginx-proxy

部署k8s ssl集群实践14:work节点部署kube-proxy