标签: kubernetes-service

如何从 pod 内部公开 kubernetes metric server api 以进行curl?

我正在使用指标服务器来获取 Kubernetes 集群的使用情况。但为了从主机外部使用它,我需要使用“kubectl proxy”。但我不想这样做,因为它不打算在后台运行。我希望它作为服务持续运行

我怎样才能实现这些

预期输出 curl clusterip:8001/apis/metrics.k8s.io/v1beta1/nodes

{
  "kind": "NodeMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"
  },
  "items": [
    {
      "metadata": {
        "name": "manhattan-master",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/manhattan-master",
        "creationTimestamp": "2019-11-15T04:26:47Z"
      },
      "timestamp": "2019-11-15T04:26:33Z",
      "window": "30s",
      "usage": {
        "cpu": "222998424n",
        "memory": "3580660Ki"
      }
    }
  ]
Run Code Online (Sandbox Code Playgroud)

我尝试使用LoadBalancig 服务 metrics-server-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: main-port
  externalTrafficPolicy: Local
  type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)

kubectl …

kubernetes kubectl kubernetes-service

5
推荐指数
1
解决办法
6763
查看次数

如何在 kubernetes 服务定义 yaml 中指定不相等的选择器?

我正在尝试为基于某些选择器的一组 pod 创建一个服务。例如,以下get pods命令根据我的要求检索正确的 pod -

kubectl get pods --selector property1=dev,property2!=admin
Run Code Online (Sandbox Code Playgroud)

以下是服务定义 yaml 的摘录,我在其中尝试使用与上述相同的选择器 -

apiVersion: v1
kind: Service
metadata:
  name: service1
spec:
  type: NodePort
  ports:
    - name: port1
      port: 30303
      targetPort: 30303
  selector:
    property1: dev
    << property2: ???? >>>

Run Code Online (Sandbox Code Playgroud)

我尝试过matchExpressions但没有意识到service 不在支持 set-based filters 的资源中。它导致以下错误 -

error: error validating "STDIN": error validating data: ValidationError(Service.spec.selector.matchExpressions): invalid type for io.k8s.api.core.v1.ServiceSpec.selector: got "array", expected "string"; if you choose to ignore these errors, turn validation off with --validate=false …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-service

5
推荐指数
1
解决办法
2458
查看次数

根据 Kubernetes Ingress 中的路径动态设置服务名称

在 Kubernetes 入口中,我想动态地将服务名称更改为与入口中路径的特定部分相匹配。像这样的东西:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /api/(^/+)/(.*)
        backend:
          serviceName: api-(&1)
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

上面示例中的 &1 将解析为字符串 /api/(^/+)/(.*) 中的第一个正则表达式匹配项

因此,基本上,如果路径类似于/api/asset/fetch/anything-at-all,那么它会将调用定向到名为api-asset的服务

我知道这可能会导致一些安全问题,但如果我强制在服务名称中添加前缀“api-”,那么从技术上讲,只有带有前缀“api-”的服务才会暴露在互联网上。所有其他服务仍将在 Kubernetes 集群内受到保护。为了简单起见,我什至可以将前缀更改为“public-”。

这是可能的事吗?设置它的正确语法是什么?

kubernetes kubernetes-ingress kubernetes-service

5
推荐指数
0
解决办法
407
查看次数

无法连接到 Kubernetes NodePort 服务

我有一个使用以下内容创建的正在运行的 Pod pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
    name: microservice-one-pod-name
    labels:
        app: microservice-one-app-label
        type: front-end
spec:
    containers:
    - name: microservice-one
      image: vismarkjuarez1994/microserviceone
      ports:
      - containerPort: 2019
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令创建了一个服务service-definition.yaml

kind: Service
apiVersion: v1
metadata:
  name: microserviceone-service
spec:
  ports:
    - port: 30008
      targetPort: 2019
      protocol: TCP
  selector:
    app: microservice-one-app-label
  type: NodePort
Run Code Online (Sandbox Code Playgroud)

然后我跑去kubectl describe node minikube寻找我应该连接的节点 IP——结果是:

Addresses:
  InternalIP:  192.168.49.2
  Hostname:    minikube
Run Code Online (Sandbox Code Playgroud)

但是当我运行以下curl命令时没有得到任何响应:

curl 192.168.49.2:30008
Run Code Online (Sandbox Code Playgroud)

192.168.49.2:30008当我尝试从浏览器访问时,请求也会超时。

Pod 日志显示容器已启动并正在运行。为什么我无法访问我的服务?

kubernetes kubernetes-pod kubernetes-service

5
推荐指数
1
解决办法
6552
查看次数

Kubernetes:如何允许在相同/不同命名空间中运行的两个 Pod 进行通信,而不管使用服务名称的协议如何?

允许在相同/不同命名空间中运行的两个 pod(例如 pod A 和 B)进行通信,而不管协议(例如 http、https、akka.tcp)以及应用的有效网络策略如何。

尝试的解决方案:

  1. 尝试将网络策略应用于两个 pod 并使用服务名称:“my-svc.my-namespace.svc.cluster.local”使 pod B 与运行服务“my-svc”的 pod A 通信,但两者无法沟通。

  2. 还尝试在部署时在 pod B 中添加 pod A 的 IP 地址和主机映射,然后 pod B 能够与 pod A 通信,但反向通信失败。

