前言

本篇文章聊聊本站的部署情况,我用的是阿里云ECS,另外我把自己的下岗笔记本改成了一台服务器放在家里跑着,云服务器作为一个公网流量入口和集群控制平台,而本地的服务作为工作节点和数据存储位置。

集群配置:为了集群配置初始化方便快捷,我将K8s相关组件配置都用YAML文件存储了下来,将他们通过一定的组织形式写入到了init.sh脚本中。如果我需要重建集群,我可以直接运行这个脚本,立刻能够构建出与现在完全相同的集群环境。

网络环境:K8s的集群环境必需是内网,其间的Pod才能相互以IP进行通信,所以必需打通云服务与本地服务的网络。我用的是OpenVPN,服务端装在云服务器上,本地服务安装客户端主动连接VPN服务,并且服务端开启了OpenVPN的双向通信,服务端与客户端相互之间可以直接以对方局域网IP进行通信。

数据存储:为了让数据存储方便,我使用了K8s的OpenEBS插件将工作节点的磁盘做为存储位置,方便自动生成Volume。本地服务器有可能会因为一些原因导致服务不可用(各种原因引起的断网,断电),所以我把本站的相关页面以静态数据的形式下载并上传到Github平台,然后在Ingress中配置,如果服务不可用,就转而拉取这些静态数据转发给客户端,并且定期同步数据上去,这样如果因为意外情况,或者是临时不得不将本地服务停机也不会导致本站失联。
相关处理参考:Python爬取网站内容做静态页面转发

K8s集群配置

为了能够更灵活的调整配置,为每个模块都分配了init.sh脚本,方便自由配置文件夹内初始化的内容,如下:
k8s
├── init.sh
├── config
│   └── kubeadm-init-config.conf
├── header_source.sh
├── readme
└── yaml
    ├── app
    │   └── wordpress
    │       ├── blog-web
    │       │   ├── ingress
    │       │   │   ├── backup
    │       │   │   │   ├── uncdn-wp-web-ingress.yaml
    │       │   │   │   └── wp-web-ingress.yaml
    │       │   │   ├── none-wp-web-ingress.yaml
    │       │   │   ├── uncdn-wp-web-ingress.yaml
    │       │   │   ├── wp-web-ingress.yaml
    │       │   │   └── www-wp-web-ingress.yaml
    │       │   ├── init.sh
    │       │   ├── secret
    │       │   │   ├── my-wordpress-mariadb.yaml
    │       │   │   └── my-wordpress.yaml
    │       │   ├── storage
    │       │   │   ├── 1-pv
    │       │   │   │   ├── data-my-wordpress-mariadb-0-pv.yaml
    │       │   │   │   └── my-wordpress-pv.yaml
    │       │   │   └── 2-pvc
    │       │   │       ├── data-my-wordpress-mariadb-0-pvc.yaml
    │       │   │       └── my-wordpress-pvc.yaml
    │       │   └── uninit.sh
    │       ├── init.sh
    │       ├── pic-web
    │       │   ├── ingress
    │       │   │   ├── backup
    │       │   │   │   ├── uncdn-wp-web-ingress.yaml
    │       │   │   │   └── wp-web-ingress.yaml
    │       │   │   └── wp-web-ingress.yaml
    │       │   ├── init.sh
    │       │   ├── secret
    │       │   │   ├── my-wordpress-mariadb.yaml
    │       │   │   └── my-wordpress.yaml
    │       │   ├── storage
    │       │   │   ├── 1-pv
    │       │   │   │   ├── data-my-wordpress-mariadb-0-pv.yaml
    │       │   │   │   └── my-wordpress-pv.yaml
    │       │   │   └── 2-pvc
    │       │   │       ├── data-my-wordpress-mariadb-0-pvc.yaml
    │       │   │       └── my-wordpress-pvc.yaml
    │       │   └── uninit.sh
    │       └── uninit.sh
    ├── init.sh
    ├── network
    │   ├── cert-manager
    │   │   ├── cert-manager.crds.yaml
    │   │   ├── cert-manager.custom.yaml
    │   │   ├── init.sh
    │   │   ├── ssl
    │   │   │   ├── letsencrypt-issuer-backup.yaml
    │   │   │   └── letsencrypt-issuer.yaml
    │   │   └── uninit.sh
    │   ├── ingress-controller
    │   │   ├── file
    │   │   │   ├── crds.yaml
    │   │   │   └── nginx-ingress-controller.yaml
    │   │   ├── init.sh
    │   │   ├── prepare
    │   │   └── uninit.sh
    │   ├── init.sh
    │   ├── kube-flannel.yaml
    │   └── uninit.sh
    ├── storage-class
    │   ├── init.sh
    │   ├── openEBS
    │   │   └── lite
    │   │       ├── openebs-lite-sc.yaml
    │   │       ├── openebs-operator-lite.yaml
    │   │       └── test-unuse
    │   │           ├── local-hostpath-pod.yaml
    │   │           └── test-pvc.yaml
    │   └── uninit.sh
    └── uninit.sh
