我将服务配置为建立在8080端口上。
我的docker映像也在8080上。
我将 ReplicaSet 设置为这样的配置
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-app-backend-rs
spec:
containers:
- name: my-app-backend
image: go-my-app-backend
ports:
- containerPort: 8080
imagePullPolicy: Never
最后,我还在端口8080上使用以下配置创建类型为 NodePort 的服务:
apiVersion: v1
kind: Service
metadata:
labels:
app: my-app-backend-rs
name: my-app-backend-svc-nodeport
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: my-app-backend
在我对NodePort进行描述之后,我看到我应该在地址http://127.0.0.1:31859
上击打(例如curl http://127.0.0.1:31859/)到我的应用程序,但是我没有任何反应。
Type: NodePort
IP: 10.110.250.176
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31859/TCP
Endpoints: 172.17.0.6:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
我不明白什么,我做错了什么?谁能给我解释一下?
答案 0 :(得分:1)
从您的输出中,我看到在端点下面创建了。因此似乎有一个Pod已准备好为该节点端口服务提供服务。因此,标签现在不是问题。
Endpoints: 172.17.0.6:8080
首先,使用kubectl exec -it podname sh(如果在该Pod容器中运行的映像上安装了curl)登录Pod,请首先确保您能够通过运行curl http://podhostname:8080命令访问该应用程序。如果没有将curl大使容器容器作为小车运行,请尝试从该容器访问http:// <>:8080并确保其正常工作。
请记住,如果您是从主节点运行此命令,则您不能以本地主机的身份访问nodeport服务,因为它将指向您的主节点。 您必须通过以下方法访问此服务。
<CLUSTERIP:PORT>---In you case:10.110.250.176:80
<1st node's IP>:31859
<2nd node's IP>:31859
答案 1 :(得分:1)
我尝试在
kubectl exec -it podname sh
之后使用curl
在这个示例中,在sh
命令前的双破折号被遗漏了。
请注意,可以随时使用kubectl exec -h
检查正确的语法,该语法应类似于:
kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]
如果每个吊舱只有一个容器,则可以简化为:
kubectl exec -it PODNAME -- COMMAND
不挑剔容器的警告是,如果该Pod上有多个容器,则将您连接到第一个容器:)
示例:kubectl exec -it pod/frontend-57gv5 -- curl localhost:80
我也尝试打
10.110.250.176:80:31859
,但这是不正确的。抱歉,但是我是网络方面的新手。
是的,这是不正确的,因为:port
的值出现两次。在该示例中,需要点击10.110.250.176:80
(因为10.110.250.176
是“ Cluster_IP”)
在我对NodePort进行描述之后,我看到我应该在地址
http://127.0.0.1:31859
上击打(例如curl http://127.0.0.1:31859/)到我的应用程序,但是我没有任何反应。
这取决于您要在哪里运行该命令。
在这种情况下,不清楚您在ReplicaSet配置中输入了什么(如果Service
的 selector 与ReplicaSet
的< em> labels ),所以让我解释一下“该应该如何工作”。
假设我们有以下ReplicaSet(下面的示例是official documentation on topic的稍微修改后的版本):
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend-rs
labels:
app: guestbook
tier: frontend-meta
spec:
# modify replicas according to your case
replicas: 2
selector:
matchLabels:
tier: frontend-label
template:
metadata:
labels:
tier: frontend-label ## shall match spec.selector.matchLabels.tier
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
以及以下服务:
apiVersion: v1
kind: Service
metadata:
labels:
app: frontend
name: frontend-svc-tier-nodeport
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
tier: frontend-label ## shall match labels from ReplicaSet spec
我们可以创建ReplicaSet(RS)和服务。结果,我们将能够看到RS,窗格,服务和端点:
kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
frontend-rs 2 2 2 10m php-redis gcr.io/google_samples/gb-frontend:v3 tier=frontend-label
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
frontend-rs-76sgd 1/1 Running 0 11m 10.12.0.31 gke-6v3n
frontend-rs-fxxq8 1/1 Running 0 11m 10.12.1.33 gke-m7z8
kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
frontend-svc-tier-nodeport NodePort 10.0.5.10 <none> 80:32113/TCP 9m41s tier=frontend-label
kubectl get ep -o wide
NAME ENDPOINTS AGE
frontend-svc-tier-nodeport 10.12.0.31:80,10.12.1.33:80 10m
kubectl describe svc/frontend-svc-tier-nodeport
Selector: tier=frontend-label
Type: NodePort
IP: 10.0.5.10
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32113/TCP
Endpoints: 10.12.0.31:80,10.12.1.33:80
从我的示例中可以看到的重要一点是,已为我们创建的服务将端口设置为80:32113 / TCP。
这将使我们能够以几种不同的方式访问“ gb-frontend:v3”应用程序:
curl 10.0.5.10:80
curl frontend-svc-tier-nodeport:80
curl PUBLIC_IP:32113
这里PUBLIC_IP是您可以访问群集中的节点的IP。群集中的所有节点都在NodePort
上侦听并根据服务的选择器转发请求。curl localhost:32113
希望有帮助。