如何将systemd服务的输出重定向到指定文件

有一种更优雅的方法可以解决systemd输出到指定文件而非/var/log/message,需要使用systemd参数与rsyslog过滤器。并指示syslog过滤器按程序名称拆分其输出。 systemd所需参数为 SyslogIdentifier:required,设置日志标识符(发送日志消息时加在行首的字符串)(“syslog tag”)。 默认值是进程的名称。此选项仅在 StandardOutput= 或 StandardError= 的值包含 journal(+console), syslog(+console), kmsg(+console) 之一时才有意义, 并且仅适用于输出到标准输出或标准错误的日志消息。 StandardOutput:required,设置进程的标准输出(STDOUT)。 可设为 inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console, file:path, append:path, socket, fd:name 之一。 StandardError:设置进程的标准错误(STDERR)。 取值范围及含义与 StandardOutput= 相同。但有如下例外: (1) inherit 表示使用 StandardOutput= 的值。 (2) fd:name 的默认文件描述符名称为 “stderr” rsyslog过滤器设置 使用rsyslog条件选择器。如果不改变rsyslog目前工作模式,按照如下操作: 新建/etc/rsyslog.d/xx.conf文件。 在新建文件内写入内容如下 单一条件处理。 text 1 2 3 if $programname == 'programname' then /var/log/programname.log # 停止往其他文件内写入,如果不加此句,会继续往/var/log/message写入。 if $programname == 'programname' then stop 多条件处理 会根据不同应用名称将不同的输出日志重定向到不同的文件内。 text 1 2 3 4 5 6 7 8 9 10 11 12 13 if ($programname == 'apiserver') then { action(type="omfile" file="/var/log/apiserver....

适用于windows10 Linux子系统的安装管理配置

什么是WSL Windows Subsystem for Linux 简称WSL,适用于Linux的Windows子系统,可以直接在Windows上运行Linux环境(包括大部分命令行工具) Linux containers与Windows Subsystem for Linux(WSL)区别 此处以docker与wsl进行一些比较,主要为个人的理解之处。 docker与wsl同样运行在本机环境中运行,不依赖其他管理程序与虚拟化。 docker与wsl同样为应用容器。 安装WSL 在Windows10上,用于Linux的Windows子系,可运行受支持的Linux版本(例如Ubuntu,OpenSuse,Debian等),而无需设置操作系统的复杂性。虚拟机或其他计算机。 使用设置为Linux启用Windows子系统 打开设置 点击“应用”。 在“相关设置”部分下,单击“程序和功能”选项 单击左窗格中的“打开或关闭Windows功能”选项。 检查Windows Subsystem for Linux选项。 完成这些步骤后,将配置该环境以下载并运行Windows 10上的Linux版本。 使用Microsoft Store安装Linux发行版 要在Windows 10上安装Linux发行版,请使用以下步骤: 打开Microsoft Store。搜索要安装的Linux发行版。一些可用的发行版包括: Ubuntu OpenSuse Kali Linux Debian Alpine WSL Suse Linux Enterprise 选择要在您的设备上安装的Linux发行版。 单击获取(或安装)按钮。 Microsoft Store安装Linux发行版 单击启动按钮。为Linux发行版创建一个用户名,然后按Enter键。 指定发行版的密码,然后按Enter。 重复密码,然后按Enter确认。 完成以上步骤后,即完成安装了WSL(没有图形界面),在开始菜单 运行 wsl 启动。 离线安装WSL 官网指导手册内包含所支持的Linux离线安装包 这里下载的为Ubuntu 18.04,下载后,文件格式为appx格式,本次使用的操作系统为,windows1709企业版,并且卸载了所有的 UWP应用。因此只能使用命令行进行安装。 非LTSC企业版或卸载windows store的可以直接双击安装 管理员打开Powershell 运行以下命令,将路径替换为下载的离线安装包路径。本次安装的 wsl 默认安装到C盘 powershell 1 Add-AppxPackage .\app_name.appx 查看已经安装的子系统...

awesome git command

