Windows|实现端口转发


所谓端口转发就是A可以访问B,B可以访问C,但是A不能访问C,让A可以通过B间接实现访问C的办法.在Linux下面,可以直接用ssh隧道实现.这里说的是Windows下的实现方法.
现在是2020年,我用的Windows Server 2019.据说2018也可以,不深究了.
用到的命令是:netsh
操作的地点是:B

添加转发

假设C上面开启了22端口,在B上添加2222转发到C的22

netsh interface portproxy add v4tov4 listenaddress=B listenport=2222 connectaddress=C connectport=22

参数释义
listenaddress -- 等待连接的本地ip地址
listenport -- 本地监听的TCP端口(待转发)
connectaddress -- 被转发端口的本地或者远程主机的ip地址
connectport -- 被转发的端口

此时A通过连接B的2222端口,实际上连接的就是C的22

查看转发

如果没有添加前执行下面的命令结果为空

netsh interface portproxy show  v4tov4

删除转发

有始有终是好习惯

netsh interface portproxy delete v4tov4 listenaddress=B listenport=2222

当然linux下也有个叫rinetd的神器,专业端口转发

转载请注明: 转自Rainbird的个人博客
   本文链接: Windows|实现端口转发

Posted in windows | Tagged , , , , , , , , , | Leave a comment

微信订阅号个人主证成功!


早就听说微信公众号的个人订阅号有人受到邀请开通了个人认证
终于7.1下午,我也收到了官方邀请

关于个人认证开启申请的通知
微信公众号开启新的认证方式,面向个人类型公众号,需申请并进行审核。
审核成功后,搜索公众号会展示认证标识、且“公众号信息-关于公众号页”会展示认证标识及认证信息。申请免费,欢迎体验!
可通过“公众号设置-个人认证-申请认证”发起申请,或点此申请。

收到时间是:17:52

个人认证 - 审核中
根据资料核实难易程度,审核约需要1-3个工作日。审核期间,请留意消息通知,我们可能会下发补充资料的通知,需要你协助补充资料。
第三方审核机构:成都知道创宇信息技术有限公司

收到时间是:17:59

立马按链接提交了个人称呼:雨鸟飞行 与公众号名称一致.
但第二项让填写领域及头衔.
领域要求某某专家之类的,头衔倒是简单直接写了公司名和职位,然后就提交了.

19:16收到四川成都的座机号电话,说是公众号认证事宜,名字没有问题,如果写了头衔,公众号会显示相关真实信息,问是否合理.我说可以隐藏吗?对方说可以写博客内容相关的东西.对方就顺手帮我改成了.

专注于Python开发语言及运维软件知识分享。

19:49收到认证成功消息

个人认证 - 认证成功
恭喜你,你的帐号已于2020-07-01通过个人认证审核。

认证效率很高
感谢

Posted in 原创 | Tagged , , , , | Leave a comment

Python|3.8.3调用阿里云slb的SDK报错两则


域名证书到期,用的阿里云七层SLB,证书也放在了SLB上,乖乖,三十多个SLB要统一更新一下证书,人工操作,容易出错不错,也比较耗时.决定使用阿里云的Python SDK
类似

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-hangzhou')
...
...
response = client.do_action_with_exception(request)
# python2:  print(response) 
print(str(response, encoding = 'utf-8'))

拿到示例代码后,直接运行,报错

ModuleNotFoundError: No module named 'aliyunsdkcore'

解决

aliyun-python-sdk-core-v3

再次运行,提示

ModuleNotFoundError: No module named 'aliyunsdkslb'

解决

aliyun-python-sdk-slb

再次运行
提示''和''未设置,这个简单阿里云 后台取一下就可以了
然后就可以愉快的玩耍了.

Posted in Python | Tagged , , , , , , , , , | Leave a comment

python|GMT时间格式转化(转)


近期域名证书到期了,写了一个Python脚本批量检查,发现证书的时间是GTM格式的,网上找到这篇文章,够用,顺道转了.

