调用 Kubernetes 服务失败
Call to Kubernetes service failed
kubernetes 版本:1.5.2
os: 分os 7
etcd 版本:3.4.0
首先,我创建了一个 etcd pod、etcd docker 文件和 etcd pod YAML 文件,如下所示:
etcd docker文件:
FROM alpine
COPY . /usr/bin
WORKDIR /usr/bin
CMD etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379
EXPOSE 2379
pod yaml 文件
apiVersion: v1
kind: Pod
metadata:
name: etcd
namespace: storageplatform
labels:
app: etcd
spec:
containers:
- name: etcd
image: "karldoenitz/etcd:3.4.0"
ports:
- containerPort: 2379
hostPort: 12379
创建 docker 映像并推送到 dockerhub 后,我 运行 命令 kubectl apply -f etcd.yaml
创建 etcd pod。
etcd pod 的 ip 是 10.254.140.117
,我 运行 命令使用 ETCDCTL_API=3 etcdctl --endpoints=175.24.47.64:12379 put 1 1
得到 OK
.
我的服务 yaml:
apiVersion: v1
kind: Service
metadata:
name: storageservice
namespace: storageplatform
spec:
type: NodePort
ports:
- port: 12379
targetPort: 12379
nodePort: 32379
selector:
app: etcd
应用 yaml 文件创建 service.run 命令 kubectl get services -n storageplatform
,我得到了这些信息。
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
storageplatform storageservice 10.254.140.117 <nodes> 12379:32379/TCP 51s
毕竟我运行命令
ETCDCTL_API=3 etcdctl --endpoints=10.254.140.117:32379 get 1
或
ETCDCTL_API=3 etcdctl --endpoints={host-ip}:32379 get 1
我得到了Error: context deadline exceeded
。
怎么了?如何让服务有用?
您使用服务 name/ip (10.254.140.117 ) 和服务端口 (12379) 定义了一个在 kubernetes 网络内部可用的服务,该服务在 kubernetes 集群的所有节点上可用,甚至在具有节点端口 (32379) 的 kubernetes 网络
您需要修复服务才能映射到正确的容器端口:targetPort
必须匹配 pod containerPort
(以及 dockerfile 中的端口)。
如果错误 Error: context deadline exceeded
仍然存在,则表明存在通信问题。这可以在将内部服务 ip 与外部节点端口(您的第一个 get 1)一起使用时进行解释。对于节点端口(您的第二个命令),我假设 etcd pod 不正确 运行,或者端口在节点上被防火墙保护。
更改服务以引用 containerPort
而不是 hostPort
apiVersion: v1
kind: Service
metadata:
name: storageservice
namespace: storageplatform
spec:
type: NodePort
ports:
- port: 2379
targetPort: 2379
nodePort: 32379
selector:
app: etcd
kubernetes 版本:1.5.2
os: 分os 7
etcd 版本:3.4.0
首先,我创建了一个 etcd pod、etcd docker 文件和 etcd pod YAML 文件,如下所示:
etcd docker文件:
FROM alpine
COPY . /usr/bin
WORKDIR /usr/bin
CMD etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379
EXPOSE 2379
pod yaml 文件
apiVersion: v1
kind: Pod
metadata:
name: etcd
namespace: storageplatform
labels:
app: etcd
spec:
containers:
- name: etcd
image: "karldoenitz/etcd:3.4.0"
ports:
- containerPort: 2379
hostPort: 12379
创建 docker 映像并推送到 dockerhub 后,我 运行 命令 kubectl apply -f etcd.yaml
创建 etcd pod。
etcd pod 的 ip 是 10.254.140.117
,我 运行 命令使用 ETCDCTL_API=3 etcdctl --endpoints=175.24.47.64:12379 put 1 1
得到 OK
.
我的服务 yaml:
apiVersion: v1
kind: Service
metadata:
name: storageservice
namespace: storageplatform
spec:
type: NodePort
ports:
- port: 12379
targetPort: 12379
nodePort: 32379
selector:
app: etcd
应用 yaml 文件创建 service.run 命令 kubectl get services -n storageplatform
,我得到了这些信息。
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
storageplatform storageservice 10.254.140.117 <nodes> 12379:32379/TCP 51s
毕竟我运行命令
ETCDCTL_API=3 etcdctl --endpoints=10.254.140.117:32379 get 1
或
ETCDCTL_API=3 etcdctl --endpoints={host-ip}:32379 get 1
我得到了Error: context deadline exceeded
。
怎么了?如何让服务有用?
您使用服务 name/ip (10.254.140.117 ) 和服务端口 (12379) 定义了一个在 kubernetes 网络内部可用的服务,该服务在 kubernetes 集群的所有节点上可用,甚至在具有节点端口 (32379) 的 kubernetes 网络
您需要修复服务才能映射到正确的容器端口:targetPort
必须匹配 pod containerPort
(以及 dockerfile 中的端口)。
如果错误 Error: context deadline exceeded
仍然存在,则表明存在通信问题。这可以在将内部服务 ip 与外部节点端口(您的第一个 get 1)一起使用时进行解释。对于节点端口(您的第二个命令),我假设 etcd pod 不正确 运行,或者端口在节点上被防火墙保护。
更改服务以引用 containerPort
而不是 hostPort
apiVersion: v1
kind: Service
metadata:
name: storageservice
namespace: storageplatform
spec:
type: NodePort
ports:
- port: 2379
targetPort: 2379
nodePort: 32379
selector:
app: etcd