---
url: /v6.2/k8s.md
---
# Kubernetes 部署指南

## 部署前准备

1.根据版本获取 **k8s** 部署配置文件。

| 安装版本   |  部署文件| 组件依赖 |
|----|----|----|
| 5.3.x | [k8s-yaml](https://download.hengshi.com/k8s-docker-yaml/k8s-5.3.zip) | metadb、engine、hengshi、minio、redis、apm-server|
| 5.4.x | [k8s-yaml](https://download.hengshi.com/k8s-docker-yaml/k8s-5.3.zip) | metadb、engine、hengshi、minio、redis、apm-server|
| 6.0.x | [k8s-yaml](https://download.hengshi.com/k8s-docker-yaml/k8s-6.0.zip) | metadb、engine、hengshi、minio、redis、apm-server|
| 6.1.x | [k8s-yaml](https://download.hengshi.com/k8s-docker-yaml/k8s-6.1.zip) | metadb、engine、hengshi、minio、redis、otelecol|
| 6.2.x | [k8s-yaml](https://download.hengshi.com/k8s-docker-yaml/k8s-6.2.zip) | metadb、engine、hengshi、minio、redis、otelecol；配置包包含 `hengshi-rbac.yaml`，用于授予 `default` ServiceAccount `namespaces/get` 权限 |

> \[!WARNING] 6.2+ 升级注意
> 从 6.1 升级到 6.2 或更高版本时，必须替换并应用配置包中的 `hengshi-rbac.yaml`。请参见[6.2+ k8s 部署注意](install-upgrade-notice.md#6.2+-k8s-部署注意)。

2.导入离线镜像 修改 image 地址

```shell
wget https://download.hengshi.com/releases/hengshi-sense-xxx.tar.gz
docker load -i hengshi-sense-xxx.tar.gz
```

> \[!TIP] 提示
> gpdb的镜像地址不同需要单独替换 eg. image: gpdb:x.x.x
>
> 其余组件均替换为导入的离线镜像tag eg. image: hengshi-sense:5.0-20231103-dp-427c5f
>
> k8s/helm 环境需要将镜像推送到集群所使用的镜像仓库，如 registry、harbor、阿里云镜像仓库、腾讯云镜像仓库

3.替换 gpdb.yaml 中的$(POD_NAMESPACE) 变量为当前namespace, 以下示例修改为hengshi

```shell
sed -i 's/$(POD_NAMESPACE)/hengshi/'
```

4.修改 pvc

* 修改 storageClassName: xxx, 为当前集群的 storageclass
* 修改 storage: xxx 为各个服务的存储大小
* doris 引擎请修改 doris.yaml

```shell
metadb.yaml
gpdb.yaml
redis.yaml
minio.yaml
```

5.指定 namespace, 比如 hengshi

```shell
kubectl create namespace hengshi
```

6. 替换 hengshi-rbac 中 namespace 配置

```shell
# 此处以 'hengshi' 举例，需要替换为实际情况的 namespace 名字
sed -i 's/__HENGSHI_NAMESPACE__/hengshi/' hengshi-rbac.yaml
```

7.如果需要导入自签发证书，请先把证书文件放到本地 `./certs/` 目录，再创建名为 `trust-certs` 的 Secret。该命令会把 `./certs/` 目录下的所有普通文件打包进 Secret。

```shell
kubectl -n hengshi create secret generic trust-certs --from-file=./certs/
```

* `trust-certs` Secret 会挂载到 `hengshi` 容器内的 `/opt/hengshi/conf/trust-certs`。
* `hengshi` 容器启动时会自动导入该目录下的证书。

## engine

### 部署 engine

如需修改 gpdb 的密码, 需要在两处修改:

* gpdb.yaml

```shell
  GREENPLUM_PWD: hengshi202020
  GREENPLUM_QUERY_PWD: query202020
  GREENPLUM_ETL_PWD: etl202020
```

* configmap.yaml

```shell
  HS_ENGINE_PWD: hengshi202020
  ENGINE_QUERY_PASSWORD: query202020
  ENGINE_ETL_PASSWORD: etl202020
```

初始化,并启动 engine。

```shell
kubectl -n hengshi apply -f gpdb.yaml
kubectl -n hengshi exec -it master-0 -- /entrypoint.sh -m initsystem
kubectl -n hengshi exec -it master-0 -- /entrypoint.sh -m startsystem
```

> \[!TIP] 提示
> doris 引擎 yaml: doris.yaml 无需 initsystem 和 startsystem 操作

### 部署其余组件

参考下列部署清单 YAML 文件。

```shell
kubectl -n hengshi apply -f configmap.yaml
kubectl -n hengshi apply -f service.yaml
kubectl -n hengshi apply -f metadb.yaml
kubectl -n hengshi apply -f minio.yaml
kubectl -n hengshi apply -f redis.yaml
kubectl -n hengshi apply -f hengshi-rbac.yaml
kubectl -n hengshi apply -f hengshi.yaml
kubectl -n hengshi apply -f ingress.yaml # 可根据需要决定是否部署执行此步骤
```

> \[!TIP] 提示
> configmap.yaml 为hengshi服务的配置文件
>
> service.yaml 是集群内部通信以及对外暴露的service文件
>
> ingress.yaml 根据需要决定是否部署ingress

### 对外暴露 hengshi 服务

hengshi 提供对外访问的示例配置，可根据需要选择其中之一即可。

#### nodePort

通过 nodePort 方式暴露 hengshi 服务 ( 默认，如果没有配置 ingress，则可使用 service 对外暴露的 nodePort 端口对外提供服务 )  。

例如以下示例中的8080所对应集群的 nodePort 映射端口。

```shell
apiVersion: v1
kind: Service
metadata:
  name: hengshi
spec:
  selector:
    hsapp: hengshi-sense
    hsrole: hengshi
  ports:
  - protocol: TCP
    name: "8080"
    port: 8080
    targetPort: 8080
  - protocol: TCP
    name: "5005"
    port: 5005
    targetPort: 5005
  type: NodePort
```

#### ingress

通过 ingress 方式对外暴露 hengshi 服务 ( 可选 )。

```shell
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hengshi-sense
  namespace: hengshi-sense
  annotations:
    ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "90"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "90"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "90"
spec:
  ingressClassName: nginx
  rules:
    - host: xxxx.hengshi.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: hengshi-sense
                port:
                  number: 8080
```

> \[!TIP] 提示
> ingressClassName: <请修改当前集群的 ingressClass>
>
> host: <域名>

## 基本运维操作

### 安全停止数据库服务

参考以下命令停止 metadb 和 engine。

```shell
kubectl -n hengshi exec -it metadb-0 -- /docker-entrypoint.sh stop metadb single
```

```shell
kubectl -n hengshi exec -it master-0 -- /entrypoint.sh -m stopsystem
```

### 重启 engine

参考以下命令重启 engine。

```shell
kubectl -n hengshi exec -it master-0 -- /entrypoint.sh gpstop -r
```

### 清理日志

运行过程中，HENGSHI SENSE 会产生运行日志，这些日志需要定时清理释放存储空间。下面示例是清理内部数据库的滚动日志的命令。

```shell
kubectl -n hengshi exec -it master-0 -- /bin/bash
crontab -e # 将下面定时语句写入进去后保存退出
0 0 * * * /opt/hengshi/bin/clean_engine.sh -t -r -c -g -p
*/5 * * * * /opt/hengshi/bin/clean_engine.sh -l
```

### 扩容 engine

1.修改 StatefulSet/segment

```shell
kubectl -n hengshi edit StatefulSet/segment
```

* SEGMENTS 字段填写扩容后所有 segment 的 appname (比如2个扩容到4个)
* StatefulSet/segment 的 replicas: 改到扩容后所有 segment 数

```shell
apiVersion: v1
kind: ConfigMap
metadata:
  name: greenplum
data:
  MASTER: "master-0"
  SEGMENTS: |  #4个 segment 的列表
    segment-0
    segment-1
    segment-2
    segment-3
...
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: segment
spec:
  replicas: 4 #例如扩容后为4个 segment
```

* 然后 kubectl -n hengshi apply -f gpdb.yaml
* 然后等待所有新增和旧有 segement pod 的状态都变成 running

2.写 new_host_file (新增 segment 列表, 比如原有2个 segment(0,1), 现扩容到4个 segment(0,1,2,3))

```shell
kubectl -n hengshi exec -it master-0 /bin/bash
cd /opt/hsdata/ && mkdir expand && cd expand
cat <<EOF > new_host_file
segment-2
segment-3
EOF
```

3.执行扩容操作

```shell
kubectl -n hengshi exec -it master-0 /bin/bash
cd /opt/hsdata/expand
psql postgres -c "create database expand"
gpexpand -f new_host_file  -D expand
  >y
  >0 #然后会生成 gpexpand_inputfile_yyyymmdd_xxxxxx 文件
gpexpand -i gpexpand_inputfile_yyyymmdd_xxxxxx -D expand
```

如果扩容失败，可参考以下命令回滚 engine。

```shell
kubectl -n hengshi exec -it master-0 /bin/bash
cd /opt/hsdata/expand
gpstart -aR
gpexpand -r -D expand
```

### engine 数据迁移

1.旧 engine 数据导出

```shell
 # dump db data
kubectl -n hengshi exec -it <OLD_ENGINE_POD_NAME> -- bash
source $HS_HOME/engine-cluster
pg_dumpall > /opt/hsdata/engine.back.sql
exit
```

2.copy 数据到新机器

```shell
 # cp db data
# 将旧引擎的数据拷贝到本地
kubectl -n hengshi cp <OLD_ENGINE_POD_NAME>:/opt/hsdata/engine.back.sql engine.back.sql
# 将数据拷贝到新引擎环境里
kubectl -n hengshi cp engine.back.sql master-0:/opt/hsdata/engine.back.sql
```

3.导入数据到新环境

```shell
 # load db data
kubectl -n hengshi exec -it master-0 -- bash
source $HS_HOME/engine-cluster
psql postgres < /opt/hsdata/engine.back.sql
rm /opt/hsdata/engine.back.sql
```

## 部署单机版 (POC)

1.修改配置文件为单机配置

执行前确保 configmap.yaml, hengshi.yaml 等配置文件与 config_to_single.sh 在同一个目录下。

```shell
./config_to_single.sh
```

2.部署引擎

参考 [引擎部署](#engine)

3.部署其余组件

参考下列部署清单 YAML 文件。

```shell
kubectl -n hengshi apply -f configmap.yaml
kubectl -n hengshi apply -f service.yaml
kubectl -n hengshi apply -f metadb.yaml
kubectl -n hengshi apply -f minio.yaml
kubectl -n hengshi apply -f redis.yaml
kubectl -n hengshi apply -f hengshi.yaml
```
