k8spod详解其一

Pod是k8s中最小的创建与运行单元,一个pod包含一个根容器/父容器/基础容器,一个或多个应用容器/业务容器。Pod里容器共享network UTS与IPC命名空间。

一,K8s创建的pod分为两种:

        1,自主式/静态pod:不被控制器管理的pod,没有自愈能力,一旦pod挂掉,不会被重新拉起。而且副本数量也不会因为达不到期望值而创建新的pod。

        2,控制器管理pod:被控制器管理的pod,有自愈能力,一旦pod挂掉就会重新拉起。副本数量达不到期望则创建新的pod。

二,Pause容器两大功能:

        1,给pod中的所有应用容器提供一个网络(共享ip)和存储(共享存储)资源共享。

        2,作为PID-1的进程(init),管理整个pod容器组的生命周期。

三,三种容器类型:

        1,基础容器:维护整个pod网络和存储空间。

//启动一个Pod时,k8s会自动启动一个基础容器
cat /opt/kubernetes/cfg/kubelet
......
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"

//每次创建 Pod 时候就会创建,运行的每一个Pod都有一个 pause-amd64 的基础容器自动会运行,对于用户是透明的
docker ps -a
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   "/pause"

        2,初始化容器(init容器):阻塞或者延迟应用容器的启动,可以为应用容器实现提供好运行环境和工具。多个init容器串行启动,每个init容器都必须在下一个init容器启动前完成启动和退出。

        3,应用容器(main容器):在所有init容器成功启动和退出后应用容器才会启动,并行启动,提供应用程序业务。

/并行启动

官网示例:
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

这个例子是定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待 mydb 启动。 一旦这两个 Init容器都启动完成,Pod 将启动 spec 中的应用容器。

kubectl describe pod myapp-pod

kubectl logs myapp-pod -c init-myservice

vim myservice.yaml
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
	
kubectl create -f myservice.yaml

kubectl get svc

kubectl get pods -n kube-system

kubectl get pods

vim mydb.yaml
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377
	
kubectl create -f mydb.yaml

kubectl get pods

四,Pod镜像拉取策略(imagepullpolicy):

        IfNotPresent:优先使用本地已存在的,若没有就从仓库拉取

        Always:无论本地有没有,总是从仓库拉取

        Never:总是不从仓库拉取

kubectl apply -f - <

//在任意 node 节点上使用 curl 查看头部信息
curl -I http://172.17.36.4
HTTP/1.1 200 OK
Server: nginx/1.14.2
......

五,Pod重启策略(restartoilicy):

        Always:容器退出总是重启容器,不管状态码

        Never:从不重启,不管状态码

        OnFailure:仅在容器异常退出时(返回状态码为非0时)会重启策略

kubectl edit deployment nginx-deployment
......
 restartPolicy: Always


//示例
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30; exit 3


kubectl apply -f pod3.yaml

//查看Pod状态,等容器启动后30秒后执行exit退出进程进入error状态,就会重启次数加1
kubectl get pods
NAME                              READY   STATUS             RESTARTS   AGE
foo                               1/1     Running            1          50s


kubectl delete -f pod3.yaml

vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30; exit 3
  restartPolicy: Never
#注意:跟container同一个级别

kubectl apply -f pod3.yaml

//容器进入error状态不会进行重启
kubectl get pods -w

你可能感兴趣的:(kubernetes,容器,云原生)