分类 自动部署 中的文章

WSL2改为桥接

需求

在docker容器内部程序自己获取的ip是172开头的。我需要跟宿主机同样网段的ip。

问题

win10系统wsl2 不支持桥接

更简单的解决方案

使用vmware虚拟机,直接启动一个linux镜像,然后使用桥接网络模式也能实现需求。

……

阅读全文

Docker | Mysql 挂载目录一键部署

创建挂载文件

mkdir -p conf
mkdir -p logs
mkdir -p mysql

编辑配置文件

cd conf/
vi my.cnf

# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


max_connections = 2000
max_user_connections = 1900
max_connect_errors = 100000
max_allowed_packet = 50M
lower_case_table_names=1
[mysqld]
skip-name-resolve
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


#保存后退出

启动

docker命令直接启动

……

阅读全文

GithubAction

Github Token 生成 & 设置

  1. github -> Settings -> Developer Settings -> Personal access tokens 新增 Tokens(classic)
  2. 点击Generate new token
  3. 点击你想使用Action的github仓库 Settings -> Secrets and variables -> Actions -> New respository secret.
  4. 填上名字ACTION_ACCESS_TOKEN和第一步生成的 token,保存

在项目根目录增加文件

.github/workflows/hugo.yml

……

阅读全文

Gitlab | CI/CD简单实现

CI/CD 流水线 组件组成

  1. stages
  2. job
  3. gitlab runner(可以与gitlab服务器独立, c/s架构. )
--------    --------    --------- 
|stage1| -> |stage2| -> | stage3|          
--------    --------    --------- 

------    ------    -------
|job1|    |job2|    | job3|          
------    ------    ------- 

---------   ---------    --------- 
|runner1|   |runner2| -> |runner3|          
---------   ---------    --------- 
  • pipline: 包含多个stage, 顺序执行
  • stages: 一个stage可以包含多个job,job之间并行
  • jobs: 一个job对应一个runner
  • runner: job的运行环境 可以独立于gitlab,放到其他宿主机上.

gitlab runner 安装

gitlab runner是运行job的环境。需要安装一个可以执行gitlab runner命令的环境.

……

阅读全文

Gitlab | CI/CD简单实现

CI/CD 流水线 组件组成

  1. stages
  2. job
  3. gitlab runner(可以与gitlab服务器独立, c/s架构. )
--------    --------    --------- 
|stage1| -> |stage2| -> | stage3|          
--------    --------    --------- 

------    ------    -------
|job1|    |job2|    | job3|          
------    ------    ------- 

---------   ---------    --------- 
|runner1|   |runner2| -> |runner3|          
---------   ---------    --------- 
  • pipline: 包含多个stage, 顺序执行
  • stages: 一个stage可以包含多个job,job之间并行
  • jobs: 一个job对应一个runner
  • runner: job的运行环境 可以独立于gitlab,放到其他宿主机上.

gitlab runner 安装

gitlab runner是运行job的环境。需要安装一个可以执行gitlab runner命令的环境.

……

阅读全文

Docker | 容器退出码详解

docker查看退出码指令

$ docker ps --filter "status=exited"
$ docker inspect  container-id --format='{<!-- -->{.State.ExitCode}}'

常见退出码

Exit Code 0

  • 退出代码0表示特定容器没有附加前台进程。
  • 该退出代码是所有其他后续退出代码的例外。
  • 这不一定意味着发生了不好的事情。如果开发人员想要在容器完成其工作后自动停止其容器,则使用此退出代码。

Exit Code 1

  • 程序错误,或者Dockerfile中引用不存在的文件,如 entrypoint中引用了错误的包
  • 程序错误可以很简单,例如“除以0”,也可以很复杂,比如空引用或者其他程序 crash