Tag command describe git tag 列出所有tag git tag -l v1.* 列出符合条件的tag(筛选作用) git tag [tag_name] 创建轻量tag(无-m标注信息) git push REMOTE TAG 推送一个tag到远端 git push origin –tags* 推送所有本地tag到远程 git push origin :refs/tags/[REMOTE TAG] git push –delete REMOTE TAG 删除远程指定tag git fetch origin [remote_tag_name] 拉取远程指定tag git show [tag_name] 显示指定tag详细信息 git push origin [local_tag_name] 推送指定本地tag到远程 git tag NEW_TAG OLD_TAG git tag -d OLD_TAG 重命名本地tag git tag -d [local_tag_name] 删除本地指定tag git ls-remote –tags origin 查询远程tags git tag -a [tag_name] 创建含注解的tag git fetch origin [remote_tag_name]git checkout [remote_tag_name] git branch checkout远端tag到本地 Checking 检查工作目录与暂存区的状态...

常用加密算法学习总结之散列函数(hash function)

散列函数(Hash function)又称散列算法、哈希函数,散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values)的指纹。这种转化是一种压缩映射,也就是散列值的空间通常远小于输入值的空间,不同的输入可能会散列成相同的输出,二不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要函数。 散列函数性质 通过使用单向散列函数,即便是确认几百MB大小的文件的完整性,也只要对比很短的散列值就可以了。那么,单向散列函数必须具备怎样的性质呢?我们来整理一下。 根据任意长度的消息计算出固定长度的散列值 能够快速计算出散列值 计算散列值所花费的时间短。尽管消息越长,计算散列值的时间也会越长,但如果不能在现实的时间内完成计算就没有意义了。 消息不同散列值也不同 难以发现碰撞的性质称为抗碰撞性(collisionresistance)。密码技术中所使用的单向散列函数,都需要具备抗碰撞性。强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。在这里,散列值可以是任意值。密码技术中的单向散列函数必须具备强抗碰撞性。 具备单向性 单向散列函数必须具备单向性(one-way)。单向性指的是无法通过散列值反算出消息的性质。根据消息计算散列值可以很容易,但这条单行路是无法反过来走的。 散列函数的应用 散列函数应用具有多样性 安全加密: 保护资料,散列值可用于唯一地识别机密信息。这需要散列函数是抗碰撞(collision-resistant)的,意味着很难找到产生相同散列值的资料。如数字签名、消息认证码。 数据校验: 确保传递真实的信息:消息或数据的接受者确认消息是否被篡改的性质叫数据的真实性,也称为完整性。 错误校正:使用一个散列函数可以很直观的检测出数据在传输时发生的错误。 负载均衡: 通过hash算法,对客户端IP进行计算hash值,将取到值与服务器数量进行取模运算。 分布式存储:如一致性hash。 常用单项散列函数 MD4 MD5 MD5在1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。 SHA-1 SHA-2 SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1。 SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。 比特币使用的sha-256进行的数字签名 算法和变体 输出散列值长度 (bits) 中继散列值长度 (bits) 资料区块长度 (bits) 最大输入消息长度 (bits) MD5 128 128 (4 × 32) 512 无限 SHA-0 160 160 (5 × 32) 512 264 − 1 SHA-1 160 160 (5 × 32) 512 264 − 1 SHA-2 SHA-224 SHA-256 224 256 256 (8 × 32) 512 SHA-384 SHA-512 SHA-512/224 SHA-512/256 384 512 224 256 512 (8 × 64) 1024 2128 − 1 Go语言中使用散列函数 Go语言使用MD5 方式一:...

常用加密算法学习总结之数字签名

