Mac配置Go开发环境
背景
目前我的主要开发语言是 Python, 当然 Python 在使用过程中还是很爽的, 但总还是想学习一门编译语言用于生产中, 由于舍友使用的 Golang 开发,这样我也就顺利入坑了 Golang。
安装 Go 语言开发环境方式一, 官网下载下载地址: https://golang.google.cn/dl/
下载 Mac 版本 pkg 安装包安装即可
方式二, Homebrew 安装1234brew updatebrew install golanggo version # 安装完成了go version go1.12.6 darwin/amd64
GOPATH
GOPATH 环境变量表示 Go的工作目录, 这个目录指定需要从那个地方寻找GO的包,可执行程序等,使用 go get 下载的包都放在这个目录下,Go语言1.14版本之后推荐使用go modules管理以来,也不再需要把代码写在GOPATH目录下了。
配置 GOPATH
GOPATH默认是$HOME/go,如果你希望使用其他目录可以在你用的Shell配置文件(如/.zshrc、/.bashrc、.bas ...
Deployment
背景
RC 和 RS 两种资源对象的功能基本上是差不多的,唯一的区别是在 selector 上 RS 支持集合,但是在生产中更推荐用 Deployment 这种资源对象来管理我们的 Pod,下面就详细说明为什么推荐用 Deployment 这种资源对象为什么比 RC 和 RS 更好
RC 是 Kubernetes 的一个核心概念,当我们把应用服务部署到集群中去,要保证应用能够持续稳定的运行,RC 就是这个保证的关键它能提供以下功能
确保 Pod数量: 它会确保 Kubernetes 中有指定数量的 Pod 在运行,如果少于指定的 Pod,RC 就会创建新的,反之会删除多余的,保证 Pod 的副本数量不变
确保 Pod 健康: 当Pod运行出现错误,不能提供服务了,RC 会杀死不健康的 Pod 重新创建新的
弹性伸缩: 在业务高峰到来之前,可以通过 RC 来调整 Pod 的数量,来确保服务的正常访问
滚动升级: 滚动升级是一种平滑的升级方式,通过逐步替代的策略,保证整体系统的稳定性
Deployment
Deployment 同样也是 Kubernetes 系统的一个核 ...
Sqlacodegen
背景
在日常开发中,有的是库和表已经存在,但是这时候如果想从库中导出 Python 的 orm sqlalchemy 的模型,可以使用 sqlacodegen 这个第三方库来实现
按表导出模型1sqlacodegen --outfile db.py --tables table1,table2 mysql+pymysql://root:passwd@127.0.0.1:3306/db_name
按库导出模型1sqlacodegen --outfile db.py mysql+pymysql://root:passwd@127.0.0.1:3306/db_name
导出详情如下12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455# coding: utf-8from sqlalchemy import Column, DateTime, Integer, Numeric, String, Textfrom flask_sqlalche ...
Replication Controller 和 ReplicaSet
背景
前面都只是使用了 Pod 的一些基本使用方法,都是直接来操作 Pod,在生产中有一些业务场景并不适合直接操作 Pod, 比如 某次运营活动非常成功,网站访问量突然暴增, 运行当前 Pod 的节点发生故障了, Pod 不能正常提供服务了。这些不能靠我们人工的去解决这些问题,我们希望 Pod 不够自动帮我门增加一个,Pod 挂了自动帮我们在合适的节点上重新启动一个 Pod, kubernetes 其实为我们提供了这样的资源对象
Replication Controller: 用来部署,升级 Pod
Replica Set: 下一下的 Replication Controller
Deployment: 可以更加方便的管理 Pod 和 Replica Set
Replication Controller (Rc)
Replication Controller 简称 RC, RC 是 Kubernetes 系统中的核心概念之一,RC 可以保证在任意时间运行 Pod 的副本数量, 能够保证 Pod 总是可用的, 如果实际 Pod 数量比指定的多那就结束掉多余的,如果实际数量比指定的少 ...
初始化容器
初始化容器
容器的健康检查可以用探针来解决,liveness probe(存活探针)和readiness probe(可读性探针), 探针和容器的两个钩子函数是可以影响到容器的生命周期,本篇介绍的是 Init Container (初始化容器)
初始化容器
Init Container 是用来做初始化工作的容器,可以是一个或者多个,这些容器会定义的顺序依次执行,只有所有的Init Container 执行完毕后,主容器才会被启动,由于Pod 里面的所有容器是共享数据卷和网络命名空间的,所以 Init Container 立面产生的数据可以被主容器使用到
PostStart和PreStop和 liveness 和 readiness 是属于主容器的生命周期范围内的
Init Container 是独立于主容器之外的,他们都属于 Pod 的生命周期范围之内.
Infra 容器
上面图中还包含一个 infra 的容器,集群中的每一个 Pod 对应运行的 Docker 容器,都包含一个 pause-amd64 的镜像,这就是我们的 infra 镜像, Pod 下面的所有容器是共享 ...
Pod 健康检查
在 kubernetes 集群中,我们可以通过配置 liveness probe (存活探针) 和 readiness probe(可读性探针) 来影响容器的生存周期,
liveness probe
kubelet 通过使用 liveness probe 来确定你的应用程序是否正在运行, 如果程序一旦崩溃了,kubernetes 就会立刻知道这个程序已经终止了,然后就会重启这个程序,而 liveness probe 的目的就是来捕获到当前应用程序的状态,如果崩溃,那么就会重启处于该状态下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去。
readiness probe
readiness probe 来确定容器是否已经就绪,可以接收流量过来了,只有当 Pod 中的容器都处于就绪状态的时候,kubelet 才会认定该 Pod 处于就绪状态,因为一个 Pod 下可能有多个容器。
探针的配置方式
exec: 执行一段命令
http: 检测某个 http 请求
tcpSocket: kubelet 将尝试在指定端口上打开容器的套接字。如果可以建立连接,容器被认为是健康的 ...
修改 rm 命令,删除文件进废纸篓
背景
在日常使用 Mac 的过程中,在终端中经常会使用 rm 命令,使用这种方式删除的资源不会出现在废纸篓中,若是误删的话,想要找回比较困难
解决方式
可以使用 trash 脚本替换 rm命令,它其实是调用的 finder 的api 进行删除,这样终端中删除的资源也会出现在废纸篓中。
安装trash使用 homebrew 就可以安装 trash,非常方便
1brew install trash
安装成功过后可以使用 trash -fr filename, 命令和 rm 一样,对于我们已经习惯了 rm 命令, 我们可以用 trash 替换 rm 命令。
修改配置文件本人使用的是 zsh 模式的终端,在 ~/.zshrc 文件中配置,如果是 bash 模式的终端,在 ~/.bash_profile 中配置
12echo alias rm="trash" >> ~/.zshrcsource ~/.zshrc
Pod Hook
Pod 是 kubenetes 集群中的最小单元, 而 Pod 是由容器组成的,Pod 的生命周期和容器的生命周期息息相关
kubernetes 为容器提供了生命周期的钩子,称为 Pod Hook, Pod Hook 是由, kubectl 发起的,当容器中的进程启动前或者容器中的进程终止之前运行, 可以为 Pod 中的所有容器都配置 hook
Pod Hook 分类
PostStart: 钩子函数在容器创建后立即执行,但是并不一定是在容器 ENTRYPOINT 之前运行,主要用户资源部署,环境准备,需要注意如果钩子花费太长时间以至于不能运行或者挂起,容器不能达到 Running 状态
PreStop: 钩子函数将在容器终止前立即被调用,特点是阻塞, 必须在删除容器的调用发出之前完成,主要用于优雅的关闭应用程序,通知其他系统等,在钩子执行期间挂起,Pod 阶段将停留在 Running状态,并且永远不会达到 Failed 状态.
如果 PostStart 或者 PreStop 钩子失败,他会杀死容器,所以我们应该让钩子函数尽可能的轻量。
示例PostStart定义一个 Ng ...
YAML 创建 Pod
上一篇我们已经对YAML 两种经常用的语法 Maps和 Lists 有了基本了解,下面我们可以使用 YAML 来创建 Pod
YAML 定义 Pod 文件1234567891011121314151617---apiVersion: v1kind: Podmetadata: name: kube100-site labels: app: webspec: containers: - name: fronted-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: - containerPort: 5000
apiVersion: 版本号,需要根据我们安装的kubernetes 版本和资源类型进行更改
kind: 创建的资源类型, 这里我们创建的是一个 Pod, 也可以是其他,Deployment, job, ingress, Service。
metadata: 包含我们定义的Pod的一 ...
YAML 基本语法
在使用 kubernetes 集群时候会用到 YAML 文件来创建相关的资源,本篇博客对YAML基本语法进行一些总结
基本语法YAML 基本语法规则如下:
大小写敏感
使用缩进表示层级关系
缩进时不允许使用 Tab 键, 只允许使用空格
# 表示注释
在多数情况下,我们只需要Lists, Maps 两种结构类型就行了
MapsMaps 是字典,就是 key:value 的键值对,Maps 可以让我们更加方便的去写配置信息。
123---apiVersion: v1kind: Pod
第一行的 --- 是分隔符, 是可选的,在同一个文件中,可以用--- 区分多个文件,上面的 YAML 文件中有两个键,kind 和 apiVersion, 他们对应的值分别是 v1 和 Pod, 对应的 JSON的格式如下
1234{ "apiVersion": "v1", "kind": "pod"}
下面我们来看一个稍微复杂一点的 YAML 文件, 创建一个 KEY 对应的 ...