容器编排与容器的生命周期管理相关,特别是在大型动态环境中。软件团队用容器编排器来控制和自动化容器管理的各种任务。
容器编排器可以工作在使用容器的任何环境。它可以帮助你在多个环境中部署相同的程序,而不需要重新编写它。
1、Kubernetes
2、Docker Swarm
3、Apache Mesos
K8s是一个最初由Google开发的,用于自动化部署、扩展和管理容器化应用的开源容器编排器技术。
K8s使部署和管理微服务架构应用程序变得很简单。它通过在集群之上形成一个抽象层来实现这一点,允许开发团队平滑地部署应用程序,
K8s主要处理以下任务:
控制平面是管理员和用户管理不同节点的地方。它通过HTTP调用接收命令或者连接到系统并且运行命令行脚本。顾名思义,它控制了K8s与应用程序的交互方式。
API 服务器为K8s集群提供了一个REST接口。 所有在pod上激活的服务和别的对象都是可以用可编程的方式与与终端进行交互。
调度器负责将任务分配给各个节点。它监控资源容量并保证工作节点的性能保持在可接受的范围内。
K8s控制器管理器是管理K8s核心控制循环的服务。它负责确保集群的共享状态正常运行。
K8s使用了Etcd,一个提供分布式键值存储的数据库,用来共享集群的整体状态的信息。
节点是运行了pod的物理机或虚拟机。控制平面管理集群中的每个节点,该节点包含运行 pod所需的服务。
K8s pod 是K8s管理容器集的最小单位。 每个pod有一个分配给pod中的所有容器的单独的IP 地址。在pod中的容器内存和存储资源是共享的。当应用程序只有一个进程时,pod 也可以有一个容器。
Kubelet是一个工作节点组件。它的任务是跟踪pod及其容器的运行状态。它与pod的YAML 或JSON描述文件相关。Kubelet检查 pod 规格并确定 pod 是否健康。
Kube代理是一个网络代理和负载均衡器,充当每个节点和API服务器之间的连接。它在集群中的每个节点上运行,并允许你从内部和外部连接到pod。
Kubectl是K8s的命令行工具。它用于部署应用程序、监控和控制集群资源以及查看日志。
K8S中的Master是集群控制节点,负责整个集群的管理和控制
Node是K8S集群中的工作负载节点,每个Node都会被Master分配一些工作负载,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上
状态 |
描述 |
ContainerCreating |
容器创建中 |
PodInitializing pod |
初始化中 |
CrashLoopBackOff |
容器曾经启动了,但可能又异常退出了,kubelet正在将它重启 |
InvalidImageName |
无法解析镜像名称 |
ImageInspectError |
无法校验镜像 |
ErrImageNeverPull |
策略禁止拉取镜像 |
ImagePullBackOff |
正在重试拉取 |
RegistryUnavailable |
连接不到镜像中心 |
ErrImagePull |
通用的拉取镜像出错 |
CreateContainerConfigError |
不能创建kubelet使用的容器配置 |
CreateContainerError |
创建容器失败 |
m.internalLifecycle.PreStartContainer |
执行hook报错 |
RunContainerError |
启动容器失败 |
PostStartHookError |
执行hook报错 |
ContainersNotInitialized |
容器没有初始化完毕 |
ContainersNotRead |
容器没有准备完毕 |
DockerDaemonNotReady |
docker还没有完全启动 |
NetworkPluginNotReady |
网络插件还没有完全启动 |
参考资料:命令行工具 (kubectl) | Kubernetes
1、创建yaml 资源
kubectl create demo.yaml
2、开放yaml资源端口
kubectl expose demo.yaml
3、创建并启动容器对象
kubectl run demo.yaml
4、显示资源详情
kubectl describe
5、查看容器的日志
kubectl logs
6、获取资源信息
kubectl get
7、编辑资源对象
kubectl edit
8、删除资源
kubectl delete
Kubernetes API的稳定版本,包含很多核心对象:pod、service等。
指定这个资源对象的类型,如pod、deployment、statefulset、job、cronjob、Endpoints service
常用的配置项有name:显示的名字,namespace:归属的命名空间。
一个嵌套字典与列表的配置项,也是主要的配置项,支持的子项非常多,根据资源对象的不同,子项会有不同的配置。
apiVersion: v1 #必选 版本号
kind: Pod #必选
metadata: #必选 元数据
name: nginx #必选 Pod名称
labels: #自定义标签
app: nginx #自定义标签名称
spec: #必选 Pod中容器的详细定义
containers: #必选 Pod中容器列表,一个pod里会有多个容器
- name:nginx #必选 容器名称
image:nginx #必选 容器的镜像名称
imagePullPolicy:IfNotPresent # [Always | Never | IfNotPresent] 获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
ports: #需要暴露的端口库号列表
- containerPort:80 # 容器需要监听的端口号
restartPolicy: Always # [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
service的spec配置:
apiVersion: v1 #必选 版本号
kind: Service #必选
metadata: #必选 元数据
name: service-hello #必选 Pod名称
labels: #自定义标签
name: service-hello #自定义标签名称
spec: #必选 Pod中容器的详细定义
type: NodePort #这里代表是NodePort类型的,另外还有ingress,LoadBalancer
ports:
- port:80 #这里的端口和clusterIP(kubectl describe service service-hello中的IP的port)对应,即在集群中所有机器上curl clusterIP:80可访问发布的应用服务
targetPort:8080 #端口一定要和contrainer暴露出来的端口对应,nodejs暴露出来的端口是8080
protocol: TCP
nodePort: 31111 #所有的节点都会开发此端口30000~32767,此端口供外部调用
selector:
run:hello #这里选择器一定要选择容器的标签
nodeName用于将Pod调度到指定的Node名称上。
# SchedulePolicy-nodeName.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: busybox
name: busyboxnn
namespace: default
spec:
nodeName: k8s-node1
containers:
- image: busybox
name: bs
command:
- "ping"
- "baidu.com"
1、查看Pod状态
2、无状态多个节点
3、查看启动部署
容器版本可以回滚到某次部署发布
5、查看服务路由
外网走域名地址访问,内网走服务名称自动注册查找