k8s企业级DevOps实践-k8s的持久化存储
Volume在K8s上,Pod的生命周期可能是很短,它们会被频繁地销毁和创建,自然在容器销毁时,里面运行时新增的数据,如修改的配置及日志文件等也会被清除。解决这一问题时可以用K8s volume来持久化保存容器的数据,Volume的生命周期独立于容器,Pod中的容器可能被销毁重建,但Volume会被保留。
本质上,K8s volume是一个目录,这点和Docker volume差不多,当Volume被mount到Pod上,这个Pod中的所有容器都可以访问这个volume,在生产场景中,我们常用的类型有这几种:
emptyDir
hostPath
PersistentVolume(PV) & PersistentVolumeClaim(PVC)
StorageClass
emptyDiremptyDir是最基础的Volume类型,pod内的容器发生重启不会造成emptyDir里面数据的丢失,但是当pod被重启后,emptyDir数据会丢失,也就是说emptyDir与pod的生命周期是一致的,这个使用场景实际上是在生产环境某些时候,它的最实际实用是提供Pod内多容器的volum ...
k8s企业级DevOps实践-Kubernetes中DaemonSet启动日志收集
下载filebeat12wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.0-linux-x86_64.tar.gztar -xf filebeat-7.4.0-linux-x86_64.tar.gz
制作filebeat镜像12345678910cat filebeat-7.4.0-linux-x86_64/dockerfileFROM registry.cn-shanghai.aliyuncs.com/wikifx/base:alpine-glibc-ShanghaiWORKDIR /appCOPY . .RUN chmod +x filebeatENTRYPOINT ["/app/filebeat", "-e", "-path.home", "./", "-path.data", "./data"]
编排文件编写12345678910111213141516171 ...
k8s企业级DevOps实践-k8s调度策略:NodeSelector/nodeAffinity/污点与容忍
为何要控制Pod应该如何调度
集群中有些机器的配置高(SSD,更好的内存等),我们希望核心的服务(比如说数据库)运行在上面
某两个服务的网络传输很频繁,我们希望它们最好在同一台机器上
……
NodeSelector调度 label是kubernetes中一个非常重要的概念,用户可以非常灵活的利用 label 来管理集群中的资源,POD 的调度可以根据节点的 label 进行特定的部署。
查看节点的label:
1$ kubectl get nodes --show-labels
为节点打label:
1$ kubectl label node k8s-master disktype=ssd
当 node 被打上了相关标签后,在调度的时候就可以使用这些标签了,只需要在spec 字段中添加nodeSelector字段,里面是我们需要被调度的节点的 label。
12345678910111213...spec: hostNetwork: true # 声明pod的网络模式为host模式,效果通docker run --net=host volumes: - name: ...
k8s企业级DevOps实践-workload(工作负载)、副本保障机制、Pod驱逐策略、服务的滚动更新和回滚
只使用Pod, 将会面临如下需求:
业务应用如何启动多个副本
Pod重建后IP会变化,外部如何访问Pod服务
运行业务Pod的某个节点挂了,如何自动帮我把Pod转移到集群中的可用节点启动起来
我的业务应用功能是收集节点监控数据,需要把Pod运行在k8s集群的各个节点上
Workload (工作负载)控制器又称工作负载是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。
ReplicaSet: 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能
Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置
DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
Job:只要完成就立即退出,不需要重启或重建
Cronjob:周期性任务控制,不需要持续后台运行
StatefulSet:管理有状态应用
De ...
k8s企业级DevOps实践-Pod管理、健康检查、ConfigMap和Secret的定义与容器编排
核心组件静态Pod的方式:
123456789101112131415161718192021222324## etcd、apiserver、controller-manager、kube-scheduler[root@k8s-master ~]# kubectl -n kube-system get poNAME READY STATUS RESTARTS AGEcoredns-58cc8c89f4-gnmdb 1/1 Running 2 22hcoredns-58cc8c89f4-r9hlv 1/1 Running 2 22hetcd-k8s-master 1/1 Running 3 22hkube-apiserver-k8s-master 1/1 Running 3 22hk ...
k8s企业级DevOps实践-Kubernetes架构、Kubernetes集群安装(两种方式)
Kubernetes架构引言学习kubernetes的架构及工作流程,使用Deployment管理Pod生命周期,实现服务不中断的滚动更新,通过服务发现来实现集群内部的服务间访问,并通过ingress-nginx实现外部使用域名访问集群内部的服务。
目标让Django demo项目可以运行在k8s集群中,可以使用域名进行服务的访问。
理解架构及核心组件
使用kubeadm快速搭建集群
运行第一个Pod应用
Pod进阶
Pod控制器的使用
实现服务与Node绑定的几种方式
负载均衡与服务发现
使用Ingress实现集群服务的7层代理
Django项目k8s落地实践:网页链接
基于ELK实现kubernetes集群的日志平台可参考:网页链接
集群认证与授权
纯容器模式的问题
业务容器数量庞大,哪些容器部署在哪些节点,使用了哪些端口,如何记录、管理,需要登录到每台机器去管理?
跨主机通信,多个机器中的容器之间相互调用如何做,iptables规则手动维护?
跨主机容器间互相调用,配置如何写?写死固定IP+端口?
如何实现业务高可用?多个容器对外提供服务如何实现负载均衡?
容器的业务中断了, ...
Nginx负载调度策略和一致性hash算法
Nginx的负载均衡算法静态调度算法(和节点无关的调度算法)
rr轮询(默认的调度算法) 平均轮询
wrr权重轮询(通过此参数进行权重调度#weight=number;) 能者多劳
ip_hash(人话:同一个ip的客户分配到同一台rs上,且不支持backup参数,和weight参数。) 当一个请求到达时,先将客户端IP通过哈希算法哈希出一个值,在随后的客户端请求中,客户端IP的哈希值只要相同,就会分配至同一台服务器,该调度算法可以解决动态网页的session共享问题。(会话保持) LVS负载均衡中的-p参数、keepalive配置里的persistence_ timeout 50参数都类似这个nginx里的ip_hash参数,其功能均为解决动态网页的session共享问题。
会话保持比较流行的解决方案: 1. 弃用此方案,将用户会话存储在后端共享缓存的redis中。供所有前端web服务器从指定的redis缓存服务器中找到共享的会话。 2. cookies技术,服务器根据客户端的请求信息生成cookie并发送给客户端。当客户端请求到第二台节点上时,服务器通过 ...
ELK-Logstash 按周创建Elasticsearch索引
按月创建的Elasticsearch索引名称,还没到月底,日志单索引9千多万行,es顶不住了。
1index => "nginx-%{beat[hostname]}-access-%{+YYYY.MM}"
于是决定按周创建Elasticsearch索引。
123mutate { update => {"[@metadata][target_index]" => "k8s_access-%{+YYYY.MM}-%{+YYYY.ww}"}}
结果如下 %{+YYYY.ww} 即 2021.35 ,第35周
ELK-Logstah 定义管道解析Nginx日志传递至Elasticsearch
通过filebeat读取日志后传送至logstash进行处理,处理完成再保存在elasticsearch中。其中最重要的一步就是logstash的处理,我们需要根据日志的格式编写相关的匹配代码,以便logstash进行匹配处理。
在这里我使用过滤插件中的Grok插件,具体技术文档请点击以下链接:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
在编写grok捕获规则时,可以使用以下网站进行辅助:https://grokdebug.herokuapp.com/
相关的语法可以参考以下GitHub页面:https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
Logstash Reference [7.12] » Filter pluginshttps://www.elastic.co/guide/en/logstash/current/filter-plugins.html
nginx日志分析1' ...
k8s企业级DevOps实践-虚拟化介绍和Docker原理深入
虚拟化核心需要解决的问题:资源隔离与资源限制
虚拟机硬件虚拟化技术, 通过一个 hypervisor 层实现对资源的彻底隔离。
容器则是操作系统级别的虚拟化,利用的是内核的 Cgroup 和 Namespace 特性,此功能完全通过软件实现。
Namespace 资源隔离命名空间是全局资源的一种抽象,将资源放到不同的命名空间中,各个命名空间中的资源是相互隔离的。 通俗来讲,就是docker在启动一个容器的时候,会调用Linux Kernel Namespace的接口,来创建一块虚拟空间,创建的时候,可以支持设置下面这几种(可以随意选择),docker默认都设置。
pid:用于进程隔离(PID:进程ID)
net:管理网络接口(NET:网络)
ipc:管理对 IPC 资源的访问(IPC:进程间通信(信号量、消息队列和共享内存))
mnt:管理文件系统挂载点(MNT:挂载)
uts:隔离主机名和域名
user:隔离用户和用户组(3.8以后的内核才支持)
12345678910111213141516171819202122func setNamespaces(daemon *Dae ...