Deploying Kubernetes (K8s) with GitHub: A Step-by-Step Tutorial – wiki基地

使用 GitHub 部署 Kubernetes (K8s):一步步教程

Kubernetes (K8s) 作为容器编排的领头羊,已经成为现代云原生应用部署的首选平台。而 GitHub,作为代码托管和协作的中心,提供了强大的自动化和版本控制能力,能够极大地简化 Kubernetes 应用的部署流程。 本教程将带你一步一步地了解如何利用 GitHub Actions 和其他工具,实现 Kubernetes 集群的自动化部署,从而提高效率、减少人为错误并确保应用部署的可重复性。

为什么使用 GitHub 部署 Kubernetes 应用?

将 GitHub 与 Kubernetes 部署流程相结合,可以带来诸多优势:

  • 版本控制: GitHub 提供代码和配置的完整版本控制,便于追踪变更、回滚到之前的版本,并进行协作开发。
  • 自动化: GitHub Actions 可以自动化构建、测试和部署流程,减少手动操作,提高效率。
  • 持续集成/持续部署 (CI/CD): 通过 GitHub Actions 建立 CI/CD 管道,可以实现代码变更后自动构建、测试和部署应用,加速迭代周期。
  • 基础设施即代码 (IaC): 使用 Terraform 或其他 IaC 工具,可以将 Kubernetes 集群和应用的配置定义为代码,并存储在 GitHub 中,实现基础设施的可重复性和自动化管理。
  • 协作与审计: GitHub 提供强大的协作功能,允许多个开发人员参与部署流程,并提供清晰的审计日志,方便追踪变更和问题。
  • 安全性: 可以通过 GitHub Secret Management 安全地存储敏感信息,如 API 密钥和密码。

前提条件

在开始本教程之前,请确保你已经具备以下条件:

  • 一个有效的 GitHub 账户: 这是使用 GitHub Actions 的基础。
  • 一个 Kubernetes 集群: 可以使用 Minikube、Kind 或云供应商(如 AWS EKS、Google GKE、Azure AKS)提供的集群。
  • kubectl 客户端: 用于与 Kubernetes 集群交互的命令行工具。
  • Helm (可选): 用于管理 Kubernetes 应用的包管理器。
  • Docker (可选): 如果你需要构建和推送 Docker 镜像。
  • Terraform (可选): 如果你想使用 IaC 来管理 Kubernetes 基础设施。
  • 对 Kubernetes 概念的理解: 比如 Pods、Deployments、Services 等。

步骤 1:创建 Kubernetes 配置文件

首先,我们需要创建 Kubernetes 的配置文件,定义应用的部署方式。 这些文件通常以 YAML 格式编写,描述了诸如 Deployment、Service、ConfigMap 等 Kubernetes 资源。

  • Deployment: 定义应用的部署,包括镜像、副本数量、资源限制等。
  • Service: 定义如何暴露应用,可以通过 ClusterIP、NodePort 或 LoadBalancer 等方式。
  • ConfigMap: 用于存储应用的配置信息。
  • Secret: 用于存储敏感信息,如密码和 API 密钥。

假设我们要部署一个简单的 Nginx 应用,可以创建以下配置文件:

“`yaml

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
– name: nginx
image: nginx:latest
ports:
– containerPort: 80

service.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
– protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
“`

将这些文件保存在你的 GitHub 仓库中,例如,k8s/deployment.yamlk8s/service.yaml

步骤 2:配置 Kubernetes 访问权限

为了让 GitHub Actions 能够与你的 Kubernetes 集群交互,你需要配置适当的访问权限。 这通常涉及以下步骤:

  1. 创建 Service Account: 在 Kubernetes 集群中创建一个 Service Account,专门用于 GitHub Actions。
  2. 创建 Role 和 RoleBinding: 创建一个 Role,定义 Service Account 拥有的权限,例如,可以创建、更新和删除 Deployment 和 Service。然后,创建一个 RoleBinding,将 Role 绑定到 Service Account。
  3. 获取 Service Account Token: 获取 Service Account 的 Token,用于身份验证。

以下是一个示例 YAML 文件,用于创建 Service Account、Role 和 RoleBinding:

“`yaml

rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
name: github-actions


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: github-actions-role
rules:
– apiGroups: [“”, “apps”, “extensions”]
resources: [“pods”, “deployments”, “services”, “configmaps”, “secrets”]
verbs: [“get”, “list”, “watch”, “create”, “update”, “patch”, “delete”]


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: github-actions-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: github-actions-role
subjects:
– kind: ServiceAccount
name: github-actions
namespace: default
“`

