如何从本地计算机访问kubernetes上的服务器?

时间:2020-04-03 10:16:04

标签: kubernetes service host

我的公司有一个kubernetes平台,在该平台上,我有一个运行在命名空间ingress上的pod my_namespace

apiVersion: v1
kind: Pod
metadata:
 name: ingress
 labels:
  app: ingress
spec:
 containers:
  - name: ingress
    image: docker:5000/mma/neurotec-ingress
    imagePullPolicy: Always

kubectl get pods -n my_namespace

NAME            READY   STATUS    RESTARTS   AGE
ingress         1/1     Running   1          11d

pod是一个侦听端口8080的服务器。

我还定义了一个服务,可以将广告连播导出到外部:

apiVersion: v1
kind: Service
metadata:
  name: ingress
  labels:
    app: ingress
spec:
  ports:
  - port: 8080
    protocol: TCP
  selector:
    app: ingress
  type: LoadBalancer

kubectl describe service -n my_namespace ingress

Name:              ingress
Namespace:         my_namespace
Labels:            app=ingress
Selector:          app=ingress
Type:              LoadBalancer
IP:                10.104.95.96
Port:              <unset>  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.16.1.232:8080

我现在想从本地计算机向服务器发送消息。我要做的第一件事是确保其IP地址可访问。但是,简单的host command返回错误:

host 10.16.1.232
Host 10.16.1.232 not found: 3(NXDOMAIN)

host ingress.my_namespace.nt // .nt is company's prefix
Host ingress.my_namespace not found: 3(NXDOMAIN)

如果我尝试运行telepresence,它还会返回错误:

Looks like there's a bug in our code. Sorry about that!

Traceback (most recent call last):
  File "/usr/bin/telepresence/telepresence/cli.py", line 135, in crash_reporting
    yield
  File "/usr/bin/telepresence/telepresence/main.py", line 65, in main
    remote_info = start_proxy(runner)
  File "/usr/bin/telepresence/telepresence/proxy/__init__.py", line 138, in start_proxy
    run_id=run_id,
  File "/usr/bin/telepresence/telepresence/proxy/remote.py", line 144, in get_remote_info
    runner, deployment_name, deployment_type, run_id=run_id
  File "/usr/bin/telepresence/telepresence/proxy/remote.py", line 91, in get_deployment_json
    return json.loads(output)["items"][0]
IndexError: list index out of range

问题:如何从本地计算机访问kubernetes上的服务器

1 个答案:

答案 0 :(得分:0)

我认为您应该使用服务type: LoadBalancer。 (不是ClusterIP

from kubernetes documentation

  • ClusterIP:在群集内部IP上公开服务。选择此值可使服务仅可从以下位置访问 群集。。这是默认的ServiceType。
  • LoadBalancer:使用云提供商的负载均衡器对外公开服务。 NodePort和ClusterIP服务, 自动创建外部负载均衡器路由。

以下是我的样本loadbalaner服务文件。我将端口80暴露给了互联网,并将端口80映射到带有标签run: my-web-portal端口8000的Pod。

apiVersion: v1
kind: Service
metadata:
  name: my-web-portal-svc
  labels:
    run: my-web-portal-svc
spec:
  ports:
  - port: 80
    targetPort: 8000
    protocol: TCP
    name: port-80
  selector:
    run: my-web-portal
  type: LoadBalancer

这是我的部署yml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-portal
spec:
  selector:
    matchLabels:
      run: my-web-portal
  replicas: 1

  template:
    metadata:
      labels:
        run: my-web-portal

    spec:
      containers:
      - name: backend
        image: xxxxxx-backend

要获取端点,我运行命令

kubectl describe service my-web-portal-svc

命令将打印出用于连接到您的Pod的端点

Type:                     LoadBalancer
IP:                       10.100.108.141
LoadBalancer Ingress:     xxxxxxxxxxxxxx.us-west-2.elb.amazonaws.com

如有任何疑问,请发表评论。