datetime类型转换成GMT时间格式

字符串(如'Thu, 19 Feb 2009 16:00:07 GMT'),
strftime(官方释义:new string) :

from datetime import datetime
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT+0800 (CST)'

print(datetime.utcnow().strftime(GMT_FORMAT))

output:

Mon, 12 Nov 2018 08:53:51 GMT+0800 (CST)

将GMT时间格式的字符串转换成datetime类型

strptime(官方释义:new datetime parsed from a string):

dd = "Fri Nov 09 2018 14:41:35 GMT+0800 (CST)"
GMT_FORMAT = '%a %b %d %Y %H:%M:%S GMT+0800 (CST)'
print(datetime.strptime(dd, GMT_FORMAT))

output:

2018-11-09 14:41:35

注意:GMT_FORMAT的格式要与索要转化的字符串相对应。

扩展:python的格式转化

%a 本地的星期缩写
%A 本地的星期全称
%b 本地的月份缩写
%B 本地的月份全称
%c 本地的合适的日期和时间表示形式
%d 月份中的第几天,类型为decimal number(10进制数字),范围[01,31]
%f 微秒,类型为decimal number,范围[0,999999],Python 2.6新增
%H 小时(24进制),类型为decimal number,范围[00,23]
%I 小时(12进制),类型为decimal number,范围[01,12]
%j 一年中的第几天,类型为decimal number,范围[001,366]
%m 月份,类型为decimal number,范围[01,12]
%M 分钟,类型为decimal number,范围[00,59]
%p 本地的上午或下午的表示(AM或PM),只当设置为%I(12进制)时才有效
%S 秒钟,类型为decimal number,范围[00,61](60和61是为了处理闰秒)
%U 一年中的第几周(以星期日为一周的开始),类型为decimal number,范围[00,53]。在度过新年时,直到一周的全部7天都在该年中时,才计算为第0周。只当指定了年份才有效。
%w 星期,类型为decimal number,范围[0,6],0为星期日
%W 一年中的第几周(以星期一为一周的开始),类型为decimal number,范围[00,53]。在度过新年时,直到一周的全部7天都在该年中时,才计算为第0周。只当指定了年份才有效。
%x 本地的合适的日期表示形式
%X 本地的合适的时间表示形式
%y 去掉世纪的年份数,类型为decimal number,范围[00,99]
%Y 带有世纪的年份数,类型为decimal number
%Z 时区名字(不存在时区时为空)
%% 代表转义的"%"字符

————————————————
版权声明:本文为CSDN博主「怠惰的小小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35462323/java/article/details/83994563

Posted in Python | Tagged , , , , , , | Leave a comment

ELK|Could not retrieve remote IP address for beats input.

ELK日志采集错误一例

背景

公司的ELK系统搭建在阿里云VPC,当然开发环境与生产环境是在两个地域隔离的.正常情况下,每个地域都是独立完整的环境.疫情期间为了节省一些资源,拿掉了开发环境的ELK,直接将日志打到生产的ELK集群
运行了三四个月一直挺正常,可是近来有同事反映,有日志查询不到,但是看日志确实又有其它的日志正常写入.看logstash的日志提示:

[2020-06-15T16:02:09,880][WARN ][logstash.inputs.beats    ] Could not retrieve remote IP address for beats input.
[2020-06-15T16:02:09,880][WARN ][logstash.inputs.beats    ] Could not retrieve remote IP address for beats input.
[2020-06-15T16:02:09,881][WARN ][logstash.inputs.beats    ] Could not retrieve remote IP address for beats input.
[2020-06-15T16:02:09,881][WARN ][logstash.inputs.beats    ] Could not retrieve remote IP address for beats input.
[2020-06-15T16:02:09,881][WARN ][logstash.inputs.beats    ] Could not retrieve remote IP address for beats input.

搜索

