K8S 中有各种各样的组件,对于容器来说 K8S 的最小单元由 Pod 进行组成,它封装了一个或多个应用程序的容器、存储资源、网络 IP 以及管理容器的选项。
简介
Pod 标示的是一个部署单元,可以理解为 K8S 中应用程序的单个实例,它可能由单个容器组成,也可能由少量紧密耦合并共享资源的容器组成。
创建 Pod
这里通过创建一个简单的 Alpine 服务为例,可以提前通过 docker pull alipine
下载镜像,然后创建 pod.yaml
文件。
apiVersion: v1
kind: Pod # 类别信息
metadata: # 基本信息
namespace: demons
name: foobar
labels:
os: alpine
spec: # 容器信息,可以包含多个容器
containers:
- name: hello
image: alpine
env:
- name: Test
value: "123456"
resources:
requests:
cpu: 2
memory: 1Gi
limits:
cpu: 2
memory: 1Gi
command: ["sh","-c","while true;do date;sleep 1;done"]
QoS
在资源配置可通过:A) requests 对资源基本保底要求;B) limits 可用资源上限。通过这两个配置,可隐式指定 QoS 的类型:
- Guaranteed 优先级高,需要保证资源的配置。
- Burstable 中等,希望有弹性能力的资源。
- BestEffort 最低,尽力而为。
常用操作
如下是基本的操作。
----- 创建、删除Pod
# kubectl create -f pod.yaml
# kubectl delete -f pod.yaml
----- 当前状态信息
# kubectl get pods foobar
----- 描述信息
# kubectl describe pod foobar
Deployment
在早期版本使用 Replication Controller 对 Pod 副本数量进行管理,在新的版本中官方推荐使用 Deployment 来代替 RC 。相比来说,Deployment 拥有更加灵活强大的升级、回滚功能,并且支持滚动更新;在升级 Pod 时,只需要定义 Pod 的最终状态,K8S 会执行必要的操作,而 RC 要自己定义如何操作。
定义 deploy.yaml
配置文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: foobar
labels:
app: alpine
spec:
replicas: 1 # 副本数量
selector:
matchLabels:
app: alpine
template:
metadata:
labels:
app: alpine
spec:
containers:
- name: hello
image: alpine # 也可以通过URL/NAME:Tag方式指定
ports: # 暴露容器的2000端口
- containerPort: 2000
command: ["nc", "-lk", "-p", "2000"]
K8S 里的 Service 是用来访问 Pod 的,由于 Pod 可能被重启,重启之后 IP 就变了,而 Service 具有名字,可以直接通过名字来访问 Service 所代表的 Pod 。
同样,创建如下的 service.yaml
文件。
apiVersion: v1
kind: Service
metadata:
name: foobar
spec:
selector:
app: alpine
type: NodePort
ports:
- protocol: TCP
port: 2000
nodePort: 30000
----- 创建Deployment
# kubectl apply -f deploy.yaml
# kubectl get deployments foobar
----- 如果设置了多个副本,则不止创建Deployment资源,还包括ReplicaSet以及Pod对象
# kubectl get deployments
# kubectl get replicasets
# kubectl get pods --show-labels
其它
当测试时,还可以只启动 alpine
镜像,其中在 containers
可以增加如下配置。
command: ["/bin/sh", "-c", "sleep 60m"]
此时无法通过 kubectl attach POD-NAME -it
方式连接,需要修改为如下配置。
tty: true
stdin: true
注意,同样是在 containers
配置下,而且需要将 command
配置删除。
常用命令
----- 查看当前所有POD状态信息
# kubectl get pods
----- 确认某个Pod的具体失败原因
# kubectl describe pod alpine-96cdb678c-cm4l7
----- 查看、删除已经部署的容器
# kubectl get deployments
# kubectl delete deployment alpine-service
参考
- 问题排查 这个绝对是经典排查路线图。