
# 区级管理平台环境部署（含数据中心部署）
#### 区级管理平台环境部署
配置要求：
- 硬件配置要求 服务器标准16C/32G内存，磁盘空间要求300G以上的存储空间。
  内部服务器需要互通，防火墙关闭，SElinux关闭。
  
- 网络设备配置要求 内部服务器之间所有端口要求互通,带宽百兆以上，接入服务器需要有ELB或VIP。
  
- 存储设备配置要求 磁盘空间要求300G以上的存储空间。根目录下40G以上，挂载盘300G以上。
  
- 服务器设备的配置要求 服务器时间要求一致，端口要求互通。
  
- 部署工具 远程ssh工具：xshell。
  浏览器：Chrome 96.0.4664.110。
  
  
 
#### 安装docker、kubernetes（所有k8s节点）
安装前先卸载冲突的软件
```
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
```
安装docker
```
cd docker && yum install -y *.rpm
mkdir -pv /data/docker
ln -s /data/docker/ /var/lib/docker
```
安装docker-compose
```
cd ../docker-compose &&  yum install -y *.rpm
正常情况下docker和docker-compose就已经安装完成了
```
可通过查看docker确认是否安装成功
```
docker -v
```
#### 系统初始化（所有服务器都要操作）
- **创建用户**
  系统运行需要创建uid和gid为2049的admin用户，先使用id admin查看是否有admin用户，有admin用户的话用户ID的组ID是多少
  如果没有admin用户，则创建admin用户
  ```
  groupadd -g 2049 admin
  useradd -g 2049 -G docker admin
  ```
  如果已存在admin用户且UID和GID不为2049的话，需更改UID和GID
  ```
  usermod -u 2049 admin && groupmod -g 2049 admin && gpasswd -a admin docker
  ```
  创建admin用户后UID不为2049的情况，先使用下面命令更改下/home/admin目录的权限，
  ```
  chown admin.admin /home/admin/ -R
  ```
  再更改用户UID即可
  ```
  usermod -u 2049 admin
  ```
  查看admin用户是否创建成功
  ```
  id admin
  uid=2049(admin) gid=2049(admin) groups=2049(admin),946(docker)
  ```
  图1查看   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001798352861.png) 
- **系统调优**
  关闭防火墙
  ```
  setenforce 0
  sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  systemctl disable --now firewalld
  chmod a+x /etc/rc.d/rc.local
  ```
  图2关闭防火墙   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001751353184.png)
  配置iptables的ACCEPT规则
  ```
  iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
  ```
  关闭swap分区
  ```
  swapoff -a
  sed -ri 's/.*swap.*/#&/' /etc/fstab
  ```
  创建docker服务相关目录
  ```
  mkdir -pv /data/{backup,cds,contacts,logs,tinyfs,webapps}
  chown admin.admin /data/{backup,cds,contacts,logs,tinyfs,webapps}
  ```
  修改docker服务配置文件
  ```
  mkdir -p /etc/docker
  cat > /etc/docker/daemon.json <<EOF
  {
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
  "max-size": "100m"
  }
  }
  EOF
  ```
  使用Systemd管理的Cgroup来进行资源控制与管理，因为相对Cgroupfs而言，Systemd限制CPU、内存等资源更加简单和成熟稳定。
  日志使用json-file格式类型存储，大小为100M，保存在/var/log/containers目录下，方便ELK等日志系统收集和管理日志。
  ```
  systemctl daemon-reload
  systemctl restart docker
  systemctl enable --now docker
  systemctl enable --now crond
  ```
  设置定时清理日志任务
  ```
  echo "0 0 */1 * *  find /data/logs/ -name '*202*'  -mtime +1 |xargs gzip &" >> /var/spool/cron/root
  echo "0 0 */1 * *  find /data/logs/ -name '*202*' -mtime +30 |xargs rm -fr &" >> /var/spool/cron/root
  ```
  安装常用服务
  ```
  yum install -y net-tools vim wget gdb lsof sysstat iotop wget lrzsz tree unzip nfs-utils  tcpdump telnet ntpdate yum-utils
  ```
  
