使用 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.yaml
和 k8s/service.yaml
。
步骤 2:配置 Kubernetes 访问权限
为了让 GitHub Actions 能够与你的 Kubernetes 集群交互,你需要配置适当的访问权限。 这通常涉及以下步骤:
- 创建 Service Account: 在 Kubernetes 集群中创建一个 Service Account,专门用于 GitHub Actions。
- 创建 Role 和 RoleBinding: 创建一个 Role,定义 Service Account 拥有的权限,例如,可以创建、更新和删除 Deployment 和 Service。然后,创建一个 RoleBinding,将 Role 绑定到 Service Account。
- 获取 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 中。
- 进入你的 GitHub 仓库,点击 “Settings” -> “Secrets” -> “Actions”。
- 点击 “New repository secret”。
- 创建以下 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 做了以下事情:
- 触发条件 (on): 当
main
分支有新的代码提交时,触发 Workflow。 - 运行环境 (runs-on): 在 Ubuntu 虚拟机上运行。
- 步骤 (steps):
- Checkout code: 检出代码。
- Configure Kubeconfig: 配置 Kubernetes 的 kubeconfig 文件,用于连接到集群。这里使用了之前存储在 GitHub Secrets 中的 API Server 地址和 Token。
- Apply Kubernetes manifests: 使用
kubectl apply
命令将deployment.yaml
和service.yaml
文件应用到 Kubernetes 集群。
步骤 5:提交代码并触发 Workflow
将 Workflow 文件提交到 GitHub 仓库的 main
分支。 这将自动触发 Workflow 的执行。
你可以进入 GitHub 仓库的 “Actions” 标签页,查看 Workflow 的执行状态。 如果一切顺利,你应该看到 Nginx 应用成功部署到你的 Kubernetes 集群中。
进阶:使用 Helm 管理应用
Helm 是 Kubernetes 的包管理器,可以简化应用的部署和管理。 如果你的应用比较复杂,建议使用 Helm 来管理。
- 创建 Helm Chart: 创建一个 Helm Chart,定义应用的部署配置。
- 使用 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 集群和应用的基础设施。
- 创建 Terraform 配置文件: 创建 Terraform 配置文件,定义 Kubernetes 集群和应用的资源。
- 使用 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 基础设施。
希望本教程对你有所帮助! 祝你部署顺利!