K8S
2021-03-29 09:46:27 5 举报
AI智能生成
k8s核心技术概念和API对象 k8s架构 k8s基础使用
作者其他创作
大纲/内容
是个啥
生产级别的容器编排系统
管理云平台中多个主机上的容器化的应用
自主的管理容器来保证云平台中的容器按照用户的期望状态运行
设计架构
核心技术概念和API对象
API对象组成
apiVersion
创建该对象所使用的 Kubernetes API 的版本
kind
想要创建的对象的类别
metadata
帮助唯一性标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace
规约spec
状态status
API对象
Pod
特点
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元
Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
通常你不需要直接创建 Pod,甚至单实例 Pod。 相反,你会使用诸如 Deployment 或 Job 这类工作负载资源 来创建 Pod。如果 Pod 需要跟踪状态, 可以考虑 StatefulSet 资源。
类型
部署(Deployment) -- 长期伺服型(long-running)
官网例子参考
部署表示用户对K8s集群的一次更新操作
可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务
有状态服务集(StatefulSet)-- 有状态应用型(stateful application)
官网例子参考
特点
1. StatefulSet Pod 具有唯一的标识
该标识包括顺序标识 、稳定的网络标识 和 稳定的存储。 该标识和 Pod 是绑定的,不管它被调度在哪个节点上。
该标识包括顺序标识 、稳定的网络标识 和 稳定的存储。 该标识和 Pod 是绑定的,不管它被调度在哪个节点上。
2. 副本的索引有序
对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号, 从 0 到 N-1,该序号在 StatefulSet 上是唯一的。Pod 的名称的形式为<statefulset name>-<ordinal index>
对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号, 从 0 到 N-1,该序号在 StatefulSet 上是唯一的。Pod 的名称的形式为<statefulset name>-<ordinal index>
3. 稳定的网络身份标识
StatefulSet 可以使用 无头服务 控制它的 Pod 的网络域
StatefulSet 可以使用 无头服务 控制它的 Pod 的网络域
1. 创建一个 Headless Service
2. 利用nslookup命令查询得到 SERVICE后面的POD的域名
3. 删除或收缩Stateful时, Pod 的序号、主机名、SRV 条目和记录名称没有改变,但和 Pod 相关联的 IP 地址可能发生了改变
4. 因此, 链接POD时, 不要使用IP, 应该使用 Pod 的 SRV 记录(web-0.nginx.default.svc.cluster.local, web-1.nginx.default.svc.cluster.local)
4. 稳定的存储
StatefulSet 控制器为每个Pod绑定 PersistentVolumes。
删除或者收缩 StatefulSet 并不会删除它关联的存储卷。
任务(Job)-- 批处理型(batch)
官网例子参考
Job是K8s用来控制批处理型任务的API对象。
后台支撑服务集(DaemonSet)-- 节点后台支撑型(node-daemon)
官网例子参考
后台支撑型服务的核心关注点在K8s集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行
典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支持K8s集群运行的服务。
复制控制器(Replication Controller,RC)
RC是K8s集群中最早的保证Pod高可用的API对象, 只适用于长期伺服型的业务类型
通过监控运行中的Pod来保证集群中运行指定数目的Pod副本
通过监控运行中的Pod来保证集群中运行指定数目的Pod副本
少于指定数目,RC就会启动运行新的Pod副本
多于指定数目,RC就会杀死多余的Pod副本
副本集(Replica Set,RS)
RS是新一代RC,提供同样的高可用能力, 区别主要在于RS后来居上,能支持更多种类的匹配模式。
副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
服务(Service)
在K8s集群中,客户端需要访问的服务就是Service对象。
类型
ClusterIP
只能在集群内访问
如上图, 可在 pod-nginx 中访问 service-python 达到当问 pod-python 的效果
如上图, 可在 pod-nginx 中访问 service-python 达到当问 pod-python 的效果
NodePort
集群外业务访问
如上图, service-python暴露映射到节点端口
如上图, service-python暴露映射到节点端口
LoadBalancer
大多数公有云托管集群中会支持该类型
ExternalName
官方文档偷的逻辑架构图
1. 每次个节点上都运行Docker。Docker来负责所有具体的映像下载和容器运行
2. 核心组件
etcd保存了整个集群的状态
apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡
3. Add-ons
kube-dns负责为整个集群提供DNS服务
Ingress Controller为服务提供外网入口
Heapster提供资源监控
Dashboard提供GUI
Federation提供跨可用区的集群
Fluentd-elasticsearch提供集群日志采集、存储与查询
Master节点逻辑架构
Node节点逻辑架构
基础使用
基础命令
kubectl version
查看对象:
kubectl get
kubectl get
kubectl get nodes/$NODE_NAME
kubectl get pods/$POD_NAME
kubectl get services/$SERVICE_NAME
kubectl get deployments/$DEPLOLYMENT_NAME
kubectl get rs 副本集
kubectl get configmaps
kubectl get pvc
kubectl get statefulset
显示有关对象的详细信息:
kubectl describe
kubectl describe
打印 pod 和其中容器的日志:
kubectl logs
kubectl logs
kubectl logs $POD_NAME
在 pod 中的容器上执行命令:
kubectl exec
kubectl exec
kubectl exec $POD_NAME env
kubectl exec -it $POD_NAME bash
部署应用
创建对象:
kubectl create -f <filename|url>
kubectl create -f <filename|url>
kubectl create deployment
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --replicas=4
--image 镜像
--replicas 副本数
更新对象:
kubectl replace -f <filename|url>
kubectl replace -f <filename|url>
删除对象:
kubectl delete -f <filename|url>
kubectl delete -f <filename|url>
升级对象
Kubectl Replace
Kubectl Replace
创建/升级对象:
kubectl apply -f xx.yaml
kubectl apply -f xx.yaml
暴露应用
公开应用:
kubectl expose
kubectl expose
kubectl expose pods/$POD_NAME --type="NodePort" --port 8080
kubectl expose services/$SERVICE_NAME --type="NodePort" --port 8080
kubectl expose deployments/$DEPLOLYMENT_NAME --type="NodePort" --port 8080
type
ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问
NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用<NodeIP>:<NodePort> 从集群外部访问 Service。是 ClusterIP 的超集。
LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。不使用代理。这种类型需要kube-dns的v1.7或更高版本。
添加Label
kubectl label pod $POD_NAME app=v1
伸缩应用
kubectl scale deployments/kubernetes-bootcamp --replicas=4
kubectl patch deployments/kubernetes-bootcamp -p '{"spec":{"replicas":3}}'
自动伸缩
kubectl autoscale deployment/nginx-test --min=2 --max=10
使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在2到10之间。
部署更新
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
部署历史版本
kubectl rollout history deployments/kubernetes-bootcamp
验证发布
kubectl rollout status deployments/kubernetes-bootcamp
回滚上个版本
kubectl rollout undo deployments/kubernetes-bootcamp
--to-revision=<版次>
ConfigMaps
新建
yaml / json文件: kubectl create -f configmap.yaml
指定单个文件和目录: kubectl create configmap $CONFIGMAP_NAME --from-file=$FILE_PATH/$DIR_PATH
key=value: kubectl create configmap special-config --from-literal=special.how=very
如何在pod中使用
1. 通过环境变量获取ConfigMap中的内容
2. 通过Volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录
spring boot + Spring Cloud Kubernetes 读取ConfigMap
kustomization
kubectl apply -k ./
kubectl delete -k ./
0 条评论
下一页
为你推荐
查看更多