L B T

记 录 过 去 的 经 验

环境信息

  • Centos-7 3.10.0-1160
  • Docker Engine 19.03.15
  • Kubernetes 1.21.2

本文档中涉及服务器的操作,都是在 Kubernetes 集群的 Master 节点上进行。如果在其他服务器启动 Halyard 容器,需要确保容器中可以访问到 Kubernetes 集群的 API Server

安装部署步骤

Install Halyard on Docker and Choose Cloud Providers - Kubernetes

宿主机准备容器数据目录

宿主机创建 local Halyard config directory [1]

mkdir /root/spinnaker_data
mkdir /root/spinnaker_data/.kube
mkdir /root/spinnaker_data/.hal

Spinnaker 的部署配置会写入容器目录 /home/spinnaker/.hal,将此配置映射到宿主机,可保证配置持久化。

拷贝 Kubernetes 集群管理配置文件到 /root/spinnaker_data/.kube/config [2]

cp /etc/kubernetes/admin.conf /root/spinnaker_data/.kube/config
chmod 777 /root/spinnaker_data/.kube/config
阅读全文 »

环境信息

  • Kubernetes 1.24
  • cert-manager v1.7.1

随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支。cert-manager 是 Kubernetes 上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 来签发免费证书并自动续期,实现永久免费使用证书。

cert-manager 工作原理

cert-manager 部署到 Kubernetes 集群后,它会 watch 它所支持的 CRD 资源,我们通过创建 CRD 资源来指示 cert-manager 为我们签发证书并自动续期: [1]

解释下几个关键的资源:

  • Issuer/ClusterIssuer: 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuerIssuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。
  • Certificate: 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。
阅读全文 »

环境信息

  • Kubernetes 1.24

ConfigMap 是 Kubernetes 用来向应用 Pod 中注入配置数据的方法。[1]

使用 ConfigMap 数据定义容器环境变量

使用单个 ConfigMap 中的数据定义容器环境变量

  1. ConfigMap 中将环境变量定义为键值对:
    kubectl create configmap special-config --from-literal=special.how=very
  2. 将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量。
    apiVersion: v1

    kind: Pod

    metadata:

    name: dapi-test-pod

    spec:

    containers:

    - name: test-container

    image: registry.k8s.io/busybox

    command: [ "/bin/sh", "-c", "env" ]

    env:

    # 定义环境变量

    - name: SPECIAL_LEVEL_KEY

    valueFrom:

    configMapKeyRef:

    # ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值

    name: special-config

    # 指定与取值相关的键名

    key: special.how

    restartPolicy: Never
    现在,Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=very
阅读全文 »

环境信息

  • Centos7 5.4.212-1
  • Docker 20.10.18
  • containerd.io-1.6.8
  • kubectl-1.25.0
  • kubeadm-1.25.0
  • kubelet-1.25.0
  • kube-flannel

常见配置文件说明

文件/目录 说明 示例
/etc/kubernetes/{admin.conf, controller-manager.conf, kubelet.conf, scheduler.conf } master 管理节点上的管理节点(admincontroller-managerkubeletscheduler)配置文件
admin 配置文件具有全局管理员权限,可以跳过 RBAC 权限控制系统,应该禁止其共享。
/etc/kubernetes/kubelet.conf worker 节点上,kubelet 配置文件
/etc/kubernetes/manifests/ 管理节点上,管理节点的启动参数配置文件,主要包括 etcd.yamlkube-apiserver.yamlkube-controller-manager.yamlkube-scheduler.yaml。是静态 Pod 的主要配置路径
/etc/kubernetes/pki/ - 管理节点上,存放所有节点之间的通信证书文件,
- worker 节点上,存放集群 CA 证书文件。 只有 ca.crt
/etc/cni/net.d/10-flannel.conflist 管理节点上,flannel 配置文件
阅读全文 »

TCP 协议抓包分析

TCP 通信过程中 seq 和 ACK 值说明

  • TCP 连接通信过程中,client 和 server 端各自维护自己的 seq。后面一个数据包的 seq 是前面一个数据包的 seq 加上前面一个数据包的大小。表示发送的字节位置。

    假如当前连接中,之前一个包 seq = 100,其发送数据包大小为 0,则当前要发送的数据包的 seq = 0

    假如当前连接中,之前一个包 seq = 100,其发送数据包大小为 20,则当前要发送的数据包的 seq = 120

  • TCP 连接通信过程中,client 和 server 端要发送给对方的包的 ACK 的值为:收到的包的 seq + 收到的包的 Len,此值告知发送方,接收方希望接收到的下一个包的序列号。

    假如接收方接收到了 seq = 100Len = 0 的包,接收方需要发送的 ACK = 100 + 1

    假如接收方接收到了 seq = 100Len = 20 的包,接收方需要发送的 ACK = 100 + 20

