Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将带有-p80:80的docker命令转换为kubernetes yaml_Docker_Kubernetes - Fatal编程技术网

如何将带有-p80:80的docker命令转换为kubernetes yaml

如何将带有-p80:80的docker命令转换为kubernetes yaml,docker,kubernetes,Docker,Kubernetes,假设我有这个yaml定义,下面它说80ports->containerPort:80就足够了吗?换句话说,我如何解释kubernetes yaml定义中的-p 80:80主机端口和容器端口 docker run -it -p 80:80 con-1 docker run -it -p hostport:containerport 使用k8s公开应用程序的端口不同于使用docker公开应用程序的端口 对于POD,spec.containers.ports字段不用于公开端口。它主要用于记录目的地

假设我有这个yaml定义,下面它说80
ports->containerPort:80
就足够了吗?换句话说,我如何解释kubernetes yaml定义中的-p 80:80主机端口和容器端口

docker run -it -p 80:80 con-1

docker run -it -p hostport:containerport

使用k8s公开应用程序的端口不同于使用docker公开应用程序的端口

对于POD,
spec.containers.ports
字段不用于公开端口。它主要用于记录目的地,也用于命名端口,以便您可以稍后在服务对象的目标端口中使用它们的名称而不是数字()来引用它们

那么我们如何将吊舱暴露在外面呢

一切都结束了。有4种类型的服务:ClusterIP、NodePort、LoadBalancer和ExternalName

它们在k8s文档中都有很好的解释,所以我不打算在这里解释。退房

假设您知道要使用的类型,现在可以使用kubectl创建此服务:

apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage
注意:请注意,如果您没有为
--目标端口
传递值,则默认值与
--端口
还要注意选择器字段,它与pod上的标签具有相同的值。它会将流量转发到每个带有此标签的pod(在名称空间内)

现在,如果您不传递
--type
的值,它默认为ClisterIP,因此这意味着服务将只能从集群中访问。 如果要从外部访问pod/应用程序,则需要使用NodePort或LoadBalancer

Nodeport在每个节点上打开一些随机端口,连接到该端口会将数据包转发到pod。问题是,您不能只选择任何要打开的端口,而且常常根本无法选择端口(它是随机分配的)

对于LoadBalancer类型,您可以使用您想要的任何端口,但您需要在云中运行,并使用cloud provisioner为您创建和配置外部LoadBalancer,并将其指向您的pod。如果您在裸机上运行,则可以使用类似LoadBalancer类型的项目


总之,使用docker公开容器与使用kubernetes公开容器完全不同。不要假设k8s的工作方式与docker的工作方式相同,只是使用不同的符号,因为它不会


阅读有关k8s服务的文档和博客,了解它们的工作原理。

您需要相应的服务对象才能访问Pod。您需要一个NodePort或LoadBalancer类型的服务,以便从集群外部访问它,然后您只能选择什么(NodePort服务通常限于端口30000或更高;LoadBalancer服务需要外部的东西来实际创建负载平衡器)。@dedpo这样做吗?
kubectl expose pod <pod-name> --port <port> --target-port <targetport> --type <type>

kubectl expose deployment <pod-name> --port <port> --target-port <targetport> --type <type>
$ kubectl expose pod my-svc --port 80 --dry-run=client -oyaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    run: my-svc
  name: my-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: my-svc
status:
  loadBalancer: {}