了解kubernetes中的服务吗?

时间:2019-07-09 13:31:43

标签: docker kubernetes devops kubernetes-service

我正在研究here中的k8s服务

我创建的服务没有选择器,只有一个端点。我要尝试做的是安装了apache,并且它在端口80上运行。我在端口31000上创建了节点端口服务。现在,该服务应将ip:31000重定向到ip:80端口。

它是为内部IP服务,而不是外部IP。

my-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - protocol: TCP
    port: 9376
    targetPort: 80
    nodePort: 31000
  type: NodePort

my-endpoint.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: <IP>
    ports:
      - port: 80

kubectl获得服务-o宽

的输出
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          53m   <none>
my-service   NodePort    10.111.205.207   <none>        9376:31000/TCP   30m   <none>

3 个答案:

答案 0 :(得分:2)

第一件事是,您需要在集群中运行一个Pod,然后在port的Endpoints yaml中分配该Pod的ip,因为服务会将Pod暴露在集群内部或外部,因此我们必须使用选择器或地址Pod,以便服务可以将其自身附加到特定Pod。

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: <ip address of the pod>
    ports:
      - port: <port of the pod>

还有另一件事使用Statefulset代替Deployment运行Pod。

答案 1 :(得分:0)

有多种类型的服务可以为您提供不同级别的访问权限:

ClusterIP -可以从另一个Pod(仅在Kubernetes集群内部)访问服务

NodePort -可以从另一个Pod以及运行Kubernetes集群的机器上访问该服务

LoadBalancer -可以从Kubernetes集群外部(使用外部IP)访问服务

当您具有TCP级别的连接时,

LoadBalancers 非常有用。如果您具有更高级别的连接( http ),则还可以使用 Ingress + NodePort

答案 2 :(得分:0)

服务的用途是在所有不同的 Pod 之间建立通信或从集群外部访问一个 Pod。

因此,您创建的每个 Pod 或每个部署总是会附带某种匹配的服务。有几种不同类型的服务。

1.集群 IP: 设置一个易于记忆的 URL 来访问 pod。只暴露集群中的 pod。因此,您可以随时使用集群 IP 服务,以便在集群内的不同 Pod 之间建立通信。

例如:event-bus-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: event-bus-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: event-bus
  template:
    metadata:
      labels:
        app: event-bus
    spec:
      containers:
        - name: event-bus
          image: lordrafiq/event-bus:latest
---
apiVersion: v1
kind: Service
metadata:
  name: event-bus-srv
spec:
  selector:
    app: event-bus
  type: ClusterIP
  ports:
    - name: event-bus
      protocol: TCP
      port: 4005
      targetPort: 4005

因此,从任何要与 event-bus 通信的 pod 内部,您可以在端口 4005 上使用 event-bus-srv。

 await axios.post('http://event-bus-srv:4005/events', {});

2.节点端口: 使 pod 可从集群外部访问(通常仅用于开发目的)。因此,节点端口可用于您想从集群外部访问 Pod 的任何时候,但它仅用于开发目的,负载均衡器是从集群访问 Pod 的正确方式。

apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - name: posts
      protocol: TCP
      port: 4000
      targetPort: 4000
http://192.168.39.234:31154/posts

31154是我们创建节点端口服务后得到的nodePort。

enter image description here

3.负载均衡器: 使 pod 可从集群外部访问。这是将 Pod 暴露给外界的正确方式。

4.外部名称: 将集群内请求重定向到 CNAME 网址。