#### 调整内核参数
开启网桥模式，可将网桥的流量传递给iptables链
关闭IPv6协议
```
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.IPv6.conf.all.disable_IPv6=1
net.IPv4.ip_forward=1
EOF
```
加载参数
```
sysctl --system
```
#### 配置k8s镜像源（所有节点）
定义kubernetes源
```
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=“镜像源地址”/kubernetes-el7-版本号
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=“镜像源地址”/yum-key.gpg
EOF
```
#### 安装kubeadm，kubelet和kubectl（所有节点）
```
yum install -y kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3
```
开机自启kubelet
```
systemctl enable kubelet.service
```
启动k8S通过kubeadm安装出来以后都是以Pod方式存在，即底层是以容器方式运行，所以kubelet必须设置开机自启
```
systemctl start kubelet.service
```
#### 初始化master节点(master节点)
```
kubeadm init \
--apiserver-advertise-address=IP地址 \
--image-repository “镜像源地址”/ \
--kubernetes-version v版本号 \
--service-cidr= IP地址/12 \
--pod-network-cidr= IP地址/16
```
如果要重新初始化集群状态：kubeadm reset，然后再进行上述操作记得保存好最后的 kubeadm join的信息node节点加入集群需要token！！！
也可以利用kubeadm token create --print-join-command 利用kubeadm命令重新生成token，node 节点加入集群需要token
#### 使用kubectl管理工具（master节点）
```
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
查看是否成功，等待一会，同时可发现像etc，controller，scheduler等组件都以pod的方式安装成功
```
kubectl cluster-info
```
#### node节点操作（所有node节点）
在每个节点上执行，加入集群
```
kubeadm join 10.13.16.61:6443 --token q7glri.mjm2gperz347n99e --discovery-token-ca-cert-hash sha256:869fcc7584845d937a94f2a159a062565b64ac56b33207e2300d61fa2f98e2a7
```
#### 安装flannel网络插件
下载flannel插件
```
wget https://gitcode.net/mirrors/flannel-io/flannel/-/blob/v0.20.2/Documentation/kube-flannel.yml
```
修改字段
```
net-conf.json: |
{
"Network": "10.244.0.0/16", ####初始化master节点时设置一样就行 将ip段修改和上文初始化master节点一样即可
"Backend": {
"Type": "vxlan"
}
}
```
发布网络
```
kubectl apply -f kube-flannel.yml
```
查看所有pod
```
kubectl get pods -A
```
如果出现Running则表示正常，如果出现Init:0/1执行以下命令，修改 flannel 插件文件，这个版本比较低，高版本 k8s 尽量选择一些高一些的版本 flannel
```
sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0-amd64#g" kube-flannel.yaml
```
#### 检查各节点健康状态
查询master是否正常
```
kubectl get cs
```
如果状态为unhealthy
```
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
```
将- --port=0注释掉
#### 部署StorageClass
安装nfs
```
yum install -y nfs-utils rpcbind
```
手动加载 NFS 共享服务时，应该先启动 rpcbind，再启动 nfs
```
systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs
```
查看 rpcbind 端口是否开启，rpcbind 服务默认使用 tcp 端口 111
```
netstat -anpt | grep rpcbind
```
创建共享目录，并授权
```
mkdir /root/data/nfs
chmod 777 /root/data/nfs
```
编辑 exports 文件
```
vim /etc/exports
/root/data/nfs *(rw,no_root_squash,sync)
```
保存退出
```
:wq
```
重新export一次
```
exportfs -rv
```
查看本机的共享目录
```
showmount -e
cd /root
kubectl apply -f storageClass.yaml
```
图3查看   
![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001751512104.png)
#### 数据库连接工具(在ops服务器上部署)
- **配置数据库源**
  ```
  sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  ```
  
- **安装数据库连接工具**
  ```
  sudo yum --enablerepo=mysql80-community install mysql-community-server --nogpgcheck
  ```
  启动mysql服务
  ```
  service mysqld start
  ```
  图4启动   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001798471881.png)
  查看root临时密码
  ```
  grep "A temporary password" /var/log/mysqld.log
  ```
  登录数据库
  ```
  mysql -uroot -p"数据库密码"
  ```
  修改数据库密码并授权
  ```
  ALTER USER 'root'@'localhost' IDENTIFIED BY '数据库密码';
  create user 'root'@'%' identified by '数据库密码' ;
  grant all privileges on *.* to  'root'@'%' with grant option ;
  flush privileges;
  ```
  
- **启动redis**
  图5启动redis   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001798352865.png)
  ```
  kubectl apply -f redis-1.yaml
  ```
  进入容器检查redis
  ```
  redis-cli -h redis哨兵服务器的地址 -p 6379  -a 'redis的密码' info Sentinel
  ```
  
#### 部署seata服务
```
cd /root
kubectl apply -f seata-server.yaml
```
#### 服务部署
- **修改配置文件**
  将本地的 user-center-admin.jar复制到的/rhCloud/sjzx/java下
  将本地的 developer-center-0.0.1-SNAPSHOT.jar复制到的/rhCloud/kfzzx/java下
  将本地的 organization-center-0.0.1-SNAPSHOT.jar复制到的/rhCloud/zzzx/java下
  将本地的 permissions-center-0.0.1-SNAPSHOT.jar复制到的/rhCloud/qxzx/java下
  将本地的 authentication-center-0.0.1-SNAPSHOT.jar复制到的/rhCloud/rzzx/java下
  修改/rhCloud/qxzx/java/java.yaml、Dockerfile配置文件
  修改/rhCloud/zzzx/java/java.yaml、Dockerfile配置文件
  修改/rhCloud/kfzzx/java/java.yaml、Dockerfile配置文件
  修改/rhCloud/sjzx/java/java.yaml、Dockerfile配置文件
  修改/rhCloud/rzzx/java/java.yaml、Dockerfile配置文件
  
- **Dockerfile**
  图6包名称   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001751512108.png)
  
  修改nginx配置
  配置文件在/rhCloud/rzzx/nginx/nginx-configmap.yaml
  配置文件在/rhCloud/qxzx/nginx/nginx-configmap.yaml
  配置文件在/rhCloud/zzzx/nginx/nginx-configmap.yaml
  配置文件在/rhCloud/kfzzx/nginx/nginx-configmap.yaml
  配置文件在/rhCloud/sjzx/nginx/nginx-configmap.yaml
  配置文件在/rhCloud/zhjy/nginx/nginx-configmap.yaml
  图7修改nginx配置   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001798471885.png)
  ```
  kubectl apply -f nginx-configmap.yaml
  ```
  
  修改前端挂载目录
  配置文件在/rhCloud/rzzx/nginx/nginx-pvc.yaml
  配置文件在/rhCloud/qxzx/nginx/nginx-pvc.yaml
  配置文件在/rhCloud/zzzx/nginx/nginx-pvc.yaml
  配置文件在/rhCloud/kfzzx/nginx/nginx-pvc.yaml
  配置文件在/rhCloud/sjzx/nginx/nginx-pvc.yaml
  配置文件在/rhCloud/zhjy/nginx/nginx-pvc.yaml
  图8修改前端挂载目录   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001798352869.png)
  ```
  kubectl apply -f nginx-pvc.yaml
  ```
  
  修改nginx.yaml项目配置文件
  配置文件在/rhCloud/rzzx/nginx/nginx.yaml
  配置文件在/rhCloud/qxzx/nginx/nginx.yaml
  配置文件在/rhCloud/zzzx/nginx/nginx.yaml
  配置文件在/rhCloud/kfzzx/nginx/nginx.yaml
  配置文件在/rhCloud/sjzx/nginx/nginx.yaml
  配置文件在/rhCloud/zhjy/nginx/nginx.yaml
  图9修改nginx.yaml项目配置文件   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001751353196.png)
  ```
  kubectl apply -f nginx.yaml
  ```
  
- **启动服务**
  以数据中心为例：
  后端部署方式
  ```
  cd /rhCloud/sjzx/java
  bash restart.sh
  ```
  
  前端部署方式
  将项目打好的包dist包放在对应目录下
  ```
  cd /root/data/nfs
  kfzzx-nginx-web-pvc-8db0b2d4-bbe6-46c5-88a6-7e2363b1d033
  qxzx-nginx-web-pvc-5d0ccd38-3f7d-4d45-90de-a85fcf78b955
  rzzx-nginx-web-pvc-24131e74-ca7a-4634-81ec-47e3f71278a8
  sjzx-nginx-web-pvc-69c8c590-8580-40e6-a70b-a8752c40f582
  zhjy-nginx-web-pvc-7402ccbb-f828-4247-bc25-f07f9a1d5e5e
  zzzx-nginx-web-pvc-58e3122b-cbfd-4822-8328-716bccc8f27b
  ```
  图10前端部署方式   
  ![](https://support.huaweicloud.com/educationcloudplatform-education/zh-cn_image_0000001751512112.png) 
