1、制作镜像:dockerfile、docker+jenkins持续集成
镜像分类:基础镜像,中间件镜像,项目镜像
2、控制器管理Pod:deployment(无状态)、deamonset(守护进程)、
statsfulset(有状态应用),job&cronjob(批处理)
3、Pod数据持久化:
4、service
5、对外发布应用:service nodeport,Ingress
LB -> ingress controller -> pod
Deployment:无状态部署,例如Web,微服务,API
StatefulSet:有状态部署,例如数据库,ZK,ETCD
DaemonSet:守护进程部署,例如监控Agent、日志Agent
Job & CronJob:批处理,例如数据库备份,邮件通知
容器部署过程中一般有以下三种数据:
启动时需要的初始数据,可以是配置文件
启动过程中产生的临时数据,该临时数据需要多个容器间共享
启动过程中产生的业务数据
使用Service ClusterIP类型暴露集群内部应用访问。
Service定义了Pod的逻辑集合和访问这个集合的策略
Service引入为了解决Pod的动态变化,提供服务发现和负载均衡
使用CoreDNS解析Service名称
使用Ingress对外暴露你的应用。
通过Service关联Pod
基于域名访问
通过Ingress Controller实现Pod的负载均衡 - 支持TCP/UDP 4层和HTTP 7层(Nginx)
yum -y install git
git clone http://10.19.151.240:9999/root/java-demo.git
Username:
Password:
ls
cd java-demo
1.安装编译环境
yum -y install java-1.8.0-openjdk maven
2.编译构建
mvn clean package -DskipTests=true
3.替换maven国内源
/etc/maven/settings.xml
<mirror>
<id>central</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repospublic</url>
</mirror>
4、使用Dockerfile构建镜像并推送到镜像仓库
docker build -t 10.19.151.240/dev/java-demo:v10 .
docker login 10.19.151.240
docker push 10.19.151.240/dev/java-demo:v10
5、创建secret保存harbor认证信息
kubectl create secret docker-registry dockerpullauth --docker-username=admin --docker-password=Harbor12345 --docker-server=10.19.151.240
kubectl delete secert dockerpullauth
6、编写yaml部署(deployment、service、ingress)
kubectl create deployment java-demo --image=10.19.151.240/dev/java-demo:v10 --dry-run -o yaml > deployment.yaml
kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml > service.yaml
kubectl apply -f ingress-controller.yaml
kubectl get pods -n ingress-nginx
7、创建数据库
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
mysql -uroot -p$MYSQL_ROOT_PASSWORD
mysql> grant all on test.* to wp@'%' identified by '123456';
telnet 10.19.151.240 3306
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: java-demo
name: java-demo
spec:
replicas: 3
selector:
matchLabels:
app: java-demo
strategy: {}
template:
metadata:
labels:
app: java-demo
spec:
imagePullSecerts:
- name: dockerpullauth
containers:
- image: 10.19.151.240/dev/java-demo:v10
name: java-demo
esources: {}
vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
spec:
rules:
- host: example.ctnrs.com
http:
paths:
- path: /
backend:
serviceName: java-demo
servicePort:80
kubectl apply -f ingress.yaml
example.ctnrs.com
Prometheus架构
K8S监控指标及实现思路
在K8S平台部署Prometheus
基于K8S服务发现的配置解析
在K8S平台部署Grafana
监控K8S集群中Pod、Node、资源对象
使用Grafana可视化展示Prometheus监控数据
告警利器Alertmanager
为什么要监控?
1、对系统不间断的实时监控
2、实时反馈系统当前状态
3、历史数据追溯
保证业务持续性运行。
你用过什么开源的监控系统?
nagios
catic
ganglia
--
zabbix
open-falcon
prometheus
Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。
自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。
为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会 (CNCF),
成为继Kubernetes之后的第二个托管项目。
https://prometheus.io
https://github.com/prometheus
PrometheusServer:收集指标和存储时间序列数据,并提供查询接口
ClientLibrary:客户端库
Push Gateway:短期存储指标数据。主要用于临时性的任务
Exporters:采集已有的第三方服务监控指标并暴露metrics
Alertmanager:告警
Web UI:简单的Web控制台
Prometheus将所有数据存储为时间序列;具有相同度量名称以及标签属于同一个指标。
每个时间序列都由度量标准名称和一组键值对(也成为标签)唯一标识。
时间序列格式:
<metric name>{<label name>=<label value>, ...}
示例:api_http_requests_total{method="POST", handler="/messages"}
时序数据库:
influxdb
实例:可以抓取的目标称为实例(Instances)
作业:具有相同目标的实例集合称为作业(Job)
在K8s中我们应监控哪些指标?
1、Node节点资源利用率(硬件,系统)
2、Pod级监控(系统,应用)
3、K8s资源监控(应用)
4、业务层面监控
硬件、系统、应用、API监控、业务监控、流量分析
Kubernetes本身监控
Node资源利用率
Node数量
Pods数量(Node)
资源对象状态
Pod监控
Pod数量(项目)
Pod状态
容器资源利用率
应用程序
APM:应用系统分析
Nginx <- expoter -> prometheus、Tomcat(agent)
监控指标 | 实现 | 内容 |
---|---|---|
Pod性能 | cAdvisor | 容器CPU,内存利用率 |
Node性能 | node-exporter | 节点CPU,内存利用率 |
K8S资源对象 | kube-state-metrics | Pod/Deployment/Service |
ls prometheus-* | xargs -i kubectl apply -f {}
https://grafana.com/grafana/download
https://grafana.com/grafana/dashboards
服务发现怎么配置?
grafana是怎么展示的?
图表没数据?
1、时间没有同步
2、数据库没有数据
3、PromQL写的有问题
relabel_configs租用?
1、重新命名标签(action: replace)
2、只保留指定的标签或者删除指定的标签(action: keep/drop)
部署Alertmanager
配置Prometheus与Alertmanager通信
配置告警
prometheus指定rules目录
configmap存储告警规则
configmap挂载到容器rules目录
增加alertmanager告警配置
Inactive:这里什么都没有发生
Pending:已触发阈值,但未满足告警持续时间
Firing:已触发阈值且满足告警持续时间,警报发送给接受者
分组(group):将类似性质的警报分类为单个通知
抑制(Inhibition):当警报发出后,停止重复发送由此警报引发的其他警报 静默(Silences):是一种简单的特定时间静音提醒的机制
curl -XPOST http://10.244.1.14:9090/-/reload
1、采集时间
2、分组时间
3、for: 1m
钉钉 webhook
企业微信 webhook
多个组,收件人
https://prometheus.io/docs/alerting/configuration/
K8S系统的组件日志
K8S Cluster里面部署的应用程序日志
标准输出
日志文件
ELK由于Elasticsearch Logstash Kibana Filebeat
docker run -d nginx
docker ps -l
docker inspect jovial_beaver
curl 172.17.0.2
docker logs jovial_beaver
curl 172.17.0.2
docker exec -it jovial_beaver bash
cd /var/log/nginx/
ls -l
docker run -d tomcat
docker ps -l
docker logs loving_bardeen
docker exec -it loving_bardeen bash
cd logs/
ls
cd /var/lib/docker/containers/
ll
cd 4729547795b046f37d12261e1f4d5e17bc5d148898df6f999a11d77710f0fede/
cat 4729547795b046f37d12261e1f4d5e17bc5d148898df6f999a11d77710f0fede-json.log
docker info
fluned
syslog
graylog
es
方案1:DaemonSet部署日志采集器
标准输出:
/var/lib/docker/containers/*/*-json.log
日志文件:
方式1:/var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/
方式2:开发根据容器名命名日志文件,并且部署时统一挂载到宿主机日志目录
方案2:sidecar部署一个专用日志采集容器
日志文件:通过emptydir共享日志目录,手动配置日志源
阿里云开源日志采集工具:log-pilot
kubectl create deployment web --image=nginx
kubectl get pods -o wide
docker ps
cd /var/lib/kubelet/pods/f7df53f2-3d59-4e55-a8af-d72f3884cbc7
ls volumes/kubernetes.io~secret/default-token-vm65n/
kubectl create deployment tomcat --image=nginx --dry-run=client -o yaml > tomcat.yaml
vim tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tomcat
name: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
strategy: {}
template:
metadata:
labels:
app: tomcat
spec:
containers:
- image: tomcat
name: tomcat
resources: {}
volumeMounts:
- name: logs
mountPath: /usr/local/tomcat/logs
volumes:
- name: logs
emptyDir:
kubectl apply -f tomcat.yaml
kubectl get pods -o wide
docker ps
cd /var/lib/kubelet/pods/efced8b9-2cbd-4bd6-86b6-6624b38bf019
cd /var/lib/kubelet/pods/efced8b9-2cbd-4bd6-86b6-6624b38bf019/volumes/kubernetes.io~empty-dir/logs
kubectl patch pv pvc-4163c9d4-44cb-4c50-aa20-412f388d989e -p '{"metadata":{"finalizers":null}}'
传统配置日志采集工具重要设置什么?
1、日志路径
2、写正则,格式化日志
3、日志源(Pod、命名空间,service,项目)
蓝绿发布
灰度发布
滚动发布
项目逻辑上分为AB组,在项目升级时,首先把A组从负 载均衡中摘除,进行新版本的部署。B组仍然继续提供 服务。
A组升级完成上线,B组从负载均衡中摘除。
特点:
• 策略简单
• 升级/回滚速度快
• 用户无感知,平滑过渡
缺点:
• 需要两倍以上服务器资源
• 短时间内浪费一定资源成本
灰度发布:只升级部分服务,即让一部分用户继续用 老版本,一部分用户开始用新版本,
如果用户对新版 本没有什么意见,那么逐步扩大范围,把所有用户都 迁移到新版本上面来。
特点:
• 保证整体系统稳定性
• 用户无感知,平滑过渡
缺点:
• 自动化要求高
滚动发布:每次只升级一个或多个服务,升级完成 后加入生产环境,
不断执行这个过程,直到集群中 的全部旧版升级新版本。
特点:
• 用户无感知,平滑过渡
缺点:
• 部署周期长
• 发布策略较复杂
• 不易回滚
项目文档:
1、项目背景
2、业务现状
3、项目实施(测试环境,迁移到线上)
4、应急预案
Kubernetes插件:Jenkins在Kubernetes集群中运行动态代理
插件介绍:https://github.com/jenkinsci/kubernetes-plugin
❖使用Jenkins的插件
Git
Kubernetes
Pipeline
Kubernetes Continuous Deploy
❖CI/CD环境特点
Slave弹性伸缩
基于镜像隔离构建环境
流水线发布,易维护
❖Jenkins参数化构建可帮助你完成更复杂环境CI/CD