学习笔记十五:基于YAML文件运行POD应用

通过资源清单文件创建第一个Pod

解压镜像:把tomcat.tar.gz上传到k8snode1和k8snode2节点
链接:https://pan.baidu.com/s/1qLcoJDqYSC9dfiDcWY-s0g?pwd=44ad
提取码:44ad

ctr -n=k8s.io images import  tomcat.tar.gz
vim pod-first.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tomcat-test
  namespace: default
  labels:
    app:  tomcat
spec:
  containers:
  - name:  tomcat-java
    ports:
    - containerPort: 8080
    image: tomcat/tomcat-8.5-jre8:v1
    imagePullPolicy: IfNotPresent

更新资源清单文件

kubectl apply -f pod-first.yaml 

查看pod是否创建成功

kubectl get pods -l app=tomcat

查看pod的ip和pod调度到哪个节点上

kubectl get pods -owide

查看pod日志

kubectl logs tomcat-test

进入到刚才创建的pod,刚才创建的pod名字是tomcat-test

kubectl exec -it tomcat-test  -- /bin/bash

假如pod里有多个容器,进入到pod里的指定容器

kubectl exec -it tomcat-test -c tomcat-java -- /bin/bash

查看pod详细信息

kubectl describe pods tomcat-test

查看pod具有哪些标签:

kubectl get pods --show-labels

删除pod

#kubectl delete pods tomcat-test
kubectl delete -f pod-first.yaml

我们上面创建的pod是一个自主式pod,也就是通过pod创建一个应用程序,如果pod出现故障停掉,那么我们通过pod部署的应用也就会停掉,不安全, 还有一种控制器管理的pod,通过控制器创建pod,可以对pod的生命周期做管理,可以定义pod的副本数,如果有一个pod意外停掉,那么会自动起来一个pod替代之前的pod

通过kubectl run创建Pod

kubectl run tomcat --image=tomcat/tomcat-8.5-jre8:v1  --image-pull-policy='IfNotPresent'  --port=8080

Pod资源清单字段解读

vim pod-tomcat.yaml
apiVersion: v1  #api版本
kind: Pod       #创建的资源
metadata:    
  name: tomcat-test  #Pod的名字
  namespace: default   #Pod所在的名称空间
  labels:
    app:  tomcat     #Pod具有的标签
spec:
  containers:
  - name:  tomcat-java   #Pod里容器的名字
    ports:
    - containerPort: 8080  #容器暴露的端口
    image: tomcat/tomcat-8.5-jre8:v1  #容器使用的镜像
    imagePullPolicy: IfNotPresent    #镜像拉取策略

Pod资源清单编写技巧

通过kubectl explain 查看定义Pod资源包含哪些字段。

kubectl explain pod
KIND:     Pod
VERSION:  v1
DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.
[Pod是可以在主机上运行的容器的集合。此资源是由客户端创建并安排到主机上。]

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
[APIVersion定义了对象,代表了一个版本。]

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
[Kind是字符串类型的值,代表了要创建的资源。服务器可以从客户端提交的请求推断出这个资源。]

   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
[metadata是对象,定义元数据属性信息的]

   spec	<Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
[spec制定了定义Pod的规格,里面包含容器的信息]

   status	<Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
[status表示状态,这个不可以修改,定义pod的时候也不需要定义这个字段]

查看pod.metadata字段如何定义

kubectl explain pod.metadata
KIND:     Pod
VERSION:  v1
RESOURCE: metadata <Object>

# metadata是对象<Object>,下面可以有多个字段

DESCRIPTION:
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
     ObjectMeta is metadata that all persisted resources must have, which
     includes all objects users must create.

FIELDS:
   annotations	<map[string]string>
     Annotations is an unstructured key value map stored with a resource that
     may be set by external tools to store and retrieve arbitrary metadata. They
     are not queryable and should be preserved when modifying objects. More
     info: http://kubernetes.io/docs/user-guide/annotations
# annotations是注解,map类型表示对应的值是key-value键值对,<string,string>表示 key和value都是String类型的

例如:

"metadata": {
  "annotations": {
    "key1" : "value1",
    "key2" : "value2"
  }
}
用Annotation来记录的信息包括:
build信息、release信息、Docker镜像信息等,例如时间戳、release id号、镜像hash值、docker registry地址等;
日志库、监控库、分析库等资源库的地址信息;
程序调试工具信息,例如工具名称、版本号等;
团队的联系信息,例如电话号码、负责人名称、网址等。
   clusterName	<string>
     The name of the cluster which the object belongs to. This is used to
     distinguish resources with same name and namespace in different clusters.
     This field is not set anywhere right now and apiserver is going to ignore
     it if set in create or update request.