参考链接

TCP 实战抓包分析

wireshark抓包分析——TCP/IP协议

wiresark 显示过滤器使用方法

Wireshark 提供了两种过滤器

  • 捕获过滤器:在抓包之前就设定好过滤条件,然后只抓取符合条件的数据包。
  • 显示过滤器:在已捕获的数据包集合中设置过滤条件,隐藏不想显示的数据包,只显示符合条件的数据包。

这两种过滤器所使用的语法是完全不同的,捕捉网卡数据的其实并不是 Wireshark,而是 WinPcap,要按 WinPcap 的规则来,显示过滤器就是 Wireshark 对已捕捉的数据进行筛选。

显示过滤器中常用的关系计算符号

符号 说明 示例
eq
==
等于 ip.src==10.10.10.10
ip.src eq 10.10.10.10
ne
!=
不等于 ip.src!=10.10.10.10
ip.src ne 10.10.10.10
gt
>
大于
lt
<
小于
ge
>=
大于等于
le
<=
小于等于
contains 包含 http.host contains com

显示过滤器中常用的逻辑计算符号

符号 说明 示例
and
&&
http.host contains com && ip.src == 44.199.163.86
http.host contains com and ip.src == 44.199.163.86
or
||
not
!

常用示例

针对 IP 过滤

  • 对源地址进行过滤
    ip.src == 192.168.0.1
  • 对目的地址进行过滤
    ip.dst == 192.168.0.1
  • 对源地址或者目的地址进行过滤
    ip.addr == 192.168.0.1
  • 如果想排除以上的数据包,只需要将其用括号囊括,然后使用 ! 即可
    !(ip.addr == 192.168.0.1)

针对协议过滤

针对某种协议的数据包,表达式很简单仅仅需要把协议的名字(必须小写)输入即可

常见协议:
tcp
udp
arp
icmp
http
smtp
ftp
dns
msnms
ip
ssl
oicq
bootp

针对端口过滤

  • 捕获某一端口的数据包(以 tcp 协议为例)
    tcp.port == 80
  • 捕获多端口的数据包,可以使用 and 来连接,下面是捕获高于某端口的表达式(以 udp 协议为例)
    udp.port >= 2048

针对 http 请求的一些过滤实例

  • 过滤出请求地址中包含 user 的请求,不包括域名
    http.request.uri contains "User"
  • 精确过滤域名
    http.host==baidu.com
  • 模糊过滤域名
    http.host contains "baidu"
  • 过滤请求的 content_type 类型
    http.content_type =="text/html"
    -过滤 http 请求方法
    http.request.method=="POST"
  • 过滤 tcp 端口
    tcp.port==80
    http && tcp.port==80 or tcp.port==5566
  • 过滤 http 响应状态码
    http.response.code==302
  • 过滤含有指定 cookie 的 http 数据包
    http.cookie contains "userid"

环境信息

  • Spinnaker 1.29.0
  • Kubernetes 1.24.7

Spinnaker 引用 Kubernetes 中的 Namespace

Kubernetes 中的 Namespace,对应 Spinnaker 中的 Application,当 在 Kubernetes 中创建 Namespace ,并在此 Namespace 创建资源后,Spinnaker 会自动读取到此 Namespace,并显示在 Applications 中。

Pipelines 中引用 Docker Registry 类型的触发器

