pod
- kubernetes的核心是管理容器
- 在kubernetes当中,没有container的对象
- 在kubernetes·当中,管理容器的最小单元是pod
- 一个pod当中会包含一个容器或多个容器,99%的场景中,一个pod中一般只有一个容器
- 如果一个pod中有多个容器,这些容器共享同一个ip地址,由于多个容器共享一个ip地址,所以这些容器不能监听在相同的端口上。
- 事实上,kubernetes的一个pod至少包含两个容器,一个是正常的的应用容器,还有一个是pause容器,pause容器用于劫持pod当中的所有容器流量。
- Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统
- Kubernetes为每个Pod都分配了唯一的IP地址,称之为PodIP,一个Pod里的多个容器共享 PodIP地址。要求底层网络支持集群内任意两个Pod之间的直接通信,通常采用虚拟二层 网络技术来实现(Flannel)。
- POD可以与其它主机上的POD直接通讯。
- 如果有POD意外停止, K8S会根据资源设定重启或创建POD,直到符合预期设定值。
pod常用配置项
- 指定pod名称 --name
- 指定pod所使用的镜像
- 配置镜像拉取策略
- 配置pod重启策略 --restart
- 配置pod所执行的任务 CMD
- 配置pod监听的端口
- 配置pod的/etc/hosts
- 配置pod所需要的环境变量
-e
nerdctl run -d -e aa=bb -e MYSQL_ROOT_PASSWORD=cka123
env:
- name: aa
value: bb
- name: MYSQL_ROOT_PASSWORD
value: cka123
apiVersion: v1
kind: Pod
metadata:
name: mysql-env
namespace: cka
labels:
name: mysql-env
spec:
restartPolicy: Always
containers:
- image: registry.cn-zhangjiakou.aliyuncs.com/breezey/mysql:5.7
name: mysql
imagePullPolicy: Always
ports:
- name: mysql
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: wordpress
- name: MYSQL_DATABASE
value: wordpress
- 配置pod的dns策略
- 配置pod的网络类型
apiVersion: v1
kind: Pod
metadata:
name: more-containers
namespace: cka
labels:
name: more-containers
spec:
restartPolicy: Always
hostNetwork: false
containers:
- image: nginx:1.21
name: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: bb
- 配置pod的资源限制
- 配置pod的健康检查
- 配置pod的存储卷
pod配置示例
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 172.16.16.3:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --advertise-address=172.16.16.3
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:2379
- --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
- --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
- --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
- --requestheader-allowed-names=front-proxy-client
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --requestheader-extra-headers-prefix=X-Remote-Extra-
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
- --secure-port=6443
- --service-account-issuer=https://kubernetes.default.svc.cluster.local
- --service-account-key-file=/etc/kubernetes/pki/sa.pub
- --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
- --service-cluster-ip-range=10.96.0.0/12
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
image: registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 172.16.16.3
path: /livez
port: 6443
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: kube-apiserver
readinessProbe:
failureThreshold: 3
httpGet:
host: 172.16.16.3
path: /readyz
port: 6443
scheme: HTTPS
periodSeconds: 1
timeoutSeconds: 15
resources:
requests:
cpu: 250m
startupProbe:
failureThreshold: 24
httpGet:
host: 172.16.16.3
path: /livez
port: 6443
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
volumeMounts:
- mountPath: /etc/ssl/certs
name: ca-certs
readOnly: true
- mountPath: /etc/pki
name: etc-pki
readOnly: true
- mountPath: /etc/kubernetes/pki
name: k8s-certs
readOnly: true
hostNetwork: true
priorityClassName: system-node-critical
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
- hostPath:
path: /etc/ssl/certs
type: DirectoryOrCreate
name: ca-certs
- hostPath:
path: /etc/pki
type: DirectoryOrCreate
name: etc-pki
- hostPath:
path: /etc/kubernetes/pki
type: DirectoryOrCreate
name: k8s-certs
status: {}
基础必选参数
# pod的最基础的yaml文件最少需要以下的几个参数
apiVersion: v1 # API版本号,注意:具有多个,不同的对象可能会使用不同API
kind: Pod # 对象类型,pod
metadata: # 元数据
name: string # POD名称
namespace: string # 所属的命名空间
spec: # specification of the resource content(资源内容的规范)
containers: # 容器列表
- name: string # 容器名称
image: string # 容器镜像
标签和注释
# 放在metadata中
metadata:
labels: # 自定义标签的名称和值
- key: value
- ...
annotations: # 自定义注释的名称和值
- key: value
- ...
容器
在容器列表containers中的各项定义
常用参数
spec:
restartPolicy: Never
containers:
- name: string # 容器名称
# 镜像
image: string
imagePullPolicy: [Always| Never | IfNotPresent]
# 镜像拉取策略。Always:总是从远程拉取;Never:总是从本地拉取;IfNotPresent【默认选项】:本地不存在就远程拉取
# 启动参数
command: [string]
# 容器启动命令列表,相当于Dockerfile中的ENDRYPOINT,是唯一的。如果不指定,就是使用容器本身的。示例:["/bin/sh","-c"]
args: [string]
# 容器启动参数列表,相当于Dockerfile中的CMD,示例:["-c"]
# 容器工作目录
workingDir: string
# 环境变量
env:
- name: string # 变量名称
value: * # 变量值
- name: string
valueFrome: # 指定值的来源
configMapkeyRef: # 从ConfigMap中获取
name: string # 指定ConfigMap
key: string # 指定configMap中的key,赋值给变量
# 端口
ports: # 需要暴露的端口列表
- name: string # 端口名称
containerPort: int # 容器端口
hostPort: int # 容器所在主机需要监听的端口号,默认为与容器IP相同,一般可以不设置
protocol: string # 端口协议,支持TCP和UDP,默认为TCP
# 挂载
volumeMounts: # 挂载定义的存储卷到容器,需要通过volumes定义
- name: string # 定义的volume的名称
mountPath: string # 容器内挂载的目录的绝对路径(少于512字符)
readOnly: boolean(布尔值) # 是否只读
imagePullPolicy 镜像拉去方式配置
- 支持三种ImagePullPolicy
- Always:不检查本地是否存在镜像,总是从远程拉取
- Never:总是使用本地镜像,而不从远程拉取
- IfNotPresent:**【默认选项】**优先使用本地镜像,如果本地没有,就从远程拉取
- 默认为IfNotPresent,但:latest标签的镜像默认为Always。
- 拉取镜像时docker会进行校验,如果镜像中的MD5码没有变,则不会拉取镜像数据。
- 生产环境中应该尽量避免使用:latest标签, 而开发环境中可以借助:latest标签自动拉取最 新的镜像。
restartPolicy 容器重启策略
- 支持三种RestartPolicy
- Always:不管因为什么原因,只要Pod退出,就会自动重启
- OnFailure:失败退出(exit code不等于0)时重启
- Never:只要退出就不再重启(Job和CronJob资源对象一般配置为Never)
- 注意事项:
- 重启是指在Pod所在Node上面本地重启, 并不会调度到其他Node上去
- 并不是所有控制器都支持以上三种策略
dnsPolicy DNS策略配置
- 通过设置dnsPolicy参数, 设置Pod中容器访问DNS的策略
- ClusterFirst:pod启动时为其配置集群内部的DNS 【默认配置参数】
- Default:pod启动时为其配置宿主机的DNS
- None:不使用任何dns策略,用户需要自己为该Pod定义dns ,可做如下配置
spec:
dnsPolicy:None
dnsConfig:
nameservers:
- 223.5.5.5
- 8.8.8.8
options:
- name:timeout
value:"1"
- name:signale-request-reopon
- **ClusterFirstWithHostNetwork**
hostNetwork 网络配置
- hostNetwork只有两个值
- true:使用宿主机ip
- false:集群分配ip**【默认值】**
apiVersion: v1
kind: Pod
metadata:
name: more-containers
namespace: cka
labels:
name: more-containers
spec:
restartPolicy: Always
hostNetwork: false
containers:
- image: nginx:1.21
name: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: bb
initContainers 容器初始化
- InitContainer在所有容器运行之前执 行(run-to-completion),常用来初始化配置。
- 初始化容器一定会先于主容器启动
- 初始化容器执行的任务不能是一个长时的任务
- 初始化容器只有正常退出之后主容器才能启动
- 初始化容器可以有多个,这多个初始化容器会顺序启动,并且全部正常退出之后,主容器才能启动
- 初始化容器主要是在主容器启动之前为主容器做准备工作
- 配置示例
apiVersion: v1
kind: Pod
metadata:
name: webserver-initcontainers
namespace: cka
labels:
name: webserver-initcontainers
spec:
restartPolicy: Always
volumes:
- name: datadir
emptyDir: {}
initContainers:
- image: busybox:1.28
name: busybox
volumeMounts:
- name: datadir
mountPath: /tmp/xxx
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
args:
- "echo 'hello initcontainer' > /tmp/xxx/index.html"
- image: busybox:1.28
name: busybox-init
volumeMounts:
- name: datadir
mountPath: /tmp/xxx
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
args:
- "echo 'two initcontainers' > /tmp/xxx/aaa.html"
containers:
- image: nginx:1.21
name: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: datadir
mountPath: /usr/share/nginx/html
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: bb
资源配额
- pod的优先级:
- QoS Class: BestEffort
- QoS Class: Burstable
- QoS Class: Guaranteed
- 资源和请求的限制卸载resource下面
- limits: 当前容器的最大资源使用量
- 如果使用的cpu超出了限制,会触发cpu限流
- 如果使用的memory超出了限制,会触发oom
- requests: 当前容器占用的最小资源,这个配置是给调度器看的
- 当requests = limits时,则Guaranteed,当出现资源不足时,kubernetes会优先保证这种pod的资源使用
- 但是requests和limits不相等时,则Burstable
- 没有配置resources,则BestEffort
- limits: 当前容器的最大资源使用量
resources:
#0.05 32Mi
# 在宿主机上,0.05核和96Mi是空闲的, 但是在调度器的眼里,这个pod跑满了0.1核128Mi
requests:
cpu: "0.1" 0.05
memory: 128Mi 96Mi
limits:
cpu: "200m"
memory: 256Mi
# 还可以写成如下的形式
# one:只配置limits,此时 requests=limits
resources:
limits:
cpu: "1"
memory: 1Gi
# two
resources:
requests:
cpu: "100m"
memory: 128Mi
limits:
cpu: "200m"
memory: "256Mi"
# three:只配置requests
resources:
requests:
memory: 32Mi
- 相关参数解析
# 资源和请求的设置
resource:
limits: # 资源限制
cpu: string # CPU限制。两种方式可以直接指定使用核数,也可以用单位:m来指定。
# 0.5 :相当于0.5颗
# 一台服务器的CPU总量等于核数乘以1000。设机器的核数为两核,则总量为2000m。此时设置CPU限制为100m,则相当于是使用了100/2000,也就是5%。此时0.5=500m
memory: string # 内存限制。
# 单位:直接使用正整数表示Byte;k;m;g;t;p
# 不区分大小写(Kilobyte,Megabyte,Gigabyte,Terabyte,Petabyte)
requests: # 资源请求设置,也就是容器启动时的初始资源请求,一般和limits相同可不设
cpu: string
memory: string
健康检查
- 三种探针来检查容器的健康状态
- **startupProbe: **用于在启动阶段探活,其预期探活失败, 如果发现探活成功,则认为pod已经正常启动,此时startupProbe的使命结束,退出不再执行;如果最终失败,则pod无法就绪
- **livenessProbe: **在starupProbe正常退出后,才会启动,用于周期性探活,其预期探活会成功, 如果失败,则杀掉pod,重新启动
- **readinessProbe: **在startupProbe正常退出后,才会启动。用于周期性探活,其预期探活会成功,如果失败,则将pod标记为不健康
- 参数解析
livenessProbe: # 如果探测失败会重启容器
exec: # 通过在容器内执行命令或脚本的方式,命令执行状态码为0,视为探测成功
command: [string]
httpGet: # 通过http get的方式访问容器IP地址,并指定端口和路径,如果响应码会2xx或3xx视为成功
path: string # 访问路径,也就是UPI示例:/index.html
port: number # 访问端口
host: string # 访问的主机名,默认为容器IP,可不设
scheme: string # 用于连接的协议,默认为http,可不设
httpHeaders: # 自定义请求头
- name: string # 名称
value: string # 值
tcpSocket: # 通过tcp协议对端口进行检测如果端口可以连通就视为检测成功
port: number
# 检测参数配置
initialDelaySeconds: number # 初始延迟秒数,也就容器启动多久后开始检测
timeoutSeconds: number # 响应超时时间
periodSeconds: number # 检测周期,也就检测时间间隔
- 配置示例
apiVersion: v1
kind: Pod
metadata:
name: webserver-health
namespace: cka
labels:
name: webserver-health
spec:
tolerations:
- operator: Exists
restartPolicy: Always
hostNetwork: false
volumes:
- name: datadir
emptyDir: {}
initContainers:
- image: busybox:1.28
name: busybox
volumeMounts:
- name: datadir
mountPath: /tmp/xxx
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
args:
- "echo 'hello initcontainer' > /tmp/xxx/index.html"
containers:
- image: nginx:1.21
name: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: datadir
mountPath: /usr/share/nginx/html
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: bb
startupProbe:
tcpSocket:
port: 80
periodSeconds: 10
failureThreshold: 30
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 5
livenessProbe:
httpGet:
path: /
scheme: HTTP
port: 80
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
httpGet:
path: /healthz
scheme: HTTP
port: 80
periodSeconds: 1
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
存储卷
- 容器的数据无法持久化
- hostPath: 将宿主机的目录挂载至容器的指定路径,如果一个pod在多个主机之间发生调度时,hostPath的数据是无法共享的。
- emptyDir: 临时存储,存储在emptyDir当中的数据也不具备持久化的能力;emptyDir会随着pod的销毁而自动删除。
- 主要使用的场景
- 一个pod当中的多个容器共享同一份数据,而这个数据又不需要持久化
- 缓存: emptyDir可以被定义为一个内存型存储,用于提供数据缓存
- 主要使用的场景
- 相关参数说明
spec:
volumes: # 存储卷有多种类型,以下为一些常用类型
- name: string # 存储卷名称
emptyDir: {} # 该类存储卷是临时生成的一个目录,与pod生命周期同步
- name: string
hostPath: # 挂载宿主机的目录
path: string # 用于挂载的目录
- name: string
nfs:
server: string # 服务IP地址
path: string # 用于挂载的目录
- name: string
persistentVolumeClaim: # 调用已经创建的持久卷
claimName: string # 持久卷声明的名称
- name: string
configMap: # 挂载ConfigMap到容器内
name: string # ConfigMap的名称
items: # 要调用的键,值会被写入文件,可以设定多个,在被volumeMounts调用时,这些文件会被一起放在挂载目录下,也可以挂入到一个文件
- key: string
path: string # 文件名
- name: string
secret: # 挂载secret到容器内
secretname: string
items:
- key: string
path: string
- 示例
apiVersion: v1
kind: Pod
metadata:
name: webserver-emptydir-cache
namespace: cka
labels:
name: webserver-emptydir-cache
spec:
dnsPolicy: None
dnsConfig:
nameservers:
- 223.5.5.5
- 8.8.8.8
options:
- name: timeout
value: "1"
- name: single-request-reopen
- name: ndots
value: "3"
restartPolicy: Always
hostNetwork: false
volumes:
- name: datadir
hostPath:
path: /data/website
- name: cachedir
emptyDir:
medium: Memory
sizeLimit: 32Mi
- name: tmpdir # 临时目录
emptyDir: {}
containers:
- image: nginx:1.21
name: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: datadir
mountPath: /usr/share/nginx/html
- name: cachedir
mountPath: /tmp/xxx
- name: tmpdir
mountPath: /tmp/yyy
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: bb
其它
spec:
restartPolicy: [Always|Never|OnFailure] # 重启策略 # OnFailure:只有在pod为非0码退出时才重启
nodeSelector: # 根据标签调度到的指定node节点,使用前需要对节点打标签
key: value # 使用命令kubectl label nodes node-name key=value
imagePullSecrets: # 指定镜像拉取时使用账户密码。需要先保存到Secret中
- name: string
hostNetwork: false # 是否使用主机网络,默认为false
静态pod
-
kubelet: 调用containerd运行容器的,从master获取要运行的容器,在本地运行。
-
kubelet可以不依赖master而独立运行;我们可以直接调用kubelet创建pod, 这种绕过master直接向kubelet请求创建的Pod,被称之为静态Pod。
-
静态pod是被kubelet直接创建的,它无法接受master的调度,k8s集群中默认有如下静态pod
- etcd
- kube-apiserver
- kube-controller-manager
- kube-scheduler
-
kubeadm初始化集群的方式就是借助了静态Pod的方式将容器运行在kubelet管理的静态Pod中
-
**由于静态Pod只受所在节点的kubelet控制,可以有效预防通过kubectl、或管理工具操作的误删除,可以用来部署核心组件应用。保障应用服务总是运行稳定数量和提供稳定服务 **
-
静态pod的默认存放路径为**:/etc/kubernetes/manifests/**
![image.png](https://img-blog.csdnimg.cn/img_convert/15b8f44ba5b519d1e9bd02862d75a4d2.png#clientId=ue703e4b4-06a0-4&from=paste&height=98&id=u3685d915&margin=[object Object]&name=image.png&originHeight=196&originWidth=761&originalType=binary&ratio=1&size=26116&status=done&style=none&taskId=u8a097be1-b3de-4b6a-869f-731f70c5acd&width=380.5)
-
**创建静态Pod的方式有两种: 配置文件、HTTP **
-
配置文件
- 以配置文件方式部署静态Pod,需要开启kubelet组件的 –pod-manifest-path= 参数,来配置静态Pod的配置文件目录。配置文件是以标准的JSON 或 YAML 格式定义的Pod。kubelet会定期扫描静态配置文件目录,根据这个目录添加和移除的JSON或YAML文件来启动和删除静态Pod。
- 如果把 pod的yaml描述文件放到 这个目录中,等kubelet扫描到文件,会自动在本机创建出来 pod;
- 如果把 pod的yaml文件更改了,kubelet也会识别到,会自动更新 pod;
- 如果把 pod的yaml文件删除了,kubelet会自动删除掉pod;
- 因为静态pod 不能被 api-server 直接管理,所以它的更新删除操作不能由 kubectl 来执行,只能直接修改或删除文本文件。
- 以配置文件方式部署静态Pod,需要开启kubelet组件的 –pod-manifest-path= 参数,来配置静态Pod的配置文件目录。配置文件是以标准的JSON 或 YAML 格式定义的Pod。kubelet会定期扫描静态配置文件目录,根据这个目录添加和移除的JSON或YAML文件来启动和删除静态Pod。
-
HTTP
- Kubelet周期地从 --manifest-url 参数指定的地址下载文件,并且把它翻译成JSON/YAML格式的pod定义。此后的操作方式与 --pod-manifest-path相同,kubelet会不时地重新下载该文件,当文件变化时对应地终止或启动静态pod
-
使用pod yaml文件创建容器
- 编写yaml文件
apiVersion: v1
kind: Pod
其它
creationTimestamp: null
labels:
run: wgtest
name: nginxtest
spec:
containers:
- image: nginx:1.21
labels:
- 使用yaml文件创建容器
kubectl apply -f nginx.yaml
创建容器
kubectl run webserver --image=nginx:1.21
查看容器详情
kubectl describe po webservice
[root@k8s01 ~]# kuberctl run webservice --image=nginx:1.21
-bash: kuberctl: command not found
[root@k8s01 ~]# kubectl run webservice --image=nginx:1.21
pod/webservice created
[root@k8s01 ~]# kubectl describe po webservice
Name: webservice
Namespace: default
Priority: 0
Node: k8s03/172.16.16.6
Start Time: Thu, 17 Mar 2022 15:42:55 +0800
Labels: run=webservice
Annotations: cni.projectcalico.org/containerID: 977ffdc7825ff1653b6cee63bb09b68 4a5fe798d6a6626a690dbedc64196c2a7
cni.projectcalico.org/podIP: 10.244.235.129/32
cni.projectcalico.org/podIPs: 10.244.235.129/32
Status: Pending
IP:
IPs:
Containers:
webservice:
Container ID:
Image: nginx:1.21
Image ID:
Port:
Host Port:
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment:
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-k4n5v ( ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
kube-api-access-k4n5v:
Type: Projected (a volume that contains injected data fro m multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional:
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists fo r 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
Normal Scheduled 20s default-scheduler Successfully assigned default/webs ervice to k8s03
Normal Pulling 19s kubelet Pulling image “nginx:1.21”
[root@k8s01 ~]# kubectl describe po webservice
Name: webservice
Namespace: default
Priority: 0
Node: k8s03/172.16.16.6
Start Time: Thu, 17 Mar 2022 15:42:55 +0800
Labels: run=webservice
Annotations: cni.projectcalico.org/containerID: 977ffdc7825ff1653b6cee63bb09b684a5fe798d6a6626a690dbedc64196c2a7
cni.projectcalico.org/podIP: 10.244.235.129/32
cni.projectcalico.org/podIPs: 10.244.235.129/32
Status: Running
IP: 10.244.235.129
IPs:
IP: 10.244.235.129
Containers:
webservice:
Container ID: containerd://f16e8ec598f85340489875e166c3d30927a1ac2b6b4108ee937b907425355bc9
Image: nginx:1.21
Image ID: docker.io/library/nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Port:
Host Port:
State: Running
Started: Thu, 17 Mar 2022 15:43:17 +0800
Ready: True
Restart Count: 0
Environment:
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-k4n5v (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-k4n5v:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional:
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
** Type Reason Age From Message**
** ---- ------ ---- ---- -------**
** Normal Scheduled 46s default-scheduler Successfully assigned default/webservice to k8s03**
** Normal Pulling 45s kubelet Pulling image “nginx:1.21”**
** Normal Pulled 24s kubelet Successfully pulled image “nginx:1.21” in 21.34189988s**
** Normal Created 24s kubelet Created container webservice**
** Normal Started 24s kubelet Started container webservice**