Kubernetes运维之容器编排基础Pod编写

YAML 基础

它的基本语法规则如下:

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 缩进时不允许使用Tab键,只允许使用空格。
  4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  5. # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

Pods基本原理

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

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

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

Pod 简单模版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1  # # api版本,可以使用 kubectl api-resources 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind: Pod # 要创建的资源类型,如Deployment/Pod/ReplicaSet/StatefulSet/DaemonSet/Job/Cronjob/Service/Ingress...
metadata: # 元数据对象,该资源的基本属性和信息
name: test-pods # 资源的名称
namespace: default # 资源空间,默认放到default空间
lables: # 标签
annotations: # 主要目的是方便用户阅读查找
spec: # 期望的状态(disired state)
volumes: # 文件挂载
- name: varlog # 挂载名称
hostPath: # 挂载方式,
path: /var/log/counter # 挂载宿主机本地目录位置
containers: # 容器列表
- name: xxx # 容器名
image: xxxx # 容器镜像
args: # 容器启动后执行命令
volumeMounts: # 容器挂载
- name: varlog # 需要挂载名称,与volumes name对应。
mountPath: /var/log #挂载到容器中目录位置
# status:# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义

命令创建Pod模板

在不知道模板该如何编写时,可以通过kubectl命令来获取yaml模板信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ kubectl run my-nginx --image=nginx:v1.15.2 --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: my-nginx
name: my-nginx
spec:
containers:
- image: nginx:v1.15.2
name: my-nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

获取字段设置帮助文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ kubectl explain pod
KIND: Pod
VERSION: v1
....

$ kubectl explain pod.spec.volumes
KIND: Pod
VERSION: v1

RESOURCE: volumes <[]Object>

DESCRIPTION:
List of volumes that can be mounted by containers belonging to the pod.
More info: https://kubernetes.io/docs/concepts/storage/volumes

Volume represents a named volume in a pod that may be accessed by any
container in the pod.

FIELDS:
awsElasticBlockStore <Object>
AWSElasticBlockStore represents an AWS Disk resource that is attached to a
kubelet's host machine and then exposed to the pod. More info:
https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore

azureDisk <Object>
AzureDisk represents an Azure Data Disk mount on the host and bind mount to
the pod.

azureFile <Object>
AzureFile represents an Azure File Service mount on the host and bind mount
to the pod.

cephfs <Object>
CephFS represents a Ceph FS mount on the host that shares a pod's lifetime

cinder <Object>
Cinder represents a cinder volume attached and mounted on kubelets host
machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md

configMap <Object>
ConfigMap represents a configMap that should populate this volume

csi <Object>
CSI (Container Storage Interface) represents ephemeral storage that is
handled by certain external CSI drivers (Beta feature).
.....

名称空间(namespace)

Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为名字空间。 在一些文档里名字空间也称为命名空间。

1
2
3
4
5
6
7
$ kubectl create ns app --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
name: app
spec: {}
status: {}

密钥私钥(secret)

k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。

Secret有三种类型

Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。

Service Account:用来访问KubernetesAPI,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount 目录中。

kubernetes.io/dockerconfigjson : 用来存储私有docker-registry的认证信息。

命令创建

用来创建用户docker registry认证的Secret,直接使用kubectl create命令创建即可,如下:

1
kubectl create  secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n default  --dry-run=client -o yaml

yaml创建

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: harbor
namespace: default
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJoYXJib3Iub2QuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IkhhcmJvcjEyMzQ1IiwiYXV0aCI6IllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSJ9fX0=