首页 > 解决方案 > Kubectl:无法解析主机

问题描述

我创建了一个节点,并且正在运行 microk8s。我创建了一个 Pod 和 3 个副本集。我可以访问经过处理的集群 IP。但是我不知道如何通过名称访问...请帮助我。我是 Kubenetes 的新手。

  1. 我创造
microk8s kubectl create deployment httpenv --image bretfisher/httpenv
  1. 规模
microk8s kubectl scale deployment/httpenv --replicas=3
  1. 暴露
microk8s kubectl expose deployment/httpenv --port 8888
  1. 显示信息
microk8s kubectl get all
NAME                          READY   STATUS    RESTARTS   AGE
pod/httpenv-bd844d85f-9xk9l   1/1     Running   0          18m
pod/httpenv-bd844d85f-jf85j   1/1     Running   0          18m
pod/httpenv-bd844d85f-p5kzg   1/1     Running   0          18m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/httpenv      ClusterIP   10.152.183.91   <none>        8888/TCP   13m
service/kubernetes   ClusterIP   10.152.183.1    <none>        443/TCP    24h

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/httpenv   3/3     3            3           18m

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/httpenv-bd844d85f   3         3         3       18m
  1. 尝试访问

从节点:

curl -i 10.152.183.91:8888

   HTTP/1.1 200 OK
curl -i httpenv:8888

   curl: (6) Could not resolve host: httpenv

标签: kubernetescurlcoredns

解决方案


您可以通过 3 种方式访问​​该服务,我只是在我自己的 microk8s 集群中运行了您的示例。

  • 将流量从 8888 端口转发到任何端口上的本地主机(例如:我已转发到 8888)。
  • 如果您想从集群内访问服务,您可以从集群中运行的任何 pod 访问该服务(虽然安全问题,可以使用策略等来处理)。
  • 您可以将服务从类型:ClusterIP 转换为 NodePort

根据您在上面给出的部署,我在本地运行,下面是运行的 pod。在下面的 port-forward 命令中,我们将所有流量从 microk8s 集群的 8888 端口路由到您的 localhost 8888。然后您可以使用浏览器并导航到 http://localhost:8888,您将在那里看到输出。

k get po 
httpenv-6fdc8554fb-j9q65   1/1     Running   0          14m
httpenv-6fdc8554fb-4fzr8   1/1     Running   0          14m
httpenv-6fdc8554fb-bsxgw   1/1     Running   0          14m

k port-forward httpenv-6fdc8554fb-j9q65 8888:8888 &

curl localhost:8888
Handling connection for 8888
{"HOME":"/root","HOSTNAME":"httpenv-6fdc8554fb-j9q65","KUBERNETES_PORT":"tcp://10.152.183.1:443","KUBERNETES_PORT_443_TCP":"tcp://10.152.183.1:443","KUBERNETES_PORT_443_TCP_ADDR":"10.152.183.1","KUBERNETES_PORT_443_TCP_PORT":"443","KUBERNETES_PORT_443_TCP_PROTO":"tcp","KUBERNETES_SERVICE_HOST":"10.152.183.1","KUBERNETES_SERVICE_PORT":"443","KUBERNETES_SERVICE_PORT_HTTPS":"443","PATH":"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}%  
  • 要访问 microk8s 集群中的服务,我们将运行一个简单的 busybox 容器。
k run -i --tty bb7 --image=busybox -- sh 
# curl  http://httpenv:8888
{"HOME":"/root","HOSTNAME":"httpenv-6fdc8554fb-bsxgw","KUBERNETES_PORT":"tcp://10.152.183.1:443","KUBERNETES_PORT_443_TCP":"tcp://10.152.183.1:443","KUBERNETES_PORT_443_TCP_ADDR":"10.152.183.1","KUBERNETES_PORT_443_TCP_PORT":"443","KUBERNETES_PORT_443_TCP_PROTO":"tcp","KUBERNETES_SERVICE_HOST":"10.152.183.1","KUBERNETES_SERVICE_PORT":"443","KUBERNETES_SERVICE_PORT_HTTPS":"443","PATH":"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}# 
  • 选项3是将服务类型从“ClusterIP”更改为“NodePort”,您可以访问microk8s集群之外的服务。使用 ifconfig 命令获取本地 IP 并 curl 节点端口。

外汇:curl http://local-ip:31223

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2021-11-03T09:55:20Z"
  labels:
    app: httpenv
  name: httpenv
  namespace: default
  resourceVersion: "2013136"
  selfLink: /api/v1/namespaces/default/services/httpenv
  uid: 908f4bbd-fef2-4435-b8c4-a80796e03b13
spec:
  clusterIP: 10.152.183.170
  clusterIPs:
  - 10.152.183.170
  externalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31223
    port: 8888
    protocol: TCP
    targetPort: 8888
  selector:
    app: httpenv
  sessionAffinity: None
  type: NodePort

 k get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
httpenv      NodePort    10.152.183.170   <none>        8888:31223/TCP   22m



推荐阅读