数字签名(Digital Signature),通俗来讲是基于非对称加密算法,用秘钥对内容进行散列值签名,在对内容与签名一起发送。 更详细的解说 更详细的解说 - 中文 数字签名的生成个验证 签名 ⑴ 对数据进行散列值运算。 ⑵ 签名:使用签名者的私钥对数据的散列值进行加密。 ⑶ 数字签名数据:签名与原始数据。 图:数字签名 Source:https://cheapsslsecurity.com/blog/digital-signature-vs-digital-certificate-the-difference-explained/ 验证 ⑴ 接收数据:原始数据&数字签名。 ⑵ 使用公钥进行解密得到散列值。 ⑶ 将原始数据的散列值与解密后的散列值进行对比。 Go语言中使用RSA进行数字签名 ⑴ pem解码:使用pem对私钥进行解码, 得到pem.Block结构体 ⑵ 获得私钥:使用GO x509接口pem.Block据解析成私钥结构体 ⑶ 计算hash值:对明文进行散列值计算 ⑷ 使用秘钥对散列值签名 go 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 package main import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/pem" "fmt" ) var ( private = `-----BEGIN 私钥----- MIICXQIBAAKBgQDc73afIxqYOHg80puDIMYrqUAiTi8EiTVDEiO9YE3+VxRvN0sa pe3zx1UdhgIn3iCPUzyI2vwNADId3LjuIjkdCcdB2fHrBTbcy6u0545HnY42F9aQ 7cAr168bHcqhQoKcna9i9nukO+w7So1J9C6Wr8J4e4923q7+T7z7bZeXywIDAQAB AoGBAItX5KLdywoyo3MJCdgcNaCX8MEyOmlL+HHC4ROxx78gQN0cLJw0Bu33zHEA ch+e8z4yKz3Nj6bLdtBqw6A9qXLBCfWfD/p9YKDZNFP/6+u9teUirOgiBSq7kXWy mtBm0I3pz33EomCuSJzLj/Mj/fkKs+425jPFcZboJdZpCyBhAkEA8mtGUGYuAZwV RKBDkf1bz5EyPBGV+9CyXa6pd6md61APY0j+qhb1w9ADfHKkAzfoilhpucznRhaz kAheqMPAMwJBAOlQEx2Ytc8TxfFqhF8RPTODe2N0jBBvsvJ85k7vNiQ+hnmaAray XS6pCbZdvmGHYKlz3MVGeis/UJKDdSzE0gkCQQCoZijkNPcEmz6S+5m00oFywXRa EgVUdndRaMHEpIlVK7pkyBJQab60Fc42JxUUP0RExoI7VcHbCG4YQhgvuDvNAkBQ CUolcwebe/sBcDrsqetGyqn/WjHaSZcnnDUdiu4VzOUwveaEafeRVCeiydHPfzNn rflkK2MphtTLDhGaRAKRAkASKlhV8aTBzTty/V3XMQfFVIAdHCyEIGMdjDDSzPly shZCn66IyIze8j5Q4ZLcRz6GPglHdrkBnyt4QFuGurpl -----END 私钥-----` public = `-----BEGIN 公钥----- MIGJAoGBANzvdp8jGpg4eDzSm4MgxiupQCJOLwSJNUMSI71gTf5XFG83Sxql7fPH VR2GAifeII9TPIja/A0AMh3cuO4iOR0Jx0HZ8esFNtzLq7TnjkedjjYX1pDtwCvX rxsdyqFCgpydr2L2e6Q77DtKjUn0Lpavwnh7j3berv5PvPttl5fLAgMBAAE= -----END 公钥-----` ) func digitalSign(privateKey, plainText string) (signText []byte, err error) { var ( pemBlock, _ = pem....

常用加密算法学习总结之非对称加密

