Spinnaker 安装配置
环境信息
- 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 |
Spinnaker 的部署配置会写入容器目录 /home/spinnaker/.hal
,将此配置映射到宿主机,可保证配置持久化。
拷贝 Kubernetes 集群管理配置文件到 /root/spinnaker_data/.kube/config
[2]
cp /etc/kubernetes/admin.conf /root/spinnaker_data/.kube/config |
Kubernetes 上部署 cert-manager 及使用
环境信息
- 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 方式。ClusterIssuer
与Issuer
的唯一区别就是Issuer
只能用来签发自己所在namespace
下的证书,ClusterIssuer
可以签发任意namespace
下的证书。Certificate
: 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对Issuer/ClusterIssuer
的引用。
kubernetes ConfigMap 使用说明
环境信息
- Kubernetes 1.24
ConfigMap
是 Kubernetes 用来向应用 Pod 中注入配置数据的方法。[1]
使用 ConfigMap 数据定义容器环境变量
使用单个 ConfigMap 中的数据定义容器环境变量
- 在
ConfigMap
中将环境变量定义为键值对:kubectl create configmap special-config --from-literal=special.how=very
- 将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量。 现在,Pod 的输出包含环境变量
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: NeverSPECIAL_LEVEL_KEY=very
。
kubernetes 配置文件说明
环境信息
- 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 管理节点上的管理节点(admin ,controller-manager ,kubelet ,scheduler )配置文件 admin 配置文件具有全局管理员权限,可以跳过 RBAC 权限控制系统,应该禁止其共享。 |
|
/etc/kubernetes/kubelet.conf |
worker 节点上,kubelet 配置文件 |
|
/etc/kubernetes/manifests/ |
管理节点上,管理节点的启动参数配置文件,主要包括 etcd.yaml , kube-apiserver.yaml , kube-controller-manager.yaml , kube-scheduler.yaml 。是静态 Pod 的主要配置路径 |
|
/etc/kubernetes/pki/ |
- 管理节点上,存放所有节点之间的通信证书文件, - worker 节点上,存放集群 CA 证书文件。 只有 ca.crt |
|
/etc/cni/net.d/10-flannel.conflist |
管理节点上,flannel 配置文件 |
TCP 协议
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 = 100
,Len = 0
的包,接收方需要发送的ACK = 100 + 1
假如接收方接收到了
seq = 100
,Len = 20
的包,接收方需要发送的ACK = 100 + 20
参考链接
wireshark 抓包工具使用
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 常见用法
环境信息
- 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 中自动引用。
在要配置的 Pipeline 的
Configuration
部分,配置Automated Triggers
,选择type
为Docker Registry
- Registry Name - 为 Halyard 中配置的 Docker Registry 的认证信息 的名称
- Organization - 对应 Docker Registry (如 Harbor) 中的 Projects
Stage 中使用以下方式引用镜像
image: '${trigger.artifacts[0].reference}'
${trigger}
为镜像名称,当一个镜像名下有多个不同标签的镜像时,${trigger.artifacts[0]
表示第一个镜像,依此类推。${trigger.artifacts[0].reference}
值为第一个镜像的完整镜像名加标签。
cp 命令用法
常用选项
选项 | 说明 | 示例 |
---|---|---|
-R, -r, --recursive |
递归拷贝 | |
-p, --preserve |
拷贝时保留文件信息(default: mode,ownership,timestamps) |
常用命令
拷贝时包含隐藏文件一起
cp -rf dir1/* dir2/
使用此格式拷贝时,假如 dir1
下面包含隐藏文件,拷贝时隐藏文件不会被拷贝过去
$ tree -a |
如上所示的目录结构,执行命令 cp -rf dir1/* dir2/
,观察目录结构:
$ tree -a |
看见,dir/.test
未被拷贝,如果拷贝时希望同时保护隐藏文件,可以使用 .
代替 *
$ tree -a |
使用 docker 运行 jenkins 的安装配置及使用
版本信息
- 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 |
启动 jenkins 容器
docker run -d -p 8080:8080 --name jenkins \ |
-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
Apollo 配置中心服务使用说明
环境信息
- 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.1
、172.31.82.2
为 pro
环境的高可用节点。172.31.83.3
为 uat
环境的单节点。
apollo-portal
和 ApolloPortalDB
部署在 pro
环境,uat
环境共用 apollo-portal
和 ApolloPortalDB
。
安装 Mysql
环境信息
- 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 |
检查 yum
源中的 mysql-community-server
信息
$ yum info mysql-community-server |
Docker 私有镜像仓库 Harbor 安装及使用
环境信息
- 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 |
准备证书
将申请好的证书上传到服务器,将 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/ |
重启 Docker
systemctl restart docker |
配置 Harbor 安装配置文件
执行 install.sh
命令安装 Harbor 时,会使用配置文件 harbor.yml
(需要拷贝安装包中的 harbor.yml.tmpl
为 harbor.yml
)。
修改配置中的 hostname
选项,配置访问 Harbor 的域名。此为必须修改的参数。
修改配置中的 https.certificate
和 https.private_key
,配置证书(harbor.crt
)和私钥的路径,使用 HTTPS 时必须配置。
修改配置中的 data_volume
,指定持久化数据卷的路径。默认为 data_volume: /data
Jenkins + gitlab 自动构建
环境信息
- 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 \ |
Jenkins 配置
以下分别记录使用 freestyle
和 Pipeline
类型的构建镜像的配置过程
创建 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
.: |
使用如下 shell 脚本
#!/bin/sh |
其中的
${Branch}
来自 参数化的构建
Kubernetes 网络数据包抓包分析
环境信息
- 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 抓包命令使用
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 证书格式说明
常见的 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 服务器。
可以到这里进行 格式转换
Alpine linux apk 命令使用
更新索引
$ apk update |
从远程镜像源中更新本地镜像源索引,update
命令会从各个镜像源列表下载 APKINDEX.tar.gz
并存储到本地缓存,一般在 /var/cache/apk/
(Alpine 在该目录下)
Docker 部署 OpenLDAP + phpLDAPadmin 教程
环境信息
- 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 \ |