在 Pipelines 中配置 Docker Registry 类型的触发器,并在后面的 Stage 中自动引用。

  1. 在要配置的 Pipeline 的 Configuration 部分,配置 Automated Triggers,选择 typeDocker Registry

  2. Stage 中使用以下方式引用镜像

    image: '${trigger.artifacts[0].reference}'

    ${trigger} 为镜像名称,当一个镜像名下有多个不同标签的镜像时,${trigger.artifacts[0] 表示第一个镜像,依此类推。${trigger.artifacts[0].reference} 值为第一个镜像的完整镜像名加标签。

阅读全文 »

常用选项

选项 说明 示例
-R, -r, --recursive 递归拷贝
-p, --preserve 拷贝时保留文件信息(default: mode,ownership,timestamps)

常用命令

拷贝时包含隐藏文件一起

cp -rf dir1/* dir2/

使用此格式拷贝时,假如 dir1 下面包含隐藏文件,拷贝时隐藏文件不会被拷贝过去

$ tree -a
.
├── dir1
│ ├── test1
│ └── .test2
└── dir2

2 directories, 2 files

如上所示的目录结构,执行命令 cp -rf dir1/* dir2/,观察目录结构:

$ tree -a
.
├── dir1
│ ├── test1
│ └── .test2
└── dir2
└── test1

2 directories, 3 files

看见,dir/.test 未被拷贝,如果拷贝时希望同时保护隐藏文件,可以使用 . 代替 *

$ tree -a
.
├── dir1
│ ├── test1
│ └── .test2
└── dir2

2 directories, 2 files

$ cp -rf dir1/. dir2/

$ tree -a
.
├── dir1
│ ├── test1
│ └── .test2
└── dir2
├── test1
└── .test2

2 directories, 4 files

版本信息

  • Centos-7 3.10.0-1160
  • Docker Engine 19.03.15
  • jenkinsci/blueocean Jenkins 2.346.3

安装步骤

下载镜像

官方镜像仓库 中搜索 jenkinsci/blueocean,下载最新镜像

docker pull jenkinsci/blueocean

启动 jenkins 容器

创建数据目录

mkdir /data/JenkinsData_blueocean
chmod 777 /data/JenkinsData_blueocean

启动 jenkins 容器

docker run -d -p 8080:8080 --name jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/JenkinsData_blueocean/:/var/jenkins_home/ \
-u root \
jenkinsci/blueocean
  • -v /var/run/docker.sock:/var/run/docker.sock - 在需要使用 Jenkins 构建 Docker 镜像时,Jenkins 容器中的 docker 客户端需要连接到宿主机的 Docker server
  • -v /data/JenkinsData_blueocean/:/var/jenkins_home/ - 数据持久化到宿主机目录
  • -u root - 容器中使用 root 用户运行,要使用 Jenkins 构建 Docker 镜像时,默认的 jenkins 用户无权限访问 /var/run/docker.sock
阅读全文 »

环境信息

  • Centos 7 kernel 5.4
  • Apollo 2.0.1
  • Mysql 5.7
  • Java 1.8

安装部署

分布式部署

部署服务器信息说明

环境 服务器 服务 端口
pro 172.31.88.1 apollo-portal 8070
pro 172.31.88.1 数据库 ApolloPortalDB 3306
pro 172.31.88.1 apollo-configservice 8080
pro 172.31.88.1 apollo-adminservice 8090
pro 172.31.88.1 数据库ApolloConfigDB 3306
pro 172.31.82.2 apollo-configservice 8080
pro 172.31.82.2 apollo-adminservice 8090
uat 172.31.83.3 apollo-configservice 8080
uat 172.31.83.3 apollo-adminservice 8090
uat 172.31.83.3 数据库ApolloConfigDB 3306

其中 172.31.88.1172.31.82.2pro 环境的高可用节点。172.31.83.3uat 环境的单节点。

apollo-portalApolloPortalDB 部署在 pro 环境,uat 环境共用 apollo-portalApolloPortalDB

阅读全文 »

环境信息

  • Centos 7 kernel 5.4
  • Mysql Server 5.7

Mysql Server 安装步骤

yum 方式安装

安装 MySQL 5.7 的 yum 源

yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

如果因为源冲突,类似如下错误

Processing Conflict: mysql80-community-release-el7-2.noarch conflicts mysql57-community-release

可以卸载旧的 yum 源安装包,重新安装

$ rpm -qa | grep mysql
mysql80-community-release-el7-2.noarch

$ yum remove mysql80-community-release-el7-2

$ yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

检查 yum 源中的 mysql-community-server 信息

$ yum info mysql-community-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: download.cf.centos.org
* elrepo: reflector.westga.edu
* epel: coresite.mm.fcix.net
* extras: download.cf.centos.org
* updates: download.cf.centos.org
Available Packages
Name : mysql-community-server
Arch : x86_64
Version : 5.7.40
Release : 1.el7
Size : 178 M
Repo : mysql57-community/x86_64
Summary : A very fast and reliable SQL database server

阅读全文 »

环境信息

  • Centos 7
  • docker-ce-19.03.15
  • harbor v2.6.1

安装步骤

官网安装参考链接

下载安装包

wget https://github.com/goharbor/harbor/releases/download/v2.6.1/harbor-offline-installer-v2.6.1.tgz
tar -xf harbor-offline-installer-v2.6.1.tgz
cd harbor

准备证书

将申请好的证书上传到服务器,将 harbor.crt 转换为 harbor.cert

openssl x509 -inform PEM -in harbor.crt -out harbor.cert 

将转换好的证书和私钥拷贝到 Docker 的证书目录 /etc/docker/certs.d/yourdomain.com/

cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
cp ca.crt /etc/docker/certs.d/yourdomain.com/

重启 Docker

systemctl restart docker

配置 Harbor 安装配置文件

执行 install.sh 命令安装 Harbor 时,会使用配置文件 harbor.yml(需要拷贝安装包中的 harbor.yml.tmplharbor.yml)。

修改配置中的 hostname 选项,配置访问 Harbor 的域名。此为必须修改的参数

修改配置中的 https.certificatehttps.private_key,配置证书(harbor.crt)和私钥的路径,使用 HTTPS 时必须配置

修改配置中的 data_volume,指定持久化数据卷的路径。默认为 data_volume: /data

阅读全文 »

环境信息

  • Jenkins jenkinsci/blueocean:2.346.3
  • GitLab Community Edition 13.9.6
  • Docker 19.03.15

本文档记录 GitLab 上面的代码更新时,使用 Jenkins 自动构建 Docker 镜像的过程。

配置过程

使用 docker 启动 Jenkins 容器

docker run -d -p 8080:8080 --name jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/JenkinsData_blueocean/:/var/jenkins_home/ \
-u root \
jenkinsci/blueocean

Jenkins 配置

以下分别记录使用 freestylePipeline 类型的构建镜像的配置过程

创建 freestyle 类型的 Item 构建镜像

源码管理(Source Code Management) 中配置 git 地址,并配置认证

默认情况下,在构建时,Jenkins 会先从配置的 Git 地址拉取代码到 Jenkins 目录: /var/jenkins_home/workspace/${PROJECT_NAME}

构建(Build)Add build step ,选择构建类型为 Execute shell,此处构建的示例项目代码结构如下,其中 Dockerfile 路径为 k8s/server/Dockerfile

.:
index.html k8s

./k8s:
server

./k8s/server:
Dockerfile

使用如下 shell 脚本

#!/bin/sh

DATA=`date +%Y%m%d%H%M`

DIR='.'

LOG=${DIR}/docker_build_result.log

DOCKER_REGISTRY='harbor.a.com'

DOCKER_REGISTRY_PROJECT='test'

PROJECT='test_project'
ENV='uat'

docker build -t ${PROJECT}-${ENV}-${Branch}:${DATA} -f k8s/server/Dockerfile ${DIR} | tee ${LOG}

docker tag ${PROJECT}-${ENV}-${Branch}:${DATA} ${DOCKER_REGISTRY}/${DOCKER_REGISTRY_PROJECT}/${PROJECT}-${ENV}-${Branch}:${DATA}

docker login -u admin -p Harbor12345 ${DOCKER_REGISTRY}

docker push ${DOCKER_REGISTRY}/${DOCKER_REGISTRY_PROJECT}/${PROJECT}-${ENV}-${Branch}:${DATA}

RESULT=`cat ${LOG} | tail -n 1`

grep "Successfully tagged " ${LOG}

exit $?

其中的 ${Branch} 来自 参数化的构建

阅读全文 »

环境信息

  • Centos7
  • Kubernetes 1.21
  • flannel 0.20

为观察 Kubernetes 集群中跨主机 POD 之间的网络通信数据流,本文通过 tcpdump 抓包,对数据流向进行记录观察。

本示例中的 Kubernetes 集群由以下节点组成:

节点主机名 节点角色 节点 IP 节点上测试 POD IP
master master eth0: 10.150.0.21 10.244.0.2
worker1 worker eth0: 10.150.0.19 10.244.1.38
worker2 worker eth0: 10.150.0.20 10.244.2.27

Flannel 简介

Kubernetes 系统上 POD 网络的实现依赖于第三方插件,Kubernetes 只负责提供了 CNI(容器网络接口),只要符合 CNI 规则的第三方插件都可以用于为 POD 提供网络实现。而 Flannel 是由 CoreOS 主推的目前比较主流的容器网络解决方案。

Flannel 支持三种不同后端实现,分别是:

  • UDP
  • VXLAN
  • host-gw

UDP 是 Flannel 项目最早支持的一种方式,是性能最差的方式,目前已被废弃。

用的最多的是 VXLAN 和 host-gw 模式的部署。

阅读全文 »

tcpdump 命令格式说明

  • option - 可选选项(参数)
  • proto - 协议类过滤器:根据协议进行过滤,可识别的关键词有: tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet
  • direction - 数据流向类过滤器:根据数据流向进行过滤,可识别的关键字有:src, dst,同时你可以使用逻辑运算符进行组合,比如 src or dst
  • type 类过滤器:可识别的关键词有:host, net, port, portrange,这些词后边需要再接参数。

常用选项

选项 说明 示例
-i 目标网卡
-n
-nn
不对 IP/DOMAIN 进行解析
不对 IP/DOMAIN 及 PORT 进行解析
-w 将结果写入文件 tcpdump icmp -w icmp.pcap
阅读全文 »

常见的 SSL 证书格式主要有:

  • .DER .CER - 文件是二进制格式,只保存证书,不保存私钥。
  • .PEM - 一般是文本格式,可保存证书,可保存私钥。
  • .CRT - 可以是二进制格式,可以是文本格式,一般均为文本格式,与 .DER 格式相同,不保存私钥。
  • .PFX .P12 - 二进制格式,同时包含证书和私钥,一般有密码保护。
  • .JK - 二进制格式,同时包含证书和私钥,一般有密码保护。

证书格式说明

DER 和 CER

该格式是二进制文件内容,Java 和 Windows 服务器偏向于使用这种编码格式。只含有证书信息,不包含私钥

OpenSSL 查看

openssl x509 -in certificate.der -inform der -text -noout

转换为 PEM:

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

PEM

Privacy Enhanced Mail,一般为文本格式,以 -----BEGIN... 开头,以 -----END... 结尾。中间的内容是 BASE64 编码。这种格式可以保存证书和私钥,有时我们也把 PEM 格式的私钥的后缀改为 .key 以区别证书与私钥。

这种格式常用于 Apache 和 Nginx 服务器。

OpenSSL 查看:

openssl x509 -in certificate.pem -text -noout

转换为 DER:

openssl x509 -in cert.crt -outform der -out cert.der

CRT

Certificate 的简称,有可能是 PEM 编码格式,也有可能是 DER 编码格式。如何查看请参考前两种格式。

PFX

Predecessor of PKCS#12,这种格式是二进制格式,且证书和私钥存在一个 PFX 文件中。一般用于 Windows 上的 IIS 服务器。该格式的文件一般会有一个密码用于保证私钥的安全。

OpenSSL 查看:

openssl pkcs12 -in for-iis.pfx

转换为 PEM:

openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

JKS

Java Key Storage,很容易知道这是 JAVA 的专属格式,利用 JAVA 的一个叫 keytool 的工具可以进行格式转换。一般用于 Tomcat 服务器。

可以到这里进行 格式转换

阅读全文 »

更新索引

$ apk update

fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/testing/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
v3.14.8-65-g0f3285f2cf [https://dl-cdn.alpinelinux.org/alpine/v3.14/main]
v3.14.8-66-ge9853dea68 [https://dl-cdn.alpinelinux.org/alpine/v3.14/community]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/main]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/testing]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/community]
OK: 38705 distinct packages available

从远程镜像源中更新本地镜像源索引,update 命令会从各个镜像源列表下载 APKINDEX.tar.gz 并存储到本地缓存,一般在 /var/cache/apk/ (Alpine 在该目录下)

阅读全文 »

环境信息

  • Centos7 3.10.0-1160.76.1
  • Docker Engine - Community 19.03.15

安装步骤

创建自定义网络

为了使容器互联,新版本建议将容器加入自定义的 Docker 网络 来连接多个容器,而不是使用 --link 参数。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

docker network create -d bridge docker-network-for-openldap

之后为 LDAP 创建的相关容器,都连接到此网络。

启动 openldap 容器

为 openldap 容器创建本地持久化数据目录,容器启动时将此目录以数据卷的形式挂载使用

mkdir /data/OpenLDAPData

启动容器,挂载数据卷,使用自定义网络

docker run -d -p 389:389 -p 636:636 \
-v /data/OpenLDAPData:/usr/local/ldap \
--name openldap \
--network docker-network-for-openldap \
osixia/openldap:1.3.0
阅读全文 »