04 | Kubernetes | Kubernetes实战

04 | Kubernetes | Kubernetes实战

项目迁移流程

1、制作镜像:dockerfile、docker+jenkins持续集成
镜像分类:基础镜像,中间件镜像,项目镜像

2、控制器管理Pod:deployment(无状态)、deamonset(守护进程)、
statsfulset(有状态应用),job&cronjob(批处理)


3、Pod数据持久化:

4、service

5、对外发布应用:service nodeport,Ingress
LB -> ingress controller -> pod

制作镜像

控制器管理Pod

Deployment:无状态部署,例如Web,微服务,API 
StatefulSet:有状态部署,例如数据库,ZK,ETCD 
DaemonSet:守护进程部署,例如监控Agent、日志Agent
Job & CronJob:批处理,例如数据库备份,邮件通知

Pod数据持久化

容器部署过程中一般有以下三种数据: 
启动时需要的初始数据,可以是配置文件
启动过程中产生的临时数据,该临时数据需要多个容器间共享
启动过程中产生的业务数据

暴露应用

使用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监控

Prometheus架构 
K8S监控指标及实现思路 
在K8S平台部署Prometheus 
基于K8S服务发现的配置解析 
在K8S平台部署Grafana 
监控K8S集群中Pod、Node、资源对象 
使用Grafana可视化展示Prometheus监控数据 
告警利器Alertmanager
为什么要监控?
1、对系统不间断的实时监控
2、实时反馈系统当前状态
3、历史数据追溯

保证业务持续性运行。

你用过什么开源的监控系统?
nagios
catic
ganglia
--
zabbix
open-falcon
prometheus

Prometheus由来

Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。
自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。
为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会 (CNCF),
成为继Kubernetes之后的第二个托管项目。
https://prometheus.io 
https://github.com/prometheus 

Prometheus架构04 | Kubernetes | Kubernetes实战_第1张图片

PrometheusServer:收集指标和存储时间序列数据,并提供查询接口 
ClientLibrary:客户端库 
Push Gateway:短期存储指标数据。主要用于临时性的任务 
Exporters:采集已有的第三方服务监控指标并暴露metrics 
Alertmanager:告警 
Web UI:简单的Web控制台

Prometheus数据模型

Prometheus将所有数据存储为时间序列;具有相同度量名称以及标签属于同一个指标。 
每个时间序列都由度量标准名称和一组键值对(也成为标签)唯一标识。 

时间序列格式: 
<metric name>{<label name>=<label value>, ...} 
示例:api_http_requests_total{method="POST", handler="/messages"}
时序数据库:
influxdb
实例:可以抓取的目标称为实例(Instances) 
作业:具有相同目标的实例集合称为作业(Job)

kubernetes监控指标

在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

kubernetes中部署Prometheus+Grafana

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)

kubernetes中部署Alertmanager

部署Alertmanager 
配置Prometheus与Alertmanager通信 
配置告警 


prometheus指定rules目录 
configmap存储告警规则 
configmap挂载到容器rules目录 
增加alertmanager告警配置
Inactive:这里什么都没有发生
Pending:已触发阈值,但未满足告警持续时间 
Firing:已触发阈值且满足告警持续时间,警报发送给接受者
分组(group):将类似性质的警报分类为单个通知 
抑制(Inhibition):当警报发出后,停止重复发送由此警报引发的其他警报 静默(Silences):是一种简单的特定时间静音提醒的机制

04 | Kubernetes | Kubernetes实战_第2张图片

curl -XPOST http://10.244.1.14:9090/-/reload
1、采集时间
2、分组时间
3for: 1m

钉钉 webhook
企业微信 webhook

多个组,收件人

https://prometheus.io/docs/alerting/configuration/

ELK Stack日志收集

K8S系统的组件日志 
K8S Cluster里面部署的应用程序日志 
标准输出 
日志文件
ELK由于Elasticsearch Logstash Kibana Filebeat

04 | Kubernetes | Kubernetes实战_第3张图片

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,项目)

基于Kubernetes构建企业Jenkins CI/CD平台

蓝绿发布
灰度发布
滚动发布 

蓝绿发布

项目逻辑上分为AB组,在项目升级时,首先把A组从负 载均衡中摘除,进行新版本的部署。B组仍然继续提供 服务。
A组升级完成上线,B组从负载均衡中摘除。 
特点: 
•   策略简单 
•   升级/回滚速度快 
•   用户无感知,平滑过渡 
缺点: 
•   需要两倍以上服务器资源 
•   短时间内浪费一定资源成本

灰度发布

灰度发布:只升级部分服务,即让一部分用户继续用 老版本,一部分用户开始用新版本,
如果用户对新版 本没有什么意见,那么逐步扩大范围,把所有用户都 迁移到新版本上面来。 
特点: 
•   保证整体系统稳定性 
•   用户无感知,平滑过渡 
缺点: 
•   自动化要求高

滚动发布

滚动发布:每次只升级一个或多个服务,升级完成 后加入生产环境,
不断执行这个过程,直到集群中 的全部旧版升级新版本。 
特点: 
•   用户无感知,平滑过渡 
缺点: 
•   部署周期长 
•   发布策略较复杂 
•   不易回滚

发布流程设计

项目文档:
1、项目背景
2、业务现状
3、项目实施(测试环境,迁移到线上)
4、应急预案

04 | Kubernetes | Kubernetes实战_第4张图片
04 | Kubernetes | Kubernetes实战_第5张图片

Kubernetes插件:Jenkins在Kubernetes集群中运行动态代理 
插件介绍:https://github.com/jenkinsci/kubernetes-plugin 
❖使用Jenkins的插件 
Git 
Kubernetes 
Pipeline 
Kubernetes Continuous Deploy 

❖CI/CD环境特点 
Slave弹性伸缩 
基于镜像隔离构建环境 
流水线发布,易维护 

❖Jenkins参数化构建可帮助你完成更复杂环境CI/CD 

你可能感兴趣的:(容器,kubernetes)