# K8s 集群部署

URL: https://caijiao.org/postgresql/extras/kubernetes/k8s
Source: docs/postgresql/extras/kubernetes/k8s.md
Description: 本章节介绍如何在 Kubernetes 集群上部署 PostgreSQL，包括集群的配置、管理以及容器化部署流程。

Kubernetes (K8s) 是一种开源容器编排平台，可以自动化容器的部署、扩展和管理。在本章节中，我们将介绍如何在 Kubernetes 集群中部署 PostgreSQL，包括集群的配置和管理。

## 1. 准备 Kubernetes 集群

### 1.1 本地部署 Kubernetes

如果您没有现成的 Kubernetes 集群，可以使用以下方法部署本地集群：

- 使用 [Minikube](https://minikube.sigs.k8s.io/docs/) 部署一个单节点 Kubernetes 集群。
- 使用 [K3s](https://k3s.io/) 部署轻量级 Kubernetes 集群。

### 1.2 使用云服务提供商的 Kubernetes 集群

大多数云服务提供商（如 AWS、Azure 和 GCP）都提供托管的 Kubernetes 服务。您可以通过相应的控制台或命令行工具（如 `eksctl`、`gcloud` 或 `az aks`）创建和管理 Kubernetes 集群。

## 2. 创建 PostgreSQL 部署

### 2.1 编写 PostgreSQL 部署配置

首先，创建一个 `postgres-deployment.yaml` 文件，定义 PostgreSQL 的部署。该文件描述了 PostgreSQL 容器如何在 Kubernetes 集群中运行。

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:latest
          env:
            - name: POSTGRES_PASSWORD
              value: "mysecretpassword"
            - name: POSTGRES_DB
              value: "mydatabase"
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: postgres-storage
              mountPath: /var/lib/postgresql/data
      volumes:
        - name: postgres-storage
          persistentVolumeClaim:
            claimName: postgres-pvc
````

### 2.2 创建 PersistentVolumeClaim (PVC)

PostgreSQL 的数据需要持久化存储。在 Kubernetes 中，我们可以使用 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来管理持久化存储。以下是一个 `postgres-pvc.yaml` 文件，用于声明一个持久化存储卷。

```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
```

### 2.3 创建 PostgreSQL 服务

为了允许外部访问 PostgreSQL 服务，我们需要创建一个 Kubernetes 服务。以下是一个 `postgres-service.yaml` 文件，用于暴露 PostgreSQL 容器的端口。

```yaml
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
  clusterIP: None
```

## 3. 部署 PostgreSQL 到 Kubernetes 集群

### 3.1 应用 YAML 配置

运行以下命令，将 PostgreSQL 的部署、PVC 和服务应用到 Kubernetes 集群中：

```bash
kubectl apply -f postgres-pvc.yaml
kubectl apply -f postgres-deployment.yaml
kubectl apply -f postgres-service.yaml
```

### 3.2 检查部署状态

使用以下命令检查部署状态：

```bash
kubectl get pods
```

确保 PostgreSQL 容器正在运行，并且没有出现错误。

### 3.3 获取 PostgreSQL 服务的 IP 地址

通过以下命令获取 PostgreSQL 服务的 IP 地址：

```bash
kubectl get svc postgres
```

## 4. 使用 Kubernetes 管理 PostgreSQL

### 4.1 扩展 PostgreSQL 部署

要增加 PostgreSQL 实例的副本数，可以修改 `postgres-deployment.yaml` 文件中的 `replicas` 字段，然后重新应用配置：

```bash
kubectl apply -f postgres-deployment.yaml
```

### 4.2 更新 PostgreSQL 配置

如果需要更新 PostgreSQL 配置，您可以修改部署配置并重新应用：

```bash
kubectl apply -f postgres-deployment.yaml
```

### 4.3 删除 PostgreSQL 部署

如果您不再需要 PostgreSQL 部署，可以运行以下命令删除相关资源：

```bash
kubectl delete -f postgres-pvc.yaml
kubectl delete -f postgres-deployment.yaml
kubectl delete -f postgres-service.yaml
```

## 5. 使用 Helm 部署 PostgreSQL

[Helm](https://helm.sh/) 是 Kubernetes 的包管理工具，可以简化应用程序的部署。您可以使用 Helm Charts 部署 PostgreSQL。以下是使用 Helm 部署 PostgreSQL 的步骤。

### 5.1 安装 Helm

首先，您需要安装 Helm。如果尚未安装，可以参考官方文档进行安装。

### 5.2 部署 PostgreSQL

运行以下命令安装 PostgreSQL：

```bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-postgres bitnami/postgresql
```

### 5.3 配置 PostgreSQL

您可以通过修改 `values.yaml` 文件来定制 PostgreSQL 的配置，然后使用以下命令安装：

```bash
helm install my-postgres -f values.yaml bitnami/postgresql
```

### 5.4 卸载 PostgreSQL

如果您不再需要 PostgreSQL，可以使用以下命令卸载：

```bash
helm uninstall my-postgres
```

## 6. 总结

使用 Kubernetes 部署 PostgreSQL 能够提供更高的可伸缩性和自动化管理。您可以使用 YAML 配置文件直接定义 PostgreSQL 的部署和服务，或者使用 Helm Charts 快速安装和管理 PostgreSQL。在生产环境中，Kubernetes 提供了高可用性、自动扩展和集群管理功能，是运行 PostgreSQL 数据库的理想平台。
