【WIP】Mac下搭建本地k8s，并进行开发、调试和部署

## 环境准备
### 安装Docker/k8s

1. 安装 [Docker for Mac](https://docs.docker.com/docker-for-mac/install/)，Version>=18.06，低版本可能不自带Kubernetes

2. 设置 `Docker` 中国官方镜像加速 [registry mirror](https://www.docker-cn.com/registry-mirror) ```https://registry.docker-cn.com```
![mirror](./image/mirror.jpg)

3. 预先从阿里云`Docker`镜像下载 `Kubernetes` 所需要的镜像, 可以通过修改 [./images](./images) 文件定制你自己需要的镜像
```bash
$ ./load_images.sh
```

4. 在`Docker for Mac` 设置中启用 `Kubernetes` 选项, 并等待一会儿，直到 `Kubernetes` 开始运行。
![k8s](./image/2018-11-01-11-46-06.png)

5. 切换`Kubernetes`运行上下文至 `docker-for-desktop`
```bash
# 一般只有在之前用其他方式运行过Kubernetes才需要
$ kubectl config use-context docker-for-desktop
```

6. 验证 `Kubernetes` 集群状态
```bash
$ kubectl cluster-info
$ kubectl get nodes
```

7. 部署 `Kubernetes dashboard`
```bash
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
# 开启本机访问代理
$ kubectl proxy
```

通过下面的连接访问 `Dashboard`:
[`http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/`](
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/)
访问时出现下面界面可跳过：
![](./image/2018-11-01-11-36-20.png)

（可选）获取 `Dashboard` `admin` 权限:
[`https://github.com/kubernetes/dashboard/wiki/Access-control#admin-privileges`](https://github.com/kubernetes/dashboard/wiki/Access-control#admin-privileges)


### 安装Helm
为了之后能够使用 `gm-cli` 更方便地进行本地环境的搭建与开发，需要安装配置helm
```
# 用当前目录下的可执行文件，版本2.10.0
$ cp helm /usr/local/bin/helm

# 初始化本地 CLI 并 将 Tiller 安装到 Kubernetes cluster
$ mkdir -p ~/.helm/repository
$ touch ~/.helm/repository/repositories.yaml
$ helm init

```


### 一些初始化配置
1. 添加证书：
```
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ./harbor.crt
```
**重启docker**

2. `docker login`
```
docker login harbor.test.gengmei
username: gmuser
password: Gengmei123!
```

3. `docker-for-mac`上添加`File Sharing`配置 `/srv/apps`、`/data/log`，添加后点击`Apply & Restart`
![](./image/2018-11-01-11-57-39.png)

若出现如下报错，可先不必添加，但是可能会出现日志挂载不到本地Mac的情况，可能后面需要手动更改日志目录（待验证）。
![](./image/2018-10-25-13-30-29.png)

**至此就能使用gm-cli构建本地集群了，具体使用参考 [gm-cli](http://git.igengmei.com/system/gm-cli)**


----------------
----------------


下面内容是不用`gm-cli`的情况下手动搭建本地集群的步骤，直接使用`gm-cli`的话可忽略
## 手动部署集群

1. 备份之前的路由表，用当前目录下的路由表替换之前的路由表
```
mv /etc/gm-config/storage/static.dir/helios.dir/static_route_table.json /etc/gm-config/storage/static.dir/helios.dir/static_route_table.json.old
cp ./static_route_table.json /etc/gm-config/storage/static.dir/helios.dir/static_route_table.json
```

2. 创建项目目录，日志目录到指定位置
```
sudo mkdir -p /data/log /srv/apps
sudo chown 自己的用户名 /data/log /srv/apps
mkdir -p /data/log/backend/app /data/log/gaia/app /data/log/mimas/app /data/log/doris/app   # ...
```

3. `clone` 项目代码
```
cd /srv/apps
git clone git@git.wanmeizhensuo.com:backend/backend.git
git clone git@git.wanmeizhensuo.com:backend/gaia.git
git clone git@git.wanmeizhensuo.com:backend/Mimas.git
git clone git@git.wanmeizhensuo.com:rank/doris.git
```

4. 每个项目`checkout`到`paas`分支，`build`镜像
```
cd 项目目录
git checkout paas
docker build --no-cache -t 项目名:local.latest .
```
另外需要一个`Redis`的镜像：
```
docker pull redis
```

5. 复制 `settings_local` 到项目目录下
```
cp ./settings_local/backend/settings_local.py /srv/apps/backend/gengmei
cp ./settings_local/gaia/settings_local.py /srv/apps/gaia/gaia
cp ./settings_local/mimas/settings_local.py /srv/apps/mimas/settings/settings_local.py
cp ./settings_local/doris/devel.py /srv/apps/doris/doris/devel.py
```

6. 设置`configmap`
```
kubectl create configmap static-route-table --from-file=/etc/gm-config/storage/static.dir/helios.dir/static_route_table.json
kubectl create configmap backend-settings --from-file=/srv/apps/backend/gengmei/settings_local.py
kubectl create configmap gaia-settings --from-file=/srv/apps/gaia/gaia/settings_local.py
kubectl create configmap mimas-settings --from-file=/srv/apps/mimas/settings/settings_local.py
kubectl create configmap doris-settings --from-file=/srv/apps/doris/doris/devel.py
```

7. 部署`Pod`和`Service`
```
# Pod
kubectl create -f deploy/backend-deploy.yml
kubectl create -f deploy/gaia-deploy.yml
kubectl create -f deploy/mimas-deploy.yml
kubectl create -f deploy/doris-deploy.yml
kubectl create -f deploy/redis-deploy.yml
# Service
kubectl create -f service/backend-service.yml
kubectl create -f service/gaia-service.yml
kubectl create -f service/mimas-service.yml
kubectl create -f service/doris-service.yml
kubectl create -f service/redis-service.yml
```

8. 测试服务是否正常
```
kubectl get service -o wide
```
找到backend-service的PORTS, 默认30001，访问 [localhost:30001](localhost:30001) 验证服务


### 服务调试(不使用gm-cli)
1. 本地开发，对`/srv/apps`的服务进行开发 

2. (如果涉及依赖的更新，先切到项目目录，执行`docker build --no-cache -t 项目名:local.latest .`)

3. 更新服务
```
kubectl replace --force -f deploy/backend-service.yml  # 更改了哪个服务，更新时就用deploy目录下的对应文件更新
```

4. 测试




