常用工具:docker linux k8s kubeadm
概念
etcd 数据库 类似redis
api server 接口对外提供api 调用 可以命令 kubectl 或者 kube-proxy,能访问etcd,事件总线
scheduler 调度决策的组件 掌握新的情况,进行决策及分布pod放在哪些node
controller 定时监控 保证实际和预期一样
work节点
kubelet 资源管理者 在api server上
container runtime 来管理容器 启动 关闭容器 收集容器信息 拉镜像
kube-proxy 管理service的组件 kube-dns 来进行解析域名
K8S对象
1、pod
pod是最小部署单元,一个pod有一个或多个容器组成,pod中容器共享存储和网络,在同一台docker主机上运行
2、service
service一个应用服务抽象,定义了pod逻辑集合和访问这个pod集合的策略 3
service代理pod集合对外表现是为一个访问入口,分配一个集群ip地址,来自这个ip的请求将负载均衡转发后端pod中的容器
service通过Lable Selector选择一组Pod提供服务。
type里有LoadBalancer ,正常选nodeport,因为loadbalancer是云服务 还有Pod内部ClusterIP
端口:
port:本身端口
targetPort:后台的端口
nodePort是在本机物理暴露端口 利用labels进行选择Service内部域名转发 30000~32767之间
3、Volume
数据卷,共享pod中容器使用的数据
4、Namespace
命名空间将对象逻辑上分配到不同Nameapace,可以是不通的项目、用户等区分管理,并设定控制策略,从而实现多租户
命名空间也称为虚拟集群
5、Lable
标签用于区分对象(比如pod,service),键值对存在,每个对象可以有多个标签,通过标签关联对象。
6、ReplicaSet
下一代Replication Controller。功能就是:确保任何给定时间指定的pod副本数量,副本少了,它会创建,并提供声明式更新等功能
RC与RS唯一区别就是lable selector支持不同,RS支持新的基于集合的标签、RC仅支持基于等式的标签 (RC即将被替代)
7、Deployment
Deployment是一个等高层次的API对象,他管理ReplicaSet和pod,并提供声明式更新等功能
官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作ReplicaSet对象
8、StatefulSet(满足有状态服务的部署)
StatefulSet适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新
9、DaemonSet
DaemonSet确保所有(或一些)节点运行同一个pod。当节点加入k8s集群中,pod会被调度到改节点上运行,当节点从集群中移除时,DaemonSet的pod会被删除,删除DaemonSet会清理它所有创建的pod
daemonset 一个节点只有一个
典型应用场景:
每个节点运行日志收集服务
每个节点运行监控服务
每个中运行网络插件、存储插件
10、job
一次性任务,运行完成后pod销毁,不再重新启动新容器。还可以任务定时运行
运行一次性容器
容器按照持续运行的时间可分为两类:
服务类容器
服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等。
工作类容器
工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。
Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服务类容器;对于工作类容器,我们用 Job。
11、configMap
ConfigMap使用场景:
通过环境变量的方式,直接传递给pod
通过在pod的命令行下运行的方式(启动命令中)
作为volume的方式挂载到pod内
12、Secret
一般情况下ConfigMap 是用来存储一些非安全的配置信息,因为ConfigMap是明文存储的,面对敏感信息时,我们就需要使用k8s的另一个对象Secret
13、ClusterIP 内部反向代理
在service下nodeport是服务器物理node对外暴露 内部pod之间相互访问就得用ClusterIP
存储卷 抽象 Volume :
解决挂载物理硬盘
挂在宿主机硬盘 默认是用hostPath
-存储解耦PVC 和PV:
解决修改挂载物理硬盘必须发布的问题 动态迁移公有云
persistentvolumeClaim(PVC)持久卷申请
persistentvolume(PV) 持久卷
静态绑定 Pod->Volume-> PVC->PV->物理存储器
动态绑定 Pod->Volume-> PVC->StorageClass->Storage Provisioner->物理存储器
-资源请求 和限额Request/Limit:
CPU Memory 可以用Request来申请大小,用Limit来限制大小
-Java K8S内存配置:
Metrics Server 组件 可以下载后启动 它会定期抓取metrics HPA也要根据这个自动伸缩 ,替代品
prometheus 普罗米修斯
kubectl top po 或 kubectl top no 来看内存使用情况
内存:
heap memory 堆-> 放对象 垃圾回收这个
non-heap 类 非堆->类 元数据
other 对象:jvm本身结构
堆_> 最小 最大 最大堆使用量 超过就OOM 初始逐渐向Max
allocated 分free used
进入容器内
java --XX:+PrintFlagsFinal -version | grep "UseContainerSupport | InitialRAMPercentage | MaxRAMPercentage | MinRAMPercentage"
UseContainerSupport=true时候 是支持容器的比如openjdk 1.8.0_212
如果K8S参数不设置 Limit内存 ,最大内存值就是 就用所有物理内存乘以 MaxRAMPercentage,比如 MaxRAMPercentage是25%,物理内存4G,最大内存就是1G
MaxRAMPercentage=80.0 就是80%
DockerFile 里java -jar 后面的启动参数可以从K8S传参进去ENTRYPOINT exec java $JAVA_OPTS -jar /usr/shar/app.jar
然后在yml文件下设置
resources:
request
limit:1000m
env:
- name:JAVA_OPTS
value:" -XX: MaxRAMPercentage=80.0"
结果最大就是800m
-探针:
http方式都是向容器内发送请求来判断
就绪探针 readiness probe /status 是否启动后就绪 如果不活,就不向pod发送流量
存活探针 liveness probe /healthz 是否还活着 如果不活 就杀掉容器
端口转发:
kubectl port-forward
解决: 可以用浏览器访问对应端口进去浏览
查看日志:
kubectl logs
辅助治理:
ELK: logtash 针对 java 收集
EFK:fluentd 针对Docker 收集
skywalking zipkin cat调用链监控平台
分布式后续学习:
serviceMesh
分布式锁