init.sh(main文件)内容如下:
. "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && _pwd=$(pwd) && echo ${_pwd%%'/k8s'*})"/k8s/header_source.sh

echo '#== start init process ==#'
echo '#== init env ==#'
kubectl create namespace blog-web
kubectl create namespace picture-web
kubectl create namespace cert-manager

# init config
$_DIR/yaml/init.sh

echo '#== end init process ==#'
集群初始化如下:
#启动集群
kubeadm init --config=k8s/config/kubeadm-init-config.conf

#初始化集群环境
./k8s/init.sh
WordPress的pv/pvc和secret已在初始化配置中提前创建,WordPress使用Helm来进行管理如下:
#blog web
helm install my-wordpress bitnami/wordpress --version 19.4.3 -n blog-web
#scenery web
helm install my-wordpress bitnami/wordpress --version 19.4.3 -n picture-web

网络

云服务与本地服务需要构建一个私有网络通道,使用openvpn,安装参考:Linux系统搭建搭建OpenVPN。

然后需要在服务端开启主动与客户端通信的能力,需要告诉openvpn服务器12.22.2.1021网络所在的位置,在ccd目录下创建一个客户端配置文件,然后在其中配置一个iroute来映射12.22.2.102的位置,如下:
[root@iZbp1605iwejf5qgem2c7hZ ~]# tree /etc/openvpn/
/etc/openvpn/
├── ccd
│   └── client
├── client
├── ipp.txt
├── openvpn-status.log
├── server
└── server.conf
[root@iZbp1605iwejf5qgem2c7hZ ~]# cat /etc/openvpn/ccd/client
iroute 12.22.2.0 255.255.255.0
文档参考:Lans behind OpenVPN
        配置

存储

OpenEBS使集群能够自动生成绑定在本地机器上的PV/PVC的能力,不过它的策略是卸载后删除,如果误操作还是会丢失掉本地文件数据,所以在WordPress部署后将其PV/PVC复制一份下来存储到YAML文件中,并修改PV中的SC2(storageClassName)与删除策略(persistentVolumeReclaimPolicy),如下:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pvc-2705f22b-f993-49d8-b82e-4a18804725b3
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Gi
  hostPath:
    path: /var/openebs/local/pvc-ee079675-34ad-49c7-b59e-1922d06ae731-blog-web
    type: DirectoryOrCreate # 或者使用 Directory,取决于你的需求
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - localhost.localdomain
  persistentVolumeReclaimPolicy: Retain
  storageClassName: wordpress-storage
  volumeMode: Filesystem

  1. 这是一个客户端的局域网IP ↩︎
  2. storageClassName可以随意命名,如果没有实际的SC那么它就相关一个命名空间的作用,hostPath会自动绑定对应的目录 ↩︎

发表回复

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