自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qhh0205

专注于云计算、Kubernetes、DevOps、微服务、持续集成/持续交付相关技术,企业级 DevOps 落地实践!

  • 博客(176)
  • 资源 (8)
  • 收藏
  • 关注

原创 从 Docker 到 Kubernetes 日志管理机制详解

在容器化时代,容器应用的日志管理和传统应用存在很大的区别,为了顺应容器化应用,Docker 和 Kubernetes 提供了一套完美的日志解决方案。本文从 Docker 到 Kubernetes 逐步介绍在容器化时代日志的管理机制,以及在 Kubernetes 平台下有哪些最佳的日志收集方案。涉及到的话题有 Docker 日志管理机制、Kubernetes 日志管理机制、Kubernetes 集群...

2019-08-26 10:30:27 2568

原创 Kubernetes 集群安全机制详解

本文主要介绍 Kubernetes 的安全机制,如何使用一系列概念、技术点、机制确保集群的访问是安全的,涉及到的关键词有:api-server,认证,授权,准入控制,RBAC,Service Account,客户端证书认证,Kubernetes 用户,Token 认证等等。虽然涉及到的技术点比较琐碎,比较多,但是了解整个机制后就很容易将其串起来,从而能很好地理解 Kubernetes 集群安全机制...

2019-08-22 13:25:38 3054

原创 Kong 微服务网关在 Kubernetes 的实践

本文主要介绍将 Kong 微服务网关作为 Kubernetes 集群统一入口的最佳实践,之前写过一篇文章使用 Nginx Ingress Controller 作为集群统一的流量入口:使用 Kubernetes Ingress 对外暴露服务,但是相比于 Kong Ingress Controller 来说,Kong 支持的功能更加强大,更适合微服务架构:拥有庞大的插件生态,能轻易扩展 Kong...

2019-08-17 12:48:46 11852 5

原创 使用 Kubernetes Ingress 对外暴露服务

本文主要介绍如何通过 Kubernetes Ingress 资源对象实现从外部对 k8s 集群中服务的访问,介绍了 k8s 对外暴露服务的多种方法、Ingress 及 Ingress Controller 的概念。涉及到的话题有:k8s 对外暴露服务的方法;Ingress 及 Ingress Controller 简介;helm 裸机部署 Nginx Ingress Controller;...

2019-08-12 23:27:22 17046 4

原创 SpringBoot 使用 Redis 分布式锁解决并发问题

问题背景现在的应用程序架构中,很多服务都是多副本运行,从而保证服务的稳定性。一个服务实例挂了,其他服务依旧可以接收请求。但是服务的多副本运行随之也会引来一些分布式问题,比如某个接口的处理逻辑是这样的:接收到请求后,先查询 DB 看是否有相关的数据,如果没有则插入数据,如果有则更新数据。在这种场景下如果相同的 N 个请求并发发到后端服务实例,就会出现重复插入数据的情况:解决方案针对上面问题,一般的解决方案是使用分布式锁来解决。同一个进程内的话用本进程内的锁即可解决,但是服务多实例部署的话是分布式的,各

2021-07-24 17:53:56 1398 3

原创 SpirngBoot 整合使用 Redis

本文主要介绍如何在 springboot 项目中集成使用 Redis。springboot 将很多基础的工具组件都封装成了一个个的 starter,比如基础的 web 框架相关的 pring-boot-starter-web,操作数据库相关的 spring-boot-starter-data-jpa 等等。如果要操作 Redis,同理需要引入 redis 相关的 starter:spring-boot-starter-data-redis。下面介绍 springboot 集成使用 Redis 的详细过程。

2021-07-17 23:20:54 74

原创 Java 解压 gzip 和 tar.gz 文件

在开发过程中有时候会需要解压 gzip 或者 tar.gz 文件,下面封装了一个工具类,可以解压 gzip 和 tar.gz 文件。package com.example.demo.common.utils;/** * Created by qianghaohao on 2021/5/23 */import org.apache.commons.compress.archivers.tar.TarArchiveEntry;import org.apache.commons.compress.a

