在上文Kubernetes入门篇中对kubernetes有一个初步的介绍,本文继续介绍kubernetes的核心组件Pod,固然仍是以实际操做为主;另外说明一点的是本系列是本人的学习笔记。node
Pod是Kubernetes中最为重要的核心概念,表明了Kubernetes中的基本构建模块;一个Pod能够包含一个容器或者多个容器,Pod自己是轻量级的,因此常常会建立不少Pod,紧密相关的容器进程常常放到同一个Pod中;一个Pod中的容器运行于相同的Network命名空间中,所以它们共享相同的IP地址和端口空间;Kubernetes集群中的全部Pod都在同一个共享网络地址空间中,每一个Pod均可以经过其余Pod的IP地址来实现相互访问,就像局域网上的计算机同样。git
Pod和其余Kubernetes资源一般是经过向Kubernetes REST API提供JSON或YAML描述文件来建立的,固然还有如kubectl run相似的简单命令,只不过配置属性有限;github
[d:\k8s]$ kubectl get po kubia-dms8n -o yaml apiVersion: v1 kind: Pod metadata: ...... spec: ...... status: ......
-o指定具体的格式,能够是yaml或者json格式;描述文件主要包括apiVersion,kind,metadata,spec以及status这几块:json
apiVersion: v1 kind: Pod metadata: name: kubia-manual spec: containers: - image: ksfzhaohui/kubia name: kubia ports: - containerPort: 8080 protocol: TCP
kubia-manual为指定的pod的名称,ksfzhaohui/kubia使用的镜像,kubia为容器的名称,8080为应用监听的端口;这里的端口纯粹是展现性的,最终以容器中应用绑定的端口为准;segmentfault
D:\k8s>kubectl create -f kubia-manual.yaml pod/kubia-manual created
以上建立了一个名称为kubia-manual的pod,能够查询当前的pod列表:api
D:\k8s>kubectl get pods NAME READY STATUS RESTARTS AGE kubia-dms8n 1/1 Running 0 25h kubia-manual 1/1 Running 0 2m8s
kubia-manual已经准备就绪,固然也能够查询指定pod的描述文件(同1.1);浏览器
D:\k8s>kubectl logs kubia-manual -c kubia kubia server is starting...
以上表示查询Pod为kubia-manual中的容器kubia的日志(由于一个pod中能够包含多个容器),目前只有服务启动成功的日志,为了更好的观察日志变更,对容器中部署的应用发起请求,以前是经过穿件service来和pod进行通讯,Kubernetes还提供了配置端口转发到pod的方式:服务器
[d:\k8s]$ kubectl port-forward kubia-manual 8888:8080 Forwarding from 127.0.0.1:8888 -> 8080 Forwarding from [::1]:8888 -> 8080
而后在本地经过浏览器访问:http://localhost:8888/;网络
继续观察容器中的日志,由于Pod中只有一个容器,因此这里能够不指定具体容器学习
C:\Users\hui.zhao.cfs>kubectl logs kubia-manual kubia server is starting... Received request from ::ffff:127.0.0.1 Received request from ::ffff:127.0.0.1
标签是一种简单却功能强大的Kubernetes特性,不只能够组织pod,也能够组织全部其余的Kubernetes资源;标签是能够附加到资源的任意键值对,用以选择具备该确切标签的资源;
apiVersion: v1 kind: Pod metadata: name: kubia-manual-v2 labels: creation_method: manual env: prod spec: containers: - image: ksfzhaohui/kubia name: kubia ports: - containerPort: 8080 protocol: TCP
在指定Pod名称kubia-manual-v2的下面指定了两个标签键值对,建立Pod:
D:\k8s>kubectl create -f kubia-manual-with-labels.yaml pod/kubia-manual-v2 created
查询全部Pod,并显示标签:
[d:\k8s]$ kubectl get po --show-labels NAME READY STATUS RESTARTS AGE LABELS kubia-dms8n 1/1 Running 0 26h run=kubia kubia-manual 1/1 Running 0 49m <none> kubia-manual-v2 1/1 Running 0 51s creation_method=manual,env=prod
[d:\k8s]$ kubectl label po kubia-manual creation_method=manual pod/kubia-manual labeled [d:\k8s]$ kubectl get po -L creation_method,env NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV kubia-dms8n 1/1 Running 0 26h kubia-manual 1/1 Running 0 55m manual kubia-manual-v2 1/1 Running 0 7m manual prod
kubia-manual没有指定标签,能够进行添加,同时也能够修改:
[d:\k8s]$ kubectl label po kubia-manual-v2 env=debug --overwrite pod/kubia-manual-v2 labeled [d:\k8s]$ kubectl get po -L creation_method,env NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV kubia-dms8n 1/1 Running 0 26h kubia-manual 1/1 Running 0 57m manual kubia-manual-v2 1/1 Running 0 8m13s manual debug
在更改现有标签时,须要使用--overwrite选项;
标签选择器容许咱们选择标记有特定标签的pod子集,并对这些pod执行操做;
[d:\k8s]$ kubectl get po -l creation_method=manual NAME READY STATUS RESTARTS AGE kubia-manual 1/1 Running 0 137m kubia-manual-v2 1/1 Running 0 88m
这里使用了creation_method=manual的标签选择器,这里能够是一个表达式,好比!=,in,notin等,多个条件用逗号分隔:
[d:\k8s]$ kubectl get po -l creation_method=manual,env=debug NAME READY STATUS RESTARTS AGE kubia-manual-v2 1/1 Running 0 98m
Kubernetes将集群中的全部节点抽象为一个总体的大型部署平台,全部pod都是近乎随机地调度到工做节点上;可是有时候咱们但愿调度到固定的硬件基础设施上,好比GPU加速,固态硬盘等等,Kubernetes也提供了相关的支持,经过标签和选择器来实现;
[d:\k8s]$ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready master 29h v1.17.0 [d:\k8s]$ kubectl label node minikube gpu=true node/minikube labeled [d:\k8s]$ kubectl get nodes -l gpu=true NAME STATUS ROLES AGE VERSION minikube Ready master 29h v1.17.0
以上咱们给默认的节点minikube添加一个gpu=true的标签来表示此工做节点是GPU加速节点;接下来须要给Pod指定节点选择器指定为gpu=true,这样就能够将Pod调度到特意的工做节点上;
apiVersion: v1 kind: Pod metadata: name: kubia-gpu spec: nodeSelector: gpu: "true" containers: - image: ksfzhaohui/kubia name: kubia
以上建立了YAML描述文件,指定了nodeSelector而且设置为gpu=true,建立Pod:
[d:\k8s]$ kubectl create -f kubia-gpu.yaml pod/kubia-gpu created
而后查看Pod的详细信息,看对应的节点信息:
[d:\k8s]$ kubectl get po kubia-gpu -o yaml apiVersion: v1 kind: Pod metadata: name: kubia-gpu spec: nodeName: minikube nodeSelector: gpu: "true"
节点名称调度到了minikube,而且显示了节点选择器信息;
除标签外,pod和其余对象还能够包含庄解;注解也是键值对,与标签不一样,注解并非为了保存标识信息而存在的,它们不能像标签同样用千对对象进行分组,可是注解能够容纳更多的信息;能够给Pod添加和修改注解:
[d:\k8s]$ kubectl annotate pod kubia-manual mycompany.com/someannotation="foo bar" pod/kubia-manual annotated [d:\k8s]$ kubectl describe pod kubia-manual Name: kubia-manual Annotations: mycompany.com/someannotation: foo bar ......
标签和命令空间均可以用来组织成组的,Pod是能够有多个标签的,能够重叠;当时命名空间是不可用重叠的,将Pod分隔成彻底独立的组,这样分组首先更加类型更加清晰,另外就是不一样的命名空间可使用相同的资源名称;
[d:\k8s]$ kubectl get ns NAME STATUS AGE default Active 44h kube-node-lease Active 44h kube-public Active 44h kube-system Active 44h kubernetes-dashboard Active 44h
经过如上命令发现命名空间,以上这些命名空间都是默认建立好的,咱们建立的Pod都在default命令空间下,其余的都是系统自带的;
[d:\k8s]$ kubectl get po --namespace default NAME READY STATUS RESTARTS AGE kubia-dms8n 1/1 Running 0 2d2h kubia-gpu 1/1 Running 0 30m kubia-manual 1/1 Running 0 25h kubia-manual-v2 1/1 Running 0 24h
也能够经过查看指定命名空间对应的Pod列表;
命名空间是一种和其余资源同样的Kubernetes资源,所以能够经过将YAML文件提交到Kubernetes API服务器来建立该资源;
apiVersion: v1 kind: Namespace metadata: name: custom-namespace
kind指定为Namespace,表示正在定义一个命名空间,custom-namespace为命名空间的名字;
[d:\k8s]$ kubectl create -f custom-namespace.yaml namespace/custom-namespace created [d:\k8s]$ kubectl get ns NAME STATUS AGE custom-namespace Active 4s ......
以上经过yaml描述文件建立命名空间;
能够在建立Pod的时候指定命名空间:
[d:\k8s]$ kubectl create -f kubia-manual.yaml -n custom-namespace pod/kubia-manual created [d:\k8s]$ kubectl get po --namespace default NAME READY STATUS RESTARTS AGE kubia-manual 1/1 Running 0 19h [d:\k8s]$ kubectl get po --namespace custom-namespace NAME READY STATUS RESTARTS AGE kubia-manual 1/1 Running 0 2m19s
能够看到在default和custom-namespace命名空间中存在相同名称的Pod,这就是命名空间的隔离功能;注:尽管命名空间将对象分隔到不一样的组,只容许你对属于特定命名空间的对象进行操做, 但实际上命名空间之间并不提供对正在运行的对象的任何隔离。
[d:\k8s]$ kubectl delete po kubia-gpu pod "kubia-gpu" deleted [d:\k8s]$ kubectl get po --namespace default NAME READY STATUS RESTARTS AGE kubia-gpu 1/1 Terminating 0 104m
在删除pod的过程当中,实际上咱们在指示Kubernetes终止该pod中的全部容器,Kubernetes向进程发送一个SIGTERM信号并等待必定的秒数使其正常关闭;关闭的过程当中能够发现Pod的状态为Terminating终结中;
[d:\k8s]$ kubectl delete po -l creation_method=manual pod "kubia-manual" deleted pod "kubia-manual-v2" deleted
会列出全部被删除的Pod;
[d:\k8s]$ kubectl delete ns custom-namespace namespace "custom-namespace" deleted [d:\k8s]$ kubectl get po --namespace custom-namespace No resources found in custom-namespace namespace.
删除命名空间的同时,其中包含的Pod都会被删除;
[d:\k8s]$ kubectl delete po --all pod "kubia-dms8n" deleted pod "kubia-gkv4v" deleted pod "kubia-zxd9q" deleted [d:\k8s]$ kubectl get po NAME READY STATUS RESTARTS AGE kubia-c9hlb 1/1 Running 0 46s kubia-f4kwr 1/1 Running 0 46s kubia-vttrc 1/1 Running 0 46s
删除完全部Pod以后,又从新出现了三个Pod,主要缘由是上面三个Pod是否是直接建立的,而是建立一个ReplicationController,而后再由ReplicationController建立pod;若是想要删除该pod须要删除ReplicationController,能够经过使用以下命令:
[d:\k8s]$ kubectl delete all --all pod "kubia-c9hlb" deleted pod "kubia-f4kwr" deleted pod "kubia-vttrc" deleted replicationcontroller "kubia" deleted service "kubernetes" deleted service "kubia" deleted [d:\k8s]$ kubectl get po No resources found in default namespace.
本文继续在阅读Kubernetes in Action过程当中,实际操做的笔记;主要介绍了Kubernetes的核心组件Pod,包括Pod的建立,标签,主键,命名空间以及中止和移除pod。
Kubernetes in Action