我正在尝试使用在minikube安装上运行的k8运行两个服务。
所以我有服务Foo
和Bar
,因此当我访问服务Foo
时,它必须触发服务Bar
才能获取数据。
以下是Foo
服务的部署配置
foo-deployment.yaml
:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: foo-server
labels:
app: foo-server
spec:
replicas: 1
template:
metadata:
labels:
app: foo-server
serving: "true"
spec:
containers:
- name: foo-server
image: foo-container
env:
- name: BAR_SERVICE_URL
value: http://bar-server:8081
ports:
- containerPort: 8080
name: http
foo-svc.yaml
:
apiVersion: v1
kind: Service
metadata:
name: foo-server
labels:
app: foo-server
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
name: http
selector:
app: foo-server
serving: "true"
BAR_SERVICE_URL
evn变量在Foo
内使用,因此服务知道Bar
的主机。
这是Bar
服务的服务配置
bar-svc.yaml
:
apiVersion: v1
kind: Service
metadata:
name: bar-server
labels:
app: bar-server
spec:
type: NodePort
ports:
- port: 8081
targetPort: 8081
name: http
selector:
app: bar-server
bar-deployment.yaml
:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: bar-server-v1
labels:
app: bar-server
version: "1.0"
spec:
replicas: 2
template:
metadata:
labels:
app: bar-server
version: "1.0"
serving: "true"
spec:
containers:
- name: bar-server
image: bar-container
ports:
- containerPort: 8081
name: http
当我使用minikube ip和公开服务端口访问Foo
服务时,我在pod日志中收到以下错误:
2018-02-08 14:32:25.875 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://bar-server:8081/endpoint": bar-server; nested exception is java.net.UnknownHostException: bar-server] with root cause
java.net.UnknownHostException: bar-server
但是,我可以使用minikube ip和公开端口bar-server/endpoint
来访问http://192.168.99.100:31168/endpoint
。
看起来我可以从群集外部访问Foo
和Bar
服务。但Foo
服务无法解析Bar
服务主机,无法访问它。
UPD :以下是一些详细解决问题的更新。
minikube
点击kube-dns
插件已启用。 Foo
窗格到wget
的旁边到Bar
服务端点尝试。我可以通过bar-server
的IP地址进行,但不能使用bar-server:8081/endpoint
。尝试nslookup kubernetes.default.svc.cluster.local localhost
看起来不错。这是ouptput:
服务器:127.0.0.1 地址1:127.0.0.1 localhost
dns
pod也会查找并运行。以下是kubectl get pods -n=kube-system | grep -i dns
kube-dns-6777479f6b-vxd7m 3/3正在运行9 1d
答案 0 :(得分:3)
Kubernetes使用DNS(kube-dns
)进行服务发现。如果k8s中的DNS正常运行,则服务Foo
应该能够ping
或curl
服务Bar
,反之亦然。
检查kube-dns
是否有效的一种方法是查看以下命令是否在任何窗格内工作:
nslookup kubernetes.default.svc.cluster.local localhost
nslookup kubernetes.default localhost
可以在输出中检查 kube-dns
pod的运行状况:
kubectl get pods -n=kube-system | grep -i dns
答案 1 :(得分:1)
尝试使用env变量BAR_SERVER_SERVICE_HOST。不要注入它,kubernetes为同一命名空间内的服务注入它
在此处阅读服务发现选项: https://kubernetes.io/docs/concepts/services-networking/service/#discovering-services