五一假期结束,我们继续看看k8s的使用,上一篇文章讲到pod,文末提到,这样的pod还无法从集群外部使用,那么如何才能访问到集群内布的服务呢?这要借助于k8s的Service资源,利用Service可以将集群内布的服务映射出来,供集群外访问。

查看Service我们可以使用命令

kubectl get svc

和pod类似,加上-n选项,我们可以查看对应命名空间下的Service。

创建Service也和pod类似,编写一个YAML文件即可,这样方便我们对我们的配置进行归档保存,针对上一篇文章的pod,我们编写的Service应该如下所示,保存文件为wordpress-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    service: wordpress
spec:
  type: NodePort
  selector:
    app: wordpress
  ports:
    - port: 10080
      name: http
      protocol: TCP
      targetPort: http
      nodePort: 10080

之后使用命令应用该配置:

kubectl apply -f wordpress-svc.yaml

当我们不需要Service的时候,运行下面的命令删除Service即可

kubectl delete -f wordpress-svc.yaml

现在我们回过头看一下上面的YAML文件的内容,metadata部分是Service自己的元数据,主要定义了Service的名称以及labels,spec是我们重点关注的。

Service有四种类型,分别是ClusterIP,NodePort,LoadBalancer和Ingress。

ClusterIP是默认的方式,就是在集群内部可以使用集群内部的ClusterIP对服务进行访问;LoadBalancer则需要为k8s配置负载均衡器才可使用,负载均衡器具有开放的域名,由负载均衡器选择合适的节点进行服务;Ingress则是利用转发机制,对外界访问进行转发规则配置。我们上面使用的是NodePort的方式,也应该是我们平时自己使用k8s使用最多的方式,我们可以使用集群内任何一个节点的IP和对应的端口号对服务进行访问,但是我们访问到的并不一定是我们所使用的IP的节点pod,k8s会在内部选择合适的节点提供服务。

spec中的字段,首先通过type说明我们的服务类型是NodePort,selector是label选择器,用来对需要开放的Pod进行选择,上一篇文章Pod中metadata的labels字段使用的是app:  wordpress,这里选择对应的label。

ports字段比较复杂,主要涉及三个端口号:port是集群内部服务开放的端口,targetPort是我们之前Pod中containers字段中定义的端口号,这里可以使用Pod中定义的name(http)代替明文(80),nodePort是我们节点映射给外部使用的端口号。所以我们上面的配置规则意思就是将app: wordpress这个Pod的http端口开放为的10080端口,集群内部也使用10080端口进行访问。之后我们就可以使用任意一个node的IP:nodePort

进行访问了。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