公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种演算法。常用的非对称加密算法有 RSA DSA ECC 等。公开密钥加密 非对称加密算法使用公钥、私钥来加解密。 公钥与私钥是成对出现的。 多个用户(终端等)使用的密钥交公钥,只有一个用户(终端等)使用的秘钥叫私钥。 使用公钥加密的数据只有对应的私钥可以解密;使用私钥加密的数据只有对应的公钥可以解密。 非对称加密通信过程 下面我们来看一看使用公钥密码的通信流程。假设Alice要给Bob发送一条消息,Alice是发送者,Bob是接收者,而这一次窃听者Eve依然能够窃所到他们之间的通信内容。 参考自维基百科 ⑴ Alice与bob事先互不认识,也没有可靠安全的沟通渠道,但Alice现在却要透过不安全的互联网向bob发送信息。 ⑵ Alice撰写好原文,原文在未加密的状态下称之为明文 plainText。 ⑶ bob使用密码学安全伪随机数生成器产生一对密钥,其中一个作为公钥 publicKey,另一个作为私钥 privateKey。 ⑷ bob可以用任何方法传送公钥publicKey 给Alice,即使在中间被窃听到也没问题。 ⑸ Alice用公钥publicKey把明文plainText进行加密,得到密文 cipherText ⑹ Alice可以用任何方法传输密文给bob,即使中间被窃听到密文也没问题。 ⑺ bob收到密文,用私钥对密文进行解密,得到明文 plainText。 由于其他人没有私钥,所以无法得知明文;如果Alice,在没有得到bob私钥的情况下,她将重新得到原文。 RSA RSA是一种非对称加密算法,是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出,并以三人姓氏开头字母拼在一起组成的。 RSA公钥和密钥的获取:随机选择两个大的素数,p q $N = p*q$ RSA加密过程:$cipherText = plainText ^ E mod N$,$(N,e)$为公钥,$(N,d)$为私钥。 RSA解密过程:$plainText = cipherText^ D mod N$ Go语言中RSA的应用 在Go语言中生成公钥与私钥 生成秘钥流程 ⑴ 使用crypto/rsa中的GenerateKey(random io.Reader, bits int)方法生成私钥(结构体) ⑵ 因为X509证书采用了ASN1描述结构,需要通过Go语言API将的到的私钥(结构体),转换为BER编码规则的字符串。 ⑶ 需要将ASN1 BER 规则转回为PEM数据编码。pem....

prometheus operator使用

什么是 Operator? Operator是由CoreOS公司开发的,用来扩展kubernetes APi的特定的应用程序控制器,Operator基于Kubernetes的资源和控制器概念之上构建,但同时又包含了对相应应用程序特定的一些专业知识。创建operator的关键是 CRD(CustomResourceDefinition)的设计。 Prometheus Operator Prometheus Operator 是CoreOS公司提供的基于Prometheus及其相关监视组件对Kubernetes集群组件的管理,该Operator目的是简化和自动化针对Kubernetes集群的基于Prometheus的管理及配置。 Prometheus Operator架构组件 Operator:作为Prometheus Operator的核心组件,也即是自定义的控制器,用来监视和部署管理Prometheus Operator CRD资源对象,监控并维持CRD资源状态。 Prometheus Server:Operator 根据自定义资源 Prometheus 类型中定义的内容而部署的Prometheus Cluster Prometheus Operator CRD: Prometheus:以CRD资源提供给Operator的类似于Pod资源清单定位的资源。 ServiceMonitor:声明定义对Kubernetes Services资源进行监控,使用标签选择器来选择所需配置的监控,后端是Service的Endpoint,通过Service标签选择器获取EndPoint对象。 PodMonitor:使用标签选择器,选择对匹配Pod进行监控 Alertmanager:声明定义了Alertmanager在Kubernetes中运行所提供的配置。 PrometheusRule: 声明定义了Prometheus在Kubernetes中运行所需的Rule配置。 reference Prometheus-Operator-design Prometheus Operator监控二进制kubernetes 查看兼容性列表选择对应的版本来下载,此处kubernetes集群为1.8.10 。 对应地址为 https://github.com/prometheus-operator/kube-prometheus.git ,可以在域名后添加.cnpmjs.org 访问中国的github加速。 bash 1 git clone https://github.com.cnpmjs.org/prometheus-operator/kube-prometheus.git 资源清单在项目目录 manifests CRD在 manifests/setup 需要先安装CRD 和 Operator 对象 kube-controller-manager 和 kube-scheduler 无监控数据 二进制部署的Kubernetes集群中部署Prometheus Operator,会发现在prometheus server的页面上发现kube-controller和kube-schedule的target为0/0。匹配不到节点信息,这是因为serviceMonitor是根据label去选取svc的。此处svc并没有kube-controller和kube-schedule 需要手动创建。 yaml 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 apiVersion: v1 kind: Service metadata: namespace: kube-system name: kube-controller-manager labels: k8s-app: kube-controller-manager component: kube-controller-manager spec: selector: k8s-app: kube-controller-manager component: kube-controller-manager ports: - name: https-metrics port: 10252 targetPort: 10252 --- apiVersion: v1 kind: Endpoints metadata: namespace: kube-system name: kube-controller-manager labels: k8s-app: kube-controller-manager component: kube-controller-manager subsets: - addresses: - ip: "10....

