kubernetes - 使用 kubectl expose 时,是否可以选择通过 nodeport 服务发布服务的主机端口?
问题描述
我想通过 nodeport 服务方法公开 tomcat 服务。我正在尝试使用 kubectl 运行命令选项而不是使用带有 kubectl(应用或创建)命令的清单 yaml 文件来实现相同的目的
[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 ~]#
现在端点没有更新,因为我们在 kubectl create service 期间没有使用标签选择器的选项
[root@master ~]# kubectl get ep tomsvc
NAME ENDPOINTS AGE
tomsvc <none> 62s
[root@master ~]#
将选择器从默认更改为 env 后:prod,endpoints 已更新
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 地址和目标端口更新的端点,它们的标签为 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 ~]#
所以为了避免使用这个选项来编辑节点端口服务 yaml 文件来更新选择器,我看到有一个选项 kubectl 公开选项来发布服务
删除了该节点端口服务并使用 kubectl 公开选项重新创建
[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
现在端点自动更新为具有 env: prod 作为标签的 pod
[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 ~]#
我的问题是为什么在使用 kubectl create service 命令时没有传递选择器的选项以及为什么在运行 kubectl expose 命令时没有选项 --nodeport ?
我在这里有什么技术上的误解吗?
解决方案
如果你想创建部署并使用kubectl run命令公开它,你可以使用以下命令:
kubectl run tom --image=tomcat --replicas=3 --port=8080 --labels="env=prod" --expose=true --service-overrides='{ "spec": { "type": "NodePort" } }'
--expose=true
创建一个服务(默认为 ClusterIP)并使用为部署指定的相同选择器将其分配给部署。
--service-overrides='{ "spec": { "type": "NodePort" } }'
将其类型更改为 NodePort。
推荐阅读
- python - 如何使 discord.py 机器人不需要前缀?
- r - 我无法在 r 中安装 quantstrat 包
- python - Lists to Dict 需要返回方法
- pyspark-dataframes - pyspark - 我无法在 pyspark 中导入 from_avro
- javascript - 根据窗口位置播放粘性 HTML 视频
- python - 如何解决我的 IndexError 问题,以便我可以在病房后连续运行我的脚本?
- ios - 隐藏/显示按钮点击视图 - SwiftUI
- python-3.x - 如何在 django admin 中通过可迭代的多个管理类
- reactjs - 用户将被带到 MailChimp 页面,并要求在 react js 中的 MailChimp 页面上再次填写订阅表格
- sql-server - 在SSIS中将字符串类型日期字段(dd/mm/yy hh mm ss)转换为字符串YYYYMMDD