2021-05-23 11:42:22 838

原创 Java 发送 HTTP 请求的两种常用方法

本文主要介绍在 Java 编程中发送 HTTP 请求的两种常用方法:JDK 原生的 HttpURLConnection 发送 HTTP 请求Apache HhttpClient 发送 HTTP 请求两种方法都可以发送 HTTP 请求,第一种是 Java 原生的,因此使用起来相对麻烦一些,第二种是通过第三方的包来实现,这个包是 Apache 旗下的专门用来发送 HTTP 请求的 HttpClient 包,是对 Java 原生的 HttpURLConnection 扩展,因此功能也更加强大,使用起来也

2021-05-16 16:01:58 3632 1

原创 Mac 下多版本 JDK 安装及切换

背景由于公司项目基于 JDK 1.8,我本地默认安装的是 JDK 10,这样在 idea 中通过 maven 编译的时候各种报错,有点不兼容。为了解决这个问题最好的办法就是再安装一个 1.8 的 JDK 版本了,和公司项目代码版本兼容。本文主要介绍 Mac 下如何安装 JDK 并且多版本如何切换。Mac 下 JDK 安装配置Mac 下安装 JDK 比较简单,只需要访问 Oracle 官网,找到对应环境和版本的 JDK 下载安装即可,下载 mac 下的 dmg 安装文件,一路点击下一步即可。JDK 下

2021-04-05 11:34:31 4389 2

原创 Java JSch 远程执行 Shell 命令

背景项目需求,需要远程 ssh 登录到某个节点执行 shell 命令来完成任务。对于这种需求,如果不用 java 程序,直接 linux 的 ssh 命令就可以完成,但是在编码到程序中时需要相关的程序包来完成,本文主要介绍在 java 中如何使用 JSch 包实现 ssh 远程连接并执行命令。JSch 简介JSch 是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功

2021-03-28 15:33:17 12294 10

原创 Java 中 final 关键字详解

在 Java 中,final 关键字可以修饰的东西比较多,很容易混淆,在这里记录一下。主要从功能上说明一下,不做过多的代码演示。final 关键字用途1. final 变量凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。2. final方法参数如果 final 关键字修饰方法参数时,方法中是不能改

2021-01-24 12:09:34 2641 2

原创 GO 语言程序设计读书笔记-接口值

GO 语言程序设计读书笔记-接口值从概念上来讲,一个接口类型的值(简称接口值)其实有两个部分:一个具体类型和该类型的一个值。二者称为接口的动态类型和动态值。比如下面声明一个接口变量 w 并赋值,那么 w 接口值可以用如下图表示:接口的零值接口的零值就是把它的动态类型和动态值都设为 nil,如下图所示:var w io.Writer // 接口的零值在这种情况下就是一个 nil 接口值,可以用 w == nil 或者 w != nil 来检测一个接口值是否时 nil。调用一个 nil 接口的任何

2020-09-06 13:09:25 3962

原创 使用 kind 1 分钟启动一个本地 k8s 开发集群

使用 kind 1 分钟启动一个本地 k8s 开发集群kind 简介Github 地址:https://github.com/kubernetes-sigs/kindkind 是一个快速启动 kubernetes 集群的工具,适合本地 k8s 开发环境搭建,能在 1 分钟之内就启动一个非常轻量级的 k8s 集群。之所以如此之快,得益于其基于其把整个 k8s 集群用到的组件都封装在了 Docker 容器里,构建一个 k8s 集群就是启动一个 Docker 容器,如此简单,正如下面图片描述一样:说说我

2020-08-15 12:37:36 2128

原创 Golang 项目配置文件读取之 viper 实践

Golang 项目配置文件读取之 viper 实践在我们做一个工程化项目的时候,经常涉及到配置文件的读取,viper 包很好地满足这一需求,而且在 Golang 生态中是流行度最高的。导入方式:import "github.com/spf13/viper"这里分享下我对 viper 包的使用关键实践:首先,在代码工程中单独定义一个包(我一般起名为 config 或者 configloader),这个包专门用来读取加载配置文件,并做相关校验,包里面我定义 3 个函数和 1 个全局变量:var v

