- pod封装多个容器
[liwm@rmaster01 yaml]$ kubectl exec -it -c demo1 memory-demo bash - 执行yaml
kubectl apply -f pod.yaml - 查看pod的label
kubectl get pod —show-labels - apply更新本地的yaml,通过apply更新配置
kubectl apply -f pod.yaml - edit
kubectl edit pod memory-demo - patch
kubectl get pod memory-demo -o json
kubectl patch pod memory-demo -p ‘{“metadata”: {“labels”: {“app”: “damon”}}}’
Pods是kubernetes集群中最小的管理单元,Pod封装了应用程序的容器(或者,在某些情况下,多个容器),存储资源,唯一的网络IP以及管理容器应该如何运行的选项。<br />Kubernetes集群中的Pod可以以两种主要方式使用:<br />运行单个容器的Pod:“one-container-per-Pod”模型是最常见的Kubernetes用例;
在这种情况下,您可以将Pod视为单个容器的包装,而Kubernetes直接管理Pod而不是容器。
运行多个需要协同工作的容器的Pod:Pod可以封装由多个容器组成的应用程序,这些容器紧密耦合并需要共享资源。<br />如何管理多个容器?<br />网络:每个Pod都会分配唯一的IP地址。Pod中的每个容器都共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用相互通信localhost。当Pod中的容器与Pod
外部的实体通信时,必须协调它们如何使用共享网络资源(例如端口)。
存储:Pod可以指定一组共享存储卷
。Pod中的所有容器都可以访问共享卷,从而允许这些容器共享数据。如果需要重新启动其中一个容器,则卷还允许Pod中的持久数据存活。
pause容器:<br />每启动一个pod,同时也会启动一个伴随容器(pause容器),pause伴随着pod的启动而启动,pod的删除而删除。通过pause容器实现pod内的容器共享网络空间。<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/116294/1585038874031-e0211f37-c87e-4265-9867-69cb6de78da7.png#align=left&display=inline&height=147&name=image.png&originHeight=228&originWidth=347&size=33220&status=done&style=none&width=223) ![image.png](https://cdn.nlark.com/yuque/0/2020/png/116294/1585038881015-f337ff3a-7261-40e6-9010-cb9a0c6649d1.png#align=left&display=inline&height=131&name=image.png&originHeight=176&originWidth=279&size=68996&status=done&style=none&width=207)**<br />**<br />生命周期<br />![](https://cdn.nlark.com/yuque/0/2020/png/116294/1585195824775-4f4cf6f3-b095-4929-a227-82459859cb73.png#align=left&display=inline&height=212&originHeight=212&originWidth=787&size=0&status=done&style=none&width=787)<br />![](https://cdn.nlark.com/yuque/0/2020/png/116294/1585195878796-09d69272-edef-4552-bec9-377524da8f92.png#align=left&display=inline&height=436&originHeight=648&originWidth=932&size=0&status=done&style=none&width=627)<br />**<br />**Pods调度流程**<br />**<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/116294/1585038981412-59684857-7f1c-4d64-bfcb-a944f5b075d0.png#align=left&display=inline&height=311&name=image.png&originHeight=387&originWidth=733&size=55144&status=done&style=none&width=589)**<br />**<br />用户提交Create Pod的请求;<br />API
Server讲请求的信息写入到etcd,此时写入etcd的信息并没有Nodename;
API
Server与Scheduler通过watch机制监控到有新的Pod请求,根据请求的资源进行调度,调度成功后进行bind pod的操作,返回给API Server将分配的Nodename写入etcd中
API
Server与kubelet通过watch机制监控到有新的bound
Pod信息,调用Docker API执行docker run的操作
Sidecar—init container
**
Pod 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的
Init 容器。Init容器是一种专用的容器,在应用程序容器启动之前运行,一般包括一些应用镜像中不存在的实用工具和安装脚本。Init 容器与普通的容器非常类似,除了如下点:
Init 容器总是运行到成功完成为止。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 为 Never,它不会重新启动。
如果为一个 Pod 指定了多个 Init 容器,那些容器会按顺序一次运行一个。
每个 Init 容器必须运行成功,下一个才能够运行。 当所有的 Init 容器运行完成时,Kubernetes 初始化 Pod 并像平常一样运行应用容器。
应用场景:
进行应用的初始化,如,从git或svn拉取应用的最新配置或动态生成配置文件。
进行应用的依赖检查,如一些web服务,必须要数据库服务先启动,然后在去启动web服务,否则会启动失败,此时在web应用pod内定义一个init容器,通过init容器去对数据库容器进行检测,一旦检测到数据库容器启动成功,就启动web应用pod。
Static Pod
Static
Pods由特定节点上的kubelet守护进程直接管理,而不需要API Server进行管理。
kubelet监视每个静态Pod(如果它崩溃,则重新启动它)Static
Pods总是绑定到特定节点上的一个Kubelet。
Kubelet自动尝试在Kubernetes
API Server上为每个静态Pod创建一个镜像Pod。
这意味着运行在节点上的pod在API Server上是可见的,但不能从那里进行控制。
RKE部署kubernetes集群的Static Pod的存放路径默认为:/etc/kubernetes/manifests/
1 pod简略信息**
NAME: Pod名字
READY: Pod 是否为READY
STATUS: Pod状态
RESTARTS:容器的重启次数
AGE:生命周期
cat << EOF > nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
EOF
2 pods的生命周期
Pending 已创建pod、1个或多个容器的镜像没有创建和下载镜像的过程
Running pod内全部容器都已创建且至少有1个容器已经处于运行的状态、启动的状态或正在重启的状态
Succeeded pod内的容器成功运行后退出且不会再重启
Failed pod内的所有容器已退出且至少有一个容器退出为失败运行的状态
Unknown 无法获取到pod的状态
3 pod 重启策略(RestartPolicy) 默认值:Always
Always 容器启动失败时由kubelet自动重启此容器
OnFailure 当容器停止运行且退出码不为0时由kubelet自动重启此容器
Never 不管容器运行状态如何、kubelet都不会重启此容器
kubelet重启容器时间间隔以乘以2n计算 如:1 2 4 8
最长延迟5分钟且成功重启后10分钟后重置该时间
**资源对象镜像的下载策略
Always:每次都下载镜像(*默认)
Never:只使用本地镜像,从不下载
IfNotPresent:只有当本地没有的时候才下载镜像
cat << EOF > imagePullPolicy.yaml
apiVersion: v1
kind: Pod
metadata:
name: imagePullPolicy
spec:
containers:
- name: nginx
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
EOF
[liwm@rmaster01 ~]$ kubectl create -f imagepullpolicy.yaml
pod/imagepullpolicy created
[liwm@rmaster01 ~]$ kubectl get pod imagepullpolicy -o yaml |grep imagePull
imagePullPolicy: IfNotPresent
[liwm@rmaster01 ~]$ vim imagepullpolicy.yaml
[liwm@rmaster01 ~]$ kubectl delete pod imagepullpolicy
pod “imagepullpolicy” deleted
[liwm@rmaster01 ~]$ kubectl create -f imagepullpolicy.yaml
pod/imagepullpolicy created
[liwm@rmaster01 ~]$ kubectl get pod imagepullpolicy -o yaml |grep imagePull
imagePullPolicy: IfNotPresent
[liwm@rmaster01 ~]$ cat imagepullpolicy.yaml
apiVersion: v1
kind: Pod
metadata:
name: imagepullpolicy
spec:
containers:
- name: nginx
image: nginx:1.7.9
#imagePullPolicy: Always
#imagePullPolicy: IfNotPresent
[liwm@rmaster01 ~]$
4 初始化容器 initContainers
启动nginx之前 busybox使用wget创建一个访问主页
**
cat << EOF > nginx-install.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
annotations:
spec:
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- http://kubernetes.io
volumeMounts:
- name: workdir
mountPath: "/work-dir"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
dnsPolicy: Default
volumes:
- name: workdir
emptyDir: {}
EOF
**
[liwm@rmaster01 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 3m23s 10.42.4.125 node01
[liwm@rmaster01 ~]$ curl 10.42.4.125
cat << EOF > initcontainers.yaml
apiVersion: v1
kind: Pod
metadata:
name: init-test
labels:
app: myapp
spec:
containers:
- name: container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-test
image: busybox:1.28
command: ['sh', '-c', 'echo init containers test && sleep 10']
EOF
5 pod容器共享Volume
cat << EOF > volume-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-pod
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
volumeMounts:
- name: app-logs
mountPath: /usr/local/tomcat/logs
- name: busybox
image: busybox
command: ["sh", "-c", "tail -f /logs/catalina*.log"]
volumeMounts:
- name: app-logs
mountPath: /logs
volumes:
- name: app-logs
emptyDir: {}
EOF
[liwm@rmaster01 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
volume-pod 2/2 Running 0 3m38s
查看tomcat的日志
[liwm@rmaster01 ~]$ kubectl exec -it volume-pod -c tomcat — ls /usr/local/tomcat/logs
catalina.2020-03-21.log localhost_access_log.2020-03-21.txt
host-manager.2020-03-21.log manager.2020-03-21.log
localhost.2020-03-21.log
[liwm@rmaster01 ~]$ kubectl exec -it volume-pod -c tomcat — ls /usr/local/tomcat/logs/catalina.2020-03-21.log
/usr/local/tomcat/logs/catalina.2020-03-21.log
[liwm@rmaster01 ~]$ kubectl exec -it volume-pod -c tomcat — tail /usr/local/tomcat/logs/catalina.2020-03-21.log
21-Mar-2020 13:01:47.293 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
[liwm@rmaster01 liwm]$ kubectl exec -it volume-pod -c busybox — tail /logs/catalina.2020-03-22.log
使用busybox查看tomcat的日志
[liwm@rmaster01 ~]$ kubectl logs volume-pod busybox
6 一个pod里可以有多个容器
cat << EOF > memory-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: demo1
image: polinux/stress
imagePullPolicy: IfNotPresent
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
- name: demo2
image: polinux/stress
imagePullPolicy: IfNotPresent
#command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
EOF
pod封装多个容器
[liwm@rmaster01 yaml]$ kubectl exec -it -c demo1 memory-demo bash
[liwm@rmaster01 yaml]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 1/2 CrashLoopBackOff 5 4m1s
[liwm@rmaster01 yaml]$ kubectl exec -it -c demo1 memory-demo — ls /
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
[liwm@rmaster01 yaml]$
7 apply、edit与patch的使用