0
点赞
收藏
分享

微信扫一扫

创建SVC访问Deployment运行的PODS

    在部署好k8s之后,我们可以通过创建Deployment来为pod和ReplicaSet提供声明式的更新能力。在Deployment中,我们需要描述目标状态,Deployment会自动根据这些描述将其变为期望状态。

    但是默认通过Deployment运行的pod只能在k8s集群中进行访问,要想被外网访问,需要创建SVC,即pod对应的service,在service上暴露端口,通过宿主机的端口映射进行pod容器的访问。


  1. 创建yaml文件

    假设现在需要在k8s上部署3个Nginx服务的pod,我们可以通过命令行或者yaml文件来创建Deployment和SVC,一般推荐使用yaml文件。

1.1 yaml文件内容

    Deployment和Service两部分信息可以放在不同的yaml文件中单独执行,如果放在同一个yaml文件中,需要用连续的三个短横线隔开。yaml文件具体内容如下:

创建SVC访问Deployment运行的PODS_k8s

创建SVC访问Deployment运行的PODS_nginx_02

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相匹配。


  1. 下载Nginx镜像

    建议提前下载好镜像,生产中建议使用企业自己制作的镜像,笔者在实验中就直接通过官方获取。

创建SVC访问Deployment运行的PODS_deployment_03


  1. 创建Deployment和SVC

    使用kubectl apply命令创建Deployment和SVC,由于提前准备了所需镜像,故稍等片刻即可查看Deployment状态,并且三个pod的状态都是ready,查看pod信息时,通过Deployment创建的三个Nginx pod已经正常运行。

创建SVC访问Deployment运行的PODS_deployment_04


  1. 修改默认主页

    此时我们是可以在浏览器使用任意一个节点的IP加30004端口去访问的,不过默认的主页无法看出效果,可以修改一下三个pod的默认主页,显示各自IP。

创建SVC访问Deployment运行的PODS_元数据_05

    修改默认主页需要登录容器,可以直接在服务器上使用kubectl exec命令加上对应pod名称登录,笔者已提前部署好dashboard,就直接在浏览器中进行修改。

创建SVC访问Deployment运行的PODS_k8s_06

创建SVC访问Deployment运行的PODS_名称空间_07

创建SVC访问Deployment运行的PODS_元数据_08

创建SVC访问Deployment运行的PODS_元数据_09


  1. 访问主页

    访问主页时我们可以在master或node节点上,不过master节点一般用于管理,真正的工作还是交给node节点好点。

创建SVC访问Deployment运行的PODS_元数据_10

创建SVC访问Deployment运行的PODS_元数据_11

创建SVC访问Deployment运行的PODS_元数据_12


  1. 高可用反代设置

    如果是生产中通过不同的IP和端口来访问Nginx服务必然很麻烦,可以在HAProxy服务器中进行转发设置,将三个node节点的信息添加进去,即可通过VIP地址进行访问。

创建SVC访问Deployment运行的PODS_deployment_13

创建SVC访问Deployment运行的PODS_deployment_14

创建SVC访问Deployment运行的PODS_k8s_15

创建SVC访问Deployment运行的PODS_deployment_16

举报

相关推荐

0 条评论