具有规范类型 ClusterIP 和规范类型 Nodeport 的 Kubernetes 服务

Kubernetes services with spec type ClusterIP and spec type Nodeport

我正在尝试创建一个服务,其中 pods 通过具有 spec type: ClusterIP 的服务建立连接,现在我想使用 [=15] 将此应用程序公开到我的浏览器=] 但是我无法将类型 NodePort 添加到现有的 service.yaml。如何在同一服务中为同一应用程序指定第二个规格?

app1-->连接到 app2(db 通过 ClusterIP:端口 1521) app1-->暴露给入口以从我的浏览器访问它

apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"partner-service","namespace":"default"},"spec":{"ports":[{"port":1521,"protocol":"TCP","targetPort":1521}]}}
  creationTimestamp: "2021-03-08T14:32:02Z"
  labels:
    app: partner-db
  name: partner-service
  namespace: default
  resourceVersion: "12574"
  uid: b5106bef-a292-4a16-aafc-9676a81cd763
spec:
  clusterIP: 10.96.122.33
  clusterIPs:
  - 10.96.122.33
  ports:
  - port: 1521
    protocol: TCP
    targetPort: 1521
  selector:
    app: partner-db
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

这会引发需要 ClusterIp 的错误。是否可以在同一个服务中有两种类型的连接?

我也试过k expose deployment partner-as --type=NodePort --ports=8080但是错误服务已经存在

这在安装了 minikube 的 vagrant VM 上运行

根据评论添加了第二项服务。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2021-03-09T09:28:00Z"
  labels:
    app: partner-as
  name: service-as
  namespace: default
  resourceVersion: "16889"
  uid: bed7ab44-c350-45e6-87c4-8aac037740c3
spec:
  clusterIP: 10.104.102.177
  clusterIPs:
  - 10.104.102.177
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30029
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: partner-as
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

和我的ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-as
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: partner.info
      http:
        paths:
          - path: /partner
            pathType: Prefix
            backend:
              service:
                name: service-as
                port:
                  number: 8080

在 vagrant 虚拟机的 etc 主机中添加 partner.info。

仍然无法从 ym 本地计算机访问 IP。(因此无法从 brwoser 访问)

将我的服务描述为

Name:                     service-as
Namespace:                default
Labels:                   app=partner-as
Annotations:              <none>
Selector:                 app=partner-as
Type:                     NodePort
IP Families:              <none>
IP:                       10.104.102.177
IPs:                      10.104.102.177
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30029/TCP
Endpoints:                172.17.0.5:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

您不能定义类型为 ClusterIPNodePort 的服务。

您需要删除 ClusterIP 类型的旧服务并创建 NodePort 类型的新服务。

请记住在 Service 规范中保留 selector 标签,以便新服务正确地将流量路由到正确的 pods 集。

您可以使用不同的名称创建两个服务,但保持相同的选择器

对于单个服务,您不能应用多个类型。 ClusterIPNodePort 你只能使用 一个

在一个文件中你可以做的是

service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: partner-db
  name: partner-service
  namespace: default
spec:
  ports:
  - port: 1521
    protocol: TCP
    targetPort: 1521
  selector:
    app: partner-db
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: partner-db
  name: partner-service-node-port
  namespace: default
spec:
  ports:
  - port: 1521
    protocol: TCP
    targetPort: 1521
  selector:
    app: partner-db
  type: NodePort

对于内部使用,您可以使用集群 IP,但如果您希望使用 Domain 使用或公开服务,我建议您使用入口。

为此

app1-->connects to app2(db via ClusterIP: port 1521) app1-->expose to ingress to access it from my browser

如果您正在使用入口,您可以将两种服务类型都用作 ClusterIP,因为您希望通过浏览器访问您的 app1