Pod是一组并置
的容器,代表了Kubernetes中的基本构建块
部分隔离
相同的IP
和端口空间
# -o wide
# -o json
[root@k8s-node01 chap03]# kubectl get pod XXX-POD -o yaml
apiVersion: v1
创建pod时,永远不需要提欧共status部分内容。
apiVersion: v1
kind: Pod
metadata:
# pod名称
name: kubia-manual
spec:
# 多个容器
containers:
- image: luksa/kubia
name: kubia
ports:
# 容器监听的端口
- containerPort: 8080
protocol: TCP
想要了解更多的API字段信息
kubecl explain pod
kubectl explain pod.spec
[root@k8s-node01 chap03]# kubectl create -f kubia-manual.yaml
pod/kubia-manual created
#查看Pod状态
## READY x/y : 总共有y个容器,x个就绪
## Init: x/y : 公共有y个initc(就绪探针), x个就绪
[root@k8s-node01 chap03]# kubectl get pod
NAME READY STATUS RESTARTS AGE
kubia-manual 1/1 Running 0 2m43s
# 查看指定pod信息
[root@k8s-node01 chap03]# kubectl get pod kubia-manual
NAME READY STATUS RESTARTS AGE
kubia-manual 1/1 Running 0 3m27s
# 查看指定pod- 详细信息
[root@k8s-node01 chap03]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubia-manual 1/1 Running 0 2m55s 10.244.1.87 k8s-node01 <none> <none>
[root@k8s-node01 chap03]# kubectl get pod -o json
[root@k8s-node01 chap03]# kubectl get pod -o yaml
Pod phase可能存在的值
#1. 到pod运行的node节点上,执行 `docker logs`命令
docker logs <container id>
#2. 查看pod日志
[root@k8s-node01 chap03]# kubectl logs kubia-manual
Kubia server starting...
#3. 查看pod 指定容器名称
[root@k8s-node01 chap03]# kubectl logs kubia-manual -c kubia
Kubia server starting...
可以通过创建一个
service
,以便外部访问该pod. 后续介绍.
本地网络端口转发到pod端口
#1.端口转发
## 将本机的8888端口 请求 映射到 pod的8080端口
[root@k8s-node01 chap03]# kubectl port-forward kubia-manual 8888:8080
Forwarding from 127.0.0.1:8888 -> 8080
Forwarding from [::1]:8888 -> 8080
#2.通过端口转发
[root@k8s-node01 chap03]# curl localhost:8888
对于微服务架构,部署的微服务数量可以轻松超过20个甚至更多。这些组件可能是副本(部署统一组件的多个副本)和多个不同的发布版本(alpha,beta…)同时运行。 这样一来我们系统中拥有数百个pod,如果没有可以有效组织这些组件的机制,将会导致产生巨大的混乱。
标签是一种简单却功能强大的Kubernates特性,不仅可以组织pod,也可以组织所有其他的kubernetes资源。
基于应用的纵向维度 和基于版本的横向维度
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual-v2
labels:
# 两个标签
creation_method: manual
env: prod
spec:
containers:
- image: luksa/kubia
name: kubia
ports:
- containerPort: 8080
protocol: TCP
# --show-labels 展示所有标签
[root@k8s-node01 chap03]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-manual 1/1 Running 0 42m <none>
kubia-manual-v2 1/1 Running 0 5s creation_method=manual,env=prod
# -L 指定感兴趣的某些标签
[root@k8s-node01 chap03]# kubectl get pod -L creation_method,env
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
kubia-manual 1/1 Running 0 44m
kubia-manual-v2 1/1 Running 0 2m14s manual prod
# 添加标签
[root@k8s-node01 chap03]# kubectl label pod kubia-manual creation_method=manual
pod/kubia-manual labeled
# 更改已有标签,需要添加 --overwrite
[root@k8s-node01 chap03]# kubectl label pod kubia-manual-v2 env=debug
error: 'env' already has a value (prod), and --overwrite is false
[root@k8s-node01 chap03]# kubectl label pod kubia-manual-v2 env=debug --overwrite
pod/kubia-manual-v2 labeled
#查看修改后的结果
[root@k8s-node01 chap03]# kubectl get pod -L creation_method,env
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
kubia-manual 1/1 Running 0 47m manual
kubia-manual-v2 1/1 Running 0 5m9s manual debug
#1. 指定标签=具体的值
[root@k8s-node01 chap03]# kubectl get pod -l creation_method=manual
NAME READY STATUS RESTARTS AGE
kubia-manual 1/1 Running 0 48m
kubia-manual-v2 1/1 Running 0 6m2s
#2. 列出包含env所有标签的pod, 无论值为如何
[root@k8s-node01 chap03]# kubectl get pod -l env
NAME READY STATUS RESTARTS AGE
kubia-manual-v2 1/1 Running 0 7m18s
#3. 列出不包含env标签的pod
## !在bash中有特殊含义,所以需要 单引号 圈引
[root@k8s-node01 chap03]# kubectl get pod -l '!env'
NAME READY STATUS RESTARTS AGE
kubia-manual 1/1 Running 0 50m
## 其他选择标签
#4. creation_method!=manual
#5. env in (prod,debug)
#6. env notin (prod,debug)
迄今为止,所有的pod都是近乎随机的调度到工作节点上。
但是某些清苦啊, 需要将pod调度到具有某些特征的节点上。如将GPU密集型运算的pod调度到实际提供GPU加速的节点上。
pod并不是唯一可以附件label标签的kubernetes资源,它可以附加到任何kubernetes对象上。
[root@k8s-node01 chap03]# kubectl label node k8s-node01 gpu=true
node/k8s-node01 labeled
[root@k8s-node01 chap03]# kubectl get node -l gpu=true
NAME STATUS ROLES AGE VERSION
k8s-node01 Ready <none> 63d v1.18.1
apiVersion: v1
kind: Pod
metadata:
name: kubia-gpu
spec:
# 选择gpu=true的节点上
nodeSelector:
gpu: "true"
containers:
- image: luksa/kubia
name: kubia
ports:
- containerPort: 8080
protocol: TCP
每一个node节点都有一个键为kubernetes.io/hostname
的标签,值为该节点的实际主机名称, 因此我们一个pod调度到某个具体的主机上。如果该node离线,将导致pod不可调度
除了标签外, pod和其他对象还可以包含注解。 注解也是键值对,所以它们本质和标签非常相似。
但是与标签不同,注解并不是为了保存标识信息而存在的,它们不能用来分组
。
大量使用注解可以为每个pod或API添加说明。
# 查看对象的注解
[root@k8s-node01 chap03]# kubectl describe pod kubia-manual-v2
....
Annotations: <none>
....
# 添加和修改注解
[root@k8s-node01 chap03]# kubectl annotate pod kubia-manual-v2 a.b.c/d="e f"
pod/kubia-manual-v2 annotated
# 查看对象的注解
[root@k8s-node01 chap03]# kubectl describe pod kubia-manual-v2
Annotations: a.b.c/d: e f
在集群中工作,如果没有指定标签选择器,我们总能看到所有对象。
如果,我们想要将对象分割成完全独立且不重叠的组
,就需要使用命名空间。
# 或者缩写 get ns
[root@k8s-node01 chap03]# kubectl get namespace
NAME STATUS AGE
default Active 63d
ingress-nginx Active 15d
kube-node-lease Active 63d
kube-public Active 63d
kube-system Active 63d
# 默认情况下,只会在default命名空间中进行操作
# -n 或者 --namespace 指定具体的命名空间
[root@k8s-node01 chap03]# kubectl get pod -n kubia-system
No resources found in kubia-system namespace.
```
### 创建命名空间
```yaml
apiVersion: v1
kind: Namespace
metadata:
name: custom-namespace
```
**创建对象时指定命名空间**
`kubectl create -f xxx.yaml -n custom-namespace`
### 命名空间提供的隔离
虽然说在不同命名空间的部署的pod应该彼此隔离,且无法通信。 但是事实并非如此,这取决于命名空间提供网络解决方案,如果命名空间不同的两个pod,知道彼此的ip地址,那么就可以将流量发送到对方。
## 停止和移除pod
```shell
#1. 按照名称删除
kubectl delete po kubia-gpu
#2. 按照标签选择器删除
kubectl delete po -l env=debug
#3. 通过删除命名空间来删除pod
kubectl delete ns custom-namespace
#4. 删除所有pod,但是保留命名空间
kubectl delete po --all
#5 删除命名空间中(几乎)所有资源】
kubectl delete all --all
```