常用加密算法学习总结之对称加密

对称加密,又称为 共享密钥加密算法,是指加密和解密方使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。 对称加密算法 DES DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS) DES的加密和解密 DES是一种将64bit(8Byte)的明文加密成64bit的密文的对称密码算法,==它的密钥长度是56比特==。从规格上来说,DES的密钥长度是64bit,但由于每隔7bit会设置一个用于==错误检查==的比特,因此实质上其密钥长度是56bit。 DES是以64bit的明文(比特序列)为一个单位来进行加密的,这个64bit的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码(blockcipher),DES就是分组密码的一种。 DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代(反复),而迭代的具体方式就称为模式(mode)。 3DES 3DES(Triple DES):是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 3DES是基于计算机的运算能力的增强,基于DES算法,增强秘钥进行多绪加密,而不是一种块密码算法。 AES AES(Advanced Encryption Standard):高级加密标准,是美国联邦政府采用的一种区块加密标准。 分组密码模式 **分组密码(blockcipher)**是每次只能处理特定长度的一块数据的一类密码算法,这里的一块"就称为分组(block)。此外,一个分组的比特数就称为分组长度(blocklength)。 例如,DES和3DES的分组长度都是64比特。这些密码算法一次只能加密64比特的明文.并生成64比特的密文。 AES的分组长度可以从128比特、192比特和256比特中进行选择。当选择128比特的分组长度时,AES一次可加密128比特的明文,并生成128比特的密文。 分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式(mode)。 分组密码的模式有很多种类,分组密码的主要模式有以下5种: 明文与密文分组 **明文分组: **是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。 **密文分组: **是指使用分组密码算法将明文分组加密之后所生成的密文。 ECB模式:Electronic Code Book mode(电子密码本模式) ECB是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。 每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被破解,使用相同的方法可以解密所有的明文数据,安全性比较差。 适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。 使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组,因此ECB模式也称为电子密码本模式当最后一个明文分组的内容小于分组长度时(如一个分组8bit),需要用一特定的数据进行填充(padding),让值一个分组长度等于分组长度。 ECB模式是所有模式中最简单的一种。ECB模式中,明文分组与密文分组是一一对应的关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组。这样一来,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在一定风险的。 CBC模式:Cipher Block Chaining mode(密码分组链接/密码块 模式) 1976年,IBM发明了密码分组链接CBC。CBC模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。 这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,在第一个块进行加密之前需要用初始化向量 IV 进行异或操作。 CBC模式是一种最常用的加密模式,它主要缺点是加密是连续的,不能并行处理,并且与ECB一样消息块必须填充到块大小的整倍数。 **当加密第一个明文分组时,由于不存在 “前一个密文分组",因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组",这个比特序列称为初始化向量(initialization vector)**通常缩写为 IV。一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。 CFB模式:Cipher FeedBack mode(密文反馈模式) 密文反馈模式 CFB;在CFB模式中,前一个分组的密文加密后和当前分组的明文XOR异或操作生成当前分组的密文。所谓反馈,这里指的就是返回输入端的意思,即前一个密文分组会被送回到密码算法的输入端。 在ECB和CBC中,明文分组都是通过密码算法进行加密的,然而,在CFB模式中,明文分组和密文分组之间并没有经过"加密"这一步骤,明文分和密文分组之间只有一个XOR。 OFB模式:Output FeedBack mode(输出反馈模式) 输出反馈模式, OFB。在OFB模式中,上一个分组密码算法的输出是当前分组密码算法的输入(下图) CTR模式:CounTeR mode(计数器模式) CTR是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码;即每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也就是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR而得到的。...

