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

Kubernetes Cookbook 编程指南 中文版教程

名称的使用

当你创建任何Kubernetes对象如Pod、副本控制器和服务的时候,你可以为它分配一个名称。Kubernetes中的名称在空间上是唯一的,这就意味着,你不可能为多个Pod分配相同的名称。

开始

Kubernetes允许我们分配一个名称,但有如下限制:

  • 最大253个字符

  • 小写字母和数字

  • 中间可以包含特殊字符,仅限于破折号(-)和点(.)

如何去做...

下面是一个Pod定义的示例,将Pod的名称设为my-pod,容器的名称是my-container,你可以成功创建它,如下所示:

# cat my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
	name: my-pod
spec:
    containers:
    - name: my-container
    	image: nginx
    	
# kubectl create -f my-pod.yaml
pod "my-pod" created

# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-pod 0/1 Running 0 4s

你可以使用kubectl describe命令来查看容器的名称my-container,如下所示:

# kubectl describe pod my-pod
Name: my-pod
Namespace: default
Image(s): nginx
Node: ip-10-96-219-25/10.96.219.25
Start Time: Wed, 16 Dec 2015 00:46:33 +0000
Labels: <none>
Status: Running
Reason:
Message:
IP: 192.168.34.35
Replication Controllers: <none>
Containers:
    my-container:
    	Container ID: docker://5501d115703e334ae44c1541b990a7e22ce4f310226eafea206594e4c85c90d9
		Image: nginx
		Image ID: docker://6ffc02088cb870652eca9ccd4c4fb582f75b29af2879792ed09bb46fd1c898ef
		State: Running
			Started: Wed, 16 Dec 2015 00:46:34 +0000
		Ready: True
		Restart Count: 0
		Environment Variables:

另一方面,下面的示例包含了两个容器,但都分配了相同的名称my-container,因此,kubectl命令返回一个错误并且无法创建Pod。

//delete previous pods
# kubectl delete pods --all
pod "my-pod" deleted
# cat duplicate.yaml
apiVersion: v1
kind: Pod
metadata:
	name: my-pod
spec:
	containers:
    - name: my-container
    	image: nginx
    - name: my-container
    	image: centos
    	command: ["/bin/sh", "-c", "while : ;do curl http://localhost:80/;sleep 3; done"]

# kubectl create -f duplicate.yaml
The Pod "my-pod" is invalid.
spec.containers[1].name: duplicate value 'my-container'

你可以添加-validate标记

例如:kubectl create -f duplicate.yaml -validate

发送命令请求之前使用一个schema来验证一下输入

在另一个例子中,YAML包含了一个副本控制器和一个服务,这两个都使用相同的名称my-nginx,但是它能够成功创建,因为副本控制器与服务是不同的:

# cat nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
    name: my-nginx
spec:
    replicas: 2
    selector:
    	sel : my-selector
    template:
        metadata:
            labels:
            	sel : my-selector
        spec:
            containers:
            - name: my-container
            	image: nginx
        ---
        apiVersion: v1
        kind: Service
        metadata:
        	name: my-nginx
        spec:
            ports:
            	- protocol: TCP
            		port: 80
           			nodePort: 30080
            type: NodePort
            selector:
            	sel: my-selector


# kubectl create -f nginx.yaml
replicationcontroller "my-nginx" created
service "my-nginx" created

# kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE
my-nginx my-container nginx sel=my-selector 2 8s

# kubectl get service
NAME 		CLUSTER_IP     EXTERNAL_IP PORT(S) SELECTOR        AGE
kubernetes  192.168.0.1    <none>      443/TCP <none>          6d
my-nginx    192.168.38.134 nodes       80/TCP  sel=my-selector 14s

它是如何工作的...

名称是一个唯一的标识,所有的命令约定都很好,不管怎样,它都是用来查找并标识容器镜像的。例如:

  • memcached-pod1

  • haproxy.us-west

  • my-project1.mysql

然而,下面的例子是不会工作的,因为它违背了Kubernetes约束:

  • Memcache-pod1(包含大写字母)

  • haproxy.us_west(包含了下划线)

  • my-project1.mysql.(点在最后)

注意Kubernetes支持一个标签允许分配一个key=value形式的标识。它也支持重复。因此,如果你想要分配一些类似于下面这样的信息,使用标签代替:

  • 环境(例如:脚手架,产品)

  • 版本(例如:v1.2)

  • 应用程序角色(例如:前端,工作者)

此外,Kubernetes还支持具有分离命名空间的命名空间。这意味着你可以在不同的命名空间(例如:nginx)中使用相同的名称。因此,如果你想仅仅分配一个应用程序名称,使用命名空间代替。

还可以参考

本节描述了如何分配并查找对像的名称。这仅仅是一个基本的方法论,但是Kubernetes有更多强大的命名工具如namespace和selectors来管理集群:

  • Pod的使用

  • 副本控制器的使用

  • 服务的使用

  • 标签和选择器的使用