容器化部署和传统部署

核心提示Pod 的本质Pod 包装了一个或多个容器。 Pod 是 K8S 的最小执行单元。 Pod 是 K8S 中的一个进程。 Pod 可包装 Docker,也支持包装其他类型容器。 Pod 包含封装的容器、存储资源、网络资源、以及指导容器如何运行

Pod的本质

Pod包装一个或多个容器。是Pod K8S的最小执行单元。它是Pod K8S中的一个过程。Pod可以包装Docker,也支持包装其他类型的容器。包含Pod封装的容器、存储资源、网络资源和指导容器如何运行的配置。

容器可以理解为没有挂钩的裸容器。K8S这种大船,直接装不上去。K8S通过在集装箱上增加挂钩,形成一个吊舱,方便操作。

Pod也可以理解为传统虚拟机,容器是运行在传统虚拟机中的程序,只不过虚拟机是一个实体,Pod是一个逻辑概念。

K8S通过安排Pod而不是直接操作集装箱来调度集装箱,K8S不能直接操作集装箱。

Pod中的共享资源

为Pod中运行的多个容器提供共享的网络、存储资源和命名空空间。

网络

Pod具有唯一的IP地址,并且Pod中的多个容器共享一个IP地址和网络端口以及其他网络资源。Pod中的多个容器可以通过使用localhost相互通信。与外界通信时,多个容器需要协调网络端口。Pod中的容器获得的系统主机名与为Pod配置的名称相同。

救援

Pod可以指定一组存储卷。Pod中的多个容器可以访问该存储卷,因此Pod中的共享卷可以保留很长时间,防止容器在重新启动时丢失数据。

Pod的特性

如果使用kind: Pod类型的yaml文件来创建Pod,则在当前节点服务器出现问题后,不能将Pod自动调度到其他可用的服务器。

使用一般类型的YAML:Deployment来创建Pod。

部署是一个控制器,可用于创建和管理Pod。比如创建Pod的多个副本,滚动更新Pod。

当Pod所在的节点出现问题时,部署控制器可以在集群中的其他节点上启动新的Pod。

Pod模板

API version:v1 kind:pod metadata:name:myapp-pod标签:app:myapp spec:containers:-name:myapp-container镜像:busybox命令:['sh ','-c ',' echo Hello Kubernetes! sleep 3600']

镜像拉动策略

除非特别指定,否则imagePullPolicy始终为,即kubelet将尝试从指定的仓库中提取每个图像。如果容器属性imagePullPolicy设置为IfNotPresent,将首先使用本地镜像。如果容器属性imagePullPolicy设置为IfNotPresent Never,将使用本地镜像。

API version:v1 kind:pod metadata:name:private-image-test-1 spec:containers:-name:uses-private-image image:nginx imagePullPolicy:Always命令:[ "echo "," SUCCESS" ]

Pod的常用参数

节点选择器

功能:绑定Pod和节点

apiVersion: v1kind: Pod...规格:节点选择器:磁盘类型:ssd

Pod只能在标签为“disktype:ssd”的节点上运行。如果没有这样的标签,调度将会失败。

节点名

这个字段一般由调度器设置,但是我们可以在测试的时候手动设置这个字段,这样调度器就认为Pod已经被调度了。

HostAliase

设置Pod中每个容器的/etc/hosts文件的内容。

apiVersion: v1kind: Pod......规格:hostAliases: - ip: "10.20.20.20 "主机名:- "test1.com" - "test2.com "

检查集装箱。

[root @ master 01 ~]# ku bectl exec-it nginx-bash root @ nginx:/# cat/etc/hosts......主机别名添加的条目数。10 . 20 . 20 . 20 test1.comtest2.com

共享进程命名空间

定义了参数shareProcessNamespace=true,则此Pod中的所有容器将共享PID名称空间。

创建一个包含两个容器的Pod

[root @ master 01 ~]# cat nginx . YAML API version:v1k ind:pod metadata:name:nginxspec:share process namespace:true containers:-name:nginx image:nginx-name:shell image:busybox stdin:true tty:true

检查操作。

[root @ master 01 ~]# ku bectl get pods-o wideNAME就绪状态重新启动老化IP节点提名节点就绪状态网关ginx 2/2运行0 117s 192.10.137.131工作03

在Pod nginx中输入名为shell的容器。

[root @ master 01 ~]# ku bectl attach-it nginx-c shell如果您没有看到命令提示符,请尝试按enter键。/ # ps auxPID用户时间命令1 root 0:00 /pause 6 root 0:00 nginx:主进程nginx -g守护进程关闭;33 1010:00 nginx:工作进程34 root 0:00 sh 39 root 0:00 ps aux

可以看到在shell容器中可以看到nginx容器的进程。

Pod的预设参数,PodPreset

我们可以提前设置一些通用配置,当用户提交自己的个性化Pod配置时,PodPreset可以自动将通用配置附加到相应的Pod上。

PodPreset中定义的内容只会在创建之前附加到Pod API对象本身,不会影响任何Pod控制器的定义。

例如,如果我们现在提交一个nginx-Deployment,部署对象本身永远不会被PodPreset更改,而只会修改这个部署创建的所有pod。

当没有启用PodPreset功能时

# kubectl get podpresetserror:服务器没有资源类型“podpresets”

启用PodPreset功能

修改[/etc/Kubernetes/Manifests/Kube-API server . YAML]中的spec . containers . command]:将原来的-runtime-config = api/all = true修改为-runtime-config = api/all = true,在settings.k8s.io/v1alpha1=true-enable-admission-plugins = pod预置中增加新的一行。所有三个主机将重新启动kubeletsystemctl。