拿着Could not retrieve remote IP address for beats input.的错误,去网上搜索,同样的报错很多,官方论坛上也有看似很靠谱的解决方案

https://discuss.elastic.co/t/could-not-retrieve-remote-ip-address-for-beats-input/104815/6

就是改掉代码去掉这个报错!!!
操作

vi /path_to_logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-beats-5.0.2-java/lib/logstash/inputs/beats/message_listener.rb

      begin
        hash.get("@metadata").put("ip_address", ctx.channel().remoteAddress().getAddress().getHostAddress())
      rescue #should never happen, but don't allow an error here to stop beats input
        input.logger.warn("Could not retrieve remote IP address for beats input.")
      end 


直接注释掉
如上图.
然后重启logstash.
正常按理说,到这里,错误注释掉了,代码继续执行,应该解决问题了.但是,很快有了新的转机.

真凶

正巧,另个同事过来找我说,在测试环境发送邮件,正文很正常,带附件就发送失败.因为对方是用Java程序写的,本能觉得应该他Java玩的不溜,语法问题.
用Python,写了一个发现,同样的正文和附件,本机很快,到了开发环境就不行.看来是网络问题
登陆阿里云,找到VPC的出口网关,乖乖竟然限制了最大出口流量2M.先放开到20M再说
如上图,发现出口流量顶峰竟然跑到了14M.

后话

后续几天一直在观察,发现流量顶多也就跑到3M,看来之前是限制的太死了,日志一直没出去,才造成了大量的积压.有节约的想法是好事儿,应该再向前一步,加个监控,这样才能及时感知变化.

Posted in ELK | Tagged , , , , , , , , , | Leave a comment

阿里云|云服务器ECS管理实例列表错误弹窗一例

阿里云错误一例
之前遇到过一次,后来不知调啥东西解决了.最近又遇到,困扰了挺长时间,终于又碰巧解决了,赶紧记录一下.
问题描述:
使用阿里云的云服务器ECS管理实例列表时,列表展示以后,总会连续三次弹框提示:当前请求失败,建议您刷新页面或者稍后重试.对实际使用倒也没有什么影响,但是稍微影响效率,毕竟要等几秒不是.

解决办法:
点击下面一行最后的 设置
子账号设置全局过滤标签,可以更加方便的查看和管理已被授权的云资源。 设置
在弹出的自定义配置项里,将第一行,每页显示条目数,改为默认的:20即可.

哦,对,要强制刷新一下页面,才不会再报错

复盘
之所以出现这个问题,大概率是想在实例列表,一次显示全所有实例.估计阿里云也是项目比较大了,有些配置自己的测试用例也验证不到吧.这问题至少存在有半年之久了.

Posted in linux | Tagged , , | Leave a comment

K8S|Mac下kubectl远程调试另一集群

背景

历史原因,公司本地没有k8s集群.要调试一个kubectl的脚本,无论是本地写,远程运行,还是远程写远程运行,效率都不咋高.想来想去,如果能跨公网调用远程的api-server,效率自然不可同日而语.
经过一翻折腾,联调成功,特记录一下.
先决条件:
本机的kubectl脚本与远程版本一致.
本机能访问远程的api-server
指定kubectl配置文件kubeconfig

kubectl版本

之所以要统一版本,是因为在使用过程中发现不同版本的客户端,同样的命令,输出竟然不一样.为了本地开发的版本可以无缝在远程运行,自己要先解决这个问题.
查看版本

kubectl version
Client Version: version.Info{
    Major:"1", 
    Minor:"16+", 
    GitVersion:"v1.16.6-beta.0", 
    GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", 
    GitTreeState:"clean", 
    BuildDate:"2020-01-15T08:26:26Z",
    GoVersion:"go1.13.5", 
    Compiler:"gc", Platform:"darwin/amd64"
}

本机是1.16.6,而我远程是v1.10.4
下载

 curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.10.4/bin/darwin/amd64/kubectl

