通过使用 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中进行操作。

环境

20220619_qiita_githubactions1.drawio (1).png

以下是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
image.png

另外,在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.
image.png

增加令牌

为了在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
image.png

在 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
image.png

最后

如果要在支持Azure Arc的Kubernetes上执行正式的GitOps,最常见的做法是使用最近通用可用的Flux v2。
然而,需要注意的是,使用Flux v2可能会导致一些费用,具体取决于Kubernetes集群的规模。

希望尽量不花太多钱的用户,即使是简单的事情也可以使用GitHub Actions来完成,这是一个介绍。
希望能对大家在家使用Kubernetes运营有所帮助。

bannerAds