合宿 API 文档说明

React Javascript React Javascript

合宿报名

1. 提交合宿报名的申请表

接口功能

向服务器发送合宿报名的申请

URL

[???/application)

支持格式

JSON

HTTP请求方式

POST

提交参数

参数 必选 类型 说明
accommodationType ture string 合宿类型
accommodationAddress true string 合宿地点
houseType true string 房间类型
startDate true string 合宿开始时间
endDate true string 合宿结束时间
extraDemand option string 额外需求
示例

地址:???/application

{
    "accommodationType":"捣蛋合宿",
    "address":"上海",
    "houseType":"双人房",
    "startDate":"2018-12-28",
    "endDate":"2018-12-29",
    "extraDemand":"API 格式说明"
}

返回字段

返回字段 字段类型 说明
status boolean 返回申请是否成功。true:成功;false:失败。
message string 返回的信息
applicationNumber int 如果成功,返回改次申请的订单号
示例
{
    "status": true,
    "message":"报名申请提交成功",
    "applicationNumber": 23223441
}
Full Post

kubernetes 部署 gocd 记录

Linux Kubernetes Gocd Cd

最近由于公司项目需要, 上了 kubernetes, 所以需要实现一套 cd 方案, 最终选择了 Thoughtworks 开发的 gocd, 记录一些开发中遇到的坑.

CD 流程简述

github 提交 commit => Jenkins 打包 (Egret 开发的html5游戏) => 提交 github 修改(新的仓库) => gocd 制作 docker 并部署到 kubernetes

什么是 Minikube

  • 区别于 cluster(集群), 用 kubernetes 的话肯定是为了集群(最少3台 服务器), 那么这个 minikube 有什么用呢? 在我看来是给用户一个快速测试的环境, 毕竟在一台 服务器 上就可以完成了.
  • 顺便这里吐槽一下 scaleway 的内核, 由于 minikube 推荐使用 vm 环境, 然而在安装过程中发现, 内核不支持, 尝试了很久去更换, 最终发现 scaleway 在开机启动脚本中写死了他自己定制的内核 – 按官方的说法: 无法更换! 很坑 ort

kubernetes 的构成 pod deployment service ingress

  • deployment: 核心业务逻辑, 创建过程中生成 pod (类似 dockercontainer);
  • service: 将 deploymentkubernetes 建立联系;
  • ingress: 将 service 与 外部 建立联系;
# -n gocd 意思是: namespace 为 gocd
# 获取在 deployment 列表
kubectl get deployment -n gocd

# 获取 名为 gocd-server 的 dployment 详情
kubectl describe deployment gocd-server -n gocd

# 删除 deployment
kubectl delete deployment gocd-server -n gocd
  • 注: 删除 pod 类似重启 deployment, 而要完全删除一个 pod, 需要删除 deployment;

调用 API 403

` curl: (22) The requested URL returned error: 403 Forbidden `

需要创建 clusterrolebinding

kubectl create clusterrolebinding clusterRoleBinding \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:default

gocd 官方 Ingress 就是个坑!

官方给的 helm 安装方法:

helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm install stable/gocd --name gocd --namespace gocd

看起来很美好, 然而事实上没法用! 目前的结论是 https 的锅.

https://github.com/kubernetes/charts/blob/master/stable/gocd/templates/ingress.yaml

源码中配置如下, 但是无论如何就是不行

spec:
  backend:
    serviceName: \{\{ template "gocd.fullname" . \}\}-server
    servicePort: \{\{ .Values.server.service.httpPort \}\}
  rules:
    \{\{- range $host := .Values.server.ingress.hosts \}\}
    - host: \{\{ $host \}\}
    \{\{- end -\}\}
  \{\{- if .Values.server.ingress.tls \}\}
  tls:
\{\{ toYaml .Values.server.ingress.tls | indent 4 \}\}
  \{\{- end -\}\}

https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/tls-termination/ingress.yaml

最后参考了上面的连接后, 如下配置即可 ╮(╯_╰)╭ 迷

spec:
  tls:
    - hosts:
      - www.example.com
      # This assumes tls-secret exists and the SSL
      # certificate contains a CN for gocd.laiwan.io
      secretName: gocd-tls
  rules:
    - host: www.example.com
      http:
        paths:
        - path: /
          backend:
            # This assumes http-svc exists and routes to healthy endpoints
            serviceName: gocd-server
            servicePort: 8153

使用自定义的 values.yaml 安装:

# 彻底删除
helm delete --purge gocd

