新溪blog

新溪-gordon之胡写乱画

0%

概要

Drone是Go语言编写的,基于容器技术的CI/CD系统。是目前为止个人感觉最轻量级的CI/CD系统,使用本身非常方便容易。目前Drone文档严重缺乏,而且好多文档是之前历史版本的使用文档,所以在安装和使用时会有一些小麻烦,除去这些一切很舒服。前一篇已经写完如何安装Drone,本篇会以一个实例来讲一下,如何用Drone完成一个最简单Golang项目的部署。

阅读全文 »

概要

Drone是Go语言编写的,基于容器技术的CI/CD系统。它具有以下几个关键特性。

Everything is a Docker Container

1
2
3
4
5
6
7
对Docker原生支持使的: drone无需在构建脚本中额外增加 docker 相关的命令就能:
1. 使用Docker化的集成环境方便的实现对多语言编译
2. 利用集成Docker环境的优势: 环境隔离、标准化镜像
利益于: 对原生 Docker 支持
Any Source Code Manager
Any Platform
Any Language
阅读全文 »

前情提要

本人使用Idea做Golang开发,之前一直是用公有项目,可通过快捷键自动获取(如下图),但私有git项目则不能如此顺利

不使用Go Modules(vgo)界面:
不使用Go Modules(vgo)

使用Go Modules(vgo):
使用Go Modules(vgo)

阅读全文 »

Configmap

ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件

查看命令

查看列表:

1
2
3
kubectl get configmap
or
kubectl get cm

查看详情:

1
$> kubectl describe cm <configMapName>

创建命令

直接创建命令:

1
2
3
4
$> kubectl create configmap <configMapName> 
--from-literal=nginx_port=80
--from-literal=server_name=k8s.zhaoweiguo.com
configmap/<configMapName> created

通过文件创建命令:

1
2
3
4
5
6
7
8
$> cat cm.conf
server {
server_name k8s.zhaoweiguo.com;
listen 80;
root /var/www/;
}
$> kubectl create configmap <configMapName> --from-file=./cm.conf

使用ConfigMap-环境变量

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
labels:
app: configmap
spec:
containers:
- name: configmap
image: alpine:v1
env:
- name: NGINX_SERVER_PORT
valueFrom:
configMapKeyRef:
name: <configMapName>
key: nginx_port
- name: NGINX_SERVER_NAME
valueFrom:
configMapKeyRef:
name: <configMapName>
key: server_name

生成pod并验证configmap的使用:

1
2
3
4
5
6
7
8
9
$> kubectl apply -f pod.yaml
pod/configmap-pod created
$> kubectl get pods
NAME READY STATUS RESTARTS AGE
configmap-pod 1/1 Running 0 41s
// 查询内部变量
$> kubectl exec -it pod-cm-1 -- printenv |grep NGINX_SERVER
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=k8s.zhaoweiguo.com

修改configmap的内容看环境变量是否同步生效:

1
2
3
4
5
6
7
8
9
$> kubectl edit cm nginx-config
// 把端口号nginx_port改为8888
$> kubectl describe cm nginx-config
// 查看configmap内容已经修改
$> kubectl exec -it pod-cm-1 -- printenv |grep NGINX_SERVER
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=k8s.zhaoweiguo.com
// 但环境变量的值并没有被修改
// 环境变量的值要在Pod重启后才会生效

使用ConfigMap-存储卷

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
labels:
app: configmap
spec:
containers:
- name: myapp
image: alpine:v1
volumeMounts:
- name: nginxconf
mountPath: /etc/conf.d/
readOnly: true
volumes:
- name: nginxconf
configMap:
name: <configMapName>

验证configmap的使用:

1
2
3
4
5
6
7
$> kubectl exec -it pod-cm-2 -- /bin/sh
$> ls /etc/conf.d/
nginx_port server_name
$> cat /etc/conf.d/nginx_port
80
$> cat /etc/conf.d/server_name
k8s.zhaoweiguo.com

修改configmap的内容看Volumn是否同步生效:

1
2
3
4
5
6
7
$> kubectl edit cm nginx-config
// 把端口号nginx_port改为8888
$> kubectl describe cm nginx-config
// 查看configmap内容已经修改
$> cat /etc/conf.d/nginx_port
8888
// Volumn方式文件内容已经自动变化

概要