Exit Code 137

  • 此状态码一般是因为 pod 中容器内存达到了它的资源限制(resources.limits),一般是内存溢出(OOM),CPU达到限制只需要不分时间片给程序就可以。因为限制资源是通过 linux 的 cgroup 实现的,所以 cgroup 会将此容器强制杀掉,类似于kill -9
  • 还可能是宿主机本身资源不够用了(OOM),内核会选取一些进程杀掉来释放内存
  • 不管是 cgroup 限制杀掉进程还是因为节点机器本身资源不够导致进程死掉,都可以从系统日志中找到记录(journalctl -k)

Exit Code 139

  • 表明容器收到了SIGSEGV信号,无效的内存引用,对应kill -11
  • 一般是代码有问题,或者 docker 的基础镜像有问题

Exit Code 143

  • 表明容器收到了SIGTERM信号,终端关闭,对应kill -15
  • 一般对应docker stop 命令
  • 有时docker stop也会导致Exit Code 137。发生在与代码无法处理SIGTERM的情况下,docker进程等待十秒钟然后发出SIGKILL强制退出。

不常用的一些 Exit Code

  • Exit Code 126: 权限问题或命令不可执行
  • Exit Code 127: Shell脚本中可能出现错字且字符无法识别的情况
  • Exit Code 1 或 255:因为很多程序员写异常退出时习惯用 exit(1) 或 exit(-1),-1 会根据转换规则转成 255。这个一般是自定义 code,要看具体逻辑。

退出状态码的区间

  • 必须在 0-255 之间,0 表示正常退出- 外界将程序中断退出,状态码在 129-255- 程序自身异常退出,状态码一般在 1-128- 假如写代码指定的退出状态码时不在 0-255 之间,例如: exit(-1),这时会自动做一个转换,最终呈现的状态码还是会在 0-255 之间。我们把状态码记为 code,当指定的退出时状态码为负数,那么转换公式如下:256 – (|code| % 256) 参考链接: https://imroc.io/posts/kubernetes/analysis-exitcode/
……

阅读全文

K8S | Prometheus+Grafana监控

概述

作为应用与Kubernetes的监控体系,Prometheus具备诸多的优势,如:

  • Kubernetes默认支持,非常适合容器和微服务- 无依赖,安装方便,上手容易- 社区活跃,它不仅仅是个工具,而是生态- 已有很多插件或者exporter,可以适应多种应用场景的数据收集需要- Grafana默认支持,提供良好的可视化- 高效,单一Prometheus可以处理百万级的监控指标,每秒处理数十万的数据点 在部署之前,先来了解一下Prometheus各个组件的作用吧!
  • MertricServer:是k8s集群资源使用情况的聚合器,收集数据给K8s集群内使用,如:kubectl,hpa,scheduler- PrometheusOperator:是一个系统检测和警报工具箱,用来存储监控数据;- NodeExporter:用于各node的关键度量指标状态数据;- kubeStateMetrics:收集k8s集群内资源对象数据,指定告警规则;- Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通过http协议传输;- Grafana:是可视化数据统计和监控平台。 web管理部署一个就可以。如果安装了其他web管理可以删除
    https://github.com/prometheus/prometheus

下载

下载prometheus所需文件:

……

阅读全文

K8S | Ingress的基本使用

缘由

看了statefulset基础教程的基础教程,并且把环境搭建起来后。pod内部是可以连通了。但是我不知道怎么去从外部访问。在网上搜索一番,通过Ingress可以作为集群的入口。遂记录之。
结合Statefulset的示例进行配置。这是未配置Ingress之前的Statefulset示例:

……

阅读全文

K8S | Statefluset的持久存储PVC

缘由

在看statefluset基础教程的时候遇到pod状态为pending

kubectl describe pod web-0

日志内容是

 pod has unbound immediate PersistentVolumeClaims

于是就对PV和PVC进行研究。
有给出完整的 web.yaml查看最下面的完整示例。但是我建议先把PV和PVC的概念弄懂了,还有学会查看pod的描述kubectl describe pod podname或者日志kubectl logs -f podname,自然知晓怎么处理pod的状态为pending的问题了。

……

阅读全文