Q's blog

一些个人文档笔记

etcd 是基于 raft算法的分布式键值数据库,生来就为集群化而设计的,由于Raft算法在做决策时需要超半数节点的投票,所以etcd集群一般推荐奇数节点,如3、5或者7个节点构成一个集群。

阅读全文 »

K8S亲和与反亲和简介

nodeSelector 提供了一种非常简单的方法来将 pod 约束到具有特定标签的节点上。亲和/反亲和功能极大地扩展了你可以表达约束的类型。关键的增强点是

  • (1) 语言更具表现力(不仅仅是“完全匹配的 AND”)
  • (2) 你可以发现规则是“软”/“偏好”,而不是硬性要求,因此,如果调度器无法满足该要求,仍然调度该 pod
  • (3) 你可以使用节点上(或其他拓扑域中)的 pod 的标签来约束,而不是使用节点本身的标签,来允许哪些 pod 可以或者不可以被放置在一起

亲和功能包含两种类型的亲和,即

  • 节点亲和
  • pod 间亲和/反亲和

节点亲和就像现有的 nodeSelector(但具有上面列出的前两个好处),然而 pod 间亲和/反亲和约束 pod 标签而不是节点标签(在上面列出的第三项中描述,除了具有上面列出的第一和第二属性)。

阅读全文 »

高可用

etcd 是基于 raft算法的分布式键值数据库,生来就为集群化而设计的,由于Raft算法在做决策时需要超半数节点的投票,所以etcd集群一般推荐奇数节点,如3、5或者7个节点构成一个集群。

以上是etcd集群部署的基础概念,但是还需要注意以下问题:

阅读全文 »

在使用 Kubernetes 时,可能会遇到一些网络问题。当通过检查配置与日志无法排查错误时,这时就需要抓取网络数据包,但是Pod内一般不会安装tcpdump命令,那有没有方法可以直接通过宿主机抓取Pod网络数据包?

当然有,本文介绍 nsenter 命令,能够进入Pod容器 net 命名空间。并且本文提供一个快速进入Pod容器 net 命名空间脚本,方便大家使用。

阅读全文 »

前言

随着 Kubernetes 越来越流行,不管大公司还是小公司都往 Kubernetes 迁移,每个公司最少有两套集群(测试和生产),但是多个集群就有多个 Kubeconfig 用户授权文件。虽然官方文档中有介绍多个Kubeconfig 文件合并成一个 Kubeconfig,但是对于一些新手来说,看得不是很明白。

本文介绍 Kubeconfig 文件结构,并推荐一个工具自动合并Kubeconfig

阅读全文 »

Pod status 状态解释 [1]

  • CrashLoopBackOff:容器退出,kubelet正在将它重启
  • InvalidImageName:无法解析镜像名称
  • ImageInspectError:无法校验镜像
  • ErrImageNeverPull:策略禁止拉取镜像
  • ImagePullBackOff:镜像正在重试拉取
  • RegistryUnavailable:连接不到镜像中心
  • ErrImagePull:通用的拉取镜像出错
  • CreateContainerConfigError:不能创建kubelet使用的容器配置
  • CreateContainerError:创建容器失败
  • m.internalLifecycle.PreStartContainer:执行hook报错
  • RunContainerError:启动容器失败
  • PostStartHookError:执行hook报错
  • ContainersNotInitialized:容器没有初始化完毕
  • ContainersNotReady:容器没有准备完毕
  • ContainerCreating:容器创建中
  • PodInitializing:pod 初始化中
  • DockerDaemonNotReady:docker还没有完全启动
  • NetworkPluginNotReady:网络插件还没有完全启动
阅读全文 »

一、openvpn原理

openvpn通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Publice key,另外一个是Private key)对数据进行加密的。这种方式称为TLS加密。

openvpn使用TLS加密的工作过程是,首先VPN Sevrver端和VPN Client端要有相同的CA证书,双方通过交换证书验证双方的合法性,用于决定是否建立VPN连接。然后使用对方的CA证书,把自己目前使用的数据加密方法加密后发送给对方,由于使用的是对方CA证书加密,所以只有对方CA证书对应的Private key才能解密该数据,这样就保证了此密钥的安全性,并且此密钥是定期改变的,对于窃听者来说,可能还没有破解出此密钥,VPN通信双方可能就已经更换密钥了。

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# https://github.com/easzlab/kubeasz/blob/master/docs/setup/quickStart.md
yum update
yum install git python-pip -y
pip install pip --upgrade -i https://mirrors.aliyun.com/pypi/simple/
pip install ansible==2.6.18 netaddr==0.7.19 -i https://mirrors.aliyun.com/pypi/simple/
ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa

#安装docker
#略

# 下载工具脚本easzup,举例使用kubeasz版本2.2.1
export release=2.2.1
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup
chmod +x ./easzup
./easzup -D -d 19.03.5 -k v1.16.9

# 安装集群
./easzup -S
# 使用默认配置安装 aio 集群
docker exec -it kubeasz easzctl start-aio
.验证安装
如果提示kubectl: command not found,退出重新ssh登录一下,环境变量生效即可

$ kubectl version # 验证集群版本
$ kubectl get node # 验证节点就绪 (Ready) 状态
$ kubectl get pod -A # 验证集群pod状态,默认已安装网络插件、coredns、metrics-server等
$ kubectl get svc -A # 验证集群服务状态

初中级运维工程师:

负载均衡:haproxy lvs nginx,调度算法和具体区别

监控服务zabbix:主被动模式和自定义监控项及模板

web服务器:nginx php tomcat apache,动静分离,location,优化配置,apache三种运行模式的区别,tomcat的java选项

数据库:mysql主从 数据备份恢复 读写分离 双主 结合业务与开发拆库拆表

iptables:源地址,目标地址转换 端口转换 访问禁止等

熟练使用jenkins

nfs等数据共享,实线基于共享存储的动静分离lnmp等web环境

高级运维工程师:

内核参数调优 公有云使用 网络知识 vmware docker 熟练k8s运行各种服务 kvm openstack 熟练shell脚本 微服务,实现业务高并发,稳定性,横向扩容

gitlab+jenkins:结合或python实现代码自动化部署与回滚

elk:各种业务日志收集雨分析,展示,故障定位

架构师:

熟练python 微服务 自动化 良好的故障定位及排除能力 安全技术 业务流程异步处理 分布式web集群 弹性扩容 业务自治愈 多数据中心业务管理

阅读全文 »

zookeeper启动时报错,日志提示“Java heap space”

按照网上的办法,应该是需要配置zookeeper的JVM

配置文件在那里呢?请查看文件路径:zookeeper/bin/zkEnv.sh

配置文件路径在zookeeper/conf/java.env,如果java.env该文件不存在,那么就创建该文件

1
2
3
4
5
#!/bin/sh
export JAVA_HOME=/usr/java/jdk # 这是你JDK安装路劲
#export JAVA_HOME=/home/jdk1.8.0_131
# heap size MUST be modified according to cluster environment
export JVMFLAGS="-Xms512m -Xmx1024m $JVMFLAGS" #这里是需要设置的内存大小

确保设置一个合理的JVM堆大小,如果设置太大,会让内存与磁盘进行交换,这将使ZK的性能大打折扣。例如一个4G内存的机器的,如果你把JVM的堆大小设置为4G或更大,那么会使频繁发生内存与磁盘空间的交换,通常设置成3G就可以了。当然,为了获得一个最好的堆大小值,在特定的使用场景下进行一些压力测试。

查看

运行zookeeper时,使用jmap -heap ${pid} 命令查看内存情况如下

0%