#对象所属群集的名称。这是用来区分不同集群中具有相同名称和命名空间的资源。此字段现在未设置在任何位置,apiserver将忽略它,如果设置了就使用设置的值

   creationTimestamp	<string>
   deletionGracePeriodSeconds	<integer>
   deletionTimestamp	<string>
   finalizers	<[]string>
   generateName	<string>
   generation	<integer>
   labels	<map[string]string> #创建的资源具有的标签
Map of string keys and values that can be used to organize and categorize
     (scope and select) objects. May match selectors of replication controllers
     and services. More info: http://kubernetes.io/docs/user-guide/labels
#labels是标签,labels是map类型,map类型表示对应的值是key-value键值对,<string,string>表示 key和value都是String类型的
   managedFields	<[]Object>
   name	<string>           #创建的资源的名字
   namespace	<string>      #创建的资源所属的名称空间
Namespace defines the space within which each name must be unique. An empty
namespace is equivalent to the "default" namespace, but "default" is the
canonical representation. Not all objects are required to be scoped to a
namespace - the value of this field for those objects will be empty.
     Must be a DNS_LABEL. Cannot be updated. More info:
     http://kubernetes.io/docs/user-guide/namespaces
# namespaces划分了一个空间,在同一个namesace下的资源名字是唯一的,默认的名称空间是default。
   ownerReferences	<[]Object>
   resourceVersion	<string>
   selfLink	<string>
   uid	<string>

查看pod.spec字段如何定义

kubectl explain pod.spec
KIND:     Pod
VERSION:  v1
RESOURCE: spec <Object>
DESCRIPTION:
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
     PodSpec is a description of a pod.
#Pod的spec字段是用来描述Pod的

FIELDS:
   activeDeadlineSeconds	<integer>
#表示Pod可以运行的最长时间,达到设置的值后,Pod会自动停止。
affinity	<Object>
  #定义亲和性的
   automountServiceAccountToken	<boolean>
   containers	<[]Object> -required-
#containers是对象列表,用来定义容器的,是必须字段。对象列表 表示下面有很多对象,对象列表下面的内容用 - 连接。
   dnsConfig	<Object>
   dnsPolicy	<string>
   enableServiceLinks	<boolean>
   ephemeralContainers	<[]Object>
   hostAliases	<[]Object>
   hostIPC	<boolean>
   hostNetwork	<boolean>
   hostPID	<boolean>
   hostname	<string>
   imagePullSecrets	<[]Object>
   initContainers	<[]Object>
   nodeName	<string>
   nodeSelector	<map[string]string>
   overhead	<map[string]string>
   preemptionPolicy	<string>
   priority	<integer>
   priorityClassName	<string>
   readinessGates	<[]Object>
   restartPolicy	<string>
   runtimeClassName	<string>
   schedulerName	<string>
   securityContext	<Object>
   serviceAccount	<string>
   serviceAccountName	<string>
   setHostnameAsFQDN	<boolean>
   shareProcessNamespace	<boolean>
   subdomain	<string>
   terminationGracePeriodSeconds	<integer>
   tolerations	<[]Object>
   topologySpreadConstraints	<[]Object>
   volumes	<[]Object>

查看pod.spec.containers字段如何定义

kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1

RESOURCE: containers <[]Object>
DESCRIPTION:
     List of containers belonging to the pod. Containers cannot currently be
     added or removed. There must be at least one container in a Pod. Cannot be
     updated.
     A single application container that you want to run within a pod.
#container是定义在pod里面的,一个pod至少要有一个容器。

FIELDS:
   args	<[]string>
   command	<[]string>
   env	<[]Object>
   envFrom	<[]Object>
   image	<string>
#image是用来指定容器需要的镜像的
   imagePullPolicy	<string>
#镜像拉取策略,pod是要调度到node节点的,那pod启动需要镜像,可以根据这个字段设置镜像拉取策略,支持如下三种:
Always:不管本地是否存在镜像,都要重新拉取镜像
Never: 从不拉取镜像
IfNotPresent:如果本地存在,使用本地的镜像,本地不存在,从官方拉取镜像

   lifecycle	<Object>
   livenessProbe	<Object>
   name	<string> -required-