添加执行权限

chmod +x ./kubectl

查看当前软链

ls -lh /usr/local/bin/kubectl
lrwxr-xr-x  1 root  admin    55B Feb 10 22:14 /usr/local/bin/kubectl -> /Applications/Docker.app/Contents/Resources/bin/kubectl

替换

mv ./kubectl /usr/local/bin/kubectl

之所以要替换这个软链是因为这样可以不用在调试的脚本中再指定一次kubectl路径了.当然了再指定一次是好习惯.
参考:
https://k8smeetup.github.io/docs/tasks/tools/install-kubectl/

远程访问api-server

这部分,开始我是直接通过rinetd这个小工具,直接将远程6443映射到公网,然后通过ip白名单访问的,结果发现这样会提示证书有问题

Unable to connect to the server: x509: 
certificate is valid for 127.0.0.1, 10.66.2.254,10.68.0.1, 
not xx.xxx.xxx.xx

既然如此,我直接在远程用Docker分分钟启动一个ipsec vpn server得了

cat vpn.env
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password

docker run \
    --name ipsec-vpn-server \
    --env-file ./vpn.env \
    --restart=always \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -d --privileged \
    hwdsl2/ipsec-vpn-server

本机的话,用系统自带的拨号工具,类型选择Cisco IPSec即可

参考:
https://github.com/hwdsl2/docker-ipsec-vpn-server

kubeconfig

这块牵扯kubectl连接集群时,寻找配置文件顺序了.
kubectl 会按顺序加载和合并来自下面位置的配置

1.--kubeconfig=/path/to/.kube/config 命令行标志

2.KUBECONFIG=/path/to/.kube/config 环境变量

3.$HOME/.kube/config 配置文件

正常情况下,都是直接使用的第三项.接下来的工作就简单了,把本地的.kube/config文件备份一下,把远程的下载过来.

参考:
https://k8smeetup.github.io/docs/tasks/administer-cluster/share-configuration/s

见证奇迹

查看一下集群信息

kubectl cluster-info
Kubernetes master is running at https://10.66.2.254:6443
CoreDNS is running at https://10.66.2.254:6443/api/v1/namespaces/kube-system/services/coredns:dns/proxy
Heapster is running at https://10.66.2.254:6443/api/v1/namespaces/kube-system/services/heapster/proxy
kubernetes-dashboard is running at https://10.66.2.254:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
monitoring-grafana is running at https://10.66.2.254:6443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
InfluxDB is running at https://10.66.205.2:6443/api/v1/namespaces/kube-system/services/monitoring-influxdb:http/proxy

接下来就愉快的玩耍kubectl了.

Posted in K8S | Tagged , , , , , , , , , | Leave a comment

Android|微信可以修改微信号


修改VX号方法

第一 (目前只限安卓手机)

第二 步骤 首先把VX升级至最新版本

第三 然后把VX退出重新登录一下

第四 登陆上去了之后 点VX号即可修改

Posted in Android | Tagged , , , | Leave a comment

K8S|kubectl实用技巧三则

作为k8s玩家,kubectl是几乎每天都敲十几遍的搭档.但是你对你的搭档熟悉吗?至少本篇提到的这三则,是一个三年选手,刚知道的...

去掉头部

kubectl通过get命令,可以获得很多信息:命名空间,服务,pod,节点等.
比如获取命名空间

kubectl get ns
NAME                   STATUS   AGE
default                Active   21d
docker                 Active   21d
kube-node-lease        Active   21d
kube-public            Active   21d
kube-system            Active   21d
kubernetes-dashboard   Active   21d

我们需要获取第一列,但是第一行并不需要,初级一些的做法直接grep排除掉

kubectl get ns|grep -v NAME|awk '{print $1}'
default
docker
kube-node-lease
kube-public
kube-system
kubernetes-dashboard

awk老手可能就直接跳过第一行了

