Day04 通过配置 资源清单 构建POD
一、Pods
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。
除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群中支持临时性容器的情况外,为调试的目的注入临时性容器。
Pods的简介
一、资源清单参数
资源和对象
Kubernetes之上常用的资源,它把所有内容都抽象为资源,把资源实例化出来后称为对象。
相关参数
apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
namespace: web-testing # 可选,不指定默认为 default,Pod 所在的命名空间
labels: # 可选,标签选择器,一般用于 Selector
- app: nginx
annotations: # 可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合 RFC 1035 规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
- name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认 TCP
env: # 可选,环境变量配置
- name: TZ # 变量名
value: Asia/Shanghai
- name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为 2 次表示就绪
failureThreshold: 1 # 检测失败 1 次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为 Always
nodeSelector: # 可选,指定 Node 节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的 secret
- name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
- name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret 模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420
copy from http://www.xuexianqi.top/archives/705.html
一、资源清单的构建
可以通过通过pycharm中的kubernetes插件来构建配置清单,这样的配置的好处是,会给你智能补全,错误提示等,我们如果复制文件到master中最好也是用这种方式,方便排错
pycharm--左上角file--setting--plugins--install kubernetes--restar idle
编写配置清单-创test.yaml
文件
# test.yaml
# k8s 中一切皆资源
# 定义创建的资源
# 注意规则
# 1.冒号(英文)后有个空格
# 2.大小写不能错
# kind定义资源
kind: Pod
# 通过 kubectl explain pod 拿到api版本
# 指定api版本号
apiVersion: v1
# 定义资源的基础信息
metadata:
# 定义名称(由字母数字及中划线(不是必须)组成,必须小写同时必须以字母开头(新版本可以以数字开头了))
name: test-pod
# 资源标签(类似字典)
labels:
app: pod-test
class: s-1 # 不允许全部数字
# 配置资源详情
spec:
# 配置pod当中包含的容器
containers:
# 容器的name
- name: nginx
image: nginx:1.19.2
# 属于容器的控制资源
ports:
# 向外暴露的端口
- containerPort: 899
name: http
- containerPort: 999
name: https
protocol: TCP # 向外暴露的网络类型
撰写好后拿到master机中
三、部署相关
1.清单部署
kubectl apply -f [配置清单路径]
kubectl apply -f test.yaml
kubectl create
也接受多个-f
参数:
kubecctl apply -f test.yaml
2.查看当前系统Pod的列表
kubectl get [资源类型]
kubectl get pods
kubectl get pods # 查看pod信息
kubectl get pods -o wide # 查看pod详细信息
------------------------------------------------------------------------
#资源名称 是否就绪 状态 重启次数 时间 内部ip 分配的node
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 9s 10.244.2.23 k8s-node-01 <none> <none>
3.删除资源
kubectl delete -f [配置清单路径]
kubectl delete -f test.yaml
kubectl delete -f test2.yaml
------------------------------------------------------------------------
pod "test-pod" deleted
在上面我们查看pod信息中看到了几个参数,下面我们来分析这几个参数-主要是状态
四、(status)Pod的生命周期
Pod 遵循一个预定义的生命周期,起始于
Pending
阶段,如果至少 其中有一个主要容器正常启动,则进入Running
,之后取决于 Pod 中是否有容器以 失败状态结束而进入Succeeded
或者Failed
阶段。和一个个独立的应用容器一样,Pod 也被认为是相对临时性(而不是长期存在)的实体。 Pod 会被创建、赋予一个唯一的 ID(UID), 并被调度到节点,并在终止(根据重启策略)或删除之前一直运行在该节点。
Pod 自身不具有自愈能力,如果 Pod 被调度到某节点(node Kubernetes中工作的机器叫做节点) 而该节点之后失效,或者调度操作本身失效,Pod 会被删除;与此类似,Pod 无法在节点资源 耗尽或者节点维护期间继续存活。Kubernetes 使用一种高级抽象,称作 控制器,来管理这些相对而言 可随时丢弃的 Pod 实例。
Pod 的
status
字段是一个 PodStatus 对象,其中包含一个phase
字段。Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。 该阶段并不是对容器或 Pod 状态的综合汇总,也不是为了成为完整的状态机。
Pod 阶段的数量和含义是严格定义的。 除了本文档中列举的内容外,不应该再假定 Pod 有其他的
phase
值。
下面是 phase
可能的值:
取值 | 描述 |
---|---|
Pending (悬决) | Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间, |
Running (运行中) | Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。 |
Succeeded (成功) | Pod 中的所有容器都已成功终止,并且不会再重启。 |
Failed (失败) | Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。 |
Unknown (未知) | 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。 |
如果某节点死掉或者与集群中其他节点失联,Kubernetes 会实施一种策略,将失去的节点上运行的所有 Pod 的 phase
设置为 Failed
注意你还可能会遇到Terminating
状态,在节点处于“不可用”状态时,CCE会迁移节点上的容器实例,并将节点上运行的pod置为**“Terminating”状态。待节点恢复后,处于“Terminating”**状态的pod会自动删除。
五、Pod的重启策略
也就是清单参数中的restartPolicy: Always
重启策略 | 描述 |
---|---|
Always | 任何情况下 容器宕机,kubernetes都会重启,默认 |
On-Failure | 当容器非正常状态下退出,k8s重启 |
Never | 任何情况下 都不重启 |
六、Pod镜像拉取策略
也是在清单参数的sepc
下的imagePullPolicy: Always
重启策略 | 描述 |
---|---|
IfNotPresent | 如果当前系统镜像已存在 则不再拉取,如果不存在 则去镜像仓库拉取镜像 默认 |
Always | 不管当前系统镜像是否存在,都去镜像仓库拉取镜像 |
Never | 不管当前系统镜像是否存在,都不去镜像仓库拉取镜像 |
七、查看 kube-system(命名空间)中的节点
这里主要用来拍错
kubectl get pods -n kube-system # 查看 kube-system(命名空间)中的节点
--------------------------------------------------------------------
NAME READY STATUS RESTARTS AGE
coredns-7dcc599b9f-gt4lz 1/1 Running 2 24h
coredns-7dcc599b9f-psxlg 1/1 Running 2 24h
etcd-k8s-master 1/1 Running 2 24h
kube-apiserver-k8s-master 1/1 Running 2 24h
kube-controller-manager-k8s-master 1/1 Running 2 24h
kube-flannel-ds-bkvp4 1/1 Running 0 3h15m
kube-flannel-ds-mwrf6 1/1 Running 2 24h
kube-flannel-ds-s46tm 1/1 Running 1 23h
kube-proxy-b4g6t 1/1 Running 1 23h
kube-proxy-nc2kz 1/1 Running 0 3h15m
kube-proxy-qxx5l 1/1 Running 2 24h
kube-scheduler-k8s-master 1/1 Running 2 24h
# 如果重启次数过多 代表有问题
kubectl get pods -n kube-system -o wide
--------------------------------------------------------------------
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-7dcc599b9f-gt4lz 1/1 Running 2 24h 10.244.0.10 k8s-master <none> <none>
coredns-7dcc599b9f-psxlg 1/1 Running 2 24h 10.244.0.8 k8s-master <none> <none>
etcd-k8s-master 1/1 Running 2 24h 10.0.0.80 k8s-master <none> <none>
kube-apiserver-k8s-master 1/1 Running 2 24h 10.0.0.80 k8s-master <none> <none>
kube-controller-manager-k8s-master 1/1 Running 2 24h 10.0.0.80 k8s-master <none> <none>
kube-flannel-ds-bkvp4 1/1 Running 0 3h17m 10.0.0.81 k8s-node-01 <none> <none>
kube-flannel-ds-mwrf6 1/1 Running 2 24h 10.0.0.80 k8s-master <none> <none>
kube-flannel-ds-s46tm 1/1 Running 1 24h 10.0.0.82 k8s-node-02 <none> <none>
kube-proxy-b4g6t 1/1 Running 1 24h 10.0.0.82 k8s-node-02 <none> <none>
kube-proxy-nc2kz 1/1 Running 0 3h17m 10.0.0.81 k8s-node-01 <none> <none>
kube-proxy-qxx5l 1/1 Running 2 24h 10.0.0.80 k8s-master <none> <none>
kube-scheduler-k8s-master 1/1 Running 2 24h 10.0.0.80 k8s-master
# 地址不一致往往时 /etc/hosts 问题没对应