#name是必须字段,用来指定容器名字的
   ports	<[]Object>
#port是端口,属于对象列表
   readinessProbe	<Object>
   resources	<Object>
   securityContext	<Object>
   startupProbe	<Object>
   stdin	<boolean>
   stdinOnce	<boolean>
   terminationMessagePath	<string>
   terminationMessagePolicy	<string>
   tty	<boolean>
   volumeDevices	<[]Object>
   volumeMounts	<[]Object>
   workingDir	<string>

查看pod.spec.container.ports字段如何定义

kubectl explain pod.spec.containers.ports
KIND:     Pod
VERSION:  v1
RESOURCE: ports <[]Object>
DESCRIPTION:
     List of ports to expose from the container. Exposing a port here gives the
     system additional information about the network connections a container
     uses, but is primarily informational. Not specifying a port here DOES NOT
     prevent that port from being exposed. Any port which is listening on the
     default "0.0.0.0" address inside a container will be accessible from the
     network. Cannot be updated.

     ContainerPort represents a network port in a single container.
FIELDS:
   containerPort	<integer> -required-
     Number of port to expose on the pod's IP address. This must be a valid port
     number, 0 < x < 65536.
#containerPort是必须字段, pod中的容器需要暴露的端口。

   hostIP	<string>
     What host IP to bind the external port to.
#将容器中的服务暴露到宿主机的端口上时,可以指定绑定的宿主机 IP。
   hostPort	<integer>
     Number of port to expose on the host. If specified, this must be a valid
     port number, 0 < x < 65536. If HostNetwork is specified, this must match
     ContainerPort. Most containers do not need this.
#容器中的服务在宿主机上映射的端口
   name	<string>
     If specified, this must be an IANA_SVC_NAME and unique within the pod. Each
     named port in a pod must have a unique name. Name for the port that can be
     referred to by services.
#端口的名字
   protocol	<string>
     Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP".

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个示例yaml文件:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: nginx image: nginx:1.7.9 - name: redis image: redis:2.8 - name: mysql image: mysql:5.6我可以提供这样的yaml文件,它可以用来在Kubernetes上运行三个Pod:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: nginx image: nginx:1.7.9 - name: redis image: redis:2.8 - name: mysql image: mysql:5.6 ### 回答2: 在Kubernetes中运行3个PodYAML文件需要以编排的方式定义Pod副本的数量。下面是一个示例的YAML文件: ```yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: my-image ``` 在这个YAML文件中,我们使用了`replicas: 3`来定义了3个Pod的副本数量。另外,`selector`部分用于标识这些Pod副本的标签,这样Kubernetes可以正确地识别和管理它们。 在`template`部分,我们定义了每个Pod副本的配置。在这个示例中,我们仅定义了一个名为"my-container"的容器,并指定了要使用的镜像"my-image"。 使用这个YAML文件,我们可以通过以下命令将其部署到Kubernetes集群中: ```bash kubectl apply -f filename.yaml ``` 其中,`filename.yaml`是你保存该YAML文件的位置。 这样,Kubernetes将会根据YAML文件中定义的配置,在集群中创建3个Pod的副本,并自动管理它们的状态和健康状况。 ### 回答3: 要在 Kubernetes 中运行三个 pod,可以创建一个包含三个 podyaml 文件。下面是一个示例: ```yaml apiVersion: v1 kind: Pod metadata: name: pod1 spec: containers: - name: container1 image: <image_name> # 其他容器配置选项 --- apiVersion: v1 kind: Pod metadata: name: pod2 spec: containers: - name: container2 image: <image_name> # 其他容器配置选项 --- apiVersion: v1 kind: Pod metadata: name: pod3 spec: containers: - name: container3 image: <image_name> # 其他容器配置选项 ``` 通过这个 yaml 文件,我们定义了三个 Pod,分别是 `pod1`、`pod2` 和 `pod3`,每个 Pod 都包含一个容器。你需要替换 `<image_name>` 为你想要运行的容器镜像的名称。 要通过该 yaml 文件在 Kubernetes 中创建这三个 Pod,可以使用 `kubectl apply` 命令: ``` kubectl apply -f <yaml_file_name>.yaml ``` 这将使用该 yaml 文件中的定义自动创建三个 Pod。完成后,你可以使用 `kubectl get pods` 命令来查看已创建的 Pod 的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值