写点什么

pod(一):Kubernetes(k8s) 创建 pod 的两种方式

作者:Java-fenn
  • 2022 年 9 月 17 日
    湖南
  • 本文字数:8561 字

    阅读完需:约 28 分钟

一.系统环境

二.前言

docker 可以创建容器,Kubernetes 不能直接创建容器,Kubernetes 创建的是 pod,pod 里面包含了一个或者多个容器。

创建 pod 的 前提 是已经有一套可以正常运行的 Kubernetes 集群,关于 Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署 Kubernetes(k8s)集群》 https://www.cnblogs.com/renshengdezheli/p/16686769.html

三.pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。

除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群中支持临时性容器 的情况下,为调试的目的注入临时性容器。

pod 里面有一个或者多个容器,常见的容器有 docker 容器,containerd 容器,除了 Docker 之外,Kubernetes 支持 很多其他容器运行时, Docker 是最有名的容器运行时, 使用 Docker 的术语来描述 Pod 会很有帮助。

Pod 的共享上下文包括一组 Linux 命名空间、控制组(cgroup)和可能一些其他的隔离方面, 即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。

就 Docker 概念的术语而言,Pod 类似于共享命名空间和文件系统卷的一组 Docker 容器。

四.创建 pod

4.1 环境介绍

Kubernetes 集群架构:k8scloude1 作为 master 节点,k8scloude2,k8scloude3 作为 worker 节点

Kubernetes 创建 pod 一般有两种方式:

  1. 使用命令行的方式创建 pod;

  2. 使用 yaml 文件创建 pod

4.2 使用命令行的方式创建 pod

创建 pod 的命令为 kubectl run ,kubectl 创建 pod 的帮助可以查看网页版,网页版地址为: https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#create

查看 kubectl run 创建 pod 的帮助

[root@k8scloude1 ~]# kubectl run --helpCreate and run a particular image in a pod.
Examples: # Start a nginx pod. kubectl run nginx --image=nginx # Start a hazelcast pod and let the container expose port 5701. kubectl run hazelcast --image=hazelcast/hazelcast --port=5701 ......Usage: kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json][--command] -- [COMMAND] [args...] [options]
Use "kubectl options" for a list of global command-line options (applies to all commands).
复制代码

首先拉取我们需要的镜像,先在 worker 节点拉取 nginx 镜像

[root@k8scloude2 ~]# docker pull nginx
[root@k8scloude3 ~]# docker pull nginx
复制代码

4.2.1 创建最简单的 pod

使用 nginx 镜像创建一个 pod

#nginx为pod名字     --image=nginx表示使用Nginx镜像[root@k8scloude1 pod]# kubectl run nginx --image=nginxpod/nginx created
复制代码

查看 pod,STATUS 为 Running 就表示 pod 创建成功

[root@k8scloude1 pod]# kubectl get podNAME    READY   STATUS              RESTARTS   AGEnginx   0/1     ContainerCreating   0          6s
[root@k8scloude1 pod]# kubectl get podNAME READY STATUS RESTARTS AGEnginx 1/1 Running 0 54s
复制代码

删除 pod

[root@k8scloude1 pod]# kubectl delete pod nginxpod "nginx" deleted
复制代码

4.2.2 创建 pod,指定镜像下载策略

使用 nginx 镜像创建一个 pod,镜像的下载策略为 IfNotPresent 本地没有才下载镜像

镜像的下载策略:Always:每次都下载最新的镜像;Never:只使用本地镜像,从不下载,IfNotPresent:本地没有才下载镜像 默认值为:Always

#nginx为pod名字     --image=nginx表示使用Nginx镜像  --image-pull-policy=IfNotPresent表示镜像下载策略为IfNotPresent本地没有才下载镜像[root@k8scloude1 pod]# kubectl run nginx --image=nginx --image-pull-policy=IfNotPresentpod/nginx created
[root@k8scloude1 pod]# kubectl get podNAME READY STATUS RESTARTS AGEnginx 1/1 Running 0 5s
#删除pod[root@k8scloude1 pod]# kubectl delete pod nginxpod "nginx" deleted
复制代码

注意:kubectl delete pod nginx 会有点慢,加了--force 强制删除 pod,删除 pod 会快很多

[root@k8scloude1 pod]# kubectl delete pod nginx --forcewarning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.pod "nginx" force deleted
复制代码

4.2.3 创建 pod,指定环境变量和标签

查看 pod 标签的帮助

[root@k8scloude1 ~]# kubectl run --help | grep labels  # Start a hazelcast pod and set labels "app=hazelcast" and "env=prod" in the container.  kubectl run hazelcast --image=hazelcast/hazelcast --labels="app=hazelcast,env=prod"  -l, --labels='': Comma separated labels to apply to the pod(s). Will override previous values.
复制代码

