Pod基本概念
最小部署单元 一组容器的组合 一个Pod中的容器共享网络命名空间与存储 Pod是短暂的
Pod为亲密性应用而存在
亲密性应用场景
- 两个应用之间发生文件交互
- 两个应用要通过127.0.0.1或socket通信
- 两个应用需要发送频发的调用
Pod实现机制
共享网络
共享存储
实例,查看网络共享是怎么实现的
导出已经运行的模板
首先查看运行的pod
kubectl get pods
导出pod模板为yaml文件
kubectl get pods java-demo-b76fc7876-5qjgn -o yaml>pod.yaml
内容如下
apiVersion: v1 kind: Pod metadata: creationTimestamp: "2019-12-24T02:23:16Z" generateName: java-demo-b76fc7876- labels: app: java-demo pod-template-hash: b76fc7876 name: java-demo-b76fc7876-5qjgn namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: java-demo-b76fc7876 uid: cda02c20-8619-44ef-adad-892ed4bc731d resourceVersion: "735811" selfLink: /api/v1/namespaces/default/pods/java-demo-b76fc7876-5qjgn uid: 07a0a636-62d5-44bf-8bc6-0224fbf01cf2 spec: containers: - image: yueming33990/java-demo imagePullPolicy: Always name: java-demo resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: default-token-44pnx readOnly: true dnsPolicy: ClusterFirst enableServiceLinks: true nodeName: k8s-node2 priority: 0 restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: default serviceAccountName: default terminationGracePeriodSeconds: 30 tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 volumes: - name: default-token-44pnx secret: defaultMode: 420 secretName: default-token-44pnx status: conditions: - lastProbeTime: null lastTransitionTime: "2019-12-24T02:23:16Z" status: "True" type: Initialized - lastProbeTime: null lastTransitionTime: "2019-12-24T02:25:46Z" status: "True" type: Ready - lastProbeTime: null lastTransitionTime: "2019-12-24T02:25:46Z" status: "True" type: ContainersReady - lastProbeTime: null lastTransitionTime: "2019-12-24T02:23:16Z" status: "True" type: PodScheduled containerStatuses: - containerID: docker://f73622a1a10253a36ec01521071fa5fecf5bdec83217a18403001a51b6a821a9 image: yueming33990/java-demo:latest imageID: docker-pullable://yueming33990/java-demo@sha256:c1d14557eaa5da1604447d6ce8538aa01411c0b85fc47b512c3eadeb11b620cf lastState: {} name: java-demo ready: true restartCount: 0 state: running: startedAt: "2019-12-24T02:25:46Z" hostIP: 192.168.1.13 phase: Running podIP: 10.244.2.4 qosClass: BestEffort startTime: "2019-12-24T02:23:16Z"
去除不需要的字段修改
apiVersion: v1 kind: Pod metadata: labels: app: my-pod name: my-pod namespace: default spec: containers: - image: nginx name: nginx image: nginx - image: java-demo name: java image: lizhenliang/java-demo:latest
启动
kubectl apply -f pod.yaml
查看是否启动
kubectl get pods
因为yaml定义了两个容器所以启动了两个容器
进入其中一个容器
kubectl exec -it my-pod -c java bash
java是刚刚命名的名字,bash是解释器
查看进程运行了java
ps -ef
查看分配的ip
进入nginx容器 查看ip 与java里面的ip是一样的
kubectl exec -it my-pod -c nginx bash
安装ifconfig工具
apt-get update
需要更新一下才能安装ifconfig工具
apt-get install net-tools/stable
查看ip ip和mac地址都和容器java是一样的
网络使用命名空间共享
存储共享通过数据卷的方式
需要持久的数据
- 临时数据
- 日志
- 数据库data
当有状态的应用pod需要偏移时可以保证数据的持久
删除已经运行的my-pod
kubectl delete pod my-pod
编辑emtydir.yaml
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: write image: centos command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"] volumeMounts: - name: data mountPath: /data - name: read image: centos command: ["bash","-c","tail -f /data/hello"] volumeMounts: - name: data mountPath: /data volumes: - name: data emptyDir: {}
该pod创建了两个容器,两个都是centos一个是写一个是读,写的产出数据,写到当前容器的/data/hello文件中
volumes定义一个empty 会在当前节点创建一个空目录,让两个容器都挂载该空目录,一个往空目录里面写,另外一个往空目录读取
运行
kubectl apply -f emtydir.yaml
查看是否启动
kubectl get pods
分别进入容器查看文件
kubectl exec -it my-pod -c write bash kubectl exec -it my-pod -c read bash
也可以通过查看容器read的日志查看
kubectl logs my-pod -c read
会不停地运行这个写入及输出的过程
Pod容器分类与设计模式
Infrastructure Container:基础容器 维护整个Pod网络空间 InitContainer:初始化容器 先于业务容器开始执行 Containers: 业务容器 并行启动
首先创建Infrastructure容器 再创建初始化容器 再创建业务容器
Pod Template常用功能字段解析
- 变量
- 拉取镜像
- 资源限制
- 健康检查