请建议我解决这个问题的方法。

kubernetes kubernetes-networkpolicy kubernetes-service

4
推荐指数
2
解决办法
8306
查看次数

在 Kubernetes 中检索服务的全名

默认情况下,根据k8s 文档,服务被分配一个 DNS A 记录作为表单名称my-svc.my-namespace.svc.cluster-domain.example

是否有检索服务全名的命令?

kubernetes kubernetes-service

4
推荐指数
2
解决办法
7333
查看次数

Kubernetes:如果 nodePort 是随机的,如何访问服务?

我是 K8s 的新手,目前正在使用 Minikube 来玩这个平台。如何为服务配置公共(即集群外)端口?我遵循了nginx 示例和 K8s 服务教程。就我而言,我创建了这样的服务:

kubectl expose deployment/mysrv --type=NodePort --port=1234
Run Code Online (Sandbox Code Playgroud)

该服务的端口是 1234,供任何试图从集群内部访问它的人使用。minikube 教程说我需要通过它的随机 nodePort 直接访问服务,这适用于手动测试目的:

kubectl describe service mysrv | grep NodePort
...
NodePort:                 <unset>  32387/TCP
# curl "http://`minikube ip`:32387/"
Run Code Online (Sandbox Code Playgroud)

但我不明白,在一个真正的集群中,该服务如何拥有一个固定的世界可访问端口。nginx 示例描述了有关使用 LoadBalancer 服务种类的一些内容,但它们甚至没有在那里指定端口...

任何想法如何修复整个服务的外部端口?

kubernetes kubernetes-service

4
推荐指数
1
解决办法
3278
查看次数

跨多个节点的服务节点端口

我在 Kubernetes 集群中运行 3 个节点。每个节点都有相同的 Pod myApp。我使用 NodePort 类型创建一个服务,以便可以从外部访问所有 3 个节点。服务 yaml 如下所示

apiVersion: v1
kind: Service
metadata:
  name: myService
  labels:
    app: myApp
spec:
  selector:
    app: myApp
  type: NodePort
Run Code Online (Sandbox Code Playgroud)

假设3个节点的节点IP+端口为:
1. 192.168.18.1:30010
2. 192.168.18.2:30010
3. 192.168.18.3:30010

我的问题是:
1.如果所有请求都到达IP(192.168.18.1:30010)的单个节点,服务会将请求负载均衡到其他节点中的Pod,还是仅目标节点(IP 192.168.18.1:30010) )?

2. 如果问题1的答案为是,则表示服务可以负载均衡请求。那么我们还需要负载均衡器吗?

谢谢

kubernetes kubernetes-service

4
推荐指数
1
解决办法
2390
查看次数

如何在 Kubernetes 中公开外部 ip?

我想用 minikube 公开我的 kubernetes 集群。

考虑我的树

.                                                                                                                                                                            
??? deployment.yaml                                                                                                                                                          
??? Dockerfile                                                                                                                                                               
??? server.js                                                                                                                                                                
??? service.yaml    
Run Code Online (Sandbox Code Playgroud)

我在本地构建了我的 docker 镜像,并且能够通过

kubectl create -f deployment.yaml 
kubectl create -f service.yaml 
Run Code Online (Sandbox Code Playgroud)

. 但是当我跑

 $ kubectl get services                                                                                                                                        
NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE                                                                                    
kubernetes                ClusterIP      10.96.0.1       <none>        443/TCP        2h
nodeapp                   LoadBalancer   10.110.106.83   <pending>     80:32711/TCP   9m
Run Code Online (Sandbox Code Playgroud)

没有外部 ip 可以连接到集群。试图暴露一个 pod,但外部 Ip 没有。为什么没有外网ip?

 $ cat deployment.yaml                                                                                                                                         
apiVersion: apps/v1                                                                                                                                                          
kind: Deployment
metadata:
  name: nodeapp
  labels:
    app: nodeapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nodeapp
  template:
    metadata:
      labels:
        app: …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-service

3
推荐指数
1
解决办法
6613
查看次数

无法访问 Kubernetes 上的暴露端口

我已经构建了一个暴露端口 80 8080 和 8443 的自定义 tcserver 映像。基本上你有一个 apache 并且在配置中你有一个代理传递来将它转发到 tcserver tomcat。

EXPOSE 80 8080 8443
Run Code Online (Sandbox Code Playgroud)

之后,我创建了一个 kubernetes yaml 来构建仅公开端口 80 的 pod。

apiVersion: v1
kind: Pod
metadata:
  name: tcserver
  namespace: default
spec:
  containers:
  - name: tcserver
    image: tcserver-test:v1
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
Run Code Online (Sandbox Code Playgroud)

以及随之而来的服务。

apiVersion: v1
kind: Service
metadata:
  name: tcserver-svc
  labels:
    app: tcserver
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30080
  selector:
    app: tcserver
Run Code Online (Sandbox Code Playgroud)

但问题是我无法访问它。
如果我登录到 pod ( kubectl exec -it tcserver -- /bin/bash),我可以执行 a …

kubernetes kubernetes-service

3
推荐指数
1
解决办法
2321
查看次数