K8s-Pod
Pod是一组容器(一个或者多个),是k8s中的最小调度单位,可以把Pod理解为传统的虚拟机,Pod中的容器就是虚拟机中运行的进程,k8s无法直接操作和调度容器,只能通过编排Pod来调度容器,Pod为其中运行的容器提供共享的网络,存储和命名空间
基础结构
网络
Pod中的容器共享Pod的网络资源:
- 一个Pod只有一个IP地址,Pod中的容器共享该Pod的IP地址和端口
Pod中容器间的通信:
- 通过共享卷通信
- 使用主机中的一个共享目录作为通信,pod中的一个容器向共享卷中写入数据,其他容器读取共享卷中的数据
- 进程间通信(IPC)
- Pod中的容器共享同一个IPC命名空间,这意味着它们可以使用标准的进程间通信方式来互相通信,比如SystemV信号量和POSIX共享内存。
- 容器间的网络通信
- Pod中的容器可以通过“localhost”来互相通信,因为他们使用同一个网络命名空间。而且,对容器来说,hostname就是Pod的名称。因为Pod中的所有容器共享同一个IP地址和端口空间,你需要为每个需要接收连接的容器分配不同的端口。也就是说,Pod中的应用需要自己协调端口的使用。
存储
Pod 可指定一组存储卷,Pod 中多容器均可以访问该存储卷,以便互相共享数据,Pod 中的共享卷可以持久保存,防止容器重启丢失数据
实践
发布一个pod
编写pod的yaml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
# 指定镜像
image: nginx:alpine
# 指定暴露端口
ports:
- containerPort: 80
根据配置文件部署pod
kubectl apply -f nginx.yaml
查看pod运行状态:如果状态是running,则pod部署成功
kubectl get pods
使用-o wide可获取到nginx这个pod的ip
kubectl get pods nginx -o wide
每个 pod 都有一个IP地址,直接访问IP地址获取内容
通过kubectl exec
可以进入到Pod内部,如果 Pod 中有多个容器,使用kubectl exec -c
指定容器
kubectl exec -it nginx sh
可以看到nginx已经暴露了80端口
netstat -tan
访问下nginx
wget -q -O - localhost
Deployment
在K8s中编排应用可以更好的做弹性扩容,负载均衡,竟然要做负载均衡,那么一个Pod是不够的,需要部署多个pod
在k8s中管理Pod的成为controller,可以使用Deployment这种controller对pod进行扩容,回滚,滚动升级等
发布一个deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment # deployment名称
spec:
selector:
matchLabels:
app: nginx # service负载均衡的选择标签
replicas: 3 # 部署的pod数量
template: # 指定部署的pod
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
发布:
kubectl apply -f nginx-deployment.yaml