Kubernetes Cookbook 编程指南 中文版教程
创建时间:2018-12-07  访问量:3665  7  0

Kubernetes Cookbook 编程指南 中文版教程

Pod的使用 

Pod是一个或多个容器组成的一个组,是Kubernetes中最小的可部署单元。 Pod总是位于同一位置并协同调度,并在共享的上下文环境中运行。 每个pod都是由以下几个Linux命名空间进行隔离:

  • 进程ID(PID)命名空间

  • 网络命名空间

  • 进程间通信(IPC)命名空间

  • Unix时间共享(UTS)命名空间

在预容器世界中,它们将在同一物理机或虚拟机上执行。

通过混合不同的Docker镜像构建你自己的应用程序栈的Pod(如,Web服务器和数据库)是非常有用的。

开始

你必须要有一个Kubernetes集群并保证Kubernetes Node可以访问Docker Hub(https://hub.docker.com) 以下来Docker镜像。你可以使用docker pull命令模仿下载一个Docker镜像,如下所示:

//在Node节点机器上使用Root权限运行

# docker pull centos
latest: Pulling from centos

47d44cb6f252: Pull complete
168a69b62202: Pull complete
812e9d9d677f: Pull complete
4234bfdd88f8: Pull complete
ce20c473cd8a: Pull complete
Digest: sha256:c96eeb93f2590858b9e1396e808d817fa0ba4076c68b59395445cb95
7b524408
Status: Downloaded newer image for centos:latest

如何去做...

  1. 登录到Kubernetes master机器并准备下面的YAML文件。它定义了运行nginx容器与CentOS容器。

  2. nginx容器打开HTTP 端口(TCP/80)。另一方面,CentOS容器尝试使用curl每3秒访问一次localhost:80:

# cat my-first-pod.yaml

apiVersion: v1
kind: Pod
metadata:
	name: my-first-pod
spec:
	containers:
    - name: my-nginx
    image: nginx
    - name: my-centos
    image: centos
    command: ["/bin/sh", "-c", "while : ;do curl http://localhost:80/; sleep 3; done"]
  1. 然后,执行kubectl create命令运行my-first-pod,如下所示:
# kubectl create -f my-first-pod.yaml
pod "my-first-pod" created

它将花费几秒到几分钟时间,主要取决于Kubernetes Node节点与Docker Hub之间的网络带宽。

  1. 你可以通过kubectl get pods查看pod的状态,如下所示:
//还在下载Docker镜像 (0/2)
# kubectl get pods
NAME 			READY 	STATUS 		RESTARTS 	AGE
my-first-pod 	0/2 	Running 	0 			6s

//它还支持如 "po" 的简写形式
# kubectl get po
NAME 			READY 	STATUS 		RESTARTS 	AGE
my-first-pod 	0/2 	Running 	0 			7s

//my-first-pod 正在运行中 (2/2)
# kubectl get pods
NAME 			READY 	STATUS 		RESTARTS 	AGE
my-first-pod 	2/2 	Running 	0 			8s

现在nginx容器(my-nginx)与CentOS容器(my-centos)都已经运行起来了。

  1. 让我们来验证一个CentOS容器是否能够访问Nginx服务。你可以通过使用kubectl logs命令并指定CentOS容器(my-centos)验证查看标准输出(stdout,standard output),如下所示:

//它显示了至少30行的输出(-tail=30)

# kubectl logs my-first-pod -c my-centos --tail=30
</body>
</html>
	% Total 	% Received 	% 	Xferd 	Average 	Speed 	Time 	Time
Time Current
										Dload 		Upload 	Total Spent
Left Speed
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully
installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
100 612 100 612 0 0 4059 0 --:--:-- --:--:--
--:--:-- 4080

正如你所见到的,pod连接了两个不同的容器,nginx和CentOS在同一Linux命名空间中。

它是如何工作的...

当启动一个Pod时,Kubernetes调度器分派一个Kubelet进程来处理启动nginx和CentOS容器的所有操作。

如果你有两个或更多的Node节点,你就可以通过验证 -o wide 选项以查找运行pod的节点:

//它指明了在名为 ip-10-96-219-25 节点上运行了my-first-pod
# kubectl get pods -o wide
NAME 			READY 	STATUS 	RESTARTS 	AGE 	NODE
my-first-pod 	2/2 	Running 0 			2m 		ip-10-96-219-25

登录到那个Node上,然后你就可以通过docker ps命令查看运行中的容器,如下所示:

# docker ps
CONTAINER ID IMAGE  COMMAND CREATED STATUS PORTS NAMES
b7eb8d0925b2 centos "/bin/sh -c 'while : 2 minutes ago Up 2 minutes
k8s_my-centos.704bf394_my-first-pod_default_a3b78651-a061-11e5-a7fb-
06676ae2a427_f8b61e2b
55d987322f53 nginx "nginx -g 'daemon of 2 minutes ago Up 2 minutes
k8s_my-nginx.608bdf36_my-first-pod_default_a3b78651-a061-11e5-a7fb-
06676ae2a427_10cc491a
a90c8d2d40ee gcr.io/google_containers/pause:0.8.0 "/pause" 2 minutes ago Up 2 minutes k8s_POD.6d00e006_my-first-pod_default_a3b78651-a061-11e5-a7fb-06676ae2a427_dfaf502a

你可能注意到了有三个容器——CentOS、nginx和pause——而不是两个。因为我们需要保留的每个pod都属于特定的Linux命名空间,如果CentOS和nginx这两个容器都挂掉了,那么命名空章也将被销毁。因此,Pod中保留的pause容器仅仅是维护Linux的命名空间的。

让我们运行第二个Pod,将其命名为my-second-pod并运行kubectl create 命令,如下所示:

//仅仅是将 my-first-pod 这个名称改为 my-second-pod

# cat my-first-pod.yaml | sed -e 's/my-first-pod/my-second-pod/' > mysecond.pod.yaml

# cat my-second.pod.yaml
apiVersion: v1
kind: Pod
metadata:
	name: my-second-pod
spec:
    containers:
    - name: my-nginx
    	image: nginx
    - name: my-centos
    	image: centos
    command: ["/bin/sh", "-c", "while : ;do curl http://localhost:80/; sleep 3; done"]
    
# kubectl get pods
NAME 			READY 	STATUS 		RESTARTS 	AGE
my-first-pod 	2/2 	Running 	0 			49m
my-second-pod 	2/2 	Running 	0 			5m

如果你有两个或两个以上Node,那么my-second-pod很有可能运行在另一个Node节点上,因为Kubernetes调度器会选择最适合的一个Node进行部署操作。

注意,如果你想要部署更多相同的pod,可以考虑使用副本控制器(replication controller)来代替。

在你测试完过后,你可以运行kubectl delete命令来从Kubernetes集群中删除你的pod。

 

//my-first-pod和my-second-pod这两个Pod正在运行
# kubectl get pods
NAME 			READY 	STATUS 		RESTARTS 	AGE
my-first-pod 	2/2 	Running 	0 			49m
my-second-pod 	2/2 	Running 	0 			5m

//删除 my-second-pod
# kubectl delete pod my-second-pod
pod "my-second-pod" deleted
# kubectl get pods
NAME 			READY 	STATUS 		RESTARTS 	AGE
my-first-pod 	2/2 	Running 	0 			54m

//删除 my-first-pod
# kubectl delete pod my-first-pod
pod "my-first-pod" deleted
# kubectl get pods
NAME 			READY 	STATUS 		RESTARTS 	AGE

还可以参考

本节描述了如何控制pods。 它是Kubernetes的基本组件和操作。以下章节将描述使用副本控制器,服务等pod的高级操作:

  • 副本控制器(replication controller)的使用

  • 服务(services)的使用

  • 标签(labels)和选择器(selectors)的使用