2020-07-11 20:26:06 1349 1

原创 通过 swagger-ui 查看 kube-apiserver apis

通过 swagger-ui 查看 kube-apiserver apis从 k8s v1.14 开始,官方已经废弃了 swagger 接口,使用 openapi 规范,暴露出来的接口是: /openapi/v2,我们要想通过swagger-ui 来查看 apiserver 接口,可以自己本地跑个 swagger-ui 服务,然后访问 kube-apiserver 地址的 openapi 接口地址即可,swagger-ui 来源支持 openapi 数据格式。1.本地启动 swagger-ui 服务d

2020-07-11 17:48:35 1465 1

原创 Golang 项目中集成日志功能

Golang 项目中集成日志功能在一个 web 项目中,日志打印功能是必须的,有了详细的日志能为问题排查带来很大的便利。Golang 有很多开源的日志包可供使用,这里我还是使用非常流行的 logrus 包,结合 file-rotatelogs 包实现日志的自动切割轮转。集成方法:1.单独定义一个 package 名为 logger,里面只有一个 init.go 文件,初始化日志配置,这个配置是全局的:日志输出格式为 json;日志自动轮转,保留最近 7 天日志,一天产生一个日志文件,防止服务长

2020-07-06 09:37:21 694

原创 Golang 从 Json 串中快速取出需要的字段

Golang 从 Json 串中快速取出需要的字段在 web 编程中很多情况下接口的数据是 json 格式,在我们拿到接口的 json 数据后如何方便地从中提取出需要的字段呢?我们可以自定义一个结构体,然后通过 Golang 的标准库 json 解析到我们定义的结构体中。但是当 json 格式比较复杂,嵌套层级比较深的时候,还是用这种方法就比较麻烦了。在这里推荐一个包: gojsonq,可以很简便地从 json 串中提取出需要的字段,无需定义额外的结构体,然后解析,直接链式地从 json 串中提取需要的字

2020-07-05 21:58:02 6612

原创 kubernetes 源码编译

kubernetes 源码编译分为本地编译和镜像编译,本地编译是指最终编译出来的是二进制可执行文件,镜像编译是最终编译出来的产出物为 docker 镜像 tar 包。本文主要介绍本地编译的方法,以编译 kube-apiserver 组件为例说明。环境要求Go 环境: go1.12.xxgcc我的环境说明:Mac Os + go1.12.10 + gcc,如果读者本地的 Go 版本不...

2020-03-01 18:14:29 1418

原创 Golang 多版本管理神器 gvm

缘起最近编译 kubernetes 遇到了点坑,编译各种报错,经搜索调研发现 k8s 的编译对 go 的版本有很严格的要求。比如我的 go1.13.4 就无法编译 kubernetes v1.16.3,必须得 go1.12.xx 版本才能编译。为了解决这种尴尬的场景只能再在主机安装个 go1.12.xx 版本,那么有没有什么优雅的方式来实现本机多版本 Golang 版本的管理呢,能很方便的进行不...

2020-03-01 11:46:44 3259

原创 Golang logrus 日志包及日志切割

Golang logrus 日志包及日志切割本文主要介绍 Golang 中最佳日志解决方案,包括常用日志包 logrus 的基本使用,如何结合 file-rotatelogs 包实现日志文件的轮转切割两大话题。Golang 关于日志处理有很多包可以使用,标准库提供的 log 包功能比较少,不支持日志级别的精确控制,自定义添加日志字段等。在众多的日志包中,更推荐使用第三方的 logrus 包,完...

2020-01-28 23:52:35 9670 3

原创 使用 Prometheus Operator 构建 Kubernetes 监控系统

