在Kubernetes上安装Athens
当您按照Walkthrough中的说明进行操作时, 最终会得到使用内存作为存储的Athens。 这仅适用于短时间试用Athens,因为您将很快耗尽内存,并且Athens在两次重启之间不会保留储存的模块(modules)。 为了使Athens运行在一个更接近生产级别的环境上, 您可能需要在 Kubernetes 集群上运行Athens. 为了帮助在Kubernetes上部署Athens,, 我们提供了一个 Helm chart . 本指南将指导您使用Helm将Athens安装在Kubernetes集群上。
前提条件
为了在Kubernetes集群上安装Athens,您必须满足一些前提条件.如果您已经完成以下步骤,请继续执行配置Helm. 本指南假设您已经创建了Kubernetes集群.
安装Kubernetes CLI
为了与Kubernetes集群进行交互,您需要 安装 kubectl。
安装Helm CLI
Helm 是用于在Kubernetes上安装预先配置好的应用程序的工具。
可以通过运行以下命令来安装helm
:
MacOS
brew install kubernetes-helm
Windows
- 下载最新版本的 Helm release。
- 解压tar文件。
- 拷贝 helm.exe 到系统 PATH 中的一个目录下.
Linux
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash
配置Helm
如果您的集群已配置为使用Helm,请继续部署Athens.
如果没有,请继续阅读。
RBAC 集群
如果您的集群启用了RBAC,则需要创建ServiceAccount,ClusterRole和ClusterRoleBinding以供Helm使用。 以下命令将创建它们并初始化Helm。
kubectl create -f https://raw.githubusercontent.com/Azure/helm-charts/master/docs/prerequisities/helm-rbac-config.yaml
helm init --service-account tiller
非RBAC 集群
如果您的集群没有启用rbac,则可以轻松初始化helm。
在部署Athens之前, 你需要等待Tiller的pod变成 Ready
状态. 您可以通过查看 kube-system
中的Pod来检查状态:
$ kubectl get pods -n kube-system -w
NAME READY STATUS RESTARTS AGE
tiller-deploy-5456568744-76c6s 1/1 Running 0 5s
部署Athens
使用Helm安装Athens的最快方法是从我们的公共Helm Chart库中进行部署。 首先,使用以下命令添加库
$ helm repo add gomods https://gomods.github.io/athens-charts
$ helm repo update
接下来,将含有默认值的chart安装到athens
命名空间:
$ helm install gomods/athens-proxy -n athens --namespace athens
这将在athens
命名空间中部署一个启用了disk
本地存储的Athens实例。此外,还将创建一个ClusterIP
服务。
高级配置
多副本
默认情况下,该chart将安装副本数量为1的athens。要更改此设置,请更改replicaCount
值:
helm install gomods/athens-proxy -n athens --namespace athens --set replicaCount=3
资源
默认情况下,该chart将在没有特定资源请求或限制的情况下安装athens。 要更改此设置,请更改resources
值:
helm install gomods/athens-proxy -n athens --namespace athens \
--set resources.requests.cpu=100m \
--set resources.requests.memory=64Mi \
--set resources.limits.cpu=100m \
--set resources.limits.memory=64Mi
有关更多信息,请参阅Kubernetes文档中的管理容器的计算资源 。
通过Github令牌(Token)授予athens访问私有存储库的权限(可选)
- 在 https://github.com/settings/tokens 上创建一个令牌(Token)
- 通过 config.toml 文件 (
GithubToken
字段) 或 通过设置ATHENS_GITHUB_TOKEN
环境变量,将令牌提供给Athens代理.
存储提供程序(storage provider)
Helm chart目前支持使用两个不同的存储提供程序来运行Athens:disk
和mongo
。 默认使用的是disk
存储提供程序。
磁盘存储配置
当使用disk
存储提供程序时,可以配置许多有关数据持久性的选项。默认情况下,雅典将使用emptyDir
卷进行部署。这可能不足以满足生产用例,因此该chart还允许您通过PersistentVolumeClaim配置持久性。该chart目前允许您设置以下值:
persistence:
enabled: false
accessMode: ReadWriteOnce
size: 4Gi
storageClass:
将其添加到override values.yaml
文件并运行:
helm install gomods/athens-proxy -n athens --namespace athens -f override-values.yaml
enabled
用于打开chart的PVC功能,而其他值直接与PersistentVolumeClaim中定义的值相关。
Mongo DB 配置
要使用Mongo DB存储提供程序,您首先需要一个MongoDB实例。当部署了MongoDB后,就可以通过storage.mongo.url
字段使用连接字符串配置Athens。 您还需将storage.type
设置为“mongo”。
helm install gomods/athens-proxy -n athens --namespace athens --set storage.type=mongo --set storage.mongo.url=<some-mongodb-connection-string>
S3 配置
要在Athens中使用S3存储,请将storage.type
设置为s3
,并将storage.s3.region
和storage.s3.bucket
分别设置为所使用的AWS区域和S3存储桶名称。 默认情况下,Athens将尝试使用AWS SDK从环境变量、共享凭证文件(shared credentials files)和EC2实例凭证组成的链中加载AWS凭证。 要手动指定AWS凭证,请设置storage.s3.access_key_id
,storage.s3.secret_access_key
,并将storage.s3.useDefaultConfiguration
更改为false
。
helm install gomods/athens-proxy -n athens --namespace athens --set storage.type=s3 --set storage.s3.region=<your-aws-region> --set storage.s3.bucket=<your-bucket>
Minio 配置
若要在Athens中使用S3存储,请将storage.type
设置为minio
。您需要设置storage.minio.endpoint
作为minio安装的URL。这个URL也可以是kubernetes内部地址的(例如minio-service.default.svc
)。您需要在minio安装过程中创建一个桶(bucket)或使用现有的一个桶。桶需要在storage.minio.bucket
中引用。最后,Athens需要在storage.minio.accesskey
和storage.minio.secretkey
中设置您的minio的身份验证凭据。
helm install gomods/athens-proxy -n athens --namespace athens --set storage.type=minio --set storage.minio.endpoint=<your-minio-endpoint> --set storage.minio.bucket=<your-bucket> --set storage.minio.accessKey=<your-minio-access-key> --set storage.minio.secretKey=<your-minio-secret-key>
Kubernetes 服务
默认情况下,Kubernetes中为Athens创建了一个ClusterIP
服务。在Kubernetes集群内使用Athens的场景下,clusterip
就足够用了。如果要在Kubernetes集群外提供Athens的服务,请考虑使用“nodeport”或“loadbalancer”。可以在安装chart时通过设置service.type
值来更改此设置。例如,要使用nodeport服务部署Athens,可以使用以下命令:
helm install gomods/athens-proxy -n athens --namespace athens --set service.type=NodePort
Ingress 资源
该chart可以选择性为您的创建一个Kubernetes Ingress 资源。要启用此功能,请将ingress.enabled
资源设置为true。
helm install gomods/athens-proxy -n athens --namespace athens --set ingress.enabled=true
values.yaml
文件中提供了更多配置选项:
ingress:
enabled: true
annotations:
certmanager.k8s.io/cluster-issuer: "letsencrypt-prod"
kubernetes.io/tls-acme: "true"
ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/ingress.class: nginx
hosts:
- athens.mydomain.com
tls:
- secretName: athens.mydomain.com
hosts:
- "athens.mydomain.com
上述的示例使用cert-manager从Let’s Encrypt设置TLS证书的自动创建/检索。 并使用nginx-ingress controller 将Athens对外暴露于互联网中。
将其添加到override-values.yaml
文件中并运行:
helm install gomods/athens-proxy -n athens --namespace athens -f override-values.yaml
上游的模块(module)库
您可以为上游模块库设置URL
,然后当Athens在自己的存储中找不到某个模块(module)时,它将尝试从上游模块库中下载该模块。
对于可用的为上游模块库,一下是几个好的选择:
https://gocenter.io
使用JFrog的GoCenter
https://proxy.golang.org
使用Go Module 镜像
- 指向任何其他Athens服务器的URL
以下示例显示了如何将GoCenter设置为上游模块库:
upstreamProxy:
enabled: true
url: "https://gocenter.io"
将其添加到 override-values.yaml
文件里并运行:
helm install gomods/athens-proxy -n athens --namespace athens -f override-values.yaml
.netrc文件支持
.netrc文件可以作为密钥共享,以允许访问私有模块。
使用以下命令从netrc
文件创建密钥(文件的名称必须为netrc):
kubectl create secret generic netrcsecret --from-file=./netrc
为了指导athens获取并使用密钥,netrc.enabled
标志必须设置为true:
helm install gomods/athens-proxy -n athens --namespace athens --set netrc.enabled=true
gitconfig支持
gitconfig可以作为私钥共享,以允许访问私有git库中的模块。 例如,您可以使用GitHub,Gitlab和其他git服务上的个人访问令牌(token),通过HTTPS配置对私有存储库的访问。
首先,准备你的gitconfig文件:
cat << EOF > /tmp/gitconfig
[url "https://user:token@git.example.com/"]
insteadOf = ssh://git@git.example.com/
insteadOf = https://git.example.com/
EOF
接下来,使用上面创建的文件创建密钥:
kubectl create secret generic athens-proxy-gitconfig --from-file=gitconfig=/tmp/gitconfig
为了使athens使用密钥,请设置适当的标志(或values.yaml
中的参数):
helm install gomods/athens-proxy --name athens --namespace athens \
--set gitconfig.enabled=true \
--set gitconfig.secretName=athens-proxy-gitconfig \
--set gitconfig.secretKey=gitconfig
共享团队实例
当您按照Walkthrough中的说明进行操作时,Athens最终使用的是本地存储空间。 这仅适用于短期试用Athens,因为您将很快耗尽内存,并且Athens在两次重启之间不会保留模块。 本指南将帮助您以一种更适合的方式运行Athens,以用于提供一个实例供开发团队共享的场景。
我们将使用Docker来运行Athens,因此首先请确保您已经安装Docker.
选择存储提供程序
Athens目前支持许多存储驱动程序。 对于本机使用,建议从使用本地磁盘作为存储提供程序开始使用。对于其他提供商,请参阅
the Storage Provider documentation.
使用本地磁盘作为存储安装Athens
为了使用本地磁盘存储来运行Athens,您接下来需要确定要将模块持久化的位置。 在下面的示例中,我们将在当前目录中创建一个名为athens-storage
的新目录。现在您可以在启用磁盘存储的情况下运行Athen。 要启用本地磁盘存储,您需要在运行Docker容器时设置ATHENS_STORAGE_TYPE
和ATHENS_DISK_STORAGE_ROOT
环境变量。
为了简单起见,下面的示例使用:latest
Docker标记,但是我们强烈建议您在环境启动并运行后切换到使用正式版本(例如:v0.3.0
)。
Bash
export ATHENS_STORAGE=~/athens-storage
mkdir -p $ATHENS_STORAGE
docker run -d -v $ATHENS_STORAGE:/var/lib/athens \
-e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens \
-e ATHENS_STORAGE_TYPE=disk \
--name athens-proxy \
--restart always \
-p 3000:3000 \
gomods/athens:latest
PowerShell
$env:ATHENS_STORAGE = "$(Join-Path $pwd athens-storage)"
md -Path $env:ATHENS_STORAGE
docker run -d -v "$($env:ATHENS_STORAGE):/var/lib/athens" `
-e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens `
-e ATHENS_STORAGE_TYPE=disk `
--name athens-proxy `
--restart always `
-p 3000:3000 `
gomods/athens:latest
注意:如果您之前尚未使用Docker for Windows挂载此驱动器,则可能会提示您允许访问
Athens现在应该作为带有本地目录athens-storage
的Docker容器运行。当Athens检索模块(module)时,它们将被存储在先前创建的目录中。首先,让我们确认雅典是否在运行:
$ docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
f0429b81a4f9 gomods/athens:latest "/bin/app" 0.0.0.0:3000->3000/tcp athens-proxy
现在,我们可以从安装了Go v1.12+的任何机器上使用Athens。 要验证这一点,请尝试以下示例:
Bash
$ export GO111MODULE=on
$ export GOPROXY=http://127.0.0.1:3000
$ git clone https://github.com/athens-artifacts/walkthrough.git
$ cd walkthrough
$ go run .
go: downloading github.com/athens-artifacts/samplelib v1.0.0
The 🦁 says rawr!
PowerShell
$env:GO111MODULE = "on"
$env:GOPROXY = "http://127.0.0.1:3000"
git clone https://github.com/athens-artifacts/walkthrough.git
cd walkthrough
$ go run .
go: downloading github.com/athens-artifacts/samplelib v1.0.0
The 🦁 says rawr!
我们可以通过检查Docker日志来验证Athens是否处理了此请求:
$ docker logs -f athens-proxy
time="2018-08-21T17:28:53Z" level=warning msg="Unless you set SESSION_SECRET env variable, your session storage is not protected!"
time="2018-08-21T17:28:53Z" level=info msg="Starting application at 0.0.0.0:3000"
handler: GET /github.com/athens-artifacts/samplelib/@v/v1.0.0.info [200]
handler: GET /github.com/athens-artifacts/samplelib/@v/v1.0.0.mod [200]
handler: GET /github.com/athens-artifacts/samplelib/@v/v1.0.0.zip [200]
现在,如果查看athens_storage
文件夹的内容,您将会看到与samplelib模块相关的新增文件。
Bash
$ ls -lr $ATHENS_STORAGE/github.com/athens-artifacts/samplelib/v1.0.0/
total 24
-rwxr-xr-x 1 jeremyrickard wheel 50 Aug 21 10:52 v1.0.0.info
-rwxr-xr-x 1 jeremyrickard wheel 2391 Aug 21 10:52 source.zip
-rwxr-xr-x 1 jeremyrickard wheel 45 Aug 21 10:52 go.mod
PowerShell
$ dir $env:ATHENS_STORAGE\github.com\athens-artifacts\samplelib\v1.0.0\
Directory: C:\athens-storage\github.com\athens-artifacts\samplelib\v1.0.0
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/21/2018 3:31 PM 45 go.mod
-a---- 8/21/2018 3:31 PM 2391 source.zip
-a---- 8/21/2018 3:31 PM 50 v1.0.0.info
重新启动Athens后,它将在该位置提供模块(module),而无需重新下载。 为了验证这一点,我们需要首先删除Athens容器。
docker rm -f athens-proxy
接下来,我们需要清除本地Go模块中的缓存。 这是必要的,以便您本地的Go命令行工具从Athens重新下载该模块。 以下命令将清除本地存储中的模块:
Bash
sudo rm -fr "$(go env GOPATH)/pkg/mod"
PowerShell
rm -recurse -force $(go env GOPATH)\pkg\mod
现在,我们重新运行Athens容器
Bash
docker run -d -v $ATHENS_STORAGE:/var/lib/athens \
-e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens \
-e ATHENS_STORAGE_TYPE=disk \
--name athens-proxy \
--restart always \
-p 3000:3000 \
gomods/athens:latest
PowerShell
docker run -d -v "$($env:ATHENS_STORAGE):/var/lib/athens" `
-e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens `
-e ATHENS_STORAGE_TYPE=disk `
--name athens-proxy `
--restart always `
-p 3000:3000 `
gomods/athens:latest
当我们重新运行我们的Go示例时,Go cli将再次从Athens下载模块。然而,Athens不需要重新检索模块。它将从本地磁盘中获取。
Bash
$ ls -lr $ATHENS_STORAGE/github.com/athens-artifacts/samplelib/v1.0.0/
total 24
-rwxr-xr-x 1 jeremyrickard wheel 50 Aug 21 10:52 v1.0.0.info
-rwxr-xr-x 1 jeremyrickard wheel 2391 Aug 21 10:52 source.zip
-rwxr-xr-x 1 jeremyrickard wheel 45 Aug 21 10:52 go.mod
PowerShell
$ dir $env:ATHENS_STORAGE\github.com\athens-artifacts\samplelib\v1.0.0\
Directory: C:\athens-storage\github.com\athens-artifacts\samplelib\v1.0.0
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/21/2018 3:31 PM 45 go.mod
-a---- 8/21/2018 3:31 PM 2391 source.zip
-a---- 8/21/2018 3:31 PM 50 v1.0.0.info
请注意文件的时间戳并没有更改
下一步: