Kubernetes 中 yaml 文件详解(pod、deployment、service)

 

Kubernetes 支持 YAML 和 JSON格式 管理资源对象

  • JSON 格式:主要用于 api 接口之间消息的传递
  • YAML 格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读。

YAML 语法格式

  • 大小写敏感;
  • 使用缩进表示层级关系;不支持Tab键制表符缩进,只使用空格缩进;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格;
  • 字符后缩进一个空格,如冒号,逗号,短横杆(-) 等
  • --- 表示YAML格式,一个文件的开始,用于分隔文件; 可以将创建多个资源写在同一个 yaml 文件中,用 --- 隔开,就不用写多个 yaml 文件了。
  • # 表示注释;

YAML 文件的学习方法

  • 多看别人(官方)写的,能读懂
  • 能照着现场的文件改着用
  • 遇到不懂的,善用 kubectl explain ... 命令查.

apiVersions

kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

如果是业务场景一半首选使用 apps/v1

带有 beta 字样的代表是测试版本,不用在生产环境中。

写一个 yaml 文件,通过声明式创建 pod

使用 -o yaml 导出一个模版来使用:

kubectl get deployments nginx-test1 -o yaml > /opt/nginx-demo1.yaml
apiVersion: apps/v1 # 指定 api 版本标签

# 定义资源的类型/角色, deployment 为副本控制器。
# 此处资源类型可以是: Deployment, Job, Ingress, Service 等
kind: Deployment 
# metadata 定义资源的元数据信息, 比如资源的名称/ namespace/ 标签信息等。
metadata:
  name: nginx-demo1 # 定义资源的名称,在同一个 namespace 中必须是唯一的。
  labels:           # 定义资源的标签(Pod 的标签)
    app: nginx
# spec 定义 deployment 资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性。
spec: 
  replicas: 3       # 定义副本数量
  selector:         # 定义标签选择器
    matchLabels:    # 定义匹配标签
      app: nginx    # 匹配的标签
  template:         # 定义业务模版, 如果有多个副本, 所有副本的属性回按照模版的相关性质进行匹配
    metadata:
      labels:
        app: nginx
    spec:
      containers:   # 定义容器属性
        - image: nginx:1.14 # 定义一个容器明,一个 '- name: ' 定义一个容器
          name: nginx    # 定义容器使用的镜像以及版本
          imagePullPolicy: IfNotPresent # 镜像拉去策略
          ports:
          - containerPort: 80    # 定义容器的对外的端口
            protocol: TCP
          resources: {}
          terminationMessagePath: /tmp/termination-log

应用

kubectl apply -f nginx-demo1.yaml
kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
nginx-demo1-8548f7fc4-b9dnp   1/1     Running   0          14m
nginx-demo1-8548f7fc4-lhwg2   1/1     Running   0          13s

创建 Service 资源

### --dry-run 表示测试资源,不是真正的创建。
$ kubectl expose deployment nginx-demo1 --port=80 --target-port=80 --type=NodePort --dry-run
W0430 20:55:44.856261   15813 helpers.go:598] --dry-run is deprecated and can be replaced with --dry-run=client.
service/nginx-demo1 exposed (dry run)
$ kubectl expose deployment nginx-demo1 --port=80 --target-port=80 --type=NodePort --dry-run=client
$ kubectl expose deployment nginx-demo1 --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml > nginx-demo1.svc.yaml




$ kubectl apply -f nginx-demo1.svc.yaml 
service/nginx-demo1 created
$ kubectl get pods,svc
NAME                              READY   STATUS    RESTARTS   AGE
pod/nginx-demo1-8548f7fc4-b9dnp   1/1     Running   0          20m
pod/nginx-demo1-8548f7fc4-lhwg2   1/1     Running   0          6m12s

NAME                  TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/kubernetes    ClusterIP   10.1.0.1     <none>        443/TCP        10d
service/nginx-demo1   NodePort    10.1.9.58    <none>        80:32427/TCP   65s
$ curl http://centos702:32427
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx-demo1
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
status:
  loadBalancer: {}

参考(照抄)


If you like TeXt, don’t forget to give me a star. :star2:

Star This Project