如何创建 Kubernetes 入口以使用 SparkJava 端口 4567?
How to create a Kubernetes ingress to work with SparkJava port 4567?
我创建了一个基于 Java 的 Web 服务,它利用了 SparkJava。默认情况下,此 Web 服务绑定并侦听端口 4567。我公司要求将其放置在 Docker 容器中。我创建了一个 Docker 文件并创建了图像,当我 运行 我公开了端口 4567...
docker run -d -p 4567:4567 -t myservice
我可以调用我的 Web 服务来测试我调用 CURL 命令...
curl -i -X "POST" -H "Content-Type: application/json" -d "{}" "http://localhost:4567/myservice"
...这是有效的。然后我的公司说它想把它放在 Amazon EKS Kubernetes 中,所以我将我的 Docker 图像发布到公司的私有 Dockerhub。我创建了三个 yaml 文件...
- deployment.yaml
- service.yaml
- ingress.yaml
我看到我的对象已创建,我可以在 Kubernetes 中获取到我的容器 运行ning 的 /bin/bash 命令行,并从那里测试本地主机对我的服务的访问是否正常工作,包括对外部的引用网络服务资源,所以我知道我的服务很好
我被入口弄糊涂了。我需要公开一个 URI 才能访问我的服务,但我不确定这应该如何工作。许多示例显示使用 NGINX,但我没有使用 NGINX。
这是我的文件和到目前为止我测试过的内容。任何指导表示赞赏。
service.yaml
kind: Service
apiVersion: v1
metadata:
name: my-api-service
spec:
selector:
app: my-api
ports:
- name: main
protocol: TCP
port: 4567
targetPort: 4567
deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-api-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api-container
image: hub.mycompany.net/myproject/my-api-service
ports:
- containerPort: 4567
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-api-ingress
spec:
backend:
serviceName: my-api-service
servicePort: 4567
当我运行命令...
kubectl get ingress my-api-ingress
...显示...
NAME HOSTS ADDRESS PORTS AGE
my-api-ingress * 80 9s
当我运行命令...
kubectl get service my-api-service
...显示...
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-api-service ClusterIP 172.20.247.225 <none> 4567/TCP 16h
当我运行下面的命令...
kubectl cluster-info
...我明白了...
Kubernetes master is running at https://12CA0954AB5F8E1C52C3DD42A3DBE645.yl4.us-east-1.eks.amazonaws.com
因此,我尝试通过发出...
使用 CURL 到达终点
curl -i -X "POST" -H "Content-Type: application/json" -d "{}" "http://12CA0954AB5F8E1C52C3DD42A3DBE645.yl4.us-east-1.eks.amazonaws.com:4567/myservice"
一段时间后我收到超时错误...
curl: (7) Failed to connect to 12CA0954AB5F8E1C52C3DD42A3DBE645.yl4.us-east-1.eks.amazonaws.com port 4567: Operation timed out
我认为我的入口有问题,但我很难找到非 NGINX 示例进行比较。
想法?
barrypicker.
你的服务应该是"type: NodePort"
这个例子非常相似(但是在 GKE 中测试过)。
kind: Service
apiVersion: v1
metadata:
name: my-api-service
spec:
selector:
app: my-api
ports:
- name: main
protocol: TCP
port: 4567
targetPort: 4567
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-api-deployment
spec:
replicas: 1
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api-container
image: hashicorp/http-echo:0.2.1
args = ["-listen=:4567", "-text='Hello api'"]
ports:
- containerPort: 4567
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-api-ingress
spec:
backend:
serviceName: my-api-service
servicePort: 4567
在您的入口 kubectl get ingress <your ingress>
您应该会看到一个外部 IP 地址。
您可以找到特定的 AWS 实施 here. In addition more information about exposing services you can find here
我创建了一个基于 Java 的 Web 服务,它利用了 SparkJava。默认情况下,此 Web 服务绑定并侦听端口 4567。我公司要求将其放置在 Docker 容器中。我创建了一个 Docker 文件并创建了图像,当我 运行 我公开了端口 4567...
docker run -d -p 4567:4567 -t myservice
我可以调用我的 Web 服务来测试我调用 CURL 命令...
curl -i -X "POST" -H "Content-Type: application/json" -d "{}" "http://localhost:4567/myservice"
...这是有效的。然后我的公司说它想把它放在 Amazon EKS Kubernetes 中,所以我将我的 Docker 图像发布到公司的私有 Dockerhub。我创建了三个 yaml 文件...
- deployment.yaml
- service.yaml
- ingress.yaml
我看到我的对象已创建,我可以在 Kubernetes 中获取到我的容器 运行ning 的 /bin/bash 命令行,并从那里测试本地主机对我的服务的访问是否正常工作,包括对外部的引用网络服务资源,所以我知道我的服务很好
我被入口弄糊涂了。我需要公开一个 URI 才能访问我的服务,但我不确定这应该如何工作。许多示例显示使用 NGINX,但我没有使用 NGINX。
这是我的文件和到目前为止我测试过的内容。任何指导表示赞赏。
service.yaml
kind: Service
apiVersion: v1
metadata:
name: my-api-service
spec:
selector:
app: my-api
ports:
- name: main
protocol: TCP
port: 4567
targetPort: 4567
deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-api-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api-container
image: hub.mycompany.net/myproject/my-api-service
ports:
- containerPort: 4567
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-api-ingress
spec:
backend:
serviceName: my-api-service
servicePort: 4567
当我运行命令...
kubectl get ingress my-api-ingress
...显示...
NAME HOSTS ADDRESS PORTS AGE
my-api-ingress * 80 9s
当我运行命令...
kubectl get service my-api-service
...显示...
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-api-service ClusterIP 172.20.247.225 <none> 4567/TCP 16h
当我运行下面的命令...
kubectl cluster-info
...我明白了...
Kubernetes master is running at https://12CA0954AB5F8E1C52C3DD42A3DBE645.yl4.us-east-1.eks.amazonaws.com
因此,我尝试通过发出...
使用 CURL 到达终点curl -i -X "POST" -H "Content-Type: application/json" -d "{}" "http://12CA0954AB5F8E1C52C3DD42A3DBE645.yl4.us-east-1.eks.amazonaws.com:4567/myservice"
一段时间后我收到超时错误...
curl: (7) Failed to connect to 12CA0954AB5F8E1C52C3DD42A3DBE645.yl4.us-east-1.eks.amazonaws.com port 4567: Operation timed out
我认为我的入口有问题,但我很难找到非 NGINX 示例进行比较。
想法?
barrypicker.
你的服务应该是"type: NodePort" 这个例子非常相似(但是在 GKE 中测试过)。
kind: Service
apiVersion: v1
metadata:
name: my-api-service
spec:
selector:
app: my-api
ports:
- name: main
protocol: TCP
port: 4567
targetPort: 4567
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-api-deployment
spec:
replicas: 1
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api-container
image: hashicorp/http-echo:0.2.1
args = ["-listen=:4567", "-text='Hello api'"]
ports:
- containerPort: 4567
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-api-ingress
spec:
backend:
serviceName: my-api-service
servicePort: 4567
在您的入口 kubectl get ingress <your ingress>
您应该会看到一个外部 IP 地址。
您可以找到特定的 AWS 实施 here. In addition more information about exposing services you can find here