将traefik部署为传统web架构模式

traefik概述 traefik-现代反向代理,也可称为现代边缘路由;traefik原声兼容主流集群,Kubernetes,Docker,AWS等。官方的定位traefik是一个让开发人员将时间花费在系统研发与部署功能上,而非配置和维护。并且traefik官方也提供自己的服务网格解决方案 作为一个 modern edge router ,traefik拥有与envoy相似的特性 基于go语言研发,目的是为了简化开发人员的配置和维护 tcp/udp支持 http L7支持 GRPC支持 服务发现和动态配置 front/ edge prory支持 可观测性 流量管理 … traefik 术语 要了解trafik,首先需要先了解一下 有关trafik中的一些术语。 EntryPoints 入口点,是可以被下游客户端连接的命名网络位置,类似于envoy 的listener和nginx的listen services 服务,负载均衡,上游主机接收来自traefik的连接和请求并返回响应。 类似于nginx upstream envoy的clusters Providers 提供者,提供配置文件的后端,如文件,consul,redis,etcd等,可使traefik自动更新 routers 路由器,分析请求,将下游主机的请求处理转入到services middlewares: 中间件,在将下游主机的请求转入到services时进行的流量调整 traefik部署安装 traefik为go语言开发的,可以直接下载运行即可。此处介绍直接运行二进制程序 后端环境准备,此处为docker运行的两个后端。 yaml 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 28 29 30 31 32 version: '3' services: webserver1: image: sealloong/envoy-end:latest ports: - 91:90 networks: envoymesh: aliases: - v1_server - default_server environment: - VERSION=v1 - COLORFUL=blue expose: - 90 webserver2: image: sealloong/envoy-end:latest ports: - 92:90 networks: envoymesh: aliases: - v1_server - default_server environment: - VERSION=v1 - COLORFUL=blue expose: - 90 networks: envoymesh: {} traefik配置说明 Traefik中的配置可以引用两种不同的内容:...

zimbra安装故障记录

启动故障:zimbra postsuper: fatal: scan_dir_push: open directory defer: Permission denied bash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Host mail.domain.com Starting ldap...Done. Starting zmconfigd...Done. Starting dnscache...Done. Starting logger...Done. Starting mailbox...Done. Starting memcached...Done. Starting proxy...Done. Starting amavis...Done. Starting antispam...Done. Starting antivirus...Done. Starting opendkim...Done. Starting snmp...Done. Starting spell...Done. Starting mta...Failed. Starting saslauthd...done. postsuper: fatal: scan_dir_push: open directory defer: Permission denied postfix failed to start Starting stats....

windows下Docker Desktop安装管理

检查要求 Windows 10 企业版、专业版或教育版 (必须windows10 1903版本以上)版本号 18362.1049+ 或 18363.1049+ ,次版本#大于.1049。最好是最新版(新版windows可以hype-v wsl2 vmvare共存,但安卓模拟器目前还没稳定的共存版本)。建议使用wsl2,安装包容量会比起hype-v小很多 。 Windows开启wsl2,建议 Windows 10 2004(版本号不低于 19041.264),可wsl2与vmvare共存。 CPU 支持并开启虚拟化(Intel VT-c 或 AMD SVM)。 最少 4 GB 内存。 对于专业版、企业版、教育版可以使用docker desktop wsl2模式,此处无需开启Hype-v 对于Win10 家庭版,Win10 19041.264之前版本,及 Win7 8用户,可以使用docker desktop Hype-v 后端。 修改安装盘 Docker Desktop 默认安装到 C:\Program Files\Docker 并不可更改,这样很不友好,可以通过软连接的方式改变Docker Desktop 默认安装盘。 text 1 mklink /J "C:\Program Files\Docker" "D:\Program Files\Docker" 限制wsl2运行最大内存 WSL 是 Microsoft 提供的一项功能,可以使开发人员能够直接在 Windows 上运行 GNU/Linux 环境,无需修改,无需传统虚拟机或双引导设置,减少了开发人员的使用复杂度 在 Docker Desktop 使用了 WSL 2 中的动态内存分配特性,极大地提高了资源消耗。这意味着,Docker Desktop 仅使用其所需的 CPU 和内存资源量,同时使 CPU 和内存密集型任务(例如构建容器)运行得更快。...

