kubernetes-in-action-03-pod

  • 学习笔记

介绍Pod

Pod是一组并置的容器,代表了Kubernetes中的基本构建块

  • 同一个Pod中容器之间部分隔离
  • 容器共享相同的IP端口空间

以YAML或JSON描述文件创建POD

检查现有pod的YAML描述文件

# -o wide
# -o json
[root@k8s-node01 chap03]# kubectl get  pod  XXX-POD -o yaml


apiVersion: v1

Pod定义的主要部分

  • metadata: 包括名称、命名空间、标签和关于该容器的其他信息
  • spec:包含pod内容的实际说明,例如pod的容器、卷和其他数据。
  • status: 包含裕兴中的pod信息,例如pod所处的条件、每个容器的描述和状态,以及内部IP和其他基本信息。

创建pod时,永远不需要提欧共status部分内容。

为pod创建一个简单的YAML描述文件

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

使用kubectl create 来创建pod

[root@k8s-node01 chap03]# kubectl create -f kubia-manual.yaml 
pod/kubia-manual created

pod其他指令

#查看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可能存在的值

  • 挂起(Pending): Pod已经被Kubenetes系统接受,但有一个或多个容器镜像尚未创建。 等待时间包括调度Pod的时间和通过网络下载镜像的时间,这可能需要花费一定的时间。
  • 运行中(Running): 该Pod已经绑定到一个节点上,Pod中所有的容器都已被创建。 至少有一个容器正在运行,或者正处于启动或重启状态。
  • 成功(Succeeded): Pod中所有容器都被成功终止,并不会再重启。
  • 失败(Failed): Pod中所有容器都已经终止了,并且至少有一个容器时因为失败终止,即非0状态退出或被系统终止。
  • 未知(Unknown): 因为某些原因无法获取Pod的状态,通常是因为Pod所在主机通信失败。

查看应用程序日志

#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...

向Pod发送请求

可以通过创建一个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

kubernetes-in-action-03-pod_第1张图片

使用标签组织Pod

对于微服务架构,部署的微服务数量可以轻松超过20个甚至更多。这些组件可能是副本(部署统一组件的多个副本)和多个不同的发布版本(alpha,beta…)同时运行。 这样一来我们系统中拥有数百个pod,如果没有可以有效组织这些组件的机制,将会导致产生巨大的混乱。
kubernetes-in-action-03-pod_第2张图片

介绍标签

标签是一种简单却功能强大的Kubernates特性,不仅可以组织pod,也可以组织所有其他的kubernetes资源。
kubernetes-in-action-03-pod_第3张图片

基于应用的纵向维度 和基于版本的横向维度

创建pod时指定标签

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

修改现有pod标签

# 添加标签
[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

通过标签选择Pod集合

#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)

标签中多个条件

通过app=pc,rel=beta 来选择pod.
kubernetes-in-action-03-pod_第4张图片

使用标签和选择器来约束pod

迄今为止,所有的pod都是近乎随机的调度到工作节点上。
但是某些清苦啊, 需要将pod调度到具有某些特征的节点上。如将GPU密集型运算的pod调度到实际提供GPU加速的节点上。

使用标签分类NODE

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

将pod调度到特定节点

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

调度到hostname

每一个node节点都有一个键为kubernetes.io/hostname的标签,值为该节点的实际主机名称, 因此我们一个pod调度到某个具体的主机上。如果该node离线,将导致pod不可调度在这里插入图片描述

注解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
```

你可能感兴趣的:(#,k8s)