如何更改kubernetes容器/吊舱的端口?

时间:2019-08-27 08:07:21

标签: docker kubernetes

我正在显示“ docker ps -a命令”的输出,以将所有容器列出到我的HTML页面。我想使用页面本身中的按钮更改这些容器的端口。通常在docker中,如果容器正在运行,我将在container-id上运行docker stop,然后通过在命令中添加-p HOSTPORT:CONTAINERPORT来重新启动它。但是由于所有运行的容器都是Kubernetes容器/容器,因此停止它们将重新创建一个具有不同名称的新容器/容器。那么在这种情况下如何更改容器/吊舱的端口?

“ docker ps -a命令”的输出

 NAMES                              CONTAINER ID  STATUS     
 k8s_nginx_nginx-6cdb6c86d4-z7m7m   56711e6de1be  Up 2 seconds
 k8s_POD_nginx-6cdb6c86d4-z7m7m_d   70b21761cb74  Up 3 seconds
 k8s_coredns_coredns-5c98db65d4-7   dfb21bb7c7f4  Up 7 days
 k8s_POD_coredns-5c98db65d4-7djs8   a336be8230ce  Up 7 days
 k8s_POD_kube-proxy-9722h_kube-sy   5e290420dec4  Up 7 days
 k8s_POD_kube-apiserver-wootz_kub   a23dea72b38b  Exited (255) 7 days ago

nginx.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - name: nginxport
    port: 80
    targetPort: 80
    nodePort: 30000
  selector:
    app: nginx
    tier: frontend

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
      tier: frontend
  template:
    metadata:
      labels:
        app: nginx
        tier: frontend
    spec:

      containers:
      - image: suji165475/devops-sample:mxgraph
        name: nginx
        ports:
        - containerPort: 80
          name: nginxport

那么如何更改任何容器/吊舱的端口?

2 个答案:

答案 0 :(得分:2)

创建广告连播后,PodSpec的大多数属性都无法更改。端口信息位于containers数组内部,链接的文档明确指出containers“无法更新”。如果要更改其显示的端口(或其大多数其他属性),必须必须删除并重新创建该容器。没有其他方法可以做到。

您几乎永远不会直接与Pod打交道(因此,您几乎永远不会在同一主机上混合普通Docker容器和Kubernetes)。通常,您创建一个Deployment对象,该对象可以就地更新,并负责为您创建和删除Pod。

(这的必然结果是,如果您尝试手动删除和重新创建Pod,孤立地更改其属性,但是这些Pod也由Deployments或StatefulSets或DaemonSets管理,则控制器将注意到副本是删除它并使用原始设置重新创建它时丢失。)

答案 1 :(得分:0)

根据他的评论回答OP的问题。

  

我想更改运行Kubernetes容器的端口。我想更改它的节点端口,容器端口,目标端口。那么如何在服务和部署中同时使用kubectl patch命令呢?

Xm=50    %X axis location 
Ym=50    %Y axis location
%location is fixed
%I have done this way
X=rand(1,2) x AREA+AREA/2;
if X(1) <= 1 | X(1) >= AREA + 1 | X(2) <= 1 | X(2) >= AREA + 1
end

这是更改吊舱规格的方法,

kubectl patch deployment nginx  --type json   -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/ports/0/containerPort", "new port"}]' && \
kubectl patch service nginx --type json   -p='[{"op": "replace", "path": "/spec/type/spec/ports/0/targetPort", "new port"}]' && \
kubectl patch service nginx --type json   -p='[{"op": "replace", "path": "/spec/type/spec/ports/0/nodePort", "new port"}]'

正如David所说,没有部署Pod并不能直接使用。

您通常要做的是,进行部署并部署Pod,然后可以使用kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/ports/0/port", "value":"new port"}]' 编辑该配置。

尝试使用类似的东西

kubectl

如果对部署进行修补,则pod会自动重新启动。

话虽如此,如果您更改容器的端口,则也必须更改kubectl patch deployment valid-deployment --type json -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/ports/0/port", "new port"}]' service。一个简单的解决方法是确保您所有的容器端口都填充了targetport属性,并将其映射到相应的k8 name