K8S建站记录

文章目录
前言
本篇文章聊聊本站的部署情况,我用的是阿里云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