尝试使用GitLab Kubernetes代理器(原名GitLab Agent for Kubernetes)
我们提供每天都无法通过搜索引擎找到的小花絮。
本篇文章是个人观点,与我所属的任何组织无关。
0. 首先
0-1. GitLab Agent for Kubernetes(GitLab Kubernetes Agent改め)ってなに?
簡単に言うとGitLabとKubernetesを連携させる方法です。
0-2. 何で連携させるの?
GitLab CI/CDの時にKubernetesクラスターを取り扱うために連携させます。
CI/CDのジョブ内でkubectlを実行すると連携されたKubernetesクラスターにkubectlの実行を反映させることができます。
0-3. 你之前也能做到,对吧?
是的,我以前能做到。
下記記事参照:
GitLab Kubernetes接続(オンプレ) – Qiita
しかし、kubeconfigファイルをGitLabサーバー側に保存する必要があり、それがセキュリティーリスクとなっていました。また、GitLabサーバー側からKubernetesクラスターへ接続する必要があり、KubernetesクラスターにグローバルIPが必要でインターネットに出ている必要がありました。
注: GitLab RunnerとKubernetesクラスターが同じプライベートネットワークにある場合は、インターネットに出ている必要はありません。しかし、GitLabサーバーにkubeconfigが必要なのは同じです。
0-4. 发生了什么?
GitLabへ接続するエージェントが開発されて、Kubernetesクラスターへインストールする方式に変わりました。
GitLab Runnerと同じ方法です。GitLabサーバーとagentkはWebSocketで接続します。
这样的话,
- Kubernetes集群无需连接到互联网,也不需要全局IP地址。不需要将kubeconfig保存在GitLab服务器端,也不需要将用于执行kubectl的kubeconfig保存在变量中。这将降低安全风险。
というメリットがあります。
GitLabRunnerとKubernetesクラスターが別々の場所にあっても問題ありません。
GitLabサーバーにだけ接続できるようにしておけば大丈夫です。
比如说,也可以采用以下这种结构。
1. 我试试看
创建GitLab项目
普通にプロジェクトを作成するので割愛します。
CI/CDを有効にしてください。
GitLab Runnerはどこにあっても問題ありません。
1. 在GitLab项目的Git仓库中创建文件。
2. 向GitLab项目的Git代码库添加文件。
我将为GitLab Kubernetes代理创建一个用于代理的文件。
文件名为config.yaml,但是文件的创建路径具有一些特点。
我们要创建一个.gitlab/agents/目录,在其中创建一个名为GitLab Agent的目录,
然后在其中创建一个config.yaml文件。config.yaml文件可以为空。
GitLab Agent的名称可以是任意的,比如aaa-bbb-ccc或者你喜欢的任何名称。
.gitlab/agents/<GitLab Agentの名前>/config.yaml
请按照 RFC 1123 中的 DNS 标签标准为此 GitLab Agent 命名。
-
- プロジェクトでユニークであること。
-
- 最大63文字まで。
-
- 小文字の英数字または-のみを使用。
-
- 英数字で始めます。
- 英数字で終了します。
1-3. GitLab Agentをプロジェクトから登録します。
以下のような画面が表示されるので、helmのコマンドをコピっておきましょう。
建立一个Kubernetes集群
在可以访问互联网的环境中,运行虚拟机并安装单节点的K3S。
准备虚拟机。
我会很容易地通过multipass进行准备。
multipass launch 20.04 --name test.gitlabagentk
我将登录至test.gitlabagentk。
multipass shell test.gitlabagentk
使用k3sup安装K3S
由于是单个服务器,因此需要下载k3sup并安装K3S。
请参考此处以获取详细信息。
使用k3sup安装k3s – Qiita
https://qiita.com/ynott/items/25df249040ceb7430c3f
curl -sLS https://get.k3sup.dev | sh
sudo install k3sup /usr/local/bin/
我要安装K3S。
k3sup install --local --k3s-extra-args="--write-kubeconfig-mode 644"
我会确认K3S的行为。
export KUBECONFIG=./kubeconfig
kubectl config set-context default
kubectl get node -o wide
安装helm命令
请事先安装好helm命令。
sudo snap install helm --classic
helm 3.7.0 from Snapcrafters installed
安装适用于Kubernetes的GitLab代理
3-1. 使用Helm安装GitLab Agent。
我会将在1.3版本中出现的helm命令复制并粘贴。
helm repo add gitlab https://charts.gitlab.io
helm repo update
helm upgrade --install teXXXXXXXXXXXXXXXXXXXXXXXXer gitlab/gitlab-agent \
--namespace gitlab-agent \
--create-namespace \
--set image.tag=v15.1.0 \
--set config.token=AyamK7XXXXXXXXXXXXXXXXXXXXXPg \
--set config.kasAddress=wss://kas.gitlab.com
3-2. GitLab UIを確認
「GitLabメニュー」>「インフラ」>「Kubernetes Clusters」に接続したGitLab Agentが表示されます。
3-3. 使用kubectl命令来检查gitlab-agent的执行状态。
请用以下命令确认 GitLab Agent 是否正在运行。
kubectl get all -n gitlab-agent
看起来没有问题。
尝试测试Kubernetes。
我将从.gitlab-ci.yaml文件中的作业尝试连接到Kubernetes集群。
创建.gitlab-ci.yml文件。
以下のような内容で.gitlab-ci.ymlファイルをGitリポジトリ直下に作成します。
重要なポイントは、kubectl config use-contextです。
kubeconfig内のcontextsを指定しますが、このkubeconfigはKubernetesクラスターを作ったときに出てくるkubeconfigではなくて、GitLab Agent用にCI/CDジョブ実行時に自動的に生成されるものです。
<グループ名>/<プロジェクト名>:の指定方法が分からない場合は、kubectl config get-contextsで出てきたName部分を指定すれば問題ありません。kubectl config use-contextがないと動きませんでした(defaultじゃないので)
deploy:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: ['']
script:
- kubectl config get-contexts
- kubectl config use-context <グループ名>/<プロジェクト名>:<GitLab Agent名>
- kubectl get pods -A
确认作业执行状态
5. なぜこんなことができるの?
ジョブ実行時にkubeconfigが自動的に生成されて、Runnerのジョブ上で読み取れるようになるからkubectlを実行してKubernetesクラスターを操作できるのですが、RunnerはKubernetesクラスターの場所を知らないのにkubectlが実行できるのは不思議です。
我来查看一下 kubeconfig。
我将在之前的.gitlab-ci.yml文件中添加以下内容,并且只需要一行。
kubectl 配置查看 –原始格式
如下所示。
deploy:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: ['']
script:
- kubectl config get-contexts
- kubectl config use-context <グループ名>/<プロジェクト名>:<GitLab Agent名>
- kubectl get pods -A
- kubectl config view --raw
追加で出力された結果
clusters.cluster.server通常用于连接Kubernetes集群的API接入点,但是它指的是GitLab服务器。
GitLab服务器充当代理,并与Kubernetes集群建立连接。
当在Runner上执行GitLab CI/CD内的作业时,kubeconfig会自动设置,并且连接目标是GitLab的KAS。
KAS为已安装GitLab Agent的Kubernetes集群提供隧道,并执行kubectl命令。
7. 怎么使用?
由于工作中可以执行kubectl命令,所以只需将Kubernetes的manifest文件放置在Git仓库中,然后使用kubectl apply -f ./manifest.yaml命令即可。
deploy:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: ['']
script:
- kubectl config use-context <グループ名>/<プロジェクト名>:<GitLab Agent名>
- kubectl apply -f ./manifest.yaml
如果一张图片加入了Kustomize或Helm,同样可以应用到Kubernetes集群中。
6. 总结
-
- GitLab Agent for Kubernetesは、Kubernetesクラスターへ安全に接続するための方法です。
- GitLab Runnerから安全にKubernetesクラスターへ接続することができます。
7. 资料来源
在Kubernetes上安装GitLab代理 | GitLab
https://docs.gitlab.com/ee/user/clusters/agent/install/index.html
激活GitOps:使用GitLab代理在AWS EKS上部署安全微服务::GitLab适用于EKS
https://gitlab-for-eks.awsworkshop.io/
2022年6月1日的《GitLab Kubernetes代理工作示例用于培训和演示》使用方法:
https://youtu.be/RGs65Zi-Tno。