我正在显示“ 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
那么如何更改任何容器/吊舱的端口?
答案 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
。