当前位置: 首页 > 知识库问答 >
问题:

在使用kubectl Expose时,是否有选择通过nodeport服务发布服务的主机端口的选项?

岳泉
2023-03-14
[root@master ~]# kubectl run tom --image=tomcat --replicas=3 --port=8080 --labels="env=prod"
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/tom created

[root@master ~]# kubectl create service nodeport tomsvc  --tcp=32156:8080 --node-port=32666
service/tomsvc created
[root@master ~]#

[root@master ~]# kubectl get svc tomsvc
NAME     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
tomsvc   NodePort   10.98.117.174   <none>        32156:32666/TCP   30s
[root@master ~]#

现在endpoint没有更新,因为在kubectl创建服务期间我们没有使用标签选择器的选项

[root@master ~]# kubectl get ep tomsvc
NAME     ENDPOINTS   AGE
tomsvc   <none>      62s
[root@master ~]#

将选择器从default更改为env:prod后,endpoint得到更新

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2019-12-28T14:30:21Z"
  labels:
    app: tomsvc
  name: tomsvc
  namespace: default
  resourceVersion: "1834608"
  selfLink: /api/v1/namespaces/default/services/tomsvc
  uid: 696f4dde-341a-4118-b02b-6aa53df18f74
spec:
  clusterIP: 10.98.117.174
  externalTrafficPolicy: Cluster
  ports:
  - name: 32156-8080
    nodePort: 32666
    port: 32156
    protocol: TCP
    targetPort: 8080
  selector:
    app: tomsvc
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}
~

现在我可以看到用pod ip地址和目标端口更新的endpoint,它们的标签为env:prod

[root@master ~]# kubectl get ep tomsvc
NAME     ENDPOINTS                                      AGE
tomsvc   10.36.0.2:8080,10.36.0.3:8080,10.36.0.4:8080   4m20s
[root@master ~]#
[root@master ~]# kubectl delete svc tomsvc
service "tomsvc" deleted

[root@master ~]# kubectl expose deployment tom --port=32156 --type=NodePort --target-port=8080
service/tom exposed
[root@master ~]# kubectl get svc tom
NAME   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
tom    NodePort   10.107.182.35   <none>        32156:30397/TCP   19s
[root@master ~]# kubectl get ep tom
NAME   ENDPOINTS                                      AGE
tom    10.36.0.2:8080,10.36.0.3:8080,10.36.0.4:8080   25s
[root@master ~]#

从技术上来说,我有什么误解吗?

共有1个答案

呼延凌
2023-03-14

如果希望创建部署并使用kubectl run命令公开它,可以使用以下命令:

kubectl run tom--image=tomcat--replicas=3-port=8080--labels=“env=prod”--expose=true--service-overrides='{“spec”:{“type”:“nodeport”}}'

--expose=true创建一个服务(默认情况下为ClusterIP),并使用为部署指定的相同选择器将其分配给部署。

 类似资料:
  • kubectl端口转发(将端口从本地主机转发到集群中的pod以获得对集群资源的访问)和NodePort服务类型之间有什么区别?

  • 问题内容: 我在没有选择器的情况下在Kubernetes的服务中苦苦挣扎。群集通过kops安装在AWS上。我有一个带有3个Nginx Pod的部署,暴露了端口80: 创建部署后,我记下了IP地址: 并创建了一个服务于IP地址的服务: 服务已成功创建: 不幸的是,我尝试通过服务从相同名称空间的另一个Pod连接到Nginx失败: 我可以直接成功地连接到Nginx Pod: 我注意到我的服务没有任何端点

  • 我想通过API从kubernetes集群读取信息:我使用fabric8 java客户机。 我想知道服务选择了哪些豆荚,但除了名称之外,我找不到对象中的任何链接信息,名称不是唯一的。 另一个方向就足够了(service->pods)或(pod<-service)。 如果有人能帮助我使用Kubectl/YAML,我可能会自己找到一种方法来使用API。

  • 在AWS EKS上,我有ALB入口控制器,入口资源指向端口32509上的NodePort服务,目标端口80,服务上有。 在这种情况下,外部流量如何在NodePort服务下路由到我的pod? 类似于,ALB

  • 从文档中我看到 LoadBalancer:使用云提供商的负载平衡器对外公开服务。将自动创建外部负载均衡器路由到的NodePort和ClusterIP服务 但它没有提到什么时候选择一个而不是另一个。我能想到的Nodeport的缺点之一是安全性(在防火墙规则中打开端口),我想知道在选择其中一个时是否有其他考虑。

  • 问题内容: 使用以下选项启动Java应用程序时: Java使用临时端口,这对于避免冲突非常有用。 是否可以从应用程序内部以编程方式获取实际端口(或连接URL)? 问题答案: 这将打印如下网址