K8s[控制器]-StatefulSet
K8s[控制器]-StatefulSet什么是StatefulSetStatefulSet 顾名思义,用于管理 Stateful(有状态)的应用程序。
StatefulSet 管理 Pod 时,确保其 Pod 有一个按顺序增长的 ID。
StatefulSet 使用场景对于有如下要求的应用程序,StatefulSet 非常适用:
稳定、唯一的网络标识(dnsname)
每个Pod始终对应各自的存储路径(PersistantVolumeClaimTemplate)
按顺序地增加副本、减少副本,并在减少副本时执行清理
按顺序自动地执行滚动更新
如果一个应用程序不需要稳定的网络标识,或者不需要按顺序部署、删除、增加副本,您应该考虑使用 Deployment 这类无状态(stateless)的控制器。
StatefulSet 的限制
Pod 的存储要么由 storage class 对应的 PersistentVolume Provisioner (opens new window)提供,要么由集群管理员事先创建
删除或 scale down 一个 StatefulSet 将不会删除其对应 ...
K8s[控制器]-Job
K8s[控制器]-Job什么是JobKubernetes中的 Job 对象将创建一个或多个 Pod,并确保指定数量的 Pod 可以成功执行到进程正常结束:
当 Job 创建的 Pod 执行成功并正常结束时,Job 将记录成功结束的 Pod 数量
当成功结束的 Pod 达到指定的数量时,Job 将完成执行
删除 Job 对象时,将清理掉由 Job 创建的 Pod
创建一个 Job 对象用来确保一个 Pod 的成功执行并结束。在第一个 Pod 执行失败或者被删除(例如,节点硬件故障或机器重启)的情况下,该 Job 对象将创建一个新的 Pod 以重新执行。
Example:
apiVersion: batch/v1kind: Jobmetadata: name: pispec: template: spec: containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", &q ...
K8s[控制器]-DaemonSet
K8s[控制器]-DaemonSet什么是DaemonSetDaemonSet 控制器确保所有(或一部分)的节点都运行了一个指定的 Pod 副本。
每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上
当节点从集群中移除时,Pod 也就被垃圾回收了
删除一个 DaemonSet 可以清理所有由其创建的 Pod
DaemonSet 的典型使用场景有:
在每个节点上运行集群的存储守护进程,例如 glusterd、ceph
在每个节点上运行日志收集守护进程,例如 fluentd、logstash
在每个节点上运行监控守护进程,例如 Prometheus Node Exporter (opens new window)、Sysdig Agent (opens new window)、collectd、Dynatrace OneAgent (opens new window)、APPDynamics Agent (opens new window)、Datadog agent (opens new window)、New Relic agent (opens new wind ...
K8s[控制器]-CronJob
K8s[控制器]-CronJobCronJob 按照预定的时间计划(schedule)创建 Job。一个 CronJob 对象类似于 crontab (cron table) 文件中的一行记录。该对象根据 Cron (opens new window)格式定义的时间计划,周期性地创建 Job 对象
本质上:CronJob 只负责按照时间计划的规定创建 Job 对象,由 Job 来负责管理具体 Pod 的创建和执行
CronJob限制当以下两个条件都满足时,Job 将至少运行一次:
startingDeadlineSeconds 被设置为一个较大的值,或者不设置该值(默认值将被采纳)
concurrencyPolicy 被设置为 Allow
对于每一个 CronJob,CronJob 控制器将检查自上一次执行的时间点到现在为止有多少次执行被错过了。如果错过的执行次数超过了 100,则 CronJob 控制器将不再创建 Job 对象,并记录如下错误
当以下两个条件都满足时,Job 将至少运行一次:
startingDeadlineSeconds 被设置为一个较大的值,或者不设置该值( ...
K8s[内核优化]-大规模下集群优化
K8s[内核优化]-大规模下集群优化最大线程数和文件打开数。
编辑 /etc/security/limits.conf 。
root soft nofile 655350root hard nofile 655350root soft nproc 655350root hard nproc 655350* soft nofile 655350* hard nofile 655350* soft nproc 655350* hard nproc 655350
内核优化,重点优化以下参数。
编辑 /etc/sysctl.conf
# 容器环境下,优化这些参数可以避免 NAT 过的 TCP 连接带宽上不去。net.netfilter.nf_conntrack_tcp_be_liberal = 1 net.netfilter.nf_conntrack_tcp_loose = 1 net.netfilter.nf_conntrack_max = 3200000net.netfilter.nf_conntrack_buckets = 16005 ...
K8s-服务发现、负载均衡、网络
K8s-服务发现、负载均衡、网络ServiceService 是 Kubernetes 中的一种服务发现机制:
Pod 有自己的 IP 地址
Service 被赋予一个唯一的 dns name
Service 通过 label selector 选定一组 Pod
Service 实现负载均衡,可将请求均衡分发到选定这一组 Pod 中
Service基础基本操作apiVersion: v1kind: Servicemetadata: name: my-servicespec:# 管理的Pod的label selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376
无label模式
apiVersion: v1kind: Servicemetadata: name: my-servicespec: ports: - protocol: TCP port: 80 targetPort: 9376
因为该 Service 没有 se ...
K8s-集群内的通信
K8s-集群内的通信Master-WorkNodeCluster to Master集群访问K8s Master,其实本质就是对于apiserver的通信(通信不是节点之间的通信,而是进程之间的通信)
K8s安装K8s,apiserver默认是监听HTTPS端口(443),并且配置了客户端认证模式,提供授权模式.节点上必须配置集群(apiserver)的公钥根证书(public root certificate),此时,在提供有效的客户端身份认证的情况下,节点可以安全地访问 APIServer。
kubelet提供TLS认证过程
对于需要调用 APIServer 接口的 Pod,应该为其关联 Service Account,此时,Kubernetes将在创建Pod时自动为其注入公钥根证书(public root certificate)以及一个有效的 bearer token(放在HTTP请求头Authorization字段)。所有名称空间中,都默认配置了名为 kubernetes Kubernetes Service,该 Service对应一个虚拟 IP(默认为 10.96.0 ...
K8s-对象
K8s-对象对象的spec和status
spec:操作员所期望的状态
status:实际上集群中的状态
必填字段在上述的 .yaml 文件中,如下字段是必须填写的:
apiVersion 用来创建对象时所使用的Kubernetes API版本
kind 被创建对象的类型
metadata 用于唯一确定该对象的元数据:包括 name 和 namespace,如果 namespace 为空,则默认值为 default
spec 描述您对该对象的期望状态
名称Kubernetes REST API 中,所有的对象都是通过 name 和 UID 唯一性确定。
Names可以通过 namespace + name 唯一性地确定一个 RESTFUL 对象,例如:
/api/v1/namespaces/{namespace}/pods/{name}
同一个名称空间下,同一个类型的对象,可以通过 name 唯一性确定。如果删除该对象之后,可以再重新创建一个同名对象。
下面是三种广泛使用的资源名称的限制类型:
DNS Subdomain Names绝大部 ...
K8s-容器
K8s-容器镜像在 Kubernetes 的 Pod 中使用容器镜像之前,您必须将其推送到一个镜像仓库(或者使用仓库中已经有的容器镜像)。在 Kubernetes 的 Pod 定义中定义容器时,必须指定容器所使用的镜像,容器中的 image 字段支持与 docker 命令一样的语法,包括私有镜像仓库和标签。
例如:my-registry.example.com:5000/example/web-example:v1.0.1 由如下几个部分组成:
my-registry.example.com:5000/example/web-example:v1.0.1
my-registry.example.com:registry 地址
5000:registry 端口
example:repository 名字
web-example:image 名字
v1.0.1:image 标签
如果您使用 hub.dokcer.com Registry 中的镜像,可以省略 registry 地址和 registry 端口。例如:nginx:latest,eipwork/kuboar ...
K8s-节点
K8s-节点K8s的node(节点)是一个工作机器。每个节点都是归属master组件管理。
节点的状态
Addresses
Conditions
Capacity and Allocatable
Info
Addresses
HostName: 在节点命令行界面上执行 hostname 命令所获得的值。启动 kubelet 时,可以通过参数 --hostname-override 覆盖
ExternalIP:通常是节点的外部IP(可以从集群外访问的内网IP地址;上面的例子中,此字段为空)
InternalIP:通常是从节点内部可以访问的 IP 地址
ConditionsConditions 描述了节点的状态。
Condition的例子有:
Node Condition
描述
OutOfDisk
如果节点上的空白磁盘空间不够,不能够再添加新的节点时,该字段为 True,其他情况为 False
Ready
如果节点是健康的且已经就绪可以接受新的 Pod。则节点Ready字段为 True。False表明了该节点不健康,不能够接受新的 Pod。
MemoryPressu ...