前一篇文章完成了git同步相关工作,使用nginx做反向代理,本篇完成PHP项目的部署,主要包括以下内容:

  • 使用ConfigMap完成Nginx的配置
  • 基于官方php-fpm镜像安装所需要的PHP插件并生成新的镜像备用
  • 使用阿里LoadBalance完成服务部署

使用ConfigMap完成Nginx的配置

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: nginx
data:
chnupdate.conf: |
server {
listen 80;
server_name web.zhaoweiguo.com;
root /opt/service-new/webroot;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log debug;
add_header Access-Control-Allow-Origin *;
client_max_body_size 128M;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php$ {
root /opt/service-new/webroot;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
}

注意:

1
2
1. 这儿设定好的目录是/opt/service-new/webroot
2. php服务是127.0.0.19000端口

使用Secret设置git密钥

获取git服务的known_hosts内容:

1
2
3
$> ssh-keyscan $YOUR_GIT_HOST > /tmp/known_hosts
例:
$> ssh-keyscan gitee.com > /tmp/known_hosts

获取known_hosts和密钥的base64:

1
2
$> cat /tmp/known_hosts | base64
$> cat /Users/zhaoweiguo/.ssh/gordon.git | base64

新建名为zwgSecret的Secret:

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: zwgSecret
namespace: nginx
data:
ssh: LS0tLS1CRUdJTiB......tCg==
known_hosts: Z2l0Y29......EQnZ1BMFNrMzN

or

1
2
3
$> kubectl create secret generic zwgSecret \
--from-file=ssh=/Users/zhaoweiguo/.ssh/gordon.git \
--from-file=known_hosts=/tmp/known_hosts

使用Deployment设置php,nginx服务

说明:

1
2
3
1. 一个pod下面有3个容器git-sync, php, nginx
2. git-sync容器只负责把代码clone到指定位置,并保证代码是最新的
3. php容器

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-appupdate-deployment
spec:
replicas: 1
selector:
matchLabels:
app: php-appupdate
template:
metadata:
labels:
app: php-appupdate
spec:
containers:
- name: git-sync # 启动 git-sync 容器
image: registry.cn-hangzhou.aliyuncs.com/xxxxxxxx/git-sync:v3.1.1
args:
- "-ssh"
- "-repo=git@git.zhaoweiguo.com:gordon/smart_upload.git"
- "-dest=service-new"
- "-branch=master"
- "-depth=1"
- "-root=/gitpath"
securityContext:
runAsUser: 65533 # git-sync user(指定用户)
volumeMounts: # 挂载数据卷
- mountPath: /gitpath
name: web-root
- name: git-secret
mountPath: /etc/git-secret
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/xxxxxxxx/nginx:alpine
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
- name: web-root
mountPath: /opt
- name: php
image: registry.cn-hangzhou.aliyuncs.com/xxxxxxxx/php:5.5-fpm-v4
imagePullPolicy: IfNotPresent
volumeMounts:
- name: web-root
mountPath: /opt
volumes:
- name: nginx-config
configMap:
name: nginx-config
- name: web-root
emptyDir: {}
- name: git-secret
secret:
secretName: zwgSecret
defaultMode: 288 # = mode 0440
securityContext:
fsGroup: 65533 # to make SSH key readable(指定用户组)

概要

  • 本项目主要实现了基于git的项目同步, 技术为nginx+html

    • git公有项目同步
    • git私有项目同步
    • 部署一个简单的nginx反向代理html

git公有项目同步

  • 基于开源项目: git-sync^1

  • 最简单的https公有项目同步^2

    • 使用git-sync做项目同步
    • 使用nginx做反向代理
    • 两个容器在同一个Pod内,挂载同一个磁盘完成项目同步
  • 配置实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
apiVersion: apps/v1
kind: Deployment
metadata:
name: blog
spec:
replicas: 1
selector:
matchLabels:
name: blog
template:
metadata:
labels:
name: blog
spec:
containers:
- name: git-sync
image: k8s.gcr.io/git-sync:v3.0.1
volumeMounts:
- name: markdown
mountPath: /tmp/git
env:
- name: GIT_SYNC_REPO
value: https://github.com/kubernetes/git-sync.git
- name: GIT_SYNC_DEST
value: git-sync
- name: hugo
image: k8s.gcr.io/hugo
volumeMounts:
- name: markdown
mountPath: /src
- name: html
mountPath: /dest
env:
- name: HUGO_SRC
value: /src/git-sync/demo/blog
- name: HUGO_BUILD_DRAFT
value: "true"
- name: HUGO_BASE_URL
value: example.com
- name: nginx
image: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: markdown
emptyDir: {}
- name: html
emptyDir: {}

git私有项目同步

  • 简单说明:

    • https协议的地址克隆需要输入密码(输入密码方案暂没找到合适的方法)
    • ssh协议的地址克隆需要私钥(此方案要把私钥存放到指定目录才可用)
    • k8s中的Secret类型专门用于存储私私钥

创建私钥

  • 方法一:
1
2
3
4
5
$> ssh-keyscan $YOUR_GIT_HOST > /tmp/known_hosts
// 指定git的密钥和known_hosts
$> kubectl create secret generic git-creds \
--from-file=ssh=/Users/zhaoweiguo/.ssh/gordon.git \
--from-file=known_hosts=/tmp/known_hosts
  • 方法二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$> ssh-keyscan $YOUR_GIT_HOST > /tmp/known_hosts
$> cat /path/to/secret-config.json
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {
"name": "git-creds"
},
"data": {
"ssh": <base64 encoded private-key> # 这儿是密钥的base64
"known_hosts": <base64 encoded known_hosts> # 这儿是known_hosts的base64
}
}

