提交 e5b43388 编写于 作者: 阳明的博客's avatar 阳明的博客

替换微博图床

上级 0d727b34
......@@ -99,4 +99,5 @@
* [Harbor](docs/63.Harbor.md)
* [Gitlab](docs/64.Gitlab.md)
* [Gitlab CI](docs/65.Gitlab CI.md)
* [Devops](docs/66/devops.md)
......@@ -140,7 +140,7 @@ spec:
上面我们在 monitoring 命名空间下面创建了名为 etcd-k8s 的 ServiceMonitor 对象,基本属性和前面章节中的一致,匹配 kube-system 这个命名空间下面的具有 k8s-app=etcd 这个 label 标签的 Service,jobLabel 表示用于检索 job 任务名称的标签,和前面不太一样的地方是 endpoints 属性的写法,配置上访问 etcd 的相关证书,endpoints 属性下面可以配置很多抓取的参数,比如 relabel、proxyUrl,tlsConfig 表示用于配置抓取监控数据端点的 tls 认证,由于证书 serverName 和 etcd 中签发的可能不匹配,所以加上了 insecureSkipVerify=true
![tlsConfig](https://ws4.sinaimg.cn/large/006tNbRwgy1fy9s4embvlj313a0fmdik.jpg)
![tlsConfig](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/mI32WB.jpg)
> 关于 ServiceMonitor 属性的更多用法可以查看文档:[https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md) 了解更多
......@@ -195,7 +195,7 @@ $ kubectl create -f prometheus-etcdService.yaml
创建完成后,隔一会儿去 Prometheus 的 Dashboard 中查看 targets,便会有 etcd 的监控项了:
![prometheus etcd](https://ws4.sinaimg.cn/large/006tNbRwgy1fy9smdbdgwj31y80autbj.jpg)
![prometheus etcd](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/5BQRte.jpg)
可以看到还是有一个明显的错误,和我们上节课监控 kube-scheduler 的错误比较类似于,因为我们这里的 etcd 的是监听在 127.0.0.1 这个 IP 上面的,所以访问会拒绝:
```shell
......@@ -209,17 +209,17 @@ $ kubectl create -f prometheus-etcdService.yaml
重启 etcd,生效后,查看 etcd 这个监控任务就正常了:
![prometheus etcd](https://ws4.sinaimg.cn/large/006tNbRwgy1fy9st81y3tj31yc0a0gnq.jpg)
![prometheus etcd](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/EmEn6b.jpg)
数据采集到后,可以在 grafana 中导入编号为`3070`的 dashboard,获取到 etcd 的监控图表。
![grafana etcd dashboard](https://ws3.sinaimg.cn/large/006tNbRwgy1fy9t1ewpc5j31uf0u00wj.jpg)
![grafana etcd dashboard](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/yQgrwt.jpg)
### 配置 PrometheusRule
现在我们知道怎么自定义一个 ServiceMonitor 对象了,但是如果需要自定义一个报警规则的话呢?比如现在我们去查看 Prometheus Dashboard 的 Alert 页面下面就已经有一些报警规则了,还有一些是已经触发规则的了:
![alerts](https://ws3.sinaimg.cn/large/006tNbRwgy1fyc4hf239zj313i0p6juv.jpg)
![alerts](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/DADO6K.jpg)
但是这些报警信息是哪里来的呢?他们应该用怎样的方式通知我们呢?我们知道之前我们使用自定义的方式可以在 Prometheus 的配置文件之中指定 AlertManager 实例和 报警的 rules 文件,现在我们通过 Operator 部署的呢?我们可以在 Prometheus Dashboard 的 Config 页面下面查看关于 AlertManager 的配置:
```yaml
......@@ -355,7 +355,7 @@ monitoring-etcd-rules.yaml monitoring-prometheus-k8s-rules.yaml
可以看到我们创建的 rule 文件已经被注入到了对应的 rulefiles 文件夹下面了,证明我们上面的设想是正确的。然后再去 Prometheus Dashboard 的 Alert 页面下面就可以查看到上面我们新建的报警规则了:
![etcd cluster](https://ws2.sinaimg.cn/large/006tNbRwgy1fyc62d4gkzj31540doac1.jpg)
![etcd cluster](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/n68RSK.jpg)
### 配置报警
......@@ -363,7 +363,7 @@ monitoring-etcd-rules.yaml monitoring-prometheus-k8s-rules.yaml
首先我们将 alertmanager-main 这个 Service 改为 NodePort 类型的 Service,修改完成后我们可以在页面上的 status 路径下面查看 AlertManager 的配置信息:
![alertmanager config](https://ws4.sinaimg.cn/large/006tNbRwgy1fyc6dz3t5ij31aa0u0te0.jpg)
![alertmanager config](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/Ty1Gxu.jpg)
这些配置信息实际上是来自于我们之前在`prometheus-operator/contrib/kube-prometheus/manifests`目录下面创建的 alertmanager-secret.yaml 文件:
......@@ -440,15 +440,15 @@ secret "alertmanager-main" created
我们添加了两个接收器,默认的通过邮箱进行发送,对于 CoreDNSDown 这个报警我们通过 webhook 来进行发送,这个 webhook 就是我们前面课程中定义的一个钉钉接收的 Server,上面的步骤创建完成后,很快我们就会收到一条钉钉消息:
![钉钉](https://ws3.sinaimg.cn/large/006tNbRwgy1fyc7drk445j311c0mm7bo.jpg)
![钉钉](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/Of4GIB.jpg)
同样邮箱中也会收到报警信息:
![邮箱](https://ws1.sinaimg.cn/large/006tNbRwgy1fyc7j3k20vj30u00u4gpx.jpg)
![邮箱](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/NjnV2X.jpg)
我们再次查看 AlertManager 页面的 status 页面的配置信息可以看到已经变成上面我们的配置信息了:
![alertmanager config](https://ws1.sinaimg.cn/large/006tNbRwgy1fyc7kvs27vj30vp0u017c.jpg)
![alertmanager config](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/gKhiPI.jpg)
AlertManager 配置也可以使用模板(.tmpl文件),这些模板可以与 alertmanager.yaml 配置文件一起添加到 Secret 对象中,比如:
......
......@@ -108,7 +108,7 @@ prometheus.monitoring.coreos.com "k8s" configured
隔一小会儿,可以前往 Prometheus 的 Dashboard 中查看配置是否生效:
![config](https://ws1.sinaimg.cn/large/006tNbRwgy1fyd8c25rf2j31530u0dl5.jpg)
![config](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/jmiqaD.jpg)
在 Prometheus Dashboard 的配置页面下面我们可以看到已经有了对应的的配置信息了,但是我们切换到 targets 页面下面却并没有发现对应的监控任务,查看 Prometheus 的 Pod 日志:
```shell
......@@ -172,7 +172,7 @@ rules:
更新上面的 ClusterRole 这个资源对象,然后重建下 Prometheus 的所有 Pod,正常就可以看到 targets 页面下面有 kubernetes-service-endpoints 这个监控任务了:
![endpoints](https://ws2.sinaimg.cn/large/006tNbRwgy1fyd9q7pq78j31rg0ewtca.jpg)
![endpoints](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/R38S3q.jpg)
我们这里自动监控了两个 Service,第一个就是我们之前创建的 Redis 的服务,我们在 Redis Service 中有两个特殊的 annotations:
```yaml
......
......@@ -439,7 +439,7 @@ kibana NodePort 10.105.208.253 <none> 5601:31816/TCP 2
如果 Pod 已经是 Running 状态了,证明应用已经部署成功了,然后可以通过 NodePort 来访问 Kibana 这个服务,在浏览器中打开`http://<任意节点IP>:31816`即可,如果看到如下欢迎界面证明 Kibana 已经成功部署到了 Kubernetes集群之中。
![kibana welcome](https://ws3.sinaimg.cn/large/006tNc79gy1fz9h04vmnnj316o0tktdh.jpg)
![kibana welcome](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/FXJOqE.jpg)
## 部署 Fluentd
......@@ -452,7 +452,7 @@ Fluentd 通过一组给定的数据源抓取日志数据,处理后(转换成
* 结构化并且标记这些数据
* 然后根据匹配的标签将数据发送到多个目标服务去
![fluentd 架构](https://ws4.sinaimg.cn/large/006tNc79gy1fz9hctkjysj30xc0ge0tk.jpg)
![fluentd 架构](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/7moPNc.jpg)
### 配置
......@@ -826,15 +826,15 @@ kibana-7558d4dc4d-5mqdz 1/1 Running 0 1d
Fluentd 启动成功后,我们可以前往 Kibana 的 Dashboard 页面中,点击左侧的`Discover`,可以看到如下配置页面:
![create index](https://ws3.sinaimg.cn/large/006tNc79gy1fz9nkcfrrrj31cf0u00y2.jpg)
![create index](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/gSH5TE.jpg)
在这里可以配置我们需要的 Elasticsearch 索引,前面 Fluentd 配置文件中我们采集的日志使用的是 logstash 格式,这里只需要在文本框中输入`logstash-*`即可匹配到 Elasticsearch 集群中的所有日志数据,然后点击下一步,进入以下页面:
![index config](https://ws2.sinaimg.cn/large/006tNc79gy1fz9noes54aj31di0u043y.jpg)
![index config](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/rLJ1wS.jpg)
在该页面中配置使用哪个字段按时间过滤日志数据,在下拉列表中,选择`@timestamp`字段,然后点击`Create index pattern`,创建完成后,点击左侧导航菜单中的`Discover`,然后就可以看到一些直方图和最近采集到的日志数据了:
![log data](https://ws4.sinaimg.cn/large/006tNc79gy1fz9ntqiplvj31df0u04bf.jpg)
![log data](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/U5d7oL.jpg)
### 测试
......@@ -861,7 +861,7 @@ $ kubectl create -f counter.yaml
Pod 创建并运行后,回到 Kibana Dashboard 页面,在上面的`Discover`页面搜索栏中输入`kubernetes.pod_name:counter`,就可以过滤 Pod 名为 counter 的日志数据:
![counter log data](https://ws4.sinaimg.cn/large/006tNc79gy1fz9o3c5ds8j31df0u0qg5.jpg)
![counter log data](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/Dd5VCx.jpg)
我们也可以通过其他元数据来过滤日志数据,比如
您可以单击任何日志条目以查看其他元数据,如容器名称,Kubernetes 节点,命名空间等。
......
# 63. Harbor
[![harbor](https://ws4.sinaimg.cn/large/006tKfTcgy1g0cz18sku5j321r0kz0ux.jpg)](/post/harbor-code-analysis/)
[![harbor](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/5xvK5f.jpg)](/post/harbor-code-analysis/)
[Harbor](https://github.com/goharbor/harbor) 是一个`CNCF`基金会托管的开源的可信的云原生`docker registry`项目,可以用于存储、签名、扫描镜像内容,Harbor 通过添加一些常用的功能如安全性、身份权限管理等来扩展 docker registry 项目,此外还支持在 registry 之间复制镜像,还提供更加高级的安全功能,如用户管理、访问控制和活动审计等,在新版本中还添加了`Helm`仓库托管的支持。
......@@ -19,7 +19,7 @@
至此,整个登录过程完成,整个过程可以用下面的流程图来说明:
![docker login](https://ws4.sinaimg.cn/large/006tKfTcgy1g0cwrqk1mqj310q0iuwgt.jpg)
![docker login](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/1WZx0K.jpg)
要完成上面的登录认证过程有两个关键点需要注意:怎样让 registry 服务知道服务认证地址?我们自己提供的认证服务生成的 token 为什么 registry 就能够识别?
......@@ -616,16 +616,16 @@ harbor-harbor-ingress registry.qikqiak.com,notary.qikqiak.com 80,
### Harbor Portal
添加完成后,在浏览器中输入`registry.qikqiak.com`就可以打开熟悉的 Harbor 的 Portal 界面了,当然我们配置的 Ingress 中会强制跳转到 https,所以如果你的浏览器有什么安全限制的话,需要信任我们这里 Ingress 对应的证书,证书文件可以通过查看 Secret 资源对象获取:
![Harbor Portal](https://ws2.sinaimg.cn/large/006tKfTcgy1g0f8ojkpikj31dy0u0wi4.jpg)
![Harbor Portal](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/xg1GWO.jpg)
然后输入用户名:admin,密码:Harbor12345(当然我们也可以通过 Helm 安装的时候自己覆盖 harborAdminPassword)即可登录进入 Portal 首页:
![Harbor Portal Home](https://ws2.sinaimg.cn/large/006tKfTcgy1g0f8qo55p0j31d80u0q7t.jpg)
![Harbor Portal Home](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/MA7tef.jpg)
我们可以看到有很多功能,默认情况下会有一个名叫`library`的项目,改项目默认是公开访问权限的,进入项目可以看到里面还有 Helm Chart 包的管理,可以手动在这里上传,也可以对改项目里面的镜像进行一些配置,比如是否开启自动扫描镜像功能:
![Harbor project settings](https://ws1.sinaimg.cn/large/006tKfTcgy1g0f98e41i1j31230u0777.jpg)
![Harbor project settings](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/XieDpz.jpg)
### docker cli
......@@ -690,7 +690,7 @@ latest: digest: sha256:4415a904b1aca178c2450fd54928ab362825e863c0ad5452fd020e92f
推送完成后,我们同样可以在 Portal 页面上看到这个镜像的信息:
![Harbor image info](https://ws1.sinaimg.cn/large/006tKfTcgy1g0f9woj4otj318q0u0n1o.jpg)
![Harbor image info](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/rGY1hl.jpg)
镜像 push 成功,同样可以测试下 pull:
......
......@@ -287,17 +287,17 @@ redis-8446f57bdf-4v62p 1/1 Running 0 17
可以看到都已经部署成功了,然后我们可以通过 Ingress 中定义的域名`git.qikqiak.com`(需要做 DNS 解析或者在本地 /etc/hosts 中添加映射)来访问 Portal:
![gitlab portal](https://ws1.sinaimg.cn/large/006tKfTcgy1g0u81axrwlj318y0u0wj0.jpg)
![gitlab portal](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/Fxx65D.jpg)
使用用户名 root,和部署的时候指定的超级用户密码`GITLAB_ROOT_PASSWORD=admin321`即可登录进入到首页:
![gitlab homepage](https://ws3.sinaimg.cn/large/006tKfTcgy1g0u85rzqbfj311g0u0jx1.jpg)
![gitlab homepage](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/WhSLdg.jpg)
Gitlab 运行后,我们可以注册为新用户并创建一个项目,还可以做很多的其他系统设置,比如设置语言、设置应用风格样式等等。
点击`Create a project`创建一个新的项目,和之前 Github 使用上没有多大的差别:
![create gitlab project](https://ws1.sinaimg.cn/large/006tKfTcgy1g0u8gpdwqoj31h90u0483.jpg)
![create gitlab project](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/VfnfrO.jpg)
创建完成后,我们可以添加本地用户的一个`SSH-KEY`,这样我们就可以通过 SSH 来拉取或者推送代码了。SSH 公钥通常包含在`~/.ssh/id_rsa.pub` 文件中,并以`ssh-rsa`开头。如果没有的话可以使用`ssh-keygen`命令来生成,`id_rsa.pub`里面的内容就是我们需要的 SSH 公钥,然后添加到 Gitlab 中。
......@@ -326,7 +326,7 @@ spec:
注意上面 ssh 对应的 nodePort 端口设置为 30022,这样就不会随机生成了,重新更新下 Deployment 和 Service,更新完成后,现在我们在项目上面 Clone 的时候使用 ssh 就会带上端口号了:
![gitlab ssh](https://ws4.sinaimg.cn/large/006tKfTcgy1g0uecaybqfj31kg0kin17.jpg)
![gitlab ssh](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/3978ZL.jpg)
现在就可以使用`Clone with SSH`的地址了,由于上面我们配置了 SSH 公钥,所以就可以直接访问上面的仓库了:
```shell
......@@ -354,7 +354,7 @@ To ssh://git@git.qikqiak.com:30022/root/gitlab-demo.git
然后刷新浏览器,就可以看到刚刚创建的 Git 仓库中多了一个 README.md 的文件:
![git commit](https://ws4.sinaimg.cn/large/006tKfTcgy1g0uekpjdcfj31b10u0af1.jpg)
![git commit](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/7AiUUZ.jpg)
到这里就表明我们的 Gitlab 就成功部署到了 Kubernetes 集群当中了。
......
......@@ -81,7 +81,7 @@ To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
前面的章节中我们已经成功安装了 Gitlab,在浏览器中打开`git.qikqiak.com`页面,然后登录后进入到管理页面`http://git.qikqiak.com/admin`,然后点击导航栏中的`Runner`,可以看到该页面中有两个总要的参数,一个是 URL,另外一个就是 Register Token,下面的步骤中需要用到这两个参数值。
![gitlab runner](https://ws3.sinaimg.cn/large/006tKfTcgy1g188bykw2ij31lu0he0xf.jpg)
![gitlab runner](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/zQbFp1.jpg)
> 注意:不要随便泄露 Token
......@@ -311,7 +311,7 @@ gitlab-ci-runner-1 1/1 Running 0 3m
可以看到已经成功运行了两个(具体取决于`StatefulSet`清单中的副本数) Runner 实例,然后切换到 Gitlab Admin 页面下面的 Runner 页面:
![gitlab runner list](https://ws2.sinaimg.cn/large/006tKfTcgy1g189zhnqzbj31lc0u07bd.jpg)
![gitlab runner list](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/QgxSq3.jpg)
当然我们也可以根据需要更改 Runner 的一些配置,比如添加 tag 标签等。
......@@ -331,7 +331,7 @@ $ git push -u origin master
```
当我们把仓库推送到 Gitlab 以后,应该可以看到 Gitlab CI 开始执行构建任务了:
![gitlab ci](https://ws2.sinaimg.cn/large/006tKfTcgy1g1929udcvuj31mg0owq5b.jpg)
![gitlab ci](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/iN2HFV.jpg)
此时 Runner Pod 所在的 namespace 下面也会出现两个新的 Pod:
```shell
......@@ -347,7 +347,7 @@ runner-9rixsyft-project-2-concurrent-1t74t9 0/2 ContainerCreating 0
这两个新的 Pod 就是用来执行具体的 Job 任务的,这里同时出现两个证明第一步是并行执行的两个任务,从上面的 Pipeline 中也可以看到是 test 和 test2 这两个 Job。我们可以看到在执行 image_build 任务的时候出现了错误:
![pipeline](https://ws2.sinaimg.cn/large/006tKfTcgy1g19369pzotj31m20emwg4.jpg)
![pipeline](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/iveZ6o.jpg)
我们可以点击查看这个 Job 失败详细信息:
```shell
......@@ -361,7 +361,7 @@ ERROR: Job failed: command terminated with exit code 1
定位到项目 -> 设置 -> CI/CD,展开`Environment variables`栏目,配置镜像仓库相关的参数值:
![gitlab ci env](https://ws1.sinaimg.cn/large/006tKfTcgy1g19duem1bdj31jc0m6jvl.jpg)
![gitlab ci env](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/ErhBLn.jpg)
配置上后,我们在上面失败的 Job 任务上点击“重试”,在重试过后依然可以看到会出现下面的错误信息:
......@@ -473,7 +473,7 @@ xxxxxxtoken值xxxx
填写上面对应的值添加集群:
![add k8s cluster](https://ws1.sinaimg.cn/large/006tKfTcgy1g1a6lrep5yj31160u0af9.jpg)
![add k8s cluster](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/wwr2FR.jpg)
......@@ -779,21 +779,21 @@ $ git push origin master
现在回到 Gitlab 中可以看到我们的项目触发了一个新的 Pipeline 的构建:
![gitlab pipeline](https://ws4.sinaimg.cn/large/006tKfTcgy1g1ag8co9r3j31m80rewhh.jpg)
![gitlab pipeline](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/D54xTd.jpg)
可以查看最后一个阶段(stage)是否正确,如果通过了,证明我们已经成功将应用程序部署到 Kubernetes 集群中了,一个成功的`review`阶段如下所示:
![review success](https://ws3.sinaimg.cn/large/006tKfTcgy1g1ahimbwmwj315z0u0n6w.jpg)
![review success](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/kXE6e7.jpg)
整个 Pipeline 构建成功后,我们可以在项目的环境菜单下面看到多了一个环境:
![env](https://ws1.sinaimg.cn/large/006tKfTcgy1g1ahkx8gwuj31vm0fatap.jpg)
![env](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/pArnyz.jpg)
如果我们点击`终止`,就会调用`.gitlab-ci.yml`中定义的钩子`on_stop: stop_review`,点击`View deployment`就可以看到这次我们的部署结果(前提是DNS解析已经完成):
![view deployment](https://ws3.sinaimg.cn/large/006tKfTcgy1g1ahq5v4qfj313i0hgtbl.jpg)
![view deployment](https://bxdc-static.oss-cn-beijing.aliyuncs.com/images/Q2yPG9.jpg)
这就是关于 Gitlab CI 结合 Kubernetes 进行 CI/CD 的过程,具体详细的构建任务还需要结合我们自己的应用实际情况而定。下节课给大家介绍使用 Jenkins + Gitlab + Harbor + Helm + Kubernetes 来实现一个完整的 CI/CD 流水线作业。
此差异已折叠。
gitlab-ci-k8s-demo @ 62ec25b6
Subproject commit 62ec25b629f8a7c174c40916c38293694bcf6e5d
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册