kubernetes的pod管理
一个Pod中的应用容器共享同一组资源:
(1)PID命名空间:Pod中的不同应用程序可以看见其他应用程序的进程ID
(2)网络命名空间:Pod中的多个容器能访问同一个IP和端口范围
(3)IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信。
(4)UTS命名空间:Pod中的多个容器共享一个主机名
(5)Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes
不建议在k8s的一个pod内运行相同应用的多个实例。也就是说一个Pod内不要运行2个或2个以上相同的镜像,因为容易造成端口冲突,而且Pod内的容器都是在同一个Node上的
pod的yaml文件定义
pod创建
kubectl create -f ./php-pod.yaml
查看当前所有的pod
kubectl get pods
查看某个pod运行的node
kubectl get pod php-test -o wide
查看pod的详细信息
kubectl describe pod php-test
kubectl get pod php-test -o yaml或者kubectl get pod php-test -o json 获取pod更为详细的信息
删除pod
kubectl delete pod php-test
RC(Replication Controller)管理
Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行, 如果少于指定数量的pod副本(replicas),Replication Controller会启动新的Container,反之会杀死多余的以保证数量不变。Replication Controller使用预先定义的pod模板创建pods,一旦创建成功,pod 模板和创建的pods没有任何关联,可以修改pod 模板而不会对已创建pods有任何影响,也可以直接更新通过Replication Controller创建的pods。对于利用pod 模板创建的pods,Replication Controller根据label selector来关联,通过修改pods的label可以删除对应的pods。
定义ReplicationController
创建ReplicationController
kubectl create -f php-controller.yaml
查询rc
kubectl get rc
kubectl get rc php-controller
kubectl describe rc php-controller
更改副本数量
kubectl scale rc php-controller --replicas=3
删除rc
通过更改replicas=0,可以把该RC下的所有Pod都删掉。另外kubeclt也提供了stop和delete命令 来完成一次性删除RC和RC控制的全部Pod。需要注意的是,单纯的删除RC,并不会影响已创建 好的Pod。
Service管理
虽然每个Pod都会分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失。这就引出一个问题:如果有一组Pod组成的一个集群来提供服务,那么如何来访问它们呢?
Kubernetes的Service(服务)就是用来解决这个问题的核心概念。
一个Service可以看作一组提供相同服务的Pod的对外访问接口。Service作用于哪些Pod是通过Label Selector来定义的。
Service的定义
Service的创建
kubectl create -f php-service.yaml
Service的查询
kubectl get service
kubectl get services
kubectl get endpoints
Pod的IP地址和Service的Cluster IP地址
php-service的ip是10.254.165.216,这是Service的Cluster IP地址,是k8s系统中的虚拟IP地址,有系统动态分配。Pod的IP地址是Docker Daemon根据docker0网桥的IP地址段进行分配的。Service的Cluster IP地址相对于Pod的IP地址来说相对稳定,Service被创建时即被分配一个IP地址,在销毁该Service之前,这个IP地址都不会变化了。而Pod在K8s集群中生命周期较短,可能被ReplicationController销毁、再次创建,新创建的Pod将会分配一个新的IP地址。
外部访问Service
由于Service对象在Cluster IP Range池中分配到的IP只能在内部访问,所以其他Pod都可以无碍访问到它。但如果这个service作为前端服务,准备为集群外的客户端提供服务,我们就需要给这个服务提供公共IP了。
NodePort
在定义Service时指定spec.type=NodePort,并指定spec.ports.nodePort的值,系统就会k8s集群中的每个node上打开一个主机上的真实端口号。这样,能访问Node的客户端都就能通过端口号访问内部的Service了。
LoadBalancer
如果云服务商支持外接负载均衡器,则可以通过spec.tye=LoadBalancer定义Service,同时指定负载均衡器的IP地址。使用这种类型需要指定Service的nodePort和clusterIp.
端口定义
如果一个Pod中有多个对外暴漏端口时,对端口进行命名,是个Endpoint不会因重名而产生歧义。
以上内容摘自http://blog.csdn.net/dream_broken/article/details/53115770。感谢分享!