标签: kubernetes-service

访问 Kubernetes clusterIP 服务时请求超时

我正在寻求帮助来解决这个无法正常工作的基本场景:

在 MacBook上运行的VirtualBox VM上安装了kubeadm 的三个节点:

sudo kubectl get nodes
NAME                STATUS    ROLES     AGE       VERSION
kubernetes-master   Ready     master    4h        v1.10.2
kubernetes-node1    Ready     <none>    4h        v1.10.2
kubernetes-node2    Ready     <none>    34m       v1.10.2
Run Code Online (Sandbox Code Playgroud)

Virtualbox VM 有 2 个适配器:1) Host-only 2) NAT。来自来宾计算机的节点 IP 是:

kubernetes-master (192.168.56.3)
kubernetes-node1  (192.168.56.4)
kubernetes-node2  (192.168.56.5)
Run Code Online (Sandbox Code Playgroud)

我正在使用 flannel pod 网络(我之前也尝试过 Calico,结果相同)。

安装主节点时,我使用了以下命令:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.56.3
Run Code Online (Sandbox Code Playgroud)

我部署了一个 Pod 已启动的 nginx 应用程序,每个节点一个 Pod:

nginx-deployment-64ff85b579-sk5zs   1/1       Running   0          14m       10.244.2.2   kubernetes-node2
nginx-deployment-64ff85b579-sqjgb   1/1       Running   0          14m       10.244.1.2   kubernetes-node1 …
Run Code Online (Sandbox Code Playgroud)

virtualbox kubernetes flannel kubeadm kubernetes-service

8
推荐指数
1
解决办法
2641
查看次数

使用nginx反向代理在Kubernetes中公开服务

我是Kubernetes的新手,想了解如何将Kubernetes中运行的服务暴露给外界.我在群集上使用NodePort公开了它.因此,例如:服务公开主机上的端口31234,我可以通过https:// kubeserverIP:31234从另一台服务器获取服务.

