Pod是Kubernetes调度的最小单元。一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机。Pod的设计理念是为了支持多个容器在一个Pod*享网络和文件系统。因此处于一个Pod中的多个容器共享以下资源:
- PID命名空间:Pod中不同的应用程序可以看到其他应用程序的进程ID。
- network命名空间:Pod中多个容器处于同一个网络命名空间,因此能够访问的IP和端口范围都是相同的。也可以通过localhost相互访问。
- IPC命名空间:Pod中的多个容器共享Inner-process Communication命名空间,因此可以通过SystemV IPC或POSIX进行进程间通信。
- UTS命名空间:Pod中的多个容器共享同一个主机名。
- Volumes:Pod中各个容器可以共享在Pod中定义分存储卷(Volume)。
pod常用操作
[root@server2 calio]# kubectl get namespaces
NAME STATUS AGE
default Active 4d
kube-node-lease Active 4d
kube-public Active 4d
kube-system Active 4d
metallb-system Active 23h
创建demo pod
[root@server2 calio]# kubectl run demo --image=myapp:v1
pod/demo created
查看 pod
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 116s
查看指定 pod
[root@server2 ~]# kubectl describe pod demo
列出Pod以及运行Pod节点信息。
[root@server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 4m36s 10.244.22.0 server4 <none> <none>
查看flannel环境
[root@server2 ~]# cat /var/run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
删除demo pod
[root@server2 ~]# kubectl delete pod demo
pod "demo" deleted
部署两个以demo命名的pod
[root@server2 ~]# kubectl create deployment demo --image=myapp:v1 --replicas=2
[root@server2 ~]# kubectl get pod -o wide
查看所有资源信息
子节点被删除后,rs会自动生成新的副本替代,保证规定节点数量
ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。
[root@server2 ~]# kubectl delete pod/demo-5b4fc8bb88-cjbgv
[root@server2 ~]# kubectl get pod -o wide
使用NodePort类型暴露端口,让外部客户端访问Pod
测试负载均衡
[root@server2 ~]# kubectl expose deployment demo --port=80 --target-port=80
[root@server2 ~]# kubectl get all
[root@server2 ~]# curl 10.109.59.20/hostname.html
查看demo资源信息
[root@server2 ~]# kubectl describe svc demo
##输出指定的一个/多个资源的详细信息。
查看replicasets信息
[root@server2 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-5b4fc8bb88 2 2 2 33m
集群拉伸,修改pod内节点部署数量
[root@server2 ~]# kubectl scale deployment demo --replicas=5
deployment.apps/demo scaled
版本升级
[root@server2 ~]# kubectl set image deployment demo myapp=myapp:v2
版本回滚
[root@server2 ~]# kubectl rollout undo deployment demo --to-revision=1
deployment.apps/demo rolled back
删除 demo pod
kubernetes 可能会产生垃圾或者僵尸pod,在删除rc的时候,相应的pod没有被删除,手动删除pod后会自动重新创建,这时一般需要先删除掉相关联的resources
[root@server2 ~]# kubectl get deployment
[root@server2 ~]# kubectl delete deployment demo
[root@server2 ~]# kubectl get pod
资源配置清单
在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单
资源清单格式
参数名(字段类型) 说明 api-version(String) k8s api的版本,目前基本是V1,可以使用kubectl api-versions命令查询 kind(String) yaml文件定义的资源类型和角色,,比如Pod metadata(Object) 元数据对象,固定值就写metadata metadata.name(String) 元数据对象的名字,由我们编写,如定义Pod的名 metadata.namespace 元数据对象的命名空间,由我们自身定义 spec(Object) 详细定义对象,固定值就写Spec spec.containers[](list) Spec对象的容器列表定义,是个列表 spec.containers[].name(String) 定义容器的名字 spec.containers[].image(String) 容器用到的镜像名称
资源清单可以一次性创建多个容器,组内成员共享网络
[root@server2 pot]# kubectl apply -f pots.yaml
pod/pod-example created
[root@server2 pot]# cat pots.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true
[root@server2 pot]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-example 2/2 Running 0 2m55s
成员可以相互通信
进入交互界面,查看ip,直接访问本地,可以获取nginx成员的默认发布页面,说明共用一个ip
[root@server2 pot]# kubectl attach pod-example -c busybox -it
进入busybox 内部查看
设置cpu以及内存大小
[root@server2 pot]# cat pots.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
resources: #限制 requests最小要求 limits最大限制
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true
[root@server2 pot]# kubectl apply -f pots.yaml
pod/pod-example created
指定部署主机
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
nodeName: server4 指定hostname安装
containers:
- name: myapp
image: myapp:v1
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true