microk8s Kubernetes 服务连接被拒绝
microk8s Kubernetes Service connection refused
我有一个简单的 restful django 项目,当你 GET localhost:8000 时 return '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 正常 运行ning。
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
明明程序是运行ning 但是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
听起来您需要一个 ingress add-on,它可以让您创建规则以通过 HTTPS/HTTP 访问您的服务。
首先启用入口:
microk8s enable ingress
然后在你的yaml文件中添加一个ingress规则,例如:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: http-ingress
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: hello
servicePort: 80
或者,您可以只公开端口 8000,因为您在本地工作,如 here 所述。
这是因为您正在使用只能从 Cluster 内部访问的 ClusterIP。
这里你需要Nginx入口控制器来暴露服务。或者您可以尝试使用主机 IP 一次连接服务。
你也可以试试命令
kubectl port-forward svc/hello 8080:8080
转发端口后,您可以在 localhost:8080.
上点击 curl
但是,对于生产用例,始终建议使用 ingress
来管理集群流量。
Ingress 基本上作为代理工作,它与 Nginx 相同。
Ingress是由Ingress controller
管理的配置对象。当您启用入口时,您需要在 minikube 中使用入口控制器,但是对于 GKE 和 EKS 上的其他集群,您必须手动设置。
这是在 minikube 中实现入口的一个很好的例子:
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
Django 没有响应。
改变
CMD python3 manage.py runserver
和
CMD python3 manage.py runserver 0.0.0.0:8000
还要将 0.0.0.0 添加到 ALLOWED_HOSTS。
我有一个简单的 restful django 项目,当你 GET localhost:8000 时 return '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 正常 运行ning。
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
明明程序是运行ning 但是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
听起来您需要一个 ingress add-on,它可以让您创建规则以通过 HTTPS/HTTP 访问您的服务。
首先启用入口:
microk8s enable ingress
然后在你的yaml文件中添加一个ingress规则,例如:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: http-ingress
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: hello
servicePort: 80
或者,您可以只公开端口 8000,因为您在本地工作,如 here 所述。
这是因为您正在使用只能从 Cluster 内部访问的 ClusterIP。
这里你需要Nginx入口控制器来暴露服务。或者您可以尝试使用主机 IP 一次连接服务。
你也可以试试命令
kubectl port-forward svc/hello 8080:8080
转发端口后,您可以在 localhost:8080.
上点击curl
但是,对于生产用例,始终建议使用 ingress
来管理集群流量。
Ingress 基本上作为代理工作,它与 Nginx 相同。
Ingress是由Ingress controller
管理的配置对象。当您启用入口时,您需要在 minikube 中使用入口控制器,但是对于 GKE 和 EKS 上的其他集群,您必须手动设置。
这是在 minikube 中实现入口的一个很好的例子:
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
Django 没有响应。
改变
CMD python3 manage.py runserver
和
CMD python3 manage.py runserver 0.0.0.0:8000
还要将 0.0.0.0 添加到 ALLOWED_HOSTS。