Kubernetes编写yaml文件示例

创建nginx-deployment.yaml,意思为创建2个pod,每个pod里的nginx版本为1.7.9,容器监听端口(containerPort)是 80

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

一个 YAML 文件,对应到 Kubernetes 中,就是一个 API Object(API 对象)。当为这个对象的各个字段填好值并提交给 Kubernetes 之后,Kubernetes 就会负责创建出这些对象所定义的容器或者其他类型的 API 资源。

Pod 就是 Kubernetes 世界里的“应用”;而一个应用,可以由多个容器组成。

Deployment,是一个定义多副本应用(即多个副本 Pod)的对象,还负责在 Pod 定义发生变化时,对每个副本进行滚动更新。

Deployment 扮演的是 Pod 的控制器的角色。

Labels 是一组 key-value 格式的标签。可以通过这个 Labels 字段从 Kubernetes 中过滤出它所关心的被控制对象。

使用命令创建,推荐使用apply

kubectl apply -f nginx-deployment.yaml
或者
kubectl create -f nginx-deployment.yaml

检查

[root@k8s-master01 yaml]# kubectl get pods -l app=nginx
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5d59d67564-9cf75   1/1     Running   0          76s
nginx-deployment-5d59d67564-ldjjm   1/1     Running   0          76s

查看一个API对象的细节

kubectl describe pod nginx-deployment-5d59d67564-9cf75

在 Kubernetes 执行的过程中,对 API 对象的所有重要操作,都会被记录在这个对象的 Events 里,并且显示在 kubectl describe 指令返回的结果中。

如果要变nginx版本,比如要对这个 Nginx 服务进行升级,把它的镜像版本从 1.7.9 升级为 1.8

修改yaml文件

...    
    spec:
      containers:
      - name: nginx
        image: nginx:1.8 # 这里被从 1.7.9 修改为 1.8
        ports:
      - containerPort: 80

使用命令生效,推荐使用apply

kubectl apply -f nginx-deployment.yaml
或者
kubectl replace -f nginx-deployment.yaml

接下来,在这个 Deployment 中尝试声明一个 Volume。

将nginx-deployment.yaml文件修改如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-vol
      volumes:
      - name: nginx-vol
        emptyDir: {}

emptyDir:不显式声明宿主机目录的 Volume。Kubernetes 会在宿主机上创建一个临时目录,这个目录将来就会被绑定挂载到容器所声明的 Volume 目录上。

Pod 中的容器,使用的是 volumeMounts 字段来声明自己要挂载哪个 Volume,并通过 mountPath 字段来定义容器内的 Volume 目录,比如:/usr/share/nginx/html。

显式声明 Volume

 ...   
    volumes:
      - name: nginx-vol
        hostPath: 
          path: /var/data

执行命令更新pod

kubectl apply -f nginx-deployment.yaml
kubectl get pods

使用 kubectl describe 查看一下最新的 Pod,会发现 Volume 的信息已经出现在了 Container 描述部分

可以使用 kubectl exec 指令,进入到这个 Pod 当中(即容器的 Namespace 中)查看这个 Volume 目录:

$ kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw -- /bin/bash
# ls /usr/share/nginx/html

删除Nginx Deployment,运行以下命令:

kubectl delete -f nginx-deployment.yaml
上一篇:git工作中常用命令


下一篇:博客园markdown