跳到主要内容

http://www.wetools.com/yaml/

最小调度单元 Pod

docker调度的是容器,在k8s集群中,最小的调度单元是Pod(豆荚)

为什么引入Pod
  • 与容器引擎解耦

    Docker、Rkt。平台设计与引擎的具体的实现解耦

  • 多容器共享网络|存储|进程 空间, 支持的业务场景更加灵活

Pod在集群中的形态

使用yaml格式定义Pod

pod-eladmin-api.yaml

apiVersion: v1
kind: Pod
metadata:
name: eladmin-api
namespace: luffy
labels:
app: eladmin-api
spec:
containers:
- name: eladmin-api
image: 172.21.65.226:5000/eladmin/eladmin-api:v1
env:
- name: DB_HOST # 指定数据库地址
value: "172.21.65.226"
- name: DB_USER # 指定数据库连接使用的用户
value: "root"
- name: DB_PWD
value: "luffyAdmin!"
- name: REDIS_HOST
value: "172.21.65.226"
- name: REDIS_PORT
value: "6379"
ports:
- containerPort: 8000
# http://www.wetools.com/yaml/
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "eladmin-api",
"namespace": "luffy",
"labels": {
"app": "eladmin-api"
}
},
"spec": {
"containers": [
{
"name": "eladmin-api",
"image": "172.21.65.226:5000/eladmin/eladmin-api:v1",
"env": [
{
"name": "DB_HOST",
"value": "172.21.65.226"
},
{
"name": "DB_USER",
"value": "root"
},
{
"name": "DB_PWD",
"value": "luffyAdmin!"
},
{
"name": "REDIS_HOST",
"value": "172.21.65.226"
},
{
"name": "REDIS_PORT",
"value": "6379"
}
],
"ports": [
{
"containerPort": 8000
}
]
}
]
}
}
apiVersion含义
alpha进入K8s功能的早期候选版本,可能包含Bug,最终不一定进入K8s
beta已经过测试的版本,最终会进入K8s,但功能、对象定义可能会发生变更。
stable可安全使用的稳定版本
v1stable 版本之后的首个版本,包含了更多的核心对象
apps/v1使用最广泛的版本,像Deployment、ReplicaSets都已进入该版本

支持的资源类型与apiVersion

kubectl api-resources

快速获得资源和版本

$ kubectl explain pod
$ kubectl explain Pod.apiVersion
创建和访问Pod
## 创建namespace, namespace是逻辑上的资源池
kubectl create namespace luffy

## 使用指定文件创建Pod
kubectl create -f pod-eladmin-api.yaml


## ImagePullBackOff,创建镜像拉取所用的密钥信息
kubectl -n luffy create secret docker-registry registry-172-21-65-226 --docker-username=admin --docker-password=admin --docker-email=admin@admin.com --docker-server=172.21.65.226:5000

## 给pod配置上述密钥
apiVersion: v1
kind: Pod
metadata:
name: eladmin-api
namespace: luffy
labels:
app: eladmin-api
spec:
imagePullSecrets:
- name: registry-172-21-65-22
containers:
- name: eladmin-api
...

## 删除pod重建,两种方式
kubectl -n luffy delete pod eladmin-api
kubectl delete -f pod-eladmin-api.yaml



## 查看pod,可以简写po
## 所有的操作都需要指定namespace,如果是在default命名空间下,则可以省略
$ kubectl -n luffy get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
eladmin-api 1/1 Running 0 11m 10.244.1.15 k8s-slave1

## 回顾流程

## 使用Pod Ip访问服务,3306和8002
$ curl 10.244.1.15:8000/auth/code

## 进入容器,执行初始化, 不必到对应的主机执行docker exec
$ kubectl -n luffy exec -ti eladmin-api bash
/ # env

Infra容器

登录k8s-slave1节点


$ nerdctl -n k8s.io ps -a|grep eladmin-api ## 发现有二个容器
## 其中包含eladmin容器以及pause容器
## 为了实现Pod内部的容器可以通过localhost通信,每个Pod都会启动pause容器,然后Pod内部的其他容器的网络空间会共享该pause容器的网络空间(Docker网络的container模式),pause容器只需要hang住网络空间,不需要额外的功能,因此资源消耗极低。



$ crictl -r "unix:///var/run/containerd/containerd.sock" pull 172.21.65.226:5000/eladmin/eladmin-api:v1
$ crictl -r "unix:///var/run/containerd/containerd.sock" rmi xxxxx
$ nerdctl pull 172.21.65.226:5000/eladmin/eladmin-api:v1
$ crictl -r "unix:///var/run/containerd/containerd.sock" logs -f 5627a65b98416

查看pod详细信息
## 查看pod调度节点及pod_ip
$ kubectl -n luffy get pods -o wide
## 查看完整的yaml
$ kubectl -n luffy get po eladmin-api -o yaml
## 查看pod的明细信息及事件
$ kubectl -n luffy describe pod eladmin-api

Troubleshooting and Debugging
#进入Pod内的容器
$ kubectl -n <namespace> exec <pod_name> -c <container_name> -ti /bin/sh

#查看Pod内容器日志,显示标准或者错误输出日志
$ kubectl -n <namespace> logs -f <pod_name> -c <container_name>

更新服务版本
$ kubectl apply -f pod-eladmin-api.yaml
删除Pod服务
#根据文件删除
$ kubectl delete -f pod-eladmin-api.yaml

#根据pod_name删除
$ kubectl -n <namespace> delete pod <pod_name>
Pod多容器

pod-eladmin.yaml

apiVersion: v1
kind: Pod
metadata:
name: eladmin
namespace: luffy
labels:
app: eladmin
spec:
imagePullSecrets:
- name: registry-172-21-65-226
containers:
- name: eladmin-api
image: 172.21.65.226:5000/eladmin/eladmin-api:v1
env:
- name: DB_HOST # 指定数据库地址
value: "172.21.65.226"
- name: DB_USER # 指定数据库连接使用的用户
value: "root"
- name: DB_PWD
value: "luffyAdmin!"
- name: REDIS_HOST
value: "172.21.65.226"
- name: REDIS_PORT
value: "6379"
ports:
- containerPort: 8000
- name: eladmin-web
image: 172.21.65.226:5000/eladmin/eladmin-web:v1
ports:
- containerPort: 80