kubectl get ns|awk 'NR>1{print $1}'
default
docker
kube-node-lease
kube-public
kube-system
kubernetes-dashboard

其实不需要,第一行,直接不显示好了

kubectl get ns --no-headers
default                Active   21d
docker                 Active   21d
kube-node-lease        Active   21d
kube-public            Active   21d
kube-system            Active   21d
kubernetes-dashboard   Active   21d

见过太多脚本跟第一行较劲了,其实只要加个参数就好了.

获取指定节点的所有pod

我们知道get时,加了-o wide参数,会多显示两列,分别是pod ip和node ip.
既然想取指定节点的所有pod,那就把所有pod列出来,然后再grep节点就好了.

kubectl get pod -o wide|grep docker-desktop
nginx-7bddbf796b-lvc4c   1/1     Running   0          20d   10.1.0.41   docker-desktop   <none>           <none>
redis-5bbcdf5c5c-sfdck   1/1     Running   0          20d   10.1.0.42   docker-desktop   <none>           <none>


也可以实现,优雅点怎么搞呢?

kubectl get pod -o wide  --field-selector spec.nodeName=docker-desktop
NAME                     READY   STATUS    RESTARTS   AGE   IP          NODE             NOMINATED NODE   READINESS GATES
nginx-7bddbf796b-lvc4c   1/1     Running   0          20d   10.1.0.41   docker-desktop   <none>           <none>
redis-5bbcdf5c5c-sfdck   1/1     Running   0          20d   10.1.0.42   docker-desktop   <none>           <none>

获取指定label的节点

前面提到资源池了,同样资源池的节点的label是一样的,那么问题来了:怎么列出同一个资源池的节点?
这还不简单吗?直接--show-labels然后grep啊.
非也非也
比如:
有个节点的label是:role=front
正确的命令是

kubectl get no -l role=front

结语

k8s是用上了,你的玩法够k8ser吗?

转载请注明: 转自Rainbird的个人博客
   本文链接: K8S|kubectl实用技巧三则

Posted in K8S | Tagged , , , , , , , | Leave a comment

K8S|划分资源池的碎碎念

背景

之前在[grafana适配k8s资源池查询]一文中有提过资源池的概念,也提过原理:由3台以上的节点通过打上同样的label标签,标记同样的污点,应用在部署的时候通过nodeSelector选择相应的主机,同时兼容污点以达到特定节点部署的目的.今天就是剖析一下细节实现,及一些自己的思考.

label配置

标签是配置在节点上.
设置

kubectl label nodes 192.168.1.22 role=core

查询

kubectl get nodes --show-labels|grep 1.22

删除

kubectl label nodes 192.168.1.22 role-

污点配置

污点同样配置在节点上
添加

kubectl taint node 192.168.1.22 role=core:NoSchedule

查询

kubectl describe node 192.168.1.22 

删除

kubectl taint node 192.168.1.22 role-

deployment配置

注意配置与dnsPolicy同级,示例为json格式

"dnsPolicy": "ClusterFirst",
"nodeSelector": {
  "role": "core"
},
"tolerations": [
  {
    "key": "role",
    "operator": "Equal",
    "value": "core",
    "effect": "NoSchedule"
  }
],

一些思考

其实也没有什么技术上的创新,都是把k8s现有的功能组合起来使用.可能有的同学会说,不打污点,直接标签+nodeSelector可以吗?可以;标签也不打,直接使用nodeSelector选择一组节点可以吗?可以;那为什么在你的实现中,非要弄这么一个复杂的组合呢?因为我维护的已经是有一定规模的k8s集群,里面跑着小二百的服务,小六百的pod.当我要实施一个方案是不可能把整个集群推倒重来的.所以设污点,让先前的服务不要过来,兼容污点,让指定的服务富起来.

转载请注明: 转自Rainbird的个人博客
   本文链接: K8S|划分资源池的碎碎念

Posted in K8S | Tagged , , , , , , , | Leave a comment