// 执行
$> kubectl create -f /path/to/secret-config.json

配置私钥Pod Volume

  • 查看确定私钥已经创建成功:

    1
    2
    3
    zhaowgMac:k8s zhaoweiguo$ kubectl get secret
    NAME TYPE DATA AGE
    git-creds Opaque 2 22d
  • git私钥volumes配置

    1
    2
    3
    4
    5
    6
    7
    # ...
    volumes:
    - name: git-secret
    secret:
    secretName: git-creds # 这儿就是前面指定Secret的名
    defaultMode: 288 # 0440
    # ...

配置git-sync容器

  • 参数说明

    1
    2
    3
    4
    -ssh: 指定使用ssh协议
    -repo: 指定git地址
    -dest: 指定clone后的文件夹名
    -branch: 指定git分支名
  • git-sync容器配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # ...
    containers:
    - name: git-sync
    image: k8s.gcr.io/git-sync:v9.3.76
    args:
    - "-ssh"
    - "-repo=git@github.com:foo/bar"
    - "-dest=bar"
    - "-branch=master"
    volumeMounts:
    - name: git-secret
    mountPath: /etc/git-secret
    securityContext:
    runAsUser: 65533 # git-sync user
    # ...

完整实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: php-deployment
spec:
replicas: 1
selector:
matchLabels:
app: php
template:
metadata:
labels:
app: php
spec:
containers:
- name: git-sync # 启动 git-sync 容器
image: registry.cn-hangzhou.aliyuncs.com/xxxxxxxx/git-sync:v3.1.1
args:
- "-ssh"
- "-repo=git@gitee.com:agents/private.git"
- "-dest=private" # git克隆后文件夹名
- "-branch=master" # git分支名
- "-depth=1" # 没有sub
- "-root=/git" # 克隆到指定目录
securityContext:
runAsUser: 65533 # git-sync user(指定用户)
volumeMounts: # 挂载数据卷
- mountPath: /git # git项目在git-sync容器存储地址
name: web-root
- name: git-secret
mountPath: /etc/git-secret # 私有git地址需要用到的私钥目录
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/xxxxxxxx/nginx:alpine-v1
volumeMounts:
- name: web-root
mountPath: /usr/share/nginx/html # git项目在nginx容器存储地址
volumes:
- name: web-root
emptyDir: {}
- name: git-secret
secret:
secretName: git-creds
defaultMode: 288 # = mode 0440

概要

  • 最近因为工作需要, 开始使用k8s
  • 我的理念是: 在用中学, 简单学习了基本概念后开始准备实践
  • 步骤:
    • 使用gin做一个简单的web项目
    • 编译一个最简单项目
    • 基于alpine打包一个新的docker
    • 运行一个Deployment生成pod
    • 运行一个Service生成服务

部署一个最简单项目

  • 先确定已经连接上k8s服务:

    1
    2
    3
    // 如何创建k8s服务后续章节专门写(本章节的k8s服务是直接使用阿里的托管k8s)
    // 基本命令使用也认为各位都已经了解
    $ kubectl get po
