docker容器中的证书问题
作者 青鸟
记录一次关于docker部署时候的debug
问题昨天的时候针对学校的统一认证做了一个简单的逆向,并打算将逆向结果用于校园论坛的认证。但是在将逆向结果打成docker部署后,访问校园认证系统的时候出现了tls:x509 certificate signed by unknown authority的错误。经过一番debug确定了问题出在了ssl证书上,导致了容器内部访问https出错。现对问题做一个具体的分析。
go语言天生适合运行在docker中,这得益于go的静态编译可以将go项目打包成一个二进制文件而无需依赖配置,可以完全独立运行在容器中且只需要最小的scratch的支持。关于docker部署的流程就不在此赘述了,详情可以见之前的博客。但是当我们对外访问的使用https的时候就会出现tls:x509 certificate signed by unknown authority的错误。
原因很简单,众所周知,https是基于ca证书的,但是我们打包成容器时候使用的是scratch,这就导致了ca证书的缺失,同时go的基础镜像于是基于scratch的,这也导致了使用go ...
k8s中的Service的实现
又是水一篇总结的博客……
概述首先了解k8s的集群网络模型是很有必要的,也是这篇博客的前提。这里建议直接阅读k8s网络模型的设计文档,可以让你对我们本篇所讨论的有个大致的了解。
在k8s框架中,每个Pod和容器一样只具有临时的生命周期,一个Pod随时有可能被终止或者漂移,我们不应当期望一个容器和pod是耐用和可用的。这时候假如我们直接对一个pod进行访问,那么我们很难保证服务的高可用和动态性,因此显然不能使用Pod地址作为服务暴露端口。
因此我们需要想办法将对服务的访问进行代理转发,不依赖于pod的地址。在k8s中,通过负载均衡和VIP实现后端真实服务的自动转发、故障转移。这个负载均衡在Kubernetes中称为Service。Kubernetes的Service就是一个四层负载均衡,Kubernetes对应的还有七层负载均衡Ingress,本文仅介绍Kubernetes Service。
Kubernetes中的Deployment保证了我们不需要去管理pod的创建与销毁以及健康状态,而Service是将运行在一个或一组Pod上的网络应用程序公开为网络服务的方法。Service让我们 ...
kafka的部署与实践
kafka简介kafka是按照分布式事务日志架构的大规模发布/订阅消息队列
基本组成
Producer:Producer即生产者,消息的产生者,是消息的入口。
Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……
Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
前面说过了每个topic都可以分为一个或多个partition,如果你觉得topic比较抽象,那partition就是比较具体的东西了!Partition在服务器上的表现形式就是一个一个的文件夹,每个partition的文件夹下面会有多组seg ...
Minikube本地部署简单的k8s服务
作者 青鸟
学习了k8s之后,就一直想上手体验一下。但是直接去部署一个k8s集群所需要的钱是非常昂贵的,于是就参考了k8s官方文档给出来的意见,使用了minikube在本地来部署一个简易的k8s来体验一下
在使用的过程中,遇到了无数的坑,能踩的都踩了个遍,于是乎就有了这篇博客。(强烈建议看官方文档,其他的全是坑)
在本篇博客的本地环境如下:
macos 14.2.1
minikube 1.31.2
kubenetes 1.28.2
首先我们创建一个namespace来隔离服务,将我们这篇博客的所有的服务都运行在隔离环境中。这里我们就创建了一个dev的namespace
1kubectl create namespace dev
使用下面的命令就可以打开k8s的可视化界面
1minikube dashboard
部署一个无状态的服务我们使用golang简单的写一个无状态服务demo,如下所示:
123456789101112131415package mainimport ( "fmt" "log" "net/http&quo ...
使用MinIO部署简单的OSS服务
OSSOSS,全称就是对象存储服务。何为对象存储?我们来看下阿里云 OSS (Object Storage Service)的介绍:
对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。
对象存储呈现出来的是一个“桶”(bucket),你可以往“桶”里面放“对象(Object)”。这个对象包括三个部分:Key、Data、Metadata。key就是对象在这个桶中的唯一标识;data就是数据;metadata就是标签,可以方便排序。
Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。麻雀虽小,五脏俱全,适合中小企业使用。当然 Minio 除了直接作为对象存储使用,还可以作为云上对象存储服务的网关层,无缝对接到 Amazon S3、MicroSoft Azure。
MinIO非常适合于存储大容量非结构化的数据。 例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意 ...
istio中无感知流量转发
作者 青鸟
最近在读istio的代码,正好借此来水一篇博客,顺便通过istio来学一点关于Service Mesh的相关知识
Service Mesh什么是Service Mesh用官方的话来说Service Mesh(服务网格)是一种用于处理服务之间通信的架构模式。在微服务架构中,应用程序通常被拆分成多个小型的、相互独立的服务,每个服务负责执行特定的功能。这些服务需要相互通信以完成整体业务逻辑。Service Mesh 提供了一种在服务之间进行通信的统一、可靠和可观察的方式。
说简单点Service Mesh就是处理微服务之间的通讯,它的主要实现形式就是在应用程序同主机上部署一个代理程序,所有的进出流量都被这个Side Car代理,于是我们便可以在这个代理程序中以最小的成本实现细粒度化的控制,包括服务的限流、熔断、降级等策略
在这种形式下,RPC 客户端将数据包先发送给,与自身同主机部署的 Sidecar,在 Sidecar 中经过服务发现、负载均衡、服务路由、流量控制之后,再将数据发往指定服务节点的 Sidecar,在服务节点的 Sidecar 中,经过记录访问日志、记录分布式追踪 ...
Kubernetes架构原理
作者 青鸟学习了Docker后,顺带把k8s 也学了,原理就顺带水篇博客,之后可能会尝试使用minikube来试着部署微服务
Kubernetes(k8s)是一个用于容器编排和管理的开源平台,负责自动化运维管理多个容器化程序(比如 Docker)的集群,可以帮助开发人员和运维团队更轻松地部署、扩展和管理容器化应用程序,从而提高了应用程序的可用性和可伸缩性。是一个生态极其丰富的容器编排框架工具。
k8s提供了一种高度抽象化的方式来处理底层基础设施,使开发人员和运维团队能够专注于应用程序的开发和管理,而不必担心底层的复杂性。
一句话来说,k8s的作用是自动化运维管理Docker(容器化)程序
Kubernetes 的强大之处在于其高度可扩展性和灵活性,使得它适用于各种不同的应用程序和用例,从简单的Web应用程序到复杂的微服务架构。它已成为云原生应用程序开发和运维的事实标准,被广泛用于容器化工作负载的管理和编排。
Kubernetes 官方文档:https://kubernetes.io/zh/
k8s的组成以下是 Kubernetes 的一些关键概念和组件:
节点(Nodes): 节点是 ...
使用Docker优雅地部署Goland服务
作者 青鸟
在试过了systemed部署服务之后,尝试了一下docker来部署,相较于systemed的部署,docker更加优雅和方便,但在这个过程中也是遇到了大大小小的问题,也是做了很多优化,特地记录一下,值得注意的是我没有使用docker-compose来部署,而是单纯的容器间通讯,之后会再写一篇来记录。文章较长,有错误的欢迎指出
关于docker环境的安装,按照官方教程即可以轻松解决,同时需要注意Docker Hub被墙了,因此要用镜像源,推荐使用腾讯云的镜像仓库
搭建生产环境这里的生产环境主要指的就是redis和mysql这两个数据库,这里有一个大坑就是当你卸载容器的时候,数据库里的数据会随之销毁,这显然是不符合我们的要求的,解决办法就是配置的时候使用挂载数据卷的方式,将数据库信息挂在到宿主主机上,以此可以在销毁或者重启容器的时候做到数据持久化。
mysql配置我们首先创建三个文件夹
123456#配置文件mkdir /usr/local/mysql/conf#数据存储mkdir /usr/local/mysql/data#mysql日志mkdir /usr/local/my ...
Etcd的简介与静态部署
作者 青鸟
在最近的工作中想用go-micro来实现一个简单的微服务,选择了etcd作为服务与注册中心,于是就在服务器上部署了etcd,并使用systemed来作为进程守护,虽然最后还是选择了Consul来作为注册中心,但是在部署Etcd这个过程中遇到了大大小小的问题,于是写一篇博客记录一下,其中着重介绍一下静态部署
Etcd的简介首先要说明的就是为什么会选etcd来作为服务与注册中心。etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁,leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用,持久性数据存储和检索而准备。从上述的定义中就可以看出Etcd的核心作用就是两个方面:持久化的键值存储系统 和 分布式系统数据一致性服务提供者。
所有的分布式系统,都面临的一个问题是多个节点之间的数据共享问题,这个和团队协作的道理是一样的,成员可以分头干活,但总是需要共享一些必须的信息,比如谁是 leader, 都有哪些成员,依赖任务之间的顺序协调等。所以分布式系统要么自己实现一个可靠的共享存储来同步信息(比如 ...
JVM中的自动内存管理结构
作者 青鸟
JVM线程在Hotspot JVM中,每个线程与操作系统中的线程直接映射。当一个Java线程准备好执行后,此时操作系统的一个本地线程也同时创建。Java线程执行终止后,本地线程也会回收。操作系统负责将所有线程安排调度到一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程的run方法。JVM中的线程分为守护线程和普通线程,当程序中最后一个非守护线程终止后,JVM也会进行终止JVM的系统线程主要分为几种,其中GC线程、虚拟机线程、周期任务线程、编译线程、信号调度线程
Java虚拟机(JVM)线程是操作系统线程的一种抽象,用于支持Java程序的并发执行。JVM线程是Java多线程编程的基础,它允许Java应用程序在同一进程内同时执行多个独立的任务,实现并发和多线程处理。
以下是关于JVM线程的一些关键信息:
线程模型:JVM线程模型通常是基于内核线程(Kernel Thread)的。每个JVM线程都会映射到一个底层操作系统线程,这使得Java线程可以在多核处理器上并发执行。
线程生命周期:JVM线程具有生命周期,包括新建、就绪、运行、阻塞和终止等状态。线程可以通过 ...