k8s入门
kubernetes指南:
https://kubernetes.feisky.xyz/concepts/objects/autoscaling
kubernetes中文社区:
https://www.kubernetes.org.cn/k8s
核心组件:
Kubernetes 主要由以下几个核心组件组成:
-
etcd 保存了整个集群的状态;
-
apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
-
controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
-
scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
-
kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
-
Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
-
kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡
网络:Ingress Controller
Ingress原理:动态生效:pod一变化,service就变化,service一变化,ingress就变化,ingreess一变化就注入到ingress controller里面。实时动态。
dns:coredns
监控:Weave Scope 是 Docker 和 Kubernetes 可视化监控工具、prometheus
日志:Fluentbit (收集)、Fluentd(过滤)、Elasticsearch(存储)、Kibana(展示)
Dashboard:作为Kubernetes的Web用户界面,用户可以通过Dashboard在Kubernetes集群中部署容器化的应用,对应用进行问题处理和管理,并对集群本身进行管理。
资源对象:
Autoscaling:Horizontal Pod Autoscaling (HPA) 可以根据 CPU 使用率或应用自定义 metrics 自动扩展 Pod 数量(支持 replication controller、deployment 和 replica set )。
ConfigMap:ConfigMap 用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap 跟 Secret 很类似,但它可以更方便地处理不包含敏感信息的字符串。
CronJob:CronJob 即定时任务,就类似于 Linux 系统的 crontab,在指定的时间周期运行指定的任务。
CustomResourceDefinition:CustomResourceDefinition(CRD)是 v1.7 新增的无需改变代码就可以扩展 Kubernetes API 的机制,用来管理自定义对象。它实际上是 ThirdPartyResources(TPR)的升级版本,而 TPR 已经在 v1.8 中弃用。
DaemonSet:DaemonSet 保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。
典型的应用包括:
-
日志收集,比如 fluentd,logstash 等
-
系统监控,比如 Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等
-
系统程序,比如 kube-proxy, kube-dns, glusterd, ceph 等
Deployment:Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义 (declarative) 方法,用来替代以前的 ReplicationController 来方便的管理应用。
Ingress:Ingress 可以给 service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等。为了配置这些 Ingress 规则,集群管理员需要部署一个 Ingress controller,它监听 Ingress 和 service 的变化,并根据规则配置负载均衡并提供访问入口。
Job:Job 负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。
Local Volume:本地数据卷(Local Volume)代表一个本地存储设备,比如磁盘、分区或者目录等。主要的应用场景包括分布式存储和数据库等需要高性能和高可靠性的环境里。本地数据卷同时支持块设备和文件系统,通过 spec.local.path 指定;但对于文件系统来说,kubernetes 并不会限制该目录可以使用的存储空间大小。
Namespace:Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pod, service, replication controller 和 deployment 等都是属于某一个 namespace 的(默认是 default),而 node, persistent volume,namespace 等资源则不属于任何 namespace。
Network Policy:Network Policy 提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制它们之间的流量以及来自外部的流量。
Node:Node 是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。为了管理 Pod,每个 Node 节点上至少要运行 container runtime(比如 docker 或者 rkt)、kubelet 和 kube-proxy 服务。
PersistentVolume:PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供网络存储资源,而 PVC 请求存储资源。
Pod:Pod 是一组紧密关联的容器集合,它们共享 IPC、Network 和 UTS namespace,是 Kubernetes 调度的基本单位。
PodPreset:PodPreset 用来给指定标签的 Pod 注入额外的信息,如环境变量、存储卷等。这样,Pod 模板就不需要为每个 Pod 都显式设置重复的信息。
ReplicaSet:ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector(ReplicationController 仅支持等式)
ReplicationController:ReplicationController(也简称为 rc)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代;而异常多出来的容器也会自动回收。
Resource Quotas:资源配额(Resource Quotas)是用来限制用户资源用量的一种机制。
Secret:Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用
Security Context:Security Context 的目的是限制不可信容器的行为,保护系统和其他容器不受其影响
Service:Service:直接用 Service 提供 cluster 内部的负载均衡,并借助 cloud provider 提供的 LB 提供外部访问
Service account:Service account 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的
StatefulSet: 是为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets 是为无状态服务而设计)
Volume:Docker 提供了 Volume 机制以便将数据持久化存储
常用命令:
kubectl get pod #查看默认名称空间default的pod状态
kubectl get pods -w
kubect get pod -w -l app=myapp-pod
kubectl get pod -n kube-system #制定名称空间查看pod状态
kubectl get node #查看节点状态
kubectl get cs #查看集群状态
kubectl describe pod kube-scheduler-master -n kube-system #查看pod的详细信息 events事件等
kubectl explain ingress.spec #资源对象帮助文档
kubectl explain ingress.spec.rules.host #查看虚拟主机调度规则
kubectl explain ingress.spec.rules.http.paths #查看路径url映射调度规则
kubectl explain ingress.spec.backend.servicename #查看url映射调用的后端主机规则(后端是通过service关联一组后端pod)
kubectl apply -f ./ #直接apply当前目录,全部自动创建
kubectl get pods -o wide --show-labels -n ingress-nginx
kubectl get svc -n ingress-nginx
kubectl delete pod PODNAME --force --grace-period=0 #删除pod
kubectl delete namespace NAMESPACENAME --force --grace-period=0 #删除namespace
配置模板:
#statefulSet的域名结构为: pod_name.service_name.namespace_name.svc.cluster.local #扩容: kubectl scale sts myapp --replicas=5 #缩容: kubectl patch sts myapp -p ‘{"spec":{"replicas":2}}’ #修改滚动更新策略,查看效果 kubectl patch sts myapp -p ‘{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}’ #注: 在打补丁时,若对象为list类型,则需要使用"[]",来指明其下标,如: containers[0],就是第一个容器. #以上statefulSet的更新策略已经修改好了,接着来修改pod的镜像为新版镜像,来查看其滚动更新的 kubectl set image sts/myapp myapp=ikubernetes/myapp:v2 kubectl patch sts myapp -p ‘{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}’

常见错误:
错误解决 - Error from server (NotFound): the server could not find the requested resource (get servic...

浙公网安备 33010602011771号