通过使用 GitHub Actions,在家中实现简易的 GitOps(Azure Arc 兼容的 Kubernetes 使用)
首先
这篇文章是参加了 Qiita Engineer Fest 2022 的关于如何使用 GitHub Actions 的个人经验分享。
由于要进行学习,我在家运行了一个Kubernetes集群,所以我想将其与GitHub Actions相结合。
当我在考虑如何从GitHub Actions访问我的家庭集群时,我发现了Azure Arc支持的Kubernetes功能,可以从任何地方访问集群。
在本篇文章中,我将解释如何将Kubernetes集群连接到Azure Arc,并在GitHub Actions中进行操作。
环境

以下是Kubernetes集群的环境情况。
-
- ノードOS: Ubuntu Server 22.04
- Kubernetesバージョン: 1.24.2
要使用Azure Arc兼容的Kubernetes,集群必须至少有一个amd64节点。
遗憾的是,无法在仅使用常见的Raspberry Pi构建的集群中引入Azure Arc。请添加amd64节点。
设置 Azure Arc 兼容的 Kubernetes
按照公式文件中的步骤进行操作。
准备工作
在Azure CLI中安装connectedk8s扩展功能。
az extension add --name connectedk8s
当您要更新已安装的扩展功能时,请执行以下命令。
az extension update --name connectedk8s
安装适用于 Azure Arc 的 Kubernetes 提供者。
az provider register --namespace Microsoft.Kubernetes
az provider register --namespace Microsoft.KubernetesConfiguration
az provider register --namespace Microsoft.ExtendedLocation
只要三个都注册成功就可以了。
$ az provider show -n Microsoft.Kubernetes -o table
Namespace RegistrationPolicy RegistrationState
-------------------- -------------------- -------------------
Microsoft.Kubernetes RegistrationRequired Registered
$ az provider show -n Microsoft.KubernetesConfiguration -o table
Namespace RegistrationPolicy RegistrationState
--------------------------------- -------------------- -------------------
Microsoft.KubernetesConfiguration RegistrationRequired Registered
$ az provider show -n Microsoft.ExtendedLocation -o table
Namespace RegistrationPolicy RegistrationState
-------------------------- -------------------- -------------------
Microsoft.ExtendedLocation RegistrationRequired Registered
在中国以本地语言转述以下内容,只需提供一种选择:
将创建资源组。在此处,名称为 AzureArc,将其创建在东日本地区。
az group create --name AzureArc --location japaneast
以上就是预先准备工作完成了。
将Kubernetes集群连接到Azure Arc
使用以下命令将Kubernetes集群连接到Azure Arc。
使用 –name 参数来设置在Azure上的名称。这里我设置为 HomeCluster。
az connectedk8s connect --name HomeCluster --resource-group AzureArc

另外,在Kubernetes上,可以确认在azure-arc Namespace下启动了Pod。
$ kubectl get pod -n azure-arc
NAME READY STATUS RESTARTS AGE
cluster-metadata-operator-855c68dcf8-l62w2 2/2 Running 0 6m55s
clusterconnect-agent-77496f7c5c-txjnx 3/3 Running 0 6m55s
clusteridentityoperator-6d74bff55b-89lf8 2/2 Running 0 6m55s
config-agent-65b55bccd9-ph4vr 2/2 Running 0 6m55s
controller-manager-7fcbd6585d-ss5hx 2/2 Running 0 6m55s
extension-manager-767db884cd-bs54v 2/2 Running 0 6m55s
flux-logs-agent-68bc745586-qjd8q 1/1 Running 0 6m55s
kube-aad-proxy-fdf494d66-htn9v 2/2 Running 0 6m55s
metrics-agent-7d6844cd4c-qblcj 2/2 Running 0 6m55s
resource-sync-agent-5d755f9d6f-vgml7 2/2 Running 0 6m55s
集群连接配置
通过使用Azure Arc兼容的Kubernetes集群连接功能,您可以通过Azure在没有网络连接的Kubernetes集群的位置进行操作。
根据官方文档提供的步骤进行操作。
(截至2022年07月02日,部分步骤在日语版文档中无法正常运行,因此参考英语版文档进行操作)
请通过以下命令启用集群连接功能。
az connectedk8s enable-features --features cluster-connect -n HomeCluster -g AzureArc
接下来,我们将创建一个用于连接的服务账户。
在这里,我们将在 Azure Arc 命名空间下创建一个名为 arc-admin 的服务账户。
kubectl create serviceaccount arc-admin -n azure-arc
接下来,创建ClusterRoleBinding并为服务账号授予访问权限。
kubectl create clusterrolebinding arc-admin-binding --clusterrole cluster-admin --serviceaccount azure-arc:arc-admin
最后获取服务账号的令牌。
通过以下命令生成密钥。
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: arc-admin-secret
namespace: azure-arc
annotations:
kubernetes.io/service-account.name: arc-admin
type: kubernetes.io/service-account-token
EOF
获取令牌。
TOKEN=$(kubectl get secret arc-admin-secret -n azure-arc -o jsonpath='{$.data.token}' | base64 -d | sed $'s/$/\\\n/g')
之后会使用获得的令牌。
到目前为止,Azure Arc支持Kubernetes的准备工作已经完成。
准备GitHub Actions
我們將從這裡開始準備在Azure Arc相容的Kubernetes上部署GitHub Actions。
创建一个GitHub存储库
首先我们来创建一个GitHub仓库。我们将使用GitHub命令行工具进行操作。
gh repo create homecluster-manage --private
OpenID Connect 开放式身份认证
为了在 GitHub Actions 中操作 Azure 资源,我们将使用 OpenID Connect。你可以手动进行设置,但由于 Microsoft 提供了一个名为 Draft 的工具,使用它可以更方便地进行设置,所以这次我们将使用它。
将 aks-preview 扩展功能添加到 Azure CLI 中。
az extension add --name aks-preview
如果之前已經安裝了,可以使用以下命令來進行更新。
az extension update --name aks-preview
如果您已经安装了扩展功能,可以使用以下命令启动草稿。
az aks draft setup-gh
开始后会显示对话形式的提示符,按顺序输入即可。
# Azure AD に登録するアプリの名前を入力
✔ Enter app registration name: homecluster-gitops
# Azure サブスクリプションを選択する
Use the arrow keys to navigate: ↓ ↑ → ←
✔ ########-####-####-####-############
? Please choose the subscription ID you would like to use.:
# Azure リソースグループの名前を入力
✔ Enter resource group name: AzureArc
# GitHub リポジトリの名前を入力
✔ Enter github organization and repo (organization/repoName): ussvgr/homecluster-manage
[Draft] Draft has successfully set up Github OIDC for your project ?
[Draft] Use 'draft generate-workflow' to generate a Github workflow to build and deploy an application on AKS.