使用 kubectl apply -f rbac.yaml 命令将这些资源应用到你的 Kubernetes 集群。

获取 Service Account 的 Token:

bash
kubectl get secret $(kubectl get serviceaccount github-actions -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode

将获取到的 Token 保存下来,稍后会用到。

步骤 3:配置 GitHub Secrets

为了安全地存储 Kubernetes 集群的连接信息和 Service Account Token,我们需要将它们添加到 GitHub Secrets 中。

  1. 进入你的 GitHub 仓库,点击 “Settings” -> “Secrets” -> “Actions”。
  2. 点击 “New repository secret”。
  3. 创建以下 Secrets:
    • KUBE_API_SERVER: Kubernetes API Server 的地址。 可以通过 kubectl cluster-info 命令获取。
    • KUBE_TOKEN: 上一步获取的 Service Account Token。
    • KUBE_NAMESPACE: Kubernetes 集群的命名空间,通常是 default

步骤 4:创建 GitHub Actions Workflow

现在,我们可以创建 GitHub Actions Workflow,定义自动化部署流程。 Workflow 文件通常位于 .github/workflows 目录下,以 YAML 格式编写。

以下是一个示例 Workflow 文件,用于部署 Nginx 应用:

“`yaml

.github/workflows/deploy.yaml

name: Deploy to Kubernetes

on:
push:
branches:
– main # 触发 Workflow 的分支

jobs:
deploy:
runs-on: ubuntu-latest

steps:
  - name: Checkout code
    uses: actions/checkout@v3

  - name: Configure Kubeconfig
    run: |
      mkdir -p ~/.kube
      echo "${{ secrets.KUBE_API_SERVER }}" > ~/.kube/config
      echo "apiVersion: v1" >> ~/.kube/config
      echo "clusters:" >> ~/.kube/config
      echo "- cluster:" >> ~/.kube/config
      echo "    server: ${{ secrets.KUBE_API_SERVER }}" >> ~/.kube/config
      echo "  name: k8s-cluster" >> ~/.kube/config
      echo "contexts:" >> ~/.kube/config
      echo "- context:" >> ~/.kube/config
      echo "    cluster: k8s-cluster" >> ~/.kube/config
      echo "    user: github-actions" >> ~/.kube/config
      echo "  name: github-actions" >> ~/.kube/config
      echo "current-context: github-actions" >> ~/.kube/config
      echo "kind: Config" >> ~/.kube/config
      echo "preferences: {}" >> ~/.kube/config
      echo "users:" >> ~/.kube/config
      echo "- name: github-actions" >> ~/.kube/config
      echo "  user:" >> ~/.kube/config
      echo "    token: ${{ secrets.KUBE_TOKEN }}" >> ~/.kube/config

  - name: Apply Kubernetes manifests
    run: |
      kubectl apply -f k8s/deployment.yaml -n ${{ secrets.KUBE_NAMESPACE }}
      kubectl apply -f k8s/service.yaml -n ${{ secrets.KUBE_NAMESPACE }}

“`

这个 Workflow 做了以下事情:

  1. 触发条件 (on):main 分支有新的代码提交时,触发 Workflow。
  2. 运行环境 (runs-on): 在 Ubuntu 虚拟机上运行。
  3. 步骤 (steps):
    • Checkout code: 检出代码。
    • Configure Kubeconfig: 配置 Kubernetes 的 kubeconfig 文件,用于连接到集群。这里使用了之前存储在 GitHub Secrets 中的 API Server 地址和 Token。
    • Apply Kubernetes manifests: 使用 kubectl apply 命令将 deployment.yamlservice.yaml 文件应用到 Kubernetes 集群。

步骤 5:提交代码并触发 Workflow

将 Workflow 文件提交到 GitHub 仓库的 main 分支。 这将自动触发 Workflow 的执行。

你可以进入 GitHub 仓库的 “Actions” 标签页,查看 Workflow 的执行状态。 如果一切顺利,你应该看到 Nginx 应用成功部署到你的 Kubernetes 集群中。

进阶:使用 Helm 管理应用

Helm 是 Kubernetes 的包管理器,可以简化应用的部署和管理。 如果你的应用比较复杂,建议使用 Helm 来管理。

  1. 创建 Helm Chart: 创建一个 Helm Chart,定义应用的部署配置。
  2. 使用 Helm Action: 在 GitHub Actions Workflow 中使用 Helm Action 来部署应用。

以下是一个示例 Helm Chart 的目录结构:

nginx-chart/
├── Chart.yaml
├── templates/
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml

Chart.yaml 文件描述 Chart 的基本信息。 templates 目录下存放 Kubernetes 资源的模板文件。 values.yaml 文件定义模板变量的默认值。

一个简化的 Chart.yaml 如下:

yaml
apiVersion: v2
name: nginx-chart
description: A simple Nginx chart
type: application
version: 0.1.0
appVersion: "1.16.0"

一个简化的 values.yaml 如下:

yaml
replicaCount: 3
image:
repository: nginx
tag: latest
pullPolicy: IfNotPresent
service:
type: LoadBalancer
port: 80

然后,修改 Workflow 文件,使用 Helm Action 部署应用:

“`yaml

.github/workflows/deploy.yaml

name: Deploy to Kubernetes with Helm

on:
push:
branches:
– main

jobs:
deploy:
runs-on: ubuntu-latest

steps:
  - name: Checkout code
    uses: actions/checkout@v3

  - name: Configure Kubeconfig
    run: |
      mkdir -p ~/.kube
      echo "${{ secrets.KUBE_API_SERVER }}" > ~/.kube/config
      echo "apiVersion: v1" >> ~/.kube/config
      echo "clusters:" >> ~/.kube/config
      echo "- cluster:" >> ~/.kube/config
      echo "    server: ${{ secrets.KUBE_API_SERVER }}" >> ~/.kube/config
      echo "  name: k8s-cluster" >> ~/.kube/config
      echo "contexts:" >> ~/.kube/config
      echo "- context:" >> ~/.kube/config
      echo "    cluster: k8s-cluster" >> ~/.kube/config
      echo "    user: github-actions" >> ~/.kube/config
      echo "  name: github-actions" >> ~/.kube/config
      echo "current-context: github-actions" >> ~/.kube/config
      echo "kind: Config" >> ~/.kube/config
      echo "preferences: {}" >> ~/.kube/config
      echo "users:" >> ~/.kube/config
      echo "- name: github-actions" >> ~/.kube/config
      echo "  user:" >> ~/.kube/config
      echo "    token: ${{ secrets.KUBE_TOKEN }}" >> ~/.kube/config

  - name: Install Helm
    uses: azure/setup-helm@v3
    with:
      version: v3.8.0 # 可根据实际情况调整

  - name: Deploy with Helm
    run: |
      helm upgrade --install my-nginx ./nginx-chart -n ${{ secrets.KUBE_NAMESPACE }}

“`

这个 Workflow 使用了 azure/setup-helm@v3 Action 来安装 Helm,然后使用 helm upgrade --install 命令来部署 Helm Chart。

进阶:使用 Terraform 管理基础设施

Terraform 是一种流行的 IaC 工具,可以用来管理 Kubernetes 集群和应用的基础设施。

  1. 创建 Terraform 配置文件: 创建 Terraform 配置文件,定义 Kubernetes 集群和应用的资源。
  2. 使用 Terraform Action: 在 GitHub Actions Workflow 中使用 Terraform Action 来创建和管理基础设施。

这部分内容较为复杂,需要对 Terraform 有一定的了解。 可以参考 Terraform 的官方文档和相关的教程来学习如何使用 Terraform 管理 Kubernetes 基础设施。

总结

本教程详细介绍了如何使用 GitHub Actions 和其他工具,实现 Kubernetes 应用的自动化部署。 通过将 GitHub 与 Kubernetes 集成,可以极大地提高效率、减少人为错误并确保应用部署的可重复性。 你可以根据自己的实际需求,选择不同的工具和方法,构建适合你的 CI/CD 管道。 记住,安全地存储敏感信息(如 API 密钥和密码)至关重要。 始终使用 GitHub Secrets 来管理这些信息。

通过本文的学习,你应该能够:

  • 了解使用 GitHub 部署 Kubernetes 应用的优势。
  • 配置 Kubernetes 集群的访问权限,并将其安全地存储在 GitHub Secrets 中。
  • 创建 GitHub Actions Workflow,自动化部署 Kubernetes 应用。
  • 使用 Helm 管理 Kubernetes 应用。
  • 了解如何使用 Terraform 管理 Kubernetes 基础设施。

希望本教程对你有所帮助! 祝你部署顺利!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部