本文主要介绍使用 Prometheus 监控 Kubernetes 的最佳实践,借助 Prometheus Operator 和 Helm 快速完成 Kubernetes 集群的监控。Prometheus Operator 是 SRE 的一种实践,一种新的软件类型,大大简化了在 Kubernetes 上部署、管理和运行 Prometheus 和 Alertmanager 集群,同时还保持 Kub...

2019-12-15 13:59:28 767

原创 MySQL 慢查询日志导入 Elasticsearch 可视化查询分析

当应用程序后台 SQL 查询慢的时候我们一般第一时间会查看数据库慢查询记录,但是慢查询记录是原始文本,直接查询搜索分析比较费时费力,虽然业界有针对 MySQL 慢查询分析的命令行工具(比如:pt-query-digest),但是使用起来还是不够方便,而且分析结果也是针对整个实例的大概统计,不能及时定位到某个应用(库.表)的慢查询。出于这个目的我们可以将 MySQL 原始慢查询日志结构化导入 Ela...

2019-10-24 19:42:28 2527 1

原创 基于 Kubernetes 的 7 大 DevOps 关键实践

本文主要介绍 DevOps 的 7 大关键实践在 Kubernetes 平台下如何落地,结合我们目前基于 Kubernetes 平台的 DevOps 实践谈谈是如何贯彻相关理念的,这里不会对其具体实现细节进行深入讲解,只做一个大致的概括的描述,分享下已有的实践,具体实践细节有时间了会单独整理一篇文章分享。DevOps 简介DevOps 集文化理念、实践和工具于一身,可以提高企业高速交付应用程序...

2019-09-07 21:03:50 1024

原创 Kubernetes 基于 EFK 技术栈的日志收集实践

之前写过一篇文章介绍了容器环境下日志管理的原理机制:从 Docker 到 Kubernetes 日志管理机制详解,文章内容偏理论,本文在该理论的支撑下具体实践 Kubernetes 下基于 EFK 技术栈的日志收集,本文偏实践,要想全面了解 Kubernetes 下日志收集管理机制,最好还是两篇文章顺序阅读。本文不仅限于介绍怎么在 Kubernetes 集群部署 EFK 组件,还涉及到其他相关话...

2019-09-06 00:23:10 4244 1

原创 Kubernetes CronJob 的一个应用案例

最近 Kubernetes 集群中出现过几次 Redis 故障,具体表现是每次集群重启(云资源按需启动), Redis Pod 都要老半天才能启动起来,后来逐渐排查定位才发现原来是由于 Redis 开启了 aof 持久化机制。我们知道在 AOF 持久化机制下,Resdis 的每一条写命令都会被同步、并且追加的方式持久化的磁盘文件,当 Redis 由于意外故障时,下次重启就会原封不动地执行 AOF...

2019-08-30 11:31:10 743 1

原创 数据库升级 DevOps 落地实践

在我们做持续集成/交付的过程中,应用的发布已经通过 DevOps 流水线基本能满足快速迭代的需求,但是很多企业在落地实践 DevOps 的过程中很容易忽略的一点是关于应用数据库版本、升级的管理,每次上线发布数据库的更新依然通过运维或者 DBA 手工更新,在微服务、容器盛行的背景下,服务多,服务发布速度快,显然靠人工该 DB 是跟不上迭代速度的,从而导致 DB 的更新成了整个软件交付周期的瓶颈。这一...

2019-08-29 11:51:42 2447 1

原创 Kubernetes 调整 nodePort 端口范围

默认情况下,k8s 集群 nodePort 分配的端口范围为:30000-32767,如果我们指定的端口不在这个范围就会报类似下面这样的错误:Error: release kong failed: Service “kong-kong-admin” is invalid: spec.ports[0].nodePort: Invalid value: 8444: provided port is...

2019-08-15 21:19:15 9946

原创 基于 docker-compose 容器化构建 Kong 微服务网关平台