增加令牌
为了在Azure Arc上操作通过GitHub Actions创建的Kubernetes,将在上一步创建的令牌添加到GitHub Actions的Secrets中。
在这里,我们将使用GitHub CLI。我们将创建一个名为SA_TOKEN的Secret。
gh secret set SA_TOKEN --app actions --body $TOKEN --repo ussvgr/homecluster-manage
准备清单和工作流程
我将准备在Kubernetes集群部署的清单以及GitHub Actions的工作流程。
请在本地目录中按照以下配置放置文件。
.
├── .github
│ └── workflows
│ └── deploy-to-arc.yaml
└── manifests
└── sampleapp.yaml
以下是每个文件的内容:
这里是 GitHub Actions 的工作流程。
name: deploy to Azure Arc Enabled Kubernetes
"on":
push:
branches:
- main
workflow_dispatch: null
env:
DEPLOYMENT_MANIFEST_PATH: ./manifests
jobs:
deploy:
permissions:
actions: read
contents: read
id-token: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Azure login
uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
- name: Get K8s context
uses: azure/k8s-set-context@v3
with:
method: service-account
cluster-type: arc
cluster-name: HomeCluster
resource-group: AzureArc
token: ${{ secrets.SA_TOKEN }}
- name: Deploys application
uses: Azure/k8s-deploy@v4
with:
action: deploy
manifests: ${{ env.DEPLOYMENT_MANIFEST_PATH }}
以下是要在Kubernetes上部署的清单文件。
这只是一个简单的示例应用,以名称为sampleapp为基础,仅启动nginx。
---
apiVersion: v1
kind: Service
metadata:
name: sampleapp
spec:
type: LoadBalancer
selector:
app: sampleapp
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sampleapp
labels:
app: sampleapp
spec:
replicas: 1
selector:
matchLabels:
app: sampleapp
template:
metadata:
labels:
app: sampleapp
spec:
containers:
- name: sampleapp
image: nginx:latest
ports:
- containerPort: 80
请按时归还图书
使用GitHub Actions进行部署
由于前面的工作已经完成,现在我们可以将其推送到GitHub并启动GitHub Actions。
git init
git add -A
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:ussvgr/homecluster-manage
git push -u origin main

在 Kubernetes 集群中部署了 sampleapp!
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
sampleapp-596d47dffb-6szm7 1/1 Running 0 30s
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 53d
sampleapp LoadBalancer 10.100.6.247 192.168.11.0 80:32533/TCP 37s

最后
如果要在支持Azure Arc的Kubernetes上执行正式的GitOps,最常见的做法是使用最近通用可用的Flux v2。
然而,需要注意的是,使用Flux v2可能会导致一些费用,具体取决于Kubernetes集群的规模。
希望尽量不花太多钱的用户,即使是简单的事情也可以使用GitHub Actions来完成,这是一个介绍。
希望能对大家在家使用Kubernetes运营有所帮助。