将preset.yaml配置为默认值

API version:settings.k8s.io/v1alpha1kind: PodPresetmetadata:名称:allow-tz-envspec:选择器:matchLabels: env: -名称:tz值:亚洲/上海

配置nginx.yaml

API version:v1 kind:pod metadata:name:nginxspec:containers:-name:nginx image:nginx

创建PodPreset

# kubectl get在默认命名空间中找不到podpresetNo资源。# podpreset.yamlpodpreset.settings.k8s.io/allow-tz-env创建的库对象应用-f #库对象获取podpresetNAME创建的ATallow-tz-env

创建Pod

[root @ master 01 ~]# ku bectl apply-f nginx . YAML pod/nginx已创建

检查Pod是否已注入。

# kubectl get pod nginx -o yaml...省略spec:containers:-env:-name:tz value:Asia/Shanghai image:nginx imagepull policy:always name:nginx resources:{ }...省略

你可以看到Pod被注入了名为TZ的env。

初始化容器

特性

初始化容器在Pod中的应用程序容器启动之前运行。

一个Pod可以有一个或多个Init容器。

每个Init容器操作都必须完成。

如果Init容器运行失败,K8S将重新启动Pod,直到Init容器成功运行。

但是,如果Pod的restartPolicy值为Never,它将不会重新启动。

如果一个Pod有多个Init容器,这些容器将依次运行。每个Init容器必须成功运行,下一个才能运行。

Init容器可以包含一些在安装过程中应用程序容器中不存在的实用程序或个性化代码。例如,在安装过程中,不需要使用sed、awk、python或dig等工具从映像生成新映像。

Init容器可以安全地运行这些工具,并防止它们降低应用程序映像的安全性。

应用程序的创建者和部署者可以独立工作,没有必要共同构建单独的应用程序映像。

Init容器可以在与Pod中的应用程序容器不同的文件系统视图中运行。因此,Init容器可以访问机密,但是应用程序容器不能。

因为Init容器必须在应用程序容器启动之前完成运行,所以Init容器提供了一种机制来阻止或延迟应用程序容器的启动,直到满足一组先决条件。一旦满足前提条件,Pod中的所有应用程序容器将并行启动。

直到所有初始化容器都成功,Pod才会就绪。

Init容器映像的改变会导致Pod重启,应用程序容器映像的改变只会重启应用程序容器。

在Pod中的每个容器复制开始之前,Init容器将被执行一次。

如何使用

定义一个包含2个Init容器的Pod。

初始化容器是myservice和mydb。两个Init容器启动后,Pod可以在spec区域启动应用程序容器myapp-container。

创建Pod的YAML文件:

cat myapp.yaml

API version:v1 kind:pod metadata:name:myapp-pod标签:app:myapp spec:containers:-name:myapp-container镜像:busybox:1.28命令:['sh ','-c ',' echo应用正在运行! sleep 3600 ']init containers:-name:init-my service image:busybox:1.28命令:['sh ','-c ',"直到nslookup myservice。$ . SVC . cluster . local;做回声等待我的服务;睡眠2;done "]-name:init-mydb image:busybox:1.28命令:['sh ','-c ',"直到nslookup mydb。$ . SVC . cluster . local;做echo等待mydb睡眠2;完成"]

创建mydb和myservice的YAML文件:

cat myservice.yaml

kind:service API version:v1 metadata:name:my service spec:ports:-协议:TCP端口:80 target port:9376-kind:service API version:v1 metadata:name:mydb spec:ports:-协议:TCP端口:80 targetPort: 9377

要启动此Pod,您可以执行以下命令:

myapp.yamlpod/myapp-pod创建的库贝克特尔应用程序

检查其状态:

kubectl get -f myapp.yamlNAME就绪状态重新启动AGEmyapp-pod 0/1单位:0/2 0 6m

使用以下命令查看更详细的信息:

ku bectl describe-f myapp . YAML name:myapp-pod namespace:default[...]标签:app=myappStatus:待定[...]Init容器:init-myservice:[...]状态:正在运行[...] init-mydb:[...]状态:等待原因:pod初始化就绪:假[...]集装箱:myapp-集装箱:[...]状态:等待原因:pod初始化就绪:假[...]

检查Pod中初始化容器的日志。

$ ku ectl日志myapp-pod-c init-my service $ ku ectl日志myapp-pod -c init-mydb

此时,Init容器将一直等待,直到找到名为mydb和myservice的服务。

为mydb和myservice创建服务:

$ ku bectl create-f services . YAML service " my service " created service " mydb "已创建

您可以看到这些Init容器已经执行完毕,然后my-app的Pod被转换到运行状态:

$ kubectl get -f myapp.yamlNAME就绪状态重新启动AGEmyapp-pod 1/1正在运行0 9m

只有当我们启动mydb和myservice并且Init容器完成时,才能创建Myapp-pod。

调试窗格

如果Pod被终止,您可以通过以下命令检查原因

kube CTL describe pod pod name kube CTL get pod-o go-template = ' { { range . status . container status } } { { " container name:" } } {。name }} {{ " r 最后状态:" } } { {。laststate}} {{end}

结束语

Pod打包集装箱,K8S通过操作Pod来操作集装箱。

Pod可以包含多个应用程序容器和多个初始化容器。

直接创建的Pod在服务器节点失效时没有自愈能力,所以需要一个控制器来解决这个问题。

 
友情链接
鄂ICP备19019357号-22