本文主要介绍如何使用 docker-compose 快速体验 Kong 微服务网关,先简单介绍基本概念,然后做了一个 Demo 测试使用,涉及到的相关话题有:Kong 简介;Konga 简介;基于 docker-compose 容器化构建 Kong 微服务网关平台;使用 Konga 可视化创建一个 Service 及路由;Kong 简介Kong 是微服务网关模式架构中连接服务消费方...

2019-08-14 20:18:12 3075 7

原创 kubectl 多集群访问配置

配置 KUBECONFIG 环境变量,是 kubectl 工具支持的变量,变量内容是冒号分隔的 kubernetes config 认证文件路径。假如我们有两个集群:A 和 B,A 集群的 config 文件为:$HOME/.kube/config,B 集群的 config 文件为:$HOME/.kube/config-local。要配置 kubectl 随时在两个集群间切换,只需要设置 KUBE...

2019-08-09 10:23:41 2071

原创 Mac OS 启用 ssh 远程登陆

检查 ssh 远程登陆是否启用sudo systemsetup -getremotelogin启用 ssh 远程登陆sudo systemsetup -setremotelogin on启用后就可以用 ssh 来登陆 mac 系统了,账号和密码为系统的账号密码。关闭 ssh 远程登陆sudo systemsetup -f -setremotelogin off...

2019-08-08 18:55:21 1011

原创 Vagrant 多网卡环境下 flannel 网络插件导致 DNS 无法解析

之前写过一篇 k8s 集群自动化部署的文章:「Kubeadm 结合 Vagrant 自动化部署最新版 Kubernetes 集群」,发现集群启动后 DNS 无法解析,公网和集群内部都无法解析,具体问题表现是:进入 pod 执行 ping service 名称或者公网域名都是无法解析 Unknow host。经过网上搜索一番找到了问题并得以解决,主要原因是 Vagrant 在多主机模式下有多个网卡...

2019-08-08 16:16:29 1036

原创 helm 部署 kubernetes-dashboard

helm 部署 kubernetes-dashboardkubernetes-dashboard 是 k8s 官方提供的集群 Web UI,可以查看集群详细的信息,比如集群的 api 资源,pod 日志,工作负载,节点资源利用率等等。使用官方提供的 Chart:https://github.com/helm/charts/tree/master/stable/kubernetes-dashb...

2019-08-08 12:51:26 2942

原创 helm 部署 heapster 组件

之前工作用的 k8s 集群(GKE)都是支持 kubectl top node 查看节点资源使用情况的,最近自己本地新搭的集群发现用不了该命令。网上搜索了下发现是由于缺少集群指标收集组件导致,目前常用的集群指标收集组件是 heapster 和 metrics-server,看官方介绍 heapster 要逐渐被淘汰了,更推荐 metrics-server。但是为了适配后续要安装的 kubernet...

2019-08-08 12:40:47 860

原创 Helm 安装使用

其实 Helm 的安装很简单,之所以单独写这篇文章主要是因为国内网络原因导致 helm 使用存在障碍(防火墙对 google 不友好),本文重点说如何解决这一问题。helm 安装官方提供了一件安装脚本,安装最新版:https://helm.sh/docs/using_helm/#installing-helmcurl -L https://git.io/get_helm.sh | bash...

2019-08-08 10:59:12 666 1

原创 Kubeadm 结合 Vagrant 自动化部署最新版 Kubernetes 集群

之前写过一篇搭建 k8s 集群的教程:「使用 kubeadm 搭建 kubernetes 集群」,教程中用到了 kubeadm 和 vagrant,但是整个过程还是手动一步一步完成:创建节点--> 节点配置、相关软件安装 --> 初始化 master 节点 --> node 节点加入 master 节点。其实这个过程完全可以通过 Vagrant 的配置器自动化来实现,达到的目的是...

2019-08-06 14:43:49 533

原创 kubeadm + vagrant 部署多节点 k8s 的一个坑

