在部署好k8s之后,我们可以通过创建Deployment来为pod和ReplicaSet提供声明式的更新能力。在Deployment中,我们需要描述目标状态,Deployment会自动根据这些描述将其变为期望状态。
但是默认通过Deployment运行的pod只能在k8s集群中进行访问,要想被外网访问,需要创建SVC,即pod对应的service,在service上暴露端口,通过宿主机的端口映射进行pod容器的访问。
- 创建yaml文件
假设现在需要在k8s上部署3个Nginx服务的pod,我们可以通过命令行或者yaml文件来创建Deployment和SVC,一般推荐使用yaml文件。
1.1 yaml文件内容
Deployment和Service两部分信息可以放在不同的yaml文件中单独执行,如果放在同一个yaml文件中,需要用连续的三个短横线隔开。yaml文件具体内容如下:
1.2 yaml文件说明
1.2.1 Deployment
一个完整的Deployment需要包含metadata(元数据)、spec(期望状态)和status(状态)三部分,其中status是创建Deployment后才会显示的,可能为running,也可能是其他异常状态等。
*由于yaml文件中的不同设置等级差别较多,以下abc之类是按照对应语句块从上到下的顺序进行说明。
1.2.1.1 apiVersion
指定创建对象所使用的API版本,kubectl explain deloyment.apiVersion命令获取。
1.2.1.2 kind
kind部分需指定副本控制器,副本控制器发展到目前共有三代,依次为Replication Controller、ReplicaSet和Deployment。
1.2.1.3 metadata
Deployment的元数据,帮助识别对象唯一性的数据,包含名称和标签,也可以加上名称空间等信息。
①namespace:指定名称空间;
②name:指定版本控制器名称;
③labels:标签设置,对应下面的“app: nginx”。
1.2.1.4 spec
相当于Deployment的规范,是Deployment创建pod的期待状态,用于定义Deployment中容器的详细信息。
①replicas:副本数量,即创建几个pod,创建多个pod时,极大概率会分布在不同的node节点上,很少出现偏向同一节点的情况;
②selector:定义标签选择器,通过匹配label来告诉控制器去管理哪些副本,使pod维持在期望状态;
a. matchLabels:定义匹配的标签,必须要设置;
b. app: nginx:匹配的目标标签;
③template:模板,必须要设置,用于定义期望状态下的pod相关信息。
a. metadata:定义模板元数据;
b. labels:定义模板标签;
c. app: nginx:模板标签名称;
d. spec:定义pod相关信息;
e. containers:定义pod中的容器数量,可以为1个或者多个,pod不能动态增减容器数量;
f. - name:容器名称;
g. image:容器使用的镜像;
h. ports:容器端口列表;
i. - containerPort:pod容器使用的端口。
1.2.2 SVC
SVC的格式大体上与Deployment相近,主要是通过对应labels的匹配来选择将流量路到哪个pod中。
1.2.2.1 kind
选择类型为service。
1.2.2.2 apiVersion
指定要使用的API版本,可通过kubectl explain service.apiVersion命令获取。
1.2.2.3 metadata
定义service元数据。
①abels:自定义service标签,下面一行为自定义service标签内容;
②name:定义service的名称,该名称可以被DNS解析;
③namespace:定义该service的名称空间。
1.2.2.4 spec
定义service的详细信息。
①type:定义服务的访问方式,默认是ClusterIP,只能在k8s集群内部访问;
②ports:定义访问端口列表。
a. - name:定义端口名称;
b. port:service监听端口;
c. protocol:service进行转发时使用的协议,支持tcp、udp和sctp三种协议;
d. targetPort:目标容器端口号;
e. nodePort:宿主机上打开的端口号,如果type部分使用的ClusterIP,不要添加该设置。
1.2.2.5 selector
service的校验器或标签选择器,匹配要访问的目标pod,将流量路到选择的pod上,必须与Deployment.spec.selector.mathLabels相匹配。
- 下载Nginx镜像
建议提前下载好镜像,生产中建议使用企业自己制作的镜像,笔者在实验中就直接通过官方获取。
- 创建Deployment和SVC
使用kubectl apply命令创建Deployment和SVC,由于提前准备了所需镜像,故稍等片刻即可查看Deployment状态,并且三个pod的状态都是ready,查看pod信息时,通过Deployment创建的三个Nginx pod已经正常运行。
- 修改默认主页
此时我们是可以在浏览器使用任意一个节点的IP加30004端口去访问的,不过默认的主页无法看出效果,可以修改一下三个pod的默认主页,显示各自IP。
修改默认主页需要登录容器,可以直接在服务器上使用kubectl exec命令加上对应pod名称登录,笔者已提前部署好dashboard,就直接在浏览器中进行修改。
- 访问主页
访问主页时我们可以在master或node节点上,不过master节点一般用于管理,真正的工作还是交给node节点好点。
- 高可用反代设置
如果是生产中通过不同的IP和端口来访问Nginx服务必然很麻烦,可以在HAProxy服务器中进行转发设置,将三个node节点的信息添加进去,即可通过VIP地址进行访问。