Я обошел StackOverflow и не мог понять, почему мой kubectl не подключается к простому примеру фляги в документации Kubernetes. Вот мой файл:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello world from python"
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0")
мой файл докера:
FROM python:3.9
RUN mkdir myapp
RUN cd myapp
COPY hello_world.py .
COPY requirements.txt .
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python3", "hello_world.py"]
мой файл YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world-deployment
labels:
app: hello
spec:
replicas: 4
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello-world-container
image: mrajancsr/playground:1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: hello-world-service
spec:
selector:
app: hello
ports:
- protocol: TCP
port: 5000
targetPort: 5000
Теперь, когда я запускаю следующее:
kubectl get pods
я получил
hello-world-deployment-67d4d6c95c-2cpvx 1/1 Running 0 12m
hello-world-deployment-67d4d6c95c-dm78v 1/1 Running 0 12m
hello-world-deployment-67d4d6c95c-f62w7 1/1 Running 0 10m
hello-world-deployment-67d4d6c95c-xlr7w 1/1 Running 0 12m
Затем далее:
kubectl get svc
Я получил...
hello-world-service ClusterIP 10.97.58.104 <none> 5000/TCP 12h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d13h
Затем я набрал:
kubectl exec -it hello-world-deployment-67d4d6c95c-2cpvx bash
curl localhost:5000
Я получаю сообщение:
Hello world from python
Это также работает:
docker run -p 5001:5000 hello-python
Я не мог использовать 5000:5000, так как по какой-то причине он уже был привязан.
Но я не могу подключить его через kubectl:
curl 10.97.58.104:5000
Затем я прочитал, что причина, по которой kubectl не работает, заключается в том, что, возможно, мне нужно отправить образ докера и заставить его тянуть? Итак, я создал репозиторий докеров и отправил свое изображение, и, следовательно, вы можете увидеть метку как mrajancsr/playground:1
, поскольку это то, что я вытащил из своего частного репо, и оно все еще не работает.
kubectl
сообщает вам, что ваш сервис hello-world-service
имеет ClusterIP
из 10.97.58.104
.
IP-адрес вашей службы является внутренним для кластера, который работает в другой сети, вы не можете обращаться к нему напрямую из вашей хост-сети.
Чтобы получить прямой доступ к вашему модулю через службу, вы можете использовать kubectl port-forward svc/hello-world-service <host-port>:<service-port>
, где в вашем случае порт службы — 5000
, а host-port
может быть любым доступным портом, который вы пожелаете.
Если вы не можете выделить порт 5000 в качестве порта хоста, у вас может быть запущен экземпляр вашего приложения.
Итак, подведем итог:
kubectl port-forward svc/hello-world-service 5001:5000
curl http://localhost:5001
Hello world from python