kubeadm + vagrant 部署多节点 k8s 的一个坑之前写过一篇「使用 kubeadm 搭建 kubernetes 集群」教程,教程里面使用 Vagrant 启动 3 个节点,1 个 master,2 个 node 节点,后来使用过程中才慢慢发现还是存在问题的。具体问题表现是:kubectl get node -o wide 查看到节点 IP 都是:10.0.2.15;[ro...

2019-08-06 09:41:32 1294 1

原创 Jenkins 集成 allure 测试报告工具

allure 基于已有的测试报告数据进行进一步的加工,美化等操作,相当于做了一次数据格式转换。allure 支持多种语言的多种测试框架,比如 Java 的 jUnit4、jUnit5、TestNg 等等。本文主要介绍如何在 Jenkins 中集成 allure 测试报表工具,在每次项目自动化测试完成后,用 allure 生成经过加工后的测试报告。我们以 java 工程的 TestNg 测试为例,...

2019-07-25 11:51:53 1482

原创 使用 Go 开发命令行应用

使用 Go 开发命令行应用作为一个程序员,命令行工具是我们再熟悉不过的了,我们每天或多或少都会用到命令行工具。比如项目构建、打包、启动等等。那么如何用 Go 语言编写类似的工具呢?调研了下,大概有下面三种方法:os.Args 函数os.Args 功能类似于 Shell 脚本的 $@ 功能,获取到命令行输入,然后进行人工解析处理,这种方式对于编写简单的工具还行,对于复杂点的工具,光解析输入参...

2019-07-23 23:59:05 1352 1

原创 Golang 协程顺序打印

Golang 协程顺序打印A、B 两个协程分别打印 1、2、3、4 和 A,B,C,D实现:定义 A、B 两个 channal,开 A、B 两个协程,A 协程输出[1, 2, 3, 4]、B 协程输出[A, B, C, D],通过两个独立的 channal 控制顺序,交替输出。func main() { A := make(chan bool, 1) B := make(chan boo...

2019-07-23 16:41:04 4672 2

原创 Go 语言 exec 实时获取外部命令的执行输出

Go 语言 exec 实时获取外部命令的执行输出在 Go 语言中调用外部 Linux 命令可以通过标准的 os/exec 包实现,我们一般的使用方式如下:package mainimport ( "fmt" "os/exec")func main() { cmd := exec.Command("ls", "-al") output, _ := cmd.CombinedOut...

2019-07-20 18:19:59 9702 1

progressbar源码修改(支持进度条样式设置)

默认progressbar进度条是#字符,用起来太单调,如果要设置更加美观的进度条,需要修改下源码。

2016-08-17

python控制台英汉互译电子词典

用python实现了下控制台电子词典,数据来自有道,通过向有道发送http表单数据,然后将服务器返回的json数据解析得到翻译结果,代码比较简单。

2016-08-08

autotools学习资料大全

通过两天的学习,基本掌握了autotools(autoconf/automake)工具的使用。然后把这两天学习用到的资料整理了下,全是干货,能以最快的速度学会用autotools来产生符合GNU标准的小型项目,从而满足自己平时发布开源代码的基本需求。至于要产生一个大型的GNU项目,并非一朝一夕的事,得多看开源代码,多看automake官方手册。

2016-04-17

eclipse主题配置文件

精心挑选了四款eclipse的配置文件,并附有使用方法(Readme.txt)。

2015-10-03

Linux主题精美壁纸

压缩包中包括了很多精心挑选的liux主题相关的精美壁纸,好不容易找到的,特此分享一下。

2015-09-23

C++之深拷贝和浅拷贝

通过简短的代码和图片来说明C++中深拷贝和浅拷贝的区别和概念。

2015-09-09

Zeal最新版

Zeal工具是比微软msdn更强大的开源的api查询工具,很实用的工具,用了绝对会爱不释手的。程序员专属工具!

2015-09-01

C++开发帮助文档大全

此压缩包包含很多有用的文档,配置到IDE更加方便,主要目录有:ASCII码表,C++参考书籍,各种CHM格式的文档,git使用帮助,MSDN绿色版,运算符优先级表,正则表达式手册。

2015-08-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除