Envoy:TLS双向认证

环境准备 主机 角色 数量 front-envoy front envoy 1 service envoy 作为内部后端的envoy 2 end 后端应用程序 2 访问 / front-envoy ==> end * 2 访问 /red/colorful ==> end red 不验证客户端证书 单项tls 访问 /gray/colorful ==> end gray 验证客户端证书 双项tls docker-compose text 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 version: '3' services: front-envoy: image: envoyproxy/envoy-alpine:v1....

Centos7 dbus问题总结

Authorization not available. Check if polkit text 1 2 3 4 Authorization not available. Check if polkit service is running or see debug message for more information. dbus.socket failed to listen on sockets: Address family not supported by protocol Failed to listen on D-Bus System Message Bus Socket. 这个问题是因为dbus.socket状态异常,所有依赖dbus的启动都会去通过systemcall连接 dbus,当服务不可用时,所有服务无法以systemd方式正常启动/关闭。需要检查dbus.socket是否正常。本地使用需保证unix套接字的监听时启动的 Did not receive a reply text 1 Failed to open connection to "system" message bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken....

记录经过envoy代理后获取客户端真实IP

在envoy作为前端代理时,用户ip的获取很重要,一般获取ip的方式。都是通过Header中的 X-Forward-For、 X-Real-IP或 Remote addr 等属性获取,但是如果确保Envoy可以获取到的ip是真实的用户ip呢?本篇继续解密! 概念说明 Remote Address 是nginx与客户端进行TCP连接过程中,获得的客户端真实地址。Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。 一般情况下,在Envoy作为最外层代理时,此IP为真实的IP客户端IP X-Real-IP 是一个自定义头。X-Real-Ip 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。X-Real-Ip 目前并不属于任何标准,代理和 Web 应用之间可以约定用任何自定义头来传递这个信息。 X-Forwarded-For X-Forwarded-For 是一个扩展头。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。通常,X-Forwarded-For可被伪造,并且使用CDN会被重写 Envoy中如何获取真实IP 在Envoy中,涉及到客户端IP的配置如下: use_remote_address: 默认值false,设置为true,使用客户端连接的真实远程地址,false是使用x-forwarded-for skip_xff_append: 设置为true,则不会将远程地址附加到x-forwarded-for中 request_headers_to_add 添加请求头 request_headers_to_remove 删除一个请求头 实验环境配置准备 yaml 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 admin: access_log_path: /dev/null address: socket_address: { address: 0....

Envoy开启访问日志 access_log

text 1 2 3 4 5 6 7 access_log: - name: envoy.listener.accesslog typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: /var/log/envoy.log log_format: text_format: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\"\n"

使用alpine为基础镜像Q&A

作为go应用存在二进制文件却不能执行 明明镜像中有对应的二进制文件,但是执行时却提示 not found 或 no such file 或 standard_init_linux.go:211: exec user process caused "no such file or directory" 网上常说都是因为windows换行符编码问题。此处实际问题是该二进制文件是使用动态链接方式编译. 解决方法: text 1 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build --ldflags "-extldflags -static" 注意:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 和 cgo_enabled=0 goos=linux goarch=amd64 是有区别的。 保存信息 诸如此类信息都是上述问题 text 1 2 3 4 standard_init_linux.go:211: exec user process caused "no such file or directory" /tmp # ./envoy_end /bin/sh: ./envoy_end: not found 替换为国内源 text 1 RUN sed -i 's@http://dl-cdn.alpinelinux.org/@https://mirrors.aliyun.com/@g' /etc/apk/repositories 基于alpine制作PHP镜像 alpine包搜索 https://pkgs....

centos配置

CentOS7 / CentOS8 设置终端屏幕分辨率 Centos7 修改文件 /boot/grub2/grub.cfg 搜索 linux16 text 1 2 vmlinuz-3.10.0-123.el7.x86_64 root=UUID=881ac4e6-4a55-47b1-b864-555de7051763 ro rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto vconsole.keymap=us rhgb quiet LANG=en_US.UTF-8 添加如下,???具体看下表 text 1 2 3 vga=0x??? vga=0x340 CentOS 8 CentOS8 使用了 blsgcfg来解析文件生成菜单项。菜单项配置文件在/boot/loader/entries/下,每一个文件表示一个启动项。 这里需要修改启动项的参数,这里修改options,实际上是修改了 /boot/grub2/grubenv对应的值。 text 1 options $kernelopts $tuned_params 可以直接修改/etc/sysconfig/grub中的GRUB_CMDLINE_LINUX值后增加=加vga=0x??? (对照分辨率表修改???)。 修改完成后执行 grub2-mkconfig -o /boot/grub2/grub.cfg 重启即修改了/boot/grub2/grubenv对应的值。 centos7 启动引导顺序 查看默认启动项 grub2-editenv list 查看启动项列表 awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg 设置默认引导 grub2-set-default 'Windows 10' 设置默认启动项 grub2-set-default 2 需要按照启动项列表顺序 重新生成grub2....

Envoy 离群检测

outlier detection 在异常检测领域中,常常需要决定新观察的点是否属于与现有观察点相同的分布(则它称为inlier),或者被认为是不同的(称为outlier)。离群是异常的数据,但是不一定是错误的数据点。 在Envoy中,离群点检测是动态确定上游集群中是否有某些主机表现不正常,然后将它们从正常的负载均衡集群中删除的过程。outlier detection可以与healthy check同时/独立启用,并构成整个上游运行状况检查解决方案的基础。 此处概念不做过多的说明,具体可以参考官方文档与自行google 监测类型 连续的5xx 连续的网关错误 连续的本地来源错误 更多介绍参考官方文档 outlier detection 离群检测测试 说明,此处只能在单机环境测试更多还的参考与实际环境 环境准备 docker-compose 模拟后端5个节点 yaml 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 version: '3' services: envoy: image: envoyproxy/envoy-alpine:v1....

Envoy的主动健康监测

实验文件 docker-compose yaml 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 version: '3' services: envoy: image: envoyproxy/envoy-alpine:v1.15-latest environment: - ENVOY_UID=0 - HEALTHY=ok ports: - 80:80 - 443:443 - 82:9901 volumes: - ....

Envoy V3APi 开启 TLS

方案架构 本次实例与官方Envoy front_proxy Example相似,首先会有一个Envoy单独运行。ingress的工作是给其他地方提供一个入口。来自外部的传入连接请求到这里,前端代理将会决定他们在内部的转发路径。 图源自Envoy官网文档 front_proxy 生成证书 text 1 openssl req -nodes -new -x509 -keyout certs/server.key -out certs/server.crt -days 365 -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=studyenvoy/OU=studyenvoy/CN=*.studyenvoy.cn" envoy配置说明 v3 api中envoy去掉了tls_context的配置,配置tls首先需要熟悉envoy的如下两个术语 Downstream:下游主机连接到 Envoy,发送请求并或获得响应。 Upstream:上游主机获取来自 Envoy 的链接请求和响应。 本次使用的是ingress的代理,需要配置的即为 Downstream v3api中使用的是transport_socket,transport_socket为 listeners 当中某一个 filter_chains 中上线文中的配置。 transport_socket 官方说明为: (config.core.v3.TransportSocket) Optional custom transport socket implementation to use for downstream connections. To setup TLS, set a transport socket with name tls and DownstreamTlsContext in the typed_config. If no transport socket configuration is specified, new connections will be set up with plaintext....