注意:

启用 GitHub 操作工作流以使用 OKE OpenID Connect 验证访问 Kubernetes 集群

简介

在本教程中,我们授权 GitHub 操作工作流在 Oracle Cloud Infrastructure Kubernetes Engine(OCI Kubernetes Engine 或 OKE)集群中执行 Kubernetes 命令。通过使用 GitHub 的原生 OpenID Connect (OIDC) 验证,您可以避免管理长期身份证明并简化对 OKE 集群的安全自动化访问,从而实现更高效的连续集成和连续部署 (Continuous Integration and Continuous Deployment,CI/CD) 工作流。

目标

任务 1:创建 GitHub 资料档案库

在 GitHub 帐户中创建新系统信息库。输入您的帐户名称或组织名称以及资料档案库的名称。

任务 2:配置 OKE 群集

  1. 使用 OKE 创建 Kubernetes 集群,或选择现有集群以更新和记下集群 Oracle Cloud 标识符 (OCID)。有关更多信息,请参见 Creating Kubernetes Clusters Using Console Workflows

  2. 创建 JSON 文件以使用以下信息更新集群。

    • isOpenIdConnectAuthEnabled:输入 true
    • issuerUrl:输入 "https://token.actions.githubusercontent.com"
    • clientId:输入值。在本示例中,我们使用 "oke-kubernetes-cluster"。此值必须与 GitHub“操作”工作流中的受众匹配。
    • requiredClaim:输入 ["repository=GH_ACCOUNT/REPO", "workflow=NAME", "ref=refs/heads/main"]
    • usernameClaim:输入 "sub"
    • usernamePrefix:输入 "actions-oidc:"

    GH_ACCOUNTREPO 值替换为您的值。JSON 文件的外观应为:

    {
        "openIdConnectTokenAuthenticationConfig": {
          "isOpenIdConnectAuthEnabled": true,
          "clientId": "oke-kubernetes-cluster",
          "issuerUrl": "https://token.actions.githubusercontent.com",
          "usernameClaim": "sub",
          "usernamePrefix": "actions-oidc:",
          "requiredClaim": [
            "repository=gregvers/testoidc",
            "workflow=oke-oidc",
            "ref=refs/heads/main"
          ],
          "caCertificate": null,
          "signingAlgorithms": [
            "RS256"
          ]
        }
    }
    
  3. 运行 OCI 命令行界面 (CLI) 命令以使用 JSON 文件更新集群。将 CLUSTER_OCID 替换为您的值。

    oci ce cluster update --cluster-id CLUSTER_OCID --from-json file://./update.json
    

任务 3:配置出站网络通信

通过将安全规则添加到分配给集群 Kubernetes API 端点的安全规则的子网安全列表中,允许集群 API 服务器将流量传出到 GitHub。

任务 4:配置基于 Kubernetes 角色的访问控制 (Role Based Access Control,RBAC)

使用以下 YAML 文件在 Kubernetes 集群中配置 RBAC 以授权 GitHub 操作工作流执行某些操作(get/watch/list pods 和 get/watch/list/create/update/delete deployment)。使用 GitHub 帐户名称和系统信息库名称更新以下行:"name: actions-oidc:repo:GH-ACCOUNT/REPO:ref:refs/heads/main"

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: actions-oidc-role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "watch", "list"]
  - apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get", "watch", "list", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: actions-oidc-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: actions-oidc-role
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: actions-oidc:repo:GH-ACCOUNT/REPO:ref:refs/heads/main

任务 5:配置 GitHub 操作

在 GitHub 资料档案库中创建 GitHub 操作工作流。

  1. 单击操作自行设置工作流

  2. 将以下代码粘贴到编辑器中并使用集群的公共 IP 更新 server="https://X.X.X.X:6443"

    name: OKE-OIDC
    
    on:
      # Triggers the workflow on push or pull request events but only for the "main" branch
      push:
        branches: [ "main" ]
      pull_request:
        branches: [ "main" ]
    
      # Allows you to run this workflow manually from the Actions tab
      workflow_dispatch:
    
    permissions:
      id-token: write # Required to receive OIDC tokens
    
    # This workflow generates a GitHub Actions OIDC token and runs kubectl command in an OKE cluster
    jobs:
      oke-oidc:
        runs-on: ubuntu-latest
        steps:
          - name: Create OIDC Token
            id: create-oidc-token
            run: |
              AUDIENCE="oke-kubernetes-cluster"
              OIDC_URL_WITH_AUDIENCE="$ACTIONS_ID_TOKEN_REQUEST_URL&audience=$AUDIENCE"
              IDTOKEN=$(curl \
                -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
                -H "Accept: application/json; api-version=2.0" \
                "$OIDC_URL_WITH_AUDIENCE" | jq -r .value)
              echo "::add-mask::${IDTOKEN}"
              echo "idToken=${IDTOKEN}" >> $GITHUB_OUTPUT
    
          - name: Check Permissions in Kubernetes
            run: |
              kubectl \
              --token=$ \
              --server="https://X.X.X.X:6443" \
              --insecure-skip-tls-verify \
              auth can-i --list
    

    Github 操作工作流将自动运行。kubectl 命令将返回您使用 RBAC 配置授权的操作(get/watch/list pods 和 get/watch/list/create/update/delete 部署)。

    GitHub 操作工作流执行

    插图 github-actions-workflow.png 的说明

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心