转载备份
影子 DOM(Shadow DOM)
你的 docker stop,它优雅吗? - 无糖拿铁,谢谢
清理Docker的container,image与volume · 零壹軒·笔记
Create a PyPI Mirror Site with devpi-server – SRE
优雅的终止 docker 容器 | iTimothy
Odoo 14 开发者指南第二十一章 性能优化 | Alan Hou 的个人博客
Odoo 14 开发者指南第八章 高级服务端开发技巧 | Alan Hou 的个人博客
kafka 系列:设置日志数据保存过期时间(含某个 topic)、日志策略_NIO4444-CSDN 博客_kafka 配置数据过期时间
Chromium 历史版本离线安装包 - 下载方法
怎样将 props 传递给 {this.props.children} | WebFuse
HappyBaseDoc
用户指南 — HappyBase 1.2.0 文档
安装指南 — HappyBase 1.2.0 文档
API 参考 — HappyBase 1.2.0 文档
PostgreSQL 时间转换
JS 中创建给定长度的数组
GSAP 入门 - 学习中心 - 绿袜
操作系统复习 | Happy Coding
如何理解 ip 路由和操作 linux 的路由表 - CodeAntenna
Elasticsearch 7.11 tokenizer, analyzer and filter 以及 IK 分词配置同义词、远程拓展词库 – Brave new world
podman 容器内访问 host 主机的端口 - 知识库 - BSMI KB 基础标准矿产工业
吐血总结!100 道经典 Python 面试题集锦上(附答案)
中共党史简表(1919 年 - 1949 年)
Dockerfile 详解_万 wu 皆可爱的博客 - CSDN 博客_dockerfile
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
Ubuntu Server 支持中文
docker push | Docker Documentation
docker 创建本地仓库详解 (push/pull)_乱红飞的博客 - CSDN 博客_docker push 本地仓库
基于 Ubuntu 20.04 安装 Kubernetes 1.18
PostgreSQL 集群篇——PostgreSQL 的配置文件解析_51CTO 博客_postGresql
【PostgreSQL】——主从流复制_Teingi 的博客 - CSDN 博客_postgresql 主从复制
PostgreSQL: Documentation: 14: 27.4. Hot Standby
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
Postgres 用户、角色与权限 :: 68hub — 技术博客
中国共产党第二十次全国代表大会在京开幕 一图速览二十大报告
配置 docker 通过代理服务器拉取镜像
IPVS no destination available - Kubernetes 实践指南
Python 风格规范 — Google 开源项目风格指南
互动测试!党的二十大报告 100 题
自定义 ESlint 规则
Java 读取 OpenSSL 生成的秘钥, 进行 RSA 加解密 | 数字魔法
CSS(一)chrome 浏览器表单自动填充默认样式 - autofil_半个 GIS 半个前端的博客 - CSDN 博客
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
Jenkins 环境变量
人民币金额大写规范 - 内蒙古农业大学财务处
[转]nginx 开启 websocket - 浅忆博客
ceph 创建使用 rbd
《三》配置 ceph 存储池 pool - Buxl's blog
基于 K8S 搭建 Ceph 分部署存储 – 唐玥璨 | 博客
序言 · Kubernetes 中文指南——云原生应用架构实战手册
服务器配置 - Redis 安装配置 | 灰帽子 - 任令仓的技术博客
Ubuntu 配置 sudo 命令不需要输入密码_ubuntu sudo 免密_一路向前 - 执着的博客 - CSDN 博客
修改 Docker 数据目录位置,包含镜像位置 - 腾讯云开发者社区 - 腾讯云
微服务架构实践(API Gateway)
微服务网关:从对比到选型,由理论到实践 | Java 程序员进阶之路
聊聊微服务网关
微服务网关:从对比到选型,由理论到实践
odoo 实现表分区 partition
使用 keepalived 搭建高可用服务 - 简书
业务网关的落地实践_文化 & 方法_Qunar 技术沙龙_InfoQ 精选文章
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
前端安全系列(二):如何防止 CSRF 攻击? - 美团技术团队
traefik 自定义中间件 | coolcao 的小站
CSRF 原理和实战利用 - FreeBuf 网络安全行业门户
安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客
Kubernetes 进阶使用之 Helm,Kustomize
各种加密算法比较
Docker 的三种网络代理配置 · 零壹軒 · 笔记
本文档使用 MrDoc 发布
-
+
首页
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [lihaoquan.me](https://lihaoquan.me/posts/pg-in-k8s/) 本文主要演示如何通过 Kubernetes 提供的持久化卷(PV)和 Statefulset 来部署 Pg 数据库容器。 镜像准备 ---- 我们打算使用官方提供的 Postgresql 12.1 版本:https://hub.docker.com/_/postgres 版本的镜像作为我们的部署镜像,这个版本的镜像提供了齐全的功能,并且支持我们使用编排文件配置环境变量,如用户名、密码、默认数据库、pgdata 路径等。 下面我们可以正式开始实例的演示了… 创建 PV ----- 这个步骤里我们编写第一份配置声明:pg-pv.yaml 下面是主要例子,这里我们创建一个名字为 postgresql-pv 的持久化卷,并使用`hostpath`作为 pv 的持久化类型,你也可以根据需要配置为 gce 或 nfs 等。作为测试的例子,我们先配置一个 10G 的大小。 ``` apiVersion: v1 kind: PersistentVolume metadata: name: postgresql-pv labels: type: local spec: storageClassName: manual capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: "/data/svr/pgdb" ``` 然后通过 kubectl 执行创建命令 ``` $ kubectl create -f pg-pv.yaml ``` 创建 PVC ------ 接下来,我们再创建 pvc 配置– pg-pvc.yaml ``` apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgresql-pv-claim spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 5Gi ``` 执行创建命令 ``` $ kubectl create -f pg-pvc.yaml ``` 到了这里,我们可以从环境中检查刚刚创建的资源情况: ``` $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE postgresql-pv 10Gi RWO Retain Bound default/postgresql-pv-claim manual 63m $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE postgresql-pv-claim Bound postgresql-pv 10Gi RWO manual 60m ``` 从上面的环境信息输出可以看到,postgresql-pv 的状态已经处于 Bound,这表明我们的 pv 已经我 pvc 绑定成功。 创建 Deployment ------------- 我们可以通过 Kubernetes Deployment 的方式来创建一个有状态服务,然后使用 PVC(PersistentVolumeClaim)来连接已经存在的 PV。 下面我们通过编写 Deployment 的 YAML 文件描述了一个运行 PostgreSQL 并使用 PVC 的 Deployment。文件定义了一个 mount 到 / var/lib/postgresql/data 的卷(因为官方 Pg 容器 initdb 的时候数据会创建在此) 注意:密码定义在 YAML 配置文件中,这是不安全的,建议使用 ConfigMap 的方式,这里只是方便测试,所以就直接定义在配置文件中。 pg-deployment.yaml 配置如下: ``` apiVersion: apps/v1 kind: Deployment metadata: name: postgresql-deployment spec: strategy: type: Recreate selector: matchLabels: app: postgresql template: metadata: labels: app: postgresql spec: containers: - image: postgres:12.1 name: postgresql env: - name: POSTGRES_PASSWORD value: pgsql@123 ports: - containerPort: 5432 name: postgresql volumeMounts: - name: postgresql-persistent-storage mountPath: /var/lib/postgresql/data volumes: - name: postgresql-persistent-storage persistentVolumeClaim: claimName: postgresql-pv-claim ``` 通过 kubectl 创建 Deployment ``` $ kubectl create -f pg-deployment.yaml $ kubectl get deployment -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR postgresql-deployment 1/1 1 1 1m postgresql postgres:12.1 app=postgresql ``` 此时,我们目标的 pod 也会被创建 ``` $ kubectl get pods NAME READY STATUS RESTARTS AGE postgresql-deployment-7cfb6c95db-5r2v8 1/1 Running 0 1m ``` 创建 Service ---------- 为了能正常访问 deployment 或者容器,我们还需要暴露一个 Servive。 Kubernetes 提供了不同的 Service 访问类型,如:ClusterIP、NodePort、LoadBlancer、NodePort。 本例子,我们利用 NodePort 暴露一个服务端口,用于外部服务能正常访问我们的数据库。 pg-service.yaml 定义如下,我们定义 nodePort 为 30432,这样集群里外的服务都能使用这个端口进行访问。 ``` apiVersion: v1 kind: Service metadata: name: postgresql-client-service labels: app: postgresql spec: type: NodePort ports: - port: 5432 targetPort: 5432 nodePort: 30432 protocol: TCP selector: app: postgresql ``` 接下来,就可以创建 Service 了: ``` $ kubectl apply -f pg-service.yaml $ kubectl get service -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d <none> postgresql-client-service NodePort 10.96.41.96 <none> 5432:30432/TCP 1m app=postgresql ``` 连接数据库 ----- 这里我们使用 psql 客户端进行测试连接 集群内 ``` $ psql -U postgres -h 10.96.41.96 -p 5432 ``` 或 ``` $ psql -U postgres -h localhost -p 30432 ``` 正常情况下,我们可以顺利连接上: ``` Password for user postgres: psql (10.1, server 12.1 (Debian 12.1-1.pgdg100+1)) WARNING: psql major version 10, server major version 12. Some psql features might not work. Type "help" for help. postgres=# ``` 为了继续测试环境是否有状态,我们接下来会创建一个新的 datase 和表,并插入数据,再销毁 pod。 然后观察新的 pod 是否能继续持有之前的数据,达到数据状态持久化的目的? 连接测试数据库 ``` create database pgtest ``` 或 ``` $ psql -U postgres -h localhost -p 30432 pgtest ``` 再创建测试表,并插入数据 ``` $ psql -U postgres -h 10.96.41.96 -p 5432 pgtest ``` 删除 pod ------ 下面,我们开始删除刚刚通过 Deployment 的 pod ``` CREATE TABLE test( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL ); insert into test (id, name) values (1, "tom"); ``` 这时,我们再观察环境中 pod 的情况可以发现,通过 deployment,一个新的 pg pod 被创建出来了 ``` kubectl delete pod/postgresql-deployment-7cfb6c95db-5r2v8 pod "postgresql-deployment-7cfb6c95db-5r2v8" deleted ``` 这个时候,我们通过上面的 psql 客户端工具,重新连接我们的 db, 观察我们之前维护的数据是否还正常保持? ``` kubectl get pods NAME READY STATUS RESTARTS AGE postgresql-deployment-7cfb6c95db-hd8ks 1/1 Running 0 13s ``` 跟我们预期一样,哪怕 pod 被删除了,我们的 K8s 环境依旧有能力通过持久化卷恢复数据。
幻翼
2023年5月31日 14:24
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码