Kubernetes Pod操作

前言

上一篇简单介绍了K8S中的组件,以及组件之间的联系。这篇就来详细的说说K8S是如何对Pod进行管理编排的。

Ubuntu上安装K8S有比较多的问题,centos7.0可以直接yum install。我直接在katacoda测试运行。

Pod的简介

通常不同的容器利用cgroupnamespace来进行网络磁盘的划分,而Pod让在处在相同Pod的容器有相同的IP。它们使用相同的网络namespace(换句话说,相同的IP地址和端口空间)。

Pod使您可以以一个单元的模式管理几个紧密耦合的应用程序容器。

Pod在K8S主要有两种形态,普通Pod和静态Pod。静态Pod即不通过K8S调度和创建,直接在某个具体的Node机器上通过具体的文件来启动。普通Pod则是由K8S创建、调度,同时数据存放在etcd中。

静态Pod

静态Pod不能通过API Server进行管理,可以使用kubectl get pod查看,但是删除修改等操作是不允许的。

静态Pod无法与ReplicationController、Deployment或者DaemonSet进行关联,并且kubelet也无法对他们进行健康检查。静态Pod总是由kubectl(kubectl是K8S命令行工具)进行创建。

创建静态 Pod 有两种方式:配置文件和 HTTP 两种方式

配置文件

配置文件就是放在特定目录下的标准的 JSON 或 YAML 格式的 pod 定义文件。启动kubelet进程,kubelet 定期的去扫描这个目录,根据这个目录下出现或消失的 YAML/JSON 文件来创建或删除静态 pod。

通过 HTTP 创建静态 Pods

kubelet 周期地从–manifest-url=参数指定的地址下载文件,并且把它翻译成 JSON/YAML 格式的 pod 定义。此后的操作方式与–pod-manifest-path=相同,kubelet 会不时地重新下载该文件,当文件变化时对应地终止或启动静态 pod。

关于静态Pod的详细介绍可以点击这篇博客

普通的Pod

进入katacoda首先启动minikube:

1
$ minikuber start

你想输入的替代文字

创建Pod资源文件:

1
$ vim pod.yaml

填入以下数据,简单来说这个就是Pod的描述文件。里面填写了Pod的元数据,元数据包括Pod名、标签、注释等。以及该Pod含有的容器信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: tomcatandmysql
spec:
restartPolicy: OnFailure
containers:
- name: tomcat
image: "tomcat:8.0"
- name: mysql
image: "mysql:5.7"
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"

下面是对pod.yaml的详细说明,因为复制带有注释的会导致创建的时候出现问题,所以使用上面没带注释的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1 			  #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 .
kind: Pod #必选,Pod,(deployment、service)
metadata: #必选,元数据,存放着关于这个pod的信息
name: tomcatandmysql #必选,Pod名称
labels:       #自定义标签
- name: test   #自定义标签对,key:value
spec: #必选,Pod中容器的详细定义
restartPolicy: OnFailure #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
containers: #必选,Pod中容器列表
- name: tomcat #必选,容器名称,需符合RFC 1035规范
image: "tomcat:8.0" #必选,容器的镜像名称
- name: mysql
image: "mysql:5.7"
env: #容器运行前需设置的环境变量列表
- name: MYSQL_ROOT_PASSWORD
value: "123456"

创建Pod:

1
$ kubectl create -f pod.yaml

你想输入的替代文字

查看pod的的信息,可以看到该pod的两个容器还在creating中。过一段时间再查看可以看到来个容器都处于READY的状态了。

你想输入的替代文字

你想输入的替代文字

可以看到当前的正在运行的容器,的确可以看到:

你想输入的替代文字

Pod操作命令

删除Pod

1
$ kubectl delete pod tomcatandmysql

查看Pod详细信息

1
$ kubectl describe pod tomcatandmysql

还可以看到pod的的事件信息

你想输入的替代文字

Pod logs

查看一个Pod的某个容器日志信息:

1
$ kubectl logs tomcatandmysql mysql #kubectl logs <podname> <imagename>

kubectl exec

进入到某个Pod,默认进入到第一个容器中:

1
$ kubectl exec -it tomcatandmysql /bin/bash

你想输入的替代文字