# 添加远程 repo
helm repo add stable https://kubernetes-charts.storage.googleapis.com

# 使用 fork 的 url, 注意是 raw 文件
# 同时 ./gocd 是本地 pull 下来的文件(包含自行修改的 ingress)
helm install -f https://raw.githubusercontent.com/tokinonagare/charts/staging/stable/gocd/values.yaml\
 stable/gocd --name gocd --namespace gocd
 
# 也可以
helm install -f values.yaml stable/gocd --name gocd --namespace gocd

端口转发

在调试 Ingress 前, 为了验证 pod 是否已经正常跑起来, 可以使用端口转发的方法:

# 服务器
kubectl port-forward --namespace gocd gocd-server-6cd5c448c9-kp844 8153

# 本地
ssh root@51.23.233.23 -L 8153:localhost:8153

浏览器即可打开 localhost:8153

pvc pv

  • pv: 在集群中挂载一个硬盘空间(没有 namespace 的区分);
  • pvc: 将 pvpods 起来;

由于不是 AWS GCE 在没有上 Ceph 之前, 使用在 host 上挂载一个硬盘空间, 重装过程如下:

# 删除 pv 和 pvc
kubectl delete pv gocd-gocd-pv && kubectl delete pvc gocd-pvc -n gocd

# 删除 host 上的文件
rm -rf /data/gocd

# 重新创建文件
mkdir /data/gocd

# 重新创建 pv 和 pvc
kubectl apply -f pv.yaml && kubectl apply -f pvc.yaml -n gocd

Ingress loadbalance 里面 IP 怎么是空的?

说好的 ip 通过下面的命令获取, 然而并卵用 ort

1. Get the GoCD server URL by running these commands:
    It may take a few minutes before the IP is available to access the GoCD server.
         echo "GoCD server public IP: http://$(kubectl get ingress gocd-server --namespace=gocd  -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"

很显然, gocd 把用他们服务的都想成了是 AWS GCE 的高富帅,scaleway 这种屌丝, 并没有自带 loadbalance, 当然没有咯 =_=

参考

Full Post

ssh登入当前vpn服务器

Linux Router Interface

最近应老板要求把公司的所有的网络包都转发到了一台vps的vpn服务器(本地使用树莓派进行的一个实现,准备稳定之后进行一个记录)。然而再如何用ssh登入这台vpn服务器上却遇到了一点麻烦。

问题简述

ssh root@xxx.xxx.xxx.xxx

通常使用这种登陆方式的话,会因为已经是在一个内网的状况下将导致无法连接。

解决方法

直连

首先想到的办法是:重新做一个接口和无线wifi,不通过vpn进行以往的正常访问。

更改router or iptables

既然我是想要ssh能够正常登入server,那么只要让ssh的22端口不通过vpn即可。

-A fw-interfaces -s 192.168.8.0/24 -i eth0 -o tun+ -j ACCEPT

访问当前内网ip

在方法2的寻找解决办法中,突然自问:为什么我现在在vpn的网络环境下依然可以访问192.168.8.2(raspberry)?好像有了灵感。

ifconfig

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255

vpn的转发无非是通过vps server作为一个出口的路由来实现的,那么我是否可以通过内网的ip登入?

ping 10.8.0.6
# 当前raspberry tun0 在vps server 下的ip

bingo! 

ping 10.8.0.1

bingo!

不用进行任何修改,完美解决问题,如何透彻的理解事物的运作原理才是解决问题的最佳方案!

ssh root@10.8.0.1
Full Post

ReactNative 防止重复请求

App Reactnative Ios

  • Demo地址: https://github.com/tokinonagare/ReactNative-PropertyFinder

当点击按钮进行urlloading的请求过程时,再次点击按钮,会出现重复请求,代码如下:

<TouchableHighlight     
  style         = {styles.searchButton}
  onPress       = {this.onSearchPressed}
  underlayColor = 'gray'>
  <Text style   = {styles.searchButtonText}>Go</Text>
</TouchableHighlight>
onSearchPressed: function() {
      this.setState({
        message: ''
      });
      var query = urlForQueryAndPage('place_name', this.state.searchString, 1);
      this._executeQuery(query);
},
_executeQuery: function(query) {
  console.log(query);
  this.setState({
    isLoading: true
  });
  fetch(query)
    .then(response => response.json())
    .then(json     => this._handleResponse(json.response))
    .catch(error   =>
      this.setState({
        isLoading: false,
        message:  'Something bad happend ' + error
      }));
},
Full Post