使用go建立一个新项目
  • go项目源码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ cat main.go
    func main() {
    router := gin.Default()
    router.GET("/file", func(c *gin.Context) {
    data := map[string]interface{}{
    "lang": "55555555555",
    "tag": "9999999",
    }
    c.AsciiJSON(http.StatusOK, data)
    })
    // Listen and serve on 0.0.0.0:8080
    s := &http.Server{
    Addr: ":8080",
    Handler: router,
    ReadTimeout: 10 * time.Second,
    WriteTimeout: 10 * time.Second,
    MaxHeaderBytes: 1 << 20,
    }
    s.ListenAndServe()
    }
  • 编译

    1
    2
    // 生成linux可用的二进制文件
    GOARCH=amd64 GOOS=linux go build -o gordondemo ../main.go
打包Docker镜像
  • Dockerfile文件

    1
    2
    3
    4
    FROM alpine        # 使用最简单镜像alpine
    ADD gordondemo / # 把生成的二进制文件放到根目录/中
    ENTRYPOINT ["/gordondemo"] # 设定入口文件为 /gordondemo (即前面的二进制文件)
    EXPOSE 8080 # 设定开放的http端口8080
  • 打包并推送镜像

    1
    2
    $ docker build -t registry.cn-beijing.aliyuncs.com/zhaoweiguo/gordondemo:v8 .
    $ docker push registry.cn-beijing.aliyuncs.com/zhaoweiguo/gordondemo:v8
生成k8s Deployment
  • 编辑Deployment的yaml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $ cat deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: gordondemo
    labels:
    app: gordondemo
    spec:
    replicas: 1 # 指定pod复制数
    template:
    metadata:
    name: gordondemo
    labels:
    app: gordondemo # 指定pod名
    spec:
    containers:
    - name: gordondemo
    image: registry.cn-beijing.aliyuncs.com/test/gordondemo:v8
    imagePullPolicy: IfNotPresent
    # command: ["/app/data-query-service/startdocker.sh", "data-query-service.jar"]
    resources:
    requests:
    memory: "256Mi"
    limits:
    memory: "512Mi"
    ports:
    - containerPort: 8080
    restartPolicy: Always
    selector:
    matchLabels:
    app: gordondemo
  • 执行Deployment

    1
    $ kubectl apply -f deployment.yaml
生成k8s Service
  • 编辑Service的yaml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // 这儿直接使用阿里云的slb服务
    $ cat service.yaml
    apiVersion: v1
    kind: Service
    metadata:
    annotations:
    service.beta.kubernetes.io/alicloud-loadbalancer-protocol-port: "http:80"
    labels:
    app: gordondemo
    name: gordondemo
    namespace: default
    spec:
    ports:
    - port: 80
    protocol: TCP
    targetPort: 8080
    selector:
    app: gordondemo
    sessionAffinity: None
    type: LoadBalancer

  • 执行Service

    1
    $ kubectl apply -f service.yaml
查看、验证
  • 查看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ kubectl get deployment
    NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
    gordondemo 1 1 1 1 10s
    $ kubectl get svc
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    gordondemo LoadBalancer 172.21.7.224 xx.xx.xx.xx 80:31807/TCP 10s
    $ kubectl get po
    NAME READY STATUS RESTARTS AGE
    gordondemo-65f4dbd959-7ps4v 1/1 Running 0 10s
  • 请求成功

    1
    2
    // EXTERNAL-IP 对应的就是阿里slb的ip地址(即EXTERNAL-IP对应的字段)
    $ curl xx.xx.xx.xx

简介

时序时空数据库(Time Series & Spatial Temporal Database,简称 TSDB)是一种高性能、低成本、稳定可靠的在线时序时空数据库服务,提供高效读写、高压缩比存储、时序数据插值及聚合计算等服务,广泛应用于物联网(IoT)设备监控系统、企业能源管理系统(EMS)、生产安全监控系统和电力检测系统等行业场景;除此以外,还提供时空场景的查询和分析的能力。

阅读全文 »

简介

日志服务(Log Service,简称 LOG)是针对日志类数据的一站式服务,无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立 DT 时代海量日志处理能力。

阅读全文 »

简介

  • 阿里云物联网平台向下连接海量设备,支撑设备数据采集上云;向上提供云端API,指令数据通过API调用下发至设备端,实现远程控制。
  • 提供MQTT, CoaP, HTTP/S等多种协议SDK设备接入,可快速对接2G/3G/4G、NB-IoT、LoRa、WiFi等不同网络设备
阅读全文 »