microk8s Kubernetes 服务连接被拒绝

时间:2021-07-01 12:34:31

标签: django kubernetes dockerfile microk8s

我有一个简单的 django 项目,当您 GET localhost:8000 时返回“hello world”。 我想使用 microk8s 运行它。 使用以下说明 (https://microk8s.io/docs/registry-images) 我创建了图像并应用了我的 yaml 文件

yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-deployment
  labels:
    app: hello
spec:
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: hello1:local
        imagePullPolicy: Never
        ports:
        - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector:
    app: hello
  ports:
  - name: hello
    port: 8000
    protocol: TCP
    targetPort: 8000

Pod 运行正常。

NAME                                    READY   STATUS    RESTARTS   AGE
pod/hello-deployment-6567ccc4f7-7j6nj   1/1     Running   0          61m

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/hello        ClusterIP   10.152.183.241   <none>        8000/TCP         59m

但是当我想访问 10.152.183.241:8000 时没有任何作用。

我也通过以下命令连接到 pod

microk8s kubectl exec -it hello-deployment-6567ccc4f7-7j6nj -- bash

然后安装 curl 并测试这些:

root@hello-deployment-6567ccc4f7-7j6nj:/code# curl localhost:8000
Hello World
root@hello-deployment-6567ccc4f7-7j6nj:/code# curl 10.152.183.241:8000
curl: (7) Failed to connect to 10.152.183.241 port 8000: Connection refused

显然程序正在运行,但是kubernetes服务有问题。我的 yaml 文件有什么问题?

更新 1: 发现图像文件有问题,它可以与其他图像一起使用。 还是不知道是什么问题。

我的 Dockerfile:

FROM python:3
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
CMD python3 manage.py runserver
EXPOSE 8000

3 个答案:

答案 0 :(得分:2)

这是因为您使用的是 ClusterIP,它只能从 CLuster 内部访问。

在这里,您需要 Nginx 入口控制器来公开服务。或者您可以尝试使用 Host IP 一次以连接服务。

你也可以试试这个命令

kubectl port-forward svc/hello 8080:8080

一旦端口被转发,您就可以在 localhost:8080 上点击 curl

但是,对于生产用例,始终建议使用 ingress 来管理集群流量。

Ingress 基本上作为代理工作,它与 Nginx 相同。

Ingress 是由 Ingress controller 管理的配置对象。当您启用入口时,您需要 minikube 中的入口控制器,但对于 GKE 和 EKS 上的其他集群,您必须手动设置。

这是在 minikube 中实现 ingress 的好例子:

https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

入口示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
spec:
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            backend:
              service:
                name: hello
                port:
                  number: 8080

答案 1 :(得分:1)

听起来您需要一个 ingress add-on,它可以让您创建规则以通过 HTTPS/HTTP 访问您的服务。

首先启用入口:

    microk8s enable ingress

然后在你的yaml文件中添加一个入口规则,例如:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: http-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: hello
          servicePort: 80

或者,您可以只公开端口 8000,因为您在本地工作,如 here 所述。

答案 2 :(得分:0)

Django 没有响应。

改变

CMD python3 manage.py runserver

CMD python3 manage.py runserver 0.0.0.0:8000

还将 0.0.0.0 添加到 ALLOWED_HOSTS。