如何使用 NodePort 与 kind?
How to use NodePort with kind?
我正在尝试使用 NodePort with kind 但不知何故它不想工作。
我已经成功部署了以下集群:
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 30000
listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
protocol: tcp # Optional, defaults to tcp
- role: worker
然后是一个非常简单的部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostname-deployment
labels:
app: hostname
spec:
replicas: 2
selector:
matchLabels:
app: hostname
template:
metadata:
labels:
app: hostname
spec:
containers:
- name: hostname
image: hostname:0.1
ports:
- containerPort: 80
和一项服务:
apiVersion: v1
kind: Service
metadata:
name: hostname-service
spec:
type: NodePort
selector:
app: hostname
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
我可以通过例如
连接到该服务
(in one terminal)
k port-forward service/hostname-service 8080:80
Forwarding from 127.0.0.1:8080 -> 80
(another one)
curl localhost:8080
hostname: hostname-deployment-75c9fd6584-ddc59 at Wed, 17 Jun 2020 15:38:33 UTC
但是我无法通过暴露的 NodePort 连接到服务
curl -v localhost:30000
* Rebuilt URL to: localhost:30000/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 30000 (#0)
> GET / HTTP/1.1
> Host: localhost:30000
> User-Agent: curl/7.58.0
> Accept: */*
>
* Recv failure: Connection reset by peer
* stopped the pause stream!
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer
kubectl get all
输出:
NAME READY STATUS RESTARTS AGE
pod/hostname-deployment-75c9fd6584-ddc59 1/1 Running 0 34m
pod/hostname-deployment-75c9fd6584-tg8db 1/1 Running 0 34m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hostname-service NodePort 10.107.104.231 <none> 80:30000/TCP 34m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hostname-deployment 2/2 2 2 34m
NAME DESIRED CURRENT READY AGE
replicaset.apps/hostname-deployment-75c9fd6584 2 2 2 34m
需要像下面这样的集群配置
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 30000
listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
protocol: tcp # Optional, defaults to tcp
- role: worker
此文件随后作为 kind create cluster --config=config.yaml
(according to docs).
传递给您的创建命令
我会尝试删除 nodePort: 30000 并检查新分配的 nodePort 是否与环回接口一起工作。如果您对服务进行更新,kube 会遇到静态分配的节点端口问题,您必须自己管理端口冲突。尝试删除部署并重新部署也有帮助。
实际上按照 Arghya Sadhu 的建议行事。不知道为什么答案被删除了。
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 30000
listenAddress: "0.0.0.0"
protocol: tcp
- role: worker
我将分享我今天尝试使用多节点类集群时的答案,另一件重要的事情是需要注意 kubectl 客户端和服务器版本。我相信这会对某人有所帮助。
第 1 步
种类-api-cluster.yml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30950
hostPort: 30950
listenAddress: "127.0.0.1"
protocol: TCP
- role: worker
- role: worker
第2步
Kubernetes 服务和部署文件。 (注意这里kind的control-plane hostPort和kubernetes service的nodePort应该是一样的)
api.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
labels:
app: api
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: api
imagePullPolicy: Never
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: api-svc
spec:
selector:
app: api
type: NodePort
ports:
- name: http
nodePort: 30950
targetPort: 8080
port: 8080
补充说明:-
kubectl 版本
Client Version: version.Info{Major:"1", Minor:"20+", GitVersion:"v1.20.4-dirty", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"dirty", BuildDate:"2021-03-15T09:55:27Z", GoVersion:"go1.16.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-21T01:11:42Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
种类--版本
kind version 0.10.0
在kind config yaml中
containerPort 必须与服务配置中的 'NodePort' 相同。
你的情况是 30000
提示:hostPort可以是任意端口,不需要和containerPort
相同
您不应该将节点端口与本地 IP 一起使用。
相反,你应该:
- 使用命令:kubectl get nodes -o wide
- 记下节点的IP
- 卷曲:30000
或
docker 执行 -it /bin/bash
卷曲localhost:30000
kubectl port-forward svc/hostname-service 30000:80
现在您的服务将在主机端口 30000 上被访问
我正在尝试使用 NodePort with kind 但不知何故它不想工作。
我已经成功部署了以下集群:
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 30000
listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
protocol: tcp # Optional, defaults to tcp
- role: worker
然后是一个非常简单的部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostname-deployment
labels:
app: hostname
spec:
replicas: 2
selector:
matchLabels:
app: hostname
template:
metadata:
labels:
app: hostname
spec:
containers:
- name: hostname
image: hostname:0.1
ports:
- containerPort: 80
和一项服务:
apiVersion: v1
kind: Service
metadata:
name: hostname-service
spec:
type: NodePort
selector:
app: hostname
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
我可以通过例如
连接到该服务(in one terminal)
k port-forward service/hostname-service 8080:80
Forwarding from 127.0.0.1:8080 -> 80
(another one)
curl localhost:8080
hostname: hostname-deployment-75c9fd6584-ddc59 at Wed, 17 Jun 2020 15:38:33 UTC
但是我无法通过暴露的 NodePort 连接到服务
curl -v localhost:30000
* Rebuilt URL to: localhost:30000/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 30000 (#0)
> GET / HTTP/1.1
> Host: localhost:30000
> User-Agent: curl/7.58.0
> Accept: */*
>
* Recv failure: Connection reset by peer
* stopped the pause stream!
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer
kubectl get all
输出:
NAME READY STATUS RESTARTS AGE
pod/hostname-deployment-75c9fd6584-ddc59 1/1 Running 0 34m
pod/hostname-deployment-75c9fd6584-tg8db 1/1 Running 0 34m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hostname-service NodePort 10.107.104.231 <none> 80:30000/TCP 34m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hostname-deployment 2/2 2 2 34m
NAME DESIRED CURRENT READY AGE
replicaset.apps/hostname-deployment-75c9fd6584 2 2 2 34m
需要像下面这样的集群配置
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 30000
listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
protocol: tcp # Optional, defaults to tcp
- role: worker
此文件随后作为 kind create cluster --config=config.yaml
(according to docs).
我会尝试删除 nodePort: 30000 并检查新分配的 nodePort 是否与环回接口一起工作。如果您对服务进行更新,kube 会遇到静态分配的节点端口问题,您必须自己管理端口冲突。尝试删除部署并重新部署也有帮助。
实际上按照 Arghya Sadhu 的建议行事。不知道为什么答案被删除了。
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 30000
listenAddress: "0.0.0.0"
protocol: tcp
- role: worker
我将分享我今天尝试使用多节点类集群时的答案,另一件重要的事情是需要注意 kubectl 客户端和服务器版本。我相信这会对某人有所帮助。
第 1 步
种类-api-cluster.yml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30950
hostPort: 30950
listenAddress: "127.0.0.1"
protocol: TCP
- role: worker
- role: worker
第2步 Kubernetes 服务和部署文件。 (注意这里kind的control-plane hostPort和kubernetes service的nodePort应该是一样的)
api.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
labels:
app: api
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: api
imagePullPolicy: Never
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: api-svc
spec:
selector:
app: api
type: NodePort
ports:
- name: http
nodePort: 30950
targetPort: 8080
port: 8080
补充说明:-
kubectl 版本
Client Version: version.Info{Major:"1", Minor:"20+", GitVersion:"v1.20.4-dirty", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"dirty", BuildDate:"2021-03-15T09:55:27Z", GoVersion:"go1.16.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-21T01:11:42Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
种类--版本
kind version 0.10.0
在kind config yaml中
containerPort 必须与服务配置中的 'NodePort' 相同。 你的情况是 30000
提示:hostPort可以是任意端口,不需要和containerPort
相同您不应该将节点端口与本地 IP 一起使用。 相反,你应该:
- 使用命令:kubectl get nodes -o wide
- 记下节点的IP
- 卷曲:30000
或
docker 执行 -it /bin/bash
卷曲localhost:30000
kubectl port-forward svc/hostname-service 30000:80
现在您的服务将在主机端口 30000 上被访问