目录
零、原理
创建
删除
一、命令行创建
创建
删除
二、配置文件创建
创建
删除
零、原理
创建
- kubectl向api server发起一个create pod请求
- apiserver接收到pod创建请求后,不会去直接创建pod,而是生成一个包含创建信息的yaml
- apiserver将刚才的yaml信息写入etcd数据库。到此为止仅仅是在etcd中添加了一条记录,还没有任何的实质性进展
- scheduler查看k8sapi,类似于通知机制。首先判断:pod.spec.Node==null?若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node。然后将信息在etcd数据库中更新分配结果:pod.spec.Node=nodeA(设置一个具体的节点)
- kubelet通过监测etcd数据库(即不停地看etcd中的记录),发现apiserver中有了个新的Node;如果这条记录中的Node与自己的编号相同(即这个Pod由scheduler分配给自己了);则调用node中的dockerapi,创建container。
删除
- 当用户执行kubectl delete pod命令时(实际上是带grace-period=30s),实际上是访问kube-apiserver的DELETE接口(此时业务逻辑做的只是更新Pod对象的元信息(DeletionTimestamp字段和DeletionGracePeriodSeconds字段),并没有在etcd中删除记录)
- 此时kubectl命令的执行会阻塞并显示正在删除pod
- 当kubelet组件监听到Pod对象的更新事件,则开始执行响应的回调方法(因为存在DeletionTimestamp字段,业务逻辑中会执行killPod()方法)
- 之后kubelet会监听到pod的删除事件,则调用相应的回调方法(访问kube-apiserver的DELETE接口,并且带grace-period=0),此时kube-apiserver的DELETE接口会去etcd中删除pod对象,此时用户kubectl get pod则才真正看不见pod对象,因为记录真的是被删除了
创建Pod分为两种方法:命令行创建和配置文件创建
一、命令行创建
创建
以ngx举例,创建了一个名称叫做 mynginx 的pod:
kubectl run mynginx --image=nginx
查看default名称空间的Pod:
kubectl get pod
查看具体信息:
kubectl describe pod mynginx
查看Pod的运行日志:
kubectl logs mynginx
这时候已经可以去看docker里面的运行容器了,但是因为我们不知道这个ngx的任务会被分配给哪一个node节点,所以去每一个节点下都去看一眼:
docker ps|grep mynginx
k8s都会每个Pod分配一个ip:
kubectl get pod -owide
使用Pod的ip+pod里面运行容器的端口(直接用上图中给出的IP):
curl 192.168.194.66
使用k8s进入pod:
kubectl exec -it mynginx -- bash
删除
至此命令行创建pod就结束了。用完删了就行:
kubectl delete pod mynginx
二、配置文件创建
创建
vim pod.yaml
内容如下(一定要注意格式,多空格都不行):
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
# namespace: default
spec:
containers:
- image: nginx
name: mynginx
运行:
kubectl apply -f pod.yaml
kubectl describe pod
kubectl get pod
删除
使用配置文件删除:
kubectl delete -f pod.yaml