千家信息网

如何使用httpd镜像创建一个Deployment资源对象及其它关联

发表于:2025-01-30 作者:千家信息网编辑
千家信息网最后更新 2025年01月30日,下文给大家带来如何使用httpd镜像创建一个Deployment资源对象及其它关联,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用在行业内
千家信息网最后更新 2025年01月30日如何使用httpd镜像创建一个Deployment资源对象及其它关联


下文给大家带来如何使用httpd镜像创建一个Deployment资源对象及其它关联,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用在行业内累计的经验做一个解答。


1、使用httpd镜像创建一个Deployment资源对象
[root@master ~]# vim lvjianzhao.yaml    #编写yaml文件kind: Deployment            #指定要创建的资源对象类型apiVersion: extensions/v1beta1        #指定deployment所对应的API版本metadata:  name: lvjianzhao-deploy      #定义deployment的名称spec:  replicas: 4            #定义需要创建pod副本的数量  template:    metadata:      labels:                           #指定pod的标签        user: lvjianzhao    spec:      containers:                                       - name: httpd                    #指定容器的名称        image: httpd                #指定基于哪个镜像运行容器[root@master ~]# kubectl apply -f lvjianzhao.yaml     #执行编写的文件[root@master ~]# kubectl explain deployment     #注:如果不知道某个资源对象所对应的API版本,可以通过此命令查看KIND:     DeploymentVERSION:  extensions/v1beta1             #这就是Deployment资源所对应的API版本                        ........................#省略部分内容[root@master ~]# kubectl get deployment lvjianzhao-deploy     #确定所执行的yaml文件生成了我们所需数量的pod

查看其pod标签,是否是我们定义的label:

[root@master ~]# kubectl describe deployment lvjianzhao-deploy    #查看这个资源对象的详细信息Name:                   lvjianzhao-deployNamespace:              defaultCreationTimestamp:      Thu, 07 Nov 2019 17:50:44 +0800Labels:                 "user=lvjianzhao"              #这里就是该资源对象的标签
2、创建一个svc资源对象与上述Deployment资源对象关联。且能够对外网提供服务。映射节点端口为:32123.

[root@master ~]# vim httpd-service.yaml    #编写service的yaml文件kind: ServiceapiVersion: v1metadata:  name: httpd-servicespec:  type: NodePort              #这里需要指定类型为"NodePort",否则默认是cluster IP  selector:    user: lvjianzhao                #与deployment资源对象的这个标签进行关联  ports:  - protocol: TCP    port: 79                #这里指定要映射到的Cluster  IP的端口    targetPort: 80              #这里指定的是要映射pod中的端口    nodePort: 32123     #这里指定的是映射到宿主机的端口[root@master ~]# kubectl apply -f httpd-service.yaml        #执行该yaml文件[root@master ~]# kubectl get svc httpd-service     #查看创建的svc(service)NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEhttpd-service   NodePort   10.97.13.198           79:32123/TCP   2m1s#可以看到将指定的群集端口映射到了本地的32123

现在就可以使用client访问k8s群集中任意一个节点的32123端口,即可看到pod所提供的服务,如下:

[root@master ~]# kubectl describe svc httpd-service       #查看该service的详细信息

返回的信息如下(只能显示少量IP,剩下的只是被省略了,而不是未指定):

既然上面说到了,endpoint指定的都是后端pod的IP地址,那么就来查看验证一下,是否正确,如下:

[root@master ~]# kubectl get pod -o wide | awk '{print $6}'   #输出后端pod的IP地址IP10.244.1.1810.244.2.2110.244.1.1710.244.2.20#可以确认查看的IP能对应上上面service的endpoint指定的IP

查看svc映射endpoint的详细情况,并详细说明负载均衡的底层原理。

3、当我们做完上述操作后,client是可以访问我们pod提供的服务的(并且是负载均衡的效果),那么这是一个什么样的实现过程呢?依赖什么实现的?

其实,背后的原理并没有那么高大上,kube-proxy通过iptables的转发机制来实现负载均衡的效果的,先定义目标IP是service提供的群集IP,然后使用"-j"选项转发到其他iptables规则,如下:

[root@master ~]# kubectl get svc httpd-service | awk '{print $3}'#我们需要先查看到service的群集IPCLUSTER-IP   10.97.13.198[root@master ~]# iptables-save > a.txt          #将iptables规则输出到文件中,方便我们查找[root@master ~]# vim a.txt         #打开iptables规则

搜索我们的群集IP,可以看到,当目标地址是群集IP地址时,就会转发到另一个规则"KUBE-SVC-X2P42VLQEZCHLPKZ",如下:


那么,现在继续搜索它转发到的规则上,如下:

上面的图中,就是与他实现负载均衡相关的策略的,我们一共四个pod,所以上图中的第一个规则使用了random的算法,只有0.25(1/4)的几率采用这个规则,当到达第二条规则后,则有0.33的几率,因为去除前一个pod,还剩下三个pod,10/3=0.33,这就是这个几率的由来,依次类推,当到达最后一个规则后,那么就不用指定几率了,肯定是它来处理这条请求。

附加:为node节点打标签,以便使pod运行在指定的节点。
[root@master ~]# kubectl label nodes node01 disktype=ssd  #给节点node01打标签"disktype=ssd"(自定义的标签)#相应的yaml文件如下:kind: DeploymentapiVersion: extensions/v1beta1metadata:  name: httpdspec:  revisionHistoryLimit: 10  replicas: 3  template:    metadata:      labels:        app: httpd-server    spec:      containers:      - name: httpd        image: 192.168.1.1:5000/httpd:v1        ports:        - containerPort: 80      nodeSelector:                //指定标签选择器
disktype: ssd



看了以上关于如何使用httpd镜像创建一个Deployment资源对象及其它关联,如果大家还有什么地方需要了解的可以在行业资讯里查找自己感兴趣的或者找我们的专业技术工程师解答的,技术工程师在行业内拥有十几年的经验了。



0