YAML 基础
它的基本语法规则如下:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
Pods的YAML编写
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。
除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群中支持临时性容器 的情况下,为调试的目的注入临时性容器。
Pod 模版
代码语言:javascript复制apiVersion: v1 # # api版本,可以使用 kubectl api-resources 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind: Pod # 要创建的资源类型,如Deployment/Pod/ReplicaSet/StatefulSet/DaemonSet/Job/Cronjob/Service/Ingress...
metadata: # 元数据对象,该资源的基本属性和信息
name # 资源的名称
namespace # 资源空间,默认放到default空间
lables # 标签
annotations # 主要目的是方便用户阅读查找
spec: # 期望的状态(disired state)
containers: # 容器列表
- name: xxx # 容器名
image: xxxx # 容器镜像
status:# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
命令创建Pod模板
在不知道模板该如何编写时,可以通过kubectl
命令来获取yaml模板信息
$ 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: {}
获取字段设置帮助文档:
代码语言:javascript复制$ 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 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为名字空间。 在一些文档里名字空间也称为命名空间。
代码语言:javascript复制$ 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命令创建即可,如下:
代码语言:javascript复制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创建
代码语言:javascript复制apiVersion: v1
kind: Secret
metadata:
name: harbor
namespace: default
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJoYXJib3Iub2QuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IkhhcmJvcjEyMzQ1IiwiYXV0aCI6IllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSJ9fX0=