此文为学习《Kubernetes权威指南》的相关笔记
个人思路:
根据docker的设计理念,容器作为一个运行单位,在使用上应当秉持“一个容器只运行一项功能”的设计原则,这个原则让容器具有高复用性和低耦合的特征,但在工业应用场景中,以这个原则所设计的服务并不能够独立看作一项完整的“微服务”进行调度(毕竟“一项功能”所能实现的事情有限),在K8s的架构中,以Pod(豆荚)作为一个调度和使用的基本单位,一个pod中大于等于一个的容器作为同一个单元,共同组成一个整体进行运行,Pod内部的容器自然有相互之间的松散耦合关系,最终提供对外调用的接口。
于此同时,Pod接收ReplicationControll、ReplicaSet、Deployment、job等资源对象的控制,可以动态生成和增删其自身的副本,这一控制由Label机制实现,在对外服务方面,Pod可以建立一个Service资源对象,获得统一的ClusterIP,统一对外提供服务,这是K8S架构中“微服务”这一慨念的具体实现,后面将继续学习这些机制,增强对其理解。
下面运行一个由多个容器组成一个Pod对外提供服务的例子,在这个例子中,Pod里包含了一个PHP前台容器和一个后台Redis数据库容器,在PHP容器设计时就指定好未来访问Redis数据库的目标端口,再在Pod建立时指定好Redis容器的端口参数一致,即实现了Pod内部两个容器的耦合,该Pod通过PHP容器开放端口对外提供服务。
1、新建配置文件frontend-localredis-pod.yaml
# vim frontend-localredis-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: redis-php
labels:
name: redis-php
spec:
containers: #定义前台容器,开放80端口
- name: frontend
image: kubeguide/guestbook-php-frontend:localredis
ports:
- containerPort: 80
- name: redis #定义Redis容器,开放6379端口
image: kubeguide/redis-master
ports:
- containerPort: 6379
2、运行kubectl create命令创建Pod
# kubectl create -f frontend-localredis-pod.yaml
pod/redis-php created
3、查看已创建的Pod:
# kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-php 2/2 ContainerCreating 0 23m
4、查看Pod详细信息,可以看到两个容器的定义和创建过程
# kubectl describe pod redis-php
Name: redis-php
Namespace: default #所在命名空间
Priority: 0 #优先权
Node: xu.node1/192.168.31.189 #运行节点/IP
Start Time: Mon, 09 Dec 2019 22:51:31 +0800
Labels: name=redis-php