创建 pod,指定环境变量和标签

#nginx为pod名字     --image=nginx表示使用Nginx镜像  --image-pull-policy=IfNotPresent表示镜像下载策略为IfNotPresent本地没有才下载镜像   --env:设置变量xx=1,yy=2     --labels设置标签,给pod打上“xx=1,yy=2”的标签[root@k8scloude1 pod]# kubectl run nginx --image=nginx --image-pull-policy=IfNotPresent --env "xx=1" --env "yy=2" --labels="xx=1,yy=2"pod/nginx created
#查看pod[root@k8scloude1 pod]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx 1/1 Running 0 20s 10.244.112.136 k8scloude2 <none> <none>
复制代码

进入到 pod 里,可以看到变量 xx,yy

[root@k8scloude1 pod]# kubectl exec -it nginx -- bashroot@nginx:/# echo $xx1root@nginx:/# echo $yy2root@nginx:/# exitexit
复制代码

查看 pod 的标签,--show-labels 参数显示标签

[root@k8scloude1 pod]# kubectl get pod -o wide --show-labelsNAME    READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES   LABELSnginx   1/1     Running   0          4m59s   10.244.112.136   k8scloude2   <none>           <none>            xx=1,yy=2
复制代码

4.3 使用 yaml 文件的方式创建 pod

4.3.1 yaml 文件概述

YAML 是"YAML Ain’t a Markup Language"(YAML 不是一种标记语言)的递归缩写。YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。主要强调这种语言是以数据为中心,而不是以标记语言为重心,例如像 xml 语言就会使用大量的标记。