我想要实现的是通过nginx(在不同的服务器上,在Kube控件之外)通过URL(例如http://service.example.com)提供此服务.我已经尝试使用指向服务的上游部署nginx,但这不起作用并且出现错误的网关错误.

这里有什么我想念的吗?或者是否有更简洁的方法来实现这一目标.

我有一个裸机安装的Kubernetes集群,无法访问gce负载均衡器或其他供应商的LB.

谢谢

kubernetes kubernetes-ingress kubernetes-service

8
推荐指数
2
解决办法
1万
查看次数

Kubernetes:没有通往主机的途径

我有一个裸机Kubernetes定制设置(手动使用Kubernetes艰难地设置集群)。一切似乎正常,但我无法从外部访问服务。

我可以在curl时获得服务列表:

https://<ip-addr>/api/v1/namespaces/kube-system/services
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试代理时(使用kubectl proxy,也使用<master-ip-address>:<port>):

https://<ip-addr>/api/v1/namespaces/kube-system/services/toned-gecko-grafana:80/proxy/
Run Code Online (Sandbox Code Playgroud)

我得到:

Error: 'dial tcp 10.44.0.16:3000: connect: no route to host'
Trying to reach: 'http://10.44.0.16:3000/'
Run Code Online (Sandbox Code Playgroud)
  • 即使我正常卷曲,http://10.44.0.16:3000/我也会遇到相同的错误。这是我是否从安装Kubernetes的VM内部卷曲的结果。能够解决此问题,请检查以下内容。

  • 我可以使用NodePort从外部访问我的服务。

  • 如果通过Nginx-Ingress公开我的服务,则可以访问它们。

  • 我将Weave用作CNI,并且日志很正常,除了开始时有几条关于它无法访问命名空间的日志行(RBAC错误)。尽管那之后日志还不错。

  • 使用CoreDNS,日志看起来很正常。APIServer和Kubelet日志看起来很正常。Kubernetes-Events看起来也很正常。

  • 附加说明:我分配的DNS服务IP是10.3.0.10,服务IP范围是:10.3.0.0/24,而POD网络是10.2.0.0/16。我不确定10.44.x.x它是什么或它来自哪里。

这是其中一项服务的输出:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "kubernetes-dashboard",
    "namespace": "kube-system",
    "selfLink": "/api/v1/namespaces/kube-system/services/kubernetes-dashboard",
    "uid": "5c8bb34f-c6a2-11e8-84a7-00163cb4ceeb",
    "resourceVersion": "7054",
    "creationTimestamp": "2018-10-03T00:22:07Z",
    "labels": {
      "addonmanager.kubernetes.io/mode": "Reconcile",
      "k8s-app": "kubernetes-dashboard",
      "kubernetes.io/cluster-service": "true"
    },
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"k8s-app\":\"kubernetes-dashboard\",\"kubernetes.io/cluster-service\":\"true\"},\"name\":\"kubernetes-dashboard\",\"namespace\":\"kube-system\"},\"spec\":{\"ports\":[{\"port\":443,\"targetPort\":8443}],\"selector\":{\"k8s-app\":\"kubernetes-dashboard\"}}}\n" …
Run Code Online (Sandbox Code Playgroud)

networking kubernetes kubernetes-service

8
推荐指数
2
解决办法
7160
查看次数

入口指向服务上的错误端口

我有一个Kubernetes服务,公开两个端口如下

Name:              m-svc
Namespace:         m-ns
Labels:            
Annotations:       <none>
Selector:          app=my-application
Type:              ClusterIP
IP:                10.233.43.40
Port:              first  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.233.115.178:8080,10.233.122.166:8080
Port:              second  8888/TCP
TargetPort:        8888/TCP
Endpoints:         10.233.115.178:8888,10.233.122.166:8888
Session Affinity:  None
Events:            <none>
Run Code Online (Sandbox Code Playgroud)

以下是入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: f5
    virtual-server.f5.com/http-port: "80"
    virtual-server.f5.com/ip: controller-default
    virtual-server.f5.com/round-robin: round-robin
  creationTimestamp: 2018-10-05T18:54:45Z
  generation: 2
  name: m-ingress
  namespace: m-ns
  resourceVersion: "39557812"
  selfLink: /apis/extensions/v1beta1/namespaces/m-ns
  uid: 20241db9-c8d0-11e8-9fac-0050568d4d4a
spec:

  rules:
  - host: www.myhost.com
    http:
      paths:
      - backend:
          serviceName: m-svc
          servicePort: 8080
        path: /first/path
      - backend:
          serviceName: …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-ingress kubernetes-service

8
推荐指数
1
解决办法
476
查看次数

为什么在 Kuberntes 部署/容器定义中需要端口/容器端口?

当我在 kubernetes 中定义例如部署时,有一个包含容器列表的部分,每个容器都包含一组端口,例如:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
Run Code Online (Sandbox Code Playgroud)

现在这里的文档明确表示它不会影响连接:

要从容器公开的端口列表。在此处公开端口可为系统提供有关容器使用的网络连接的附加信息,但主要是信息性的。在此处不指定端口不会阻止该端口被公开。任何侦听容器内默认“0.0.0.0”地址的端口都可以从网络访问。无法更新。

现在看来它并没有真正影响任何东西,只是信息性的,但这究竟意味着什么,它在哪里使用?

我发现它的一个用途是,如果端口定义了一个名称,则可以通过该名称从服务中引用它。

是它还是这个规范还有其他用途?

kubernetes kubernetes-deployment kubernetes-container kubernetes-service kubernetes-networking

8
推荐指数
1
解决办法
3207
查看次数

如何使用Kubernetes端口名称?

在kubernetes 部署中,我指定一个端口,如下所示:

 containers:
 - name: nginx
   image: nginx:latest
   ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
Run Code Online (Sandbox Code Playgroud)

现在,在服务中,我可以像这样引用该端口(允许我仅在服务中指定外部端口):

spec:
  type: ClusterIP
  ports:
  - name: nginx-port
    port: 80
    targetPort: nginx-port
    protocol: TCP
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我可以使用以下语法在其他地方引用服务和端口nginx-service.default.svc.cluster.local:nginx-port吗?您知道我可以使用这些特殊名称来引用服务,但是我发现自己像这样对端口号进行了硬编码nginx-service.default.svc.cluster.local:80

kubernetes kubernetes-service

7
推荐指数
4
解决办法
6185
查看次数

为什么我的Kubernetes服务有时只能在EKS上运行?

在某些情况下,我们提供的服务在尝试访问它们时没有任何响应。例如,Chrome显示ERR_EMPTY_RESPONSE,偶尔我们还会遇到其他错误,例如408,我可以肯定它是从ELB返回的,而不是从应用程序本身返回的。

经过长期的调查,包括对节点本身进行shsh处理,对负载均衡器进行实验等,我们仍然不确定问题实际存在于哪一层:在Kubernetes本身中,还是在Amazon EKS(ELB或除此以外)

  • 似乎只有节点的实例(数据)端口才是有问题的端口。这些问题似乎是断断续续的,这使我们相信,在我们的kubernetes清单或docker配置中,这并不是显而易见的事情,而在基础架构中却是其他问题。有时服务和吊舱会正常工作,但回来后又会早晨破损。这使我们相信问题出在kubernetes中的Pod的重新分配,可能是由AWS中的某项(负载平衡器更改,自动扩展组更改等)或kubernetes本身中由于其他原因重新分配Pod引起的。
  • 在我们已经看到的所有情况下,运行状况检查端口都可以正常运行而不会出现问题,这就是为什么kubernetes和aws都认为一切正常并且不报告任何故障的原因。
  • 我们已经看到某个节点上的某些Pod可以工作,而其他Pod不在同一节点上。
  • 我们已经验证了kube-proxy正在运行,并且iptables-save输出与正在工作的两个pod之间的“相同”。(相同的含义是,并非唯一的所有内容,例如ip地址和端口都是相同的,并且彼此之间应保持一致)。(我们使用以下说明来帮助您完成以下说明:https : //kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#is-the-kube-proxy-working
  • 从节点本身上的ssh,对于发生故障的Pod,我们可以通过所有可能的ip /端口访问Pod(即应用程序本身)。
    • 实例数据端口上节点本身的10.地址。
    • 应用程序端口上的容器(docker容器)的地址10.。
    • 172.的地址?在应用程序端口上(我们不确定该ip是什么,或者ip路由如何到达它,因为它是与docker0接口的172地址不同的子网)。
  • 从另一个节点上的ssh,对于发生故障的Pod,我们无法在任何端口(ERR_EMPTY_RESPONSE)上访问发生故障的Pod。这似乎与服务/负载平衡器的行为相同。

还有什么可能导致这种行为?

kubernetes kubernetes-service amazon-eks

7
推荐指数
1
解决办法
976
查看次数

NodePort无法与AWS EKS服务器终端节点一起使用

eks服务器端点是xxxxxxxxxxx.xxx.eks.amazonaws.com,我已经创建了带有部署和服务对象的yml文件。

[ec2-user@ip-]$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
fakeserver   NodePort    10.100.235.246   <none>        6311:30002/TCP   1h
kubernetes   ClusterIP   10.100.0.1       <none>        443/TCP          1d
Run Code Online (Sandbox Code Playgroud)

当我浏览xxxxxxxxxxx.xxx.eks.amazonaws.com:30002时返回的时间太长而无法响应。安全组具有入站规则中的所有流量。

amazon-web-services kubernetes kubernetes-service amazon-eks

6
推荐指数
1
解决办法
1501
查看次数

如何与 Kubernetes 中的 Sidecar 容器中的 pod 通信?

我无法与侧车集装箱中的吊舱交谈...任何帮助将不胜感激!

这是我的部署

---
apiVersion: extensions/v1beta1
kind: Deployment

metadata:
   name: sidecar-deployment

spec:
replicas: 1

template:
    metadata:
       labels:
          app: sidecar
    spec:
      containers:
      - name: sidecar1
        image: sidecar
        args:
        - /sidecar
        - --port=32000
        - --path=/sidecar1
        ports:
        - containerPort: 32000
      - name: sidecar2
        image: sidecar
        args:
        - /sidecar
        - --port=32001
        - --path=/sidecar2
        ports:
        - containerPort: 32001
Run Code Online (Sandbox Code Playgroud)

这是我为 pod 提供的服务

---
apiVersion: v1
kind: Service

metadata:
  name: sidecar-service

spec:
  ports:
  - name: http
    port: 80
    targetPort: 32001
    protocol: TCP

selector:
  app: sidecar
type: NodePort
Run Code Online (Sandbox Code Playgroud)

部署ingress后,我可以连接到服务和sidecar2,因为sidecar2是通过服务公开的: …

kubernetes kubernetes-service

6
推荐指数
1
解决办法
6226
查看次数

无法连接到 Kubernetes 中的 Mongodb pod(连接被拒绝)

我有一些远程虚拟机,我想在其中部署一些 Mongodb 实例,然后使它们可以远程访问,但由于某种原因,我似乎无法完成这项工作。

这些是我采取的步骤:

  • 我启动了一个在远程虚拟机上运行 Mongodb 的 Kubernetes pod。
  • 然后我通过 Kubernetes NodePort 服务公开它。
  • 然后我尝试从笔记本电脑连接到 Mongodb 实例,但没有成功。

这是我用来尝试连接的命令:

$ mongo host:NodePort   
Run Code Online (Sandbox Code Playgroud)

(“主机”是指 Kubernetes master)。

这是它的输出:

MongoDB shell version v4.0.3
connecting to: mongodb://host:NodePort/test
2018-10-24T21:43:41.462+0200 E QUERY    [js] Error: couldn't connect to server host:NodePort, connection attempt failed: SocketException:
Error connecting to host:NodePort :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:257:13
@(connect):1:6
exception: connect failed
Run Code Online (Sandbox Code Playgroud)

从 Kubernetes master 处,我确保 Mongodb pod 正在运行。然后我在容器中运行 shell 并检查 Mongodb 服务器是否正常工作。此外,我之前通过在 yaml 描述中指定“--bind-ip=0.0.0.0”选项来授予对 Mongodb 服务器的远程访问权限。为了确保已应用此选项,我从同一个 shell 在 Mongodb 实例内运行此命令: …

remote-connection mongodb kubernetes kubernetes-service

6
推荐指数
1
解决办法
1万
查看次数