Mac中搭建Kubernetes
Kubernetes是Google和RadHat公司共同主导的开源容器编排项目,功能非常强大,也非常的火热和流行,但同时里面也有很多的概念和名词需要我们去学习和理解。学习任何一个技术先需要把基础环境搭建起来,本篇就介绍怎样在Mac中启动单节点的Kubernetes。
启用Kubernetes在Mac中安装了Docker之后,会自动安装了Kubernetes,正常情况下,我们只需要在Docker的Preferrences->Kubernetes中勾选Enable Kubernetes,然后点击Apply按钮即可。但由于伟大的墙的存在,这么一个简单的启动也会变得一波三折。
如果您是直接在Docker中启用Kubernetes,Kubernetes的状态会一直都是kubernetes is starting...,原因是有一些Kubernetes依赖的镜像不能正常的下载。
所以需要手动拉取镜像,执行命令修改项目tag。有多种开源项目已经有脚本执行。
###参考 k8s-docker-for-mac
Github上有个开源项目可以帮我们手动拉取镜像,执行下面命令拉去改项目代码到本地
1g ...
Redis攻击模拟,获取服务器登录权限
公司服务器使用Redis集群,最近发现数据异常丢失。多方排除,找出问题。发现是Redis被人攻击,Redis中有开发了远程连接断开,被恶意用户远程登录后,注入了一些文件。
通过百度等各种途径,了解到了Redis的攻击方式,今天特意模拟了下,通过Redis漏洞,获取服务器权限,远程ssh登录。
排查过程,可以查看另外一篇文章Redis集群数据异常丢失,发现挖矿程序
安装Redis为模拟,先安装redis,而且是以漏洞方式启动
1234567891011121314151617181920yum install redischmod 0777 /var/log/redis/redis.log service redis start# 查看是否正常启动ps aux | grep redis# 测试redis-cli ping# 返回PONG#修改端口绑定vi /etc/redis.conf # bind 127.0.0.1bind 0.0.0.0# 重启redis# service redis restart 不能用此启动,此是用redis用户启动sudo redis-server /etc ...
Redis集群数据异常丢失,发现挖矿程序
现象公司服务器使用Redis集群,最近发现数据异常丢失。刚存储的数据,当时能够查询到,过了2天就无法查询。查询了内存是否溢出,集群节点信息,都没有排查到问题。
刚开始总是以为是redis哪里配置的有问题,可能配置的有定时清空数据库的机制吧,但是找了一圈没有发现redis配置的问题。
后来通过日志,定位到,是被人攻击,执行了清库命令。
排查查看数据过期时间1ttl key
数据正常
集群健康状况12345678#查看服务器内存free # 登录redis查看#集群状态cluster info#节点cluster nodes
查看Memory都是正常的,只有40M
查看内存淘汰机制maxmemory-policy是noeviction,为禁止驱逐数据
redis info信息详解
发现问题查看aof日志,发现问题,有被执行flushall清库命令
1egrep -i 'flushall|um_1765039' -A3 -B3 appendonly.aof
再查阿里云邮件,也提示了异常操作信息,定位为入侵。
原因是该服务器有外网IP,虽然服务链接地址是使用的内网IP+ ...
Go包管理工具Dep及翻墙设置
Go语言早期没有包管理工具,社区里go的第三方包托管在各个git托管平台。需要用到包时通过go get 命令工具安装,但这个工具没有版本描述性文件。在go的世界里没有“package.json”这种文件。这个给我们带来直接的影响就是依赖放在外网,而且没有版本约束
而且使用Gopath配置,多个项目时,配置比较繁琐。
目前依赖工具有很多,如:glide、godep等
从1.9版本开始,官方发布依赖工具,用来管理和下载工程依赖的工具。
123dep is a prototype dependency management tool for Go. It requires Go 1.9 or newer to compile. dep is safe for production use.
安装Mac安装1brew install dep
linux1curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
Windows1go get -u github.com/golang/dep/cmd/de ...
GO序列化和反序列化研究
序列化和反序列化的概念把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送
Json序列化Struct 序列化为Json12345type Student struct { Name string Age uint8 Address string}
12345678910s1 := Student{"张三", 18, &q ...
Go同时开启Grpc服务和http服务
Beego开发Grpc服务,同时提供Grpc和普通http服务。
在Beego项目中,一般都是直接开发应用,监听一个端口,使用一种协议。
当我们想使用Grpc服务,同时想使用http服务时,在同一个代码库中时,这时候需要提供2个服务,监听2个端口。
示例1234567891011121314151617181920212223242526272829303132333435363738394041424344package mainimport ( "context" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" "google.golang.org/grpc" "google.golang.org/grpc/reflection" pb "grpc_demo/test" "net")func main(){ end := make(chan bool, 1) go ...
Mac搭建grpc-go环境并测试
GRPC简介GRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
在 GRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
GRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
安装protocprotoc是Protobuf 的编译器
12brew tap grpc/grpcbrew install --with-plugins grpc
安装成功后查看
1protoc --version
显示版本
1libprotoc 3.7.1
可以查 ...
阿里云Docker 容器时间与主机时间不一致
今天使用阿里云Docker容器,发现日志文件时间相差8个小时。
通过date命令查看时间
查看主机时间
12019年 7月23日 星期二 20时15分40秒 CST
查看容器时间
1Tue Jul 23 12:15:40 UTC 2019
可以发现,他们相隔了8小时。
CST应该是指(China Shanghai Time,东八区时间)UTC应该是指(Coordinated Universal Time,标准时间)
解决方案方案一:共享主机的localtime挂载localtime文件到容器内 ,保证两者所采用的时区是一致的
12-v /etc/localtime:/etc/localtime:ro \-v /etc/timezone:/etc/timezone:ro \
方案二:复制主机的localtime1docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime
在完成后,再通过date命令进行查看当前时间。
但是,在容器中运行的程序的时间不一定能更新过来,比如在容器运行的MySQL服务,在更新时间后,通过sql查看MySQ ...
Go invalid memory address or nil pointer dereference错误
Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference这种是内存地址错误。
首先我们要了解指针,指针地址在 Go 中 * 代表取指针地址中存的值,& 代表取一个值的地址对于指针,我们一定要明白指针储存的是一个值的地址,但本身这个指针也需要地址来储存
错误示例123456789101112package mainimport "fmt"func main() { var i *int fmt.Println(&i, i) *i = 1 fmt.Println(&i, i, *i)}
错误提示
12340xc00009a008 <nil>panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x ...
Go并发访问变量,异常处理
竟险竟险(竞争条件、Race Condition)是指多个协程(goroutine)同时访问共享数据,其结果取决于指令执行顺序的情况。具体归纳为当有一个变量, 有一个 goroutine 会对它进行写操作, 其他 goroutine 对它进行读操作。 是否需要对这个变量进行加锁保护。
考虑如下售票程序。该程序模拟两个售票窗口,一个执行购票,一个执行退票。
1234567891011121314151617181920212223242526package mainimport ( "fmt" "time")var ticket = 200 // 总票数// 退票func refund() { ticket += 1}// 购票func buy() { ticket -= 1}func main() { go buy() // 购票协程 go refund() // 退票协程 time.Sleep(time.Microsecond * 1) //等待上面两个协程结束 fmt.Println(t ...