YAML 是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。YAML 的配置文件后缀为 .yaml。

  • yaml 文件基本语法:

    YAML 使用可打印的 Unicode 字符,可使用 UTF-8 或 UTF-16。

  • 数据结构采用键值对的形式,即 键名称: 值,注意冒号后面要有空格。

  • 每个清单(数组)成员以单行表示,并用短杠+空白(- )起始。或使用方括号([]),并用逗号+空白(, )分开成员。

  • 每个散列表的成员用冒号+空白(: )分开键值和内容。或使用大括号({ }),并用逗号+空白(, )分开。

  • 字符串值一般不使用引号,必要时可使用,使用双引号表示字符串时,会转义字符串中的特殊字符(例如\n)。使用单引号时不会转义字符串中的特殊字符。

  • 大小写敏感

  • 使用缩进表示层级关系,缩进不允许使用 tab,只允许空格,因为有可能在不同系统下 tab 长度不一样

  • 缩进的空格数可以任意,只要相同层级的元素左对齐即可

  • 在单一文件中,可用连续三个连字号(---)区分多个文件。还有选择性的连续三个点号(…)用来表示文件结尾。

  • '#'表示注释,可以出现在一行中的任何位置,单行注释

  • 在使用逗号及冒号时,后面都必须接一个空白字符,所以可以在字符串或数值中自由加入分隔符号(例如:5,280 或 http://www.wikipedia.org)而不需要使用引号。

接下里使用 yaml 文件的方式创建 pod

4.3.2 使用 yaml 文件的方式创建 pod

--dry-run 模拟运行,并不会真的创建一个 pod , --dry-run=client 输出信息少 ,--dry-run=server 输出信息多, -o yaml 以 yaml 文件的格式输出

--dry-run=server 输出信息如下:内容很多

#nginx为pod名字     --image=nginx表示使用Nginx镜像  --image-pull-policy=IfNotPresent表示镜像下载策略为IfNotPresent本地没有才下载镜像[root@k8scloude1 pod]# kubectl run nginx --image=nginx --image-pull-policy=IfNotPresent --dry-run=server -o yamlapiVersion: v1kind: Podmetadata:  creationTimestamp: "2022-01-12T07:51:11Z"  labels:    run: nginx  name: nginx  namespace: pod  uid: afa40310-3efd-4d9f-8337-8e1db955c6f7spec:  containers:  - image: nginx    imagePullPolicy: IfNotPresent    name: nginx    resources: {}    terminationMessagePath: /dev/termination-log    terminationMessagePolicy: File    volumeMounts:    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount      name: kube-api-access-w56gz      readOnly: true  dnsPolicy: ClusterFirst  enableServiceLinks: true  preemptionPolicy: PreemptLowerPriority  priority: 0  restartPolicy: Always  schedulerName: default-scheduler  securityContext: {}  serviceAccount: default  serviceAccountName: default  terminationGracePeriodSeconds: 30  tolerations:  - effect: NoExecute    key: node.kubernetes.io/not-ready    operator: Exists    tolerationSeconds: 300  - effect: NoExecute    key: node.kubernetes.io/unreachable    operator: Exists    tolerationSeconds: 300  volumes:  - name: kube-api-access-w56gz    projected:      defaultMode: 420      sources:      - serviceAccountToken:          expirationSeconds: 3607          path: token      - configMap:          items:          - key: ca.crt            path: ca.crt          name: kube-root-ca.crt      - downwardAPI:          items:          - fieldRef:              apiVersion: v1              fieldPath: metadata.namespace            path: namespacestatus:  phase: Pending  qosClass: BestEffort
复制代码

--dry-run=client 输出信息如下:输出内容恰到好处

[root@k8scloude1 pod]# kubectl run nginx --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yamlapiVersion: v1kind: Podmetadata:  creationTimestamp: null  labels:    run: nginx  name: nginxspec:  containers:  - image: nginx    imagePullPolicy: IfNotPresent    name: nginx    resources: {}  dnsPolicy: ClusterFirst  restartPolicy: Alwaysstatus: {}
复制代码

生成创建 pod 的 yaml 文件

[root@k8scloude1 pod]# kubectl run nginx --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml >nginx.yaml
复制代码

yaml 文件里有很多变量,可以使用 kubectl explain 查看 yaml 文件每个字段的含义

# kubectl explain pods查看一级字段有哪些,每个的含义[root@k8scloude1 ~]# kubectl explain podsKIND:     PodVERSION:  v1
DESCRIPTION: Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.
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
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
metadata <Object> Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#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
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
复制代码

查看一级字段下包含了哪些字段,对某个字段不了解,先使用 kubectl explain 查看

[root@k8scloude1 ~]# kubectl explain pod.spec
[root@k8scloude1 ~]# kubectl explain pods.spec.containers
[root@k8scloude1 ~]# kubectl explain pods.spec.containers.ports
复制代码

容器 containers 里也可以自定义变量,定义变量的时候:变量的值如果是数字,需要加“”

[root@k8scloude1 pod]# vim nginx.yaml 
#kind: Pod表示资源类型为Pod labels指定pod标签 metadata下面的name指定pod名字 containers下面全是容器的定义 #image指定镜像名字 imagePullPolicy指定镜像下载策略 containers下面的name指定容器名#resources指定容器资源(CPU,内存等) env指定容器里的环境变量 dnsPolicy指定DNS策略#restartPolicy容器重启策略[root@k8scloude1 pod]# cat nginx.yaml apiVersion: v1kind: Podmetadata: creationTimestamp: null labels: run: nginx name: nginxspec: containers: - image: nginx imagePullPolicy: IfNotPresent name: nginx resources: {} env: - name: xx value: "12" - name: yy value: "21" - name: zz value: hello dnsPolicy: ClusterFirst restartPolicy: Alwaysstatus: {}
复制代码

kubectl apply -f 应用配置文件,创建 pod

[root@k8scloude1 pod]# kubectl apply -f nginx.yaml pod/nginx created
[root@k8scloude1 pod]# kubectl get podsNAME READY STATUS RESTARTS AGEnginx 1/1 Running 0 26s
复制代码

删除 pod

[root@k8scloude1 pod]# kubectl delete -f nginx.yaml pod "nginx" deleted
[root@k8scloude1 pod]# kubectl get podsNo resources found in pod namespace.
复制代码

定义一个 pod 指明容器的端口,containerPort: 80 只是告知外界 nginx 这个 pod 使用 80 端口,真正要修改端口需要修改镜像

[root@k8scloude1 pod]# vim nginx.yaml 
#kind: Pod表示资源类型为Pod labels指定pod标签 metadata下面的name指定pod名字 containers下面全是容器的定义 #image指定镜像名字 imagePullPolicy指定镜像下载策略 containers下面的name指定容器名#resources指定容器资源(CPU,内存等) env指定容器里的环境变量 dnsPolicy指定DNS策略#restartPolicy容器重启策略 ports指定容器端口[root@k8scloude1 pod]# cat nginx.yaml apiVersion: v1kind: Podmetadata: creationTimestamp: null labels: run: nginx name: nginxspec: containers: - image: nginx imagePullPolicy: IfNotPresent name: nginx resources: {} ports: - name: http containerPort: 80 protocol: TCP env: - name: xx value: "12" - name: yy value: "21" - name: zz value: hello dnsPolicy: ClusterFirst restartPolicy: Alwaysstatus: {}
复制代码

创建 pod

[root@k8scloude1 pod]# kubectl apply -f nginx.yaml pod/nginx created
[root@k8scloude1 pod]# kubectl get podsNAME READY STATUS RESTARTS AGEnginx 1/1 Running 0 3s
复制代码

强制删除 pod

[root@k8scloude1 pod]# kubectl delete pod nginx --force warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.pod "nginx" force deleted
复制代码

4.3.3 yaml 文件里的字典和列表

先生成一个 yaml 文件

[root@k8scloude1 pod]# kubectl run nginx --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yamlapiVersion: v1kind: Podmetadata:  creationTimestamp: null  labels:    run: nginx  name: nginxspec:  containers:  - image: nginx    imagePullPolicy: IfNotPresent    name: nginx    resources: {}  dnsPolicy: ClusterFirst  restartPolicy: Alwaysstatus: {}
复制代码

我们注意到,有的字段前面有- ,有的没有- ,没有-的是字典,字典里不能有重复变量,有-的是列表,列表里的每个对象都是一个匿名字典,在列表中,对象的第一个字段要加-

例如:当 pod 里有多个容器的时候,containers 可以定义多个,每个容器是一个对象,每个容器的第一个变量就加-

apiVersion: v1kind: Podmetadata:  creationTimestamp: null  labels:    run: nginx  name: nginxspec:  containers:  - image: nginx    imagePullPolicy: IfNotPresent    name: nginx    resources: {}  - image: nginx    imagePullPolicy: IfNotPresent    name: nginx    resources: {}  - image: nginx    imagePullPolicy: IfNotPresent    name: nginx    resources: {}  dnsPolicy: ClusterFirst  restartPolicy: Always
status: {}
复制代码

4.3.4 查看不同类型的 apiVersion

不同的 Kubernetes 资源类型,apiVersion 是不一样的,Pod 的 apiVersion 为 v1

kubectl api-versions 查看所有的 apiVersion

[root@k8scloude1 ~]# kubectl api-versions admissionregistration.k8s.io/v1admissionregistration.k8s.io/v1beta1apiextensions.k8s.io/v1apiextensions.k8s.io/v1beta1apiregistration.k8s.io/v1apiregistration.k8s.io/v1beta1apps/v1authentication.k8s.io/v1authentication.k8s.io/v1beta1authorization.k8s.io/v1authorization.k8s.io/v1beta1autoscaling/v1autoscaling/v2beta1autoscaling/v2beta2batch/v1batch/v1beta1certificates.k8s.io/v1certificates.k8s.io/v1beta1coordination.k8s.io/v1coordination.k8s.io/v1beta1crd.projectcalico.org/v1discovery.k8s.io/v1discovery.k8s.io/v1beta1events.k8s.io/v1events.k8s.io/v1beta1extensions/v1beta1flowcontrol.apiserver.k8s.io/v1beta1metrics.k8s.io/v1beta1networking.k8s.io/v1networking.k8s.io/v1beta1node.k8s.io/v1node.k8s.io/v1beta1policy/v1policy/v1beta1rbac.authorization.k8s.io/v1rbac.authorization.k8s.io/v1beta1scheduling.k8s.io/v1scheduling.k8s.io/v1beta1storage.k8s.io/v1storage.k8s.io/v1beta1v1
复制代码

4.3.5 使用同一个 yaml 文件创建多个 pod

生成 yaml 文件

[root@k8scloude1 pod]# kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml >pod1.yaml
复制代码

使用同一个 yaml 文件创建 2 个 pod

[root@k8scloude1 pod]# sed 's/pod1/pod2/' pod1.yaml apiVersion: v1kind: Podmetadata:  creationTimestamp: null  labels:    run: pod2  name: pod2spec:  containers:  - image: nginx    imagePullPolicy: IfNotPresent    name: pod2    resources: {}  dnsPolicy: ClusterFirst  restartPolicy: Alwaysstatus: {}
[root@k8scloude1 pod]# sed 's/pod1/pod2/' pod1.yaml | kubectl apply -f -pod/pod2 created
[root@k8scloude1 pod]# sed 's/pod1/pod3/' pod1.yaml | kubectl apply -f -pod/pod3 created
[root@k8scloude1 pod]# kubectl get podsNAME READY STATUS RESTARTS AGEpod2 1/1 Running 0 30spod3 1/1 Running 0 9s
[root@k8scloude1 pod]# lspod1.yaml
复制代码


用户头像

Java-fenn

关注

需要Java资料或者咨询可加我v : Jimbye 2022.08.16 加入

还未添加个人简介

评论

发布
暂无评论
pod(一):Kubernetes(k8s)创建pod的两种方式_Java_Java-fenn_InfoQ写作社区