写在前面的话

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

学到这里,遇到了和学习 docker 时候一样的问题,如果让人手动敲命令,简单的环境还好,但是如果遇到复杂的依赖部署,那么我们怎么去管理?

在 docker 中,我们通过 yml 文件定义程序运行的关系,在 K8S 中也一样,也有自己的 yml。

在 K8S 中,我们几乎能用到的东西,都可以把它称作资源,而这个定义了规则的 yml 文件就是资源清单。

 

 

资源清单

 

资源清单格式:

apiVersion: group/apiversion    # 如果没给定 group 名称,默认 core,可使用 kubectl api-versions 查看当前 K8S 的所有 apiVersion 信息
kind:         # 资源类别
metadata:     # 资源元素据
    name
    namespace # K8S 自身的 namespace
    labels
    annotations
spec:         # 期望的状态
status:       # 当前状态,用户不用定义

 

查看支持的 apiVersion:

【04】Kubernets:资源清单 随笔 第1张

 

获取资源清单一级字段:

kubectl explain po

结果如图:

【04】Kubernets:资源清单 随笔 第2张

 

获取资源清单二级字段:

kubectl explain pod.metadata

结果如图:

【04】Kubernets:资源清单 随笔 第3张

同理,查看三级字段继续使用 . 加关键字就行了。

 

创建一个简单的 Pod 资源清单:

mkdir pod-test
cd pod-test/
vim pod-test.yml

内容如下:

apiVersion: v1
kind: Pod
metadata:
    name: pod-test
    labels: 
        # 打标签
        app: my-app
        tier: frontend
spec:
    # 创建两个容器
    containers:    
    - name: nginx
      image: ikubernetes/myapp:v1
    - name: tomcat
      image: tomcat:7-alpine

创建 Pod:

kubectl create -f pod-test.yml

结果如图:

【04】Kubernets:资源清单 随笔 第4张

查看创建结果:

kubectl get pods

结果如图:

【04】Kubernets:资源清单 随笔 第5张

查看 Pod 详细信息:

kubectl describe pod pod-test

结果如图:

【04】Kubernets:资源清单 随笔 第6张

 

为了能够访问,可以再度创建一个 Service 清单:

vim svc-test.yml

内容如下:

apiVersion: v1
kind: Service
metadata:
    name: service-test
    labels:
        app1: nginx
        app2: tomcat
spec:
    ports:
    - name: nginx
      port: 80
      targetPort: 80
      nodePort: 32001
    - name: tomcat
      port: 8080
      targetPort: 8080
      nodePort: 32002
    selector:
      app: my-app
    type: NodePort

通过 selector 绑定 label,通过 name 来绑定访问。

kubectl create -f svc-test.yml

查看结果:

kubectl get svc -o wid

结果如图:

【04】Kubernets:资源清单 随笔 第7张

可以看到绑定的 label 和端口映射规则。

访问测试 Nginx 截图如图:

【04】Kubernets:资源清单 随笔 第8张

TOMCAT 结果如图:

【04】Kubernets:资源清单 随笔 第9张

 

通过现有的 pod 查看他的 yml:

kubectl get pod pod-test -o yaml

结果如图:

【04】Kubernets:资源清单 随笔 第10张

同理也可以查看 service:

kubectl get services service-test -o yaml

 

 

详细说说 spec 字段

 

关键字如下表:

参数 说明
spec.containers
name pod 的名称,名称唯一且对象创建后不可以被修改
image 镜像仓库的路径/镜像的名称:镜像的标签
image.imagePullPolicy

镜像下载策略:Always(总去仓库),Never(从不去仓库),IfNotPresent(默认,如果本地没有就去仓库)。

但如果镜像标签是 latest,则是 Always

ports 容器公开的端口列表,主要作为说明作用,而不是真正被用到
ports.containerPort pod 暴露的端口,此端口仅是说明作用
ports.hostPort 主机上公开的端口
ports.protocol 端口的协议
ports.hostIP 指定要绑定的主机
command <[]string> 运行的程序,类似于docker 中的 entrypiont
args <[]string>

向 docker 镜像传递参数,如果定义该字段,镜像中 cmd 不会被执行。

引用变量使用$(VAR_NAME),命令方式使用 $$(VAR_NAME)

volumeMounts.name 存储卷名字
volumeMounts.mountPath 可以被容器挂载的存储卷的路径,路径不能包含':' 符号
volumeMounts.subPath 可以被容器挂载的存储卷的路径,并且不会覆盖挂载点中的文件
volumeMounts.readOnly 是否只读,默认为 false
resources.limits 资源限制
resources.limits.cpu CPU 上限
resources.limits.memory 内存上限
resources.requests 资源需求
resources.requests.cpu CPU 请求,也是调度 CPU 资源的依据
resources.requests.memory 内存请求,也是调度内存资源的依据
pod.spec
nodeSelector 指定对象的调度节点,节点必须存在
restartPolicy 容器重启策:Always(退出就重启),OnFailure(失败退出重启),Never(不重启)

 

 

资源清单实例

 

【1】通过 ConfigMap 传递参数:ConfigMap 是用了存储 K8S 的配置文件的资源对象。可以通过如下命令获取帮助:

kubectl create configmap -h

 例如:

kubectl create configmap my-config --from-literal=k1=v1 --from-literal=k2=v2
kubectl create configmap my-env-config --from-literal=k3=v3

查看结果:

kubectl get configmaps

如下图:

【04】Kubernets:资源清单 随笔 第11张

查看值:

kubectl get configmaps my-config -o go-template='{{.data}}'
kubectl get configmaps my-env-config -o go-template='{{.data}}'

结果如下:

map[k1:v1 k2:v2]
map[k3:v3]

给集群的节点打标签:

kubectl label nodes node3 disk=ssd

此时我们创建一个 yml:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo1
spec:
  containers:
  - name: container-demo1               # 容器名称
    image: busybox                      # 镜像路径
    command: ["/bin/sh", "-c", "env"]
    env:                                # 配置env
    - name: MY-K1                       # env名称
      valueFrom:                        # 指定env的来源
        configMapKeyRef:                # 表示从ConfMap中选择
          name: my-config               # ConfigMap的文件名称
          key: k1                       # ConfigMap中的key名称
    - name: MY-K2
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: k2
    envFrom:                            # 容器中填充环境变量的列表
    - configMapRef:                     # 指定ConfigMap文件
        name: my-env-config             # ConfigMap文件
  restartPolicy: Never                  # 定义重启策略
  nodeSelector:                         # node选择器
    disk: ssd

注意红色部分的对齐,否则会出现没有 name 关键字。

kubectl create -f pod-test.yml
kubectl get pods -o wide

执行查看结果:

【04】Kubernets:资源清单 随笔 第12张

因为 nodeSelector 有配置,所以被分配到了我们指定标签的机器。

 

【2】传递密码清单:

CentOS base64 加密解密:

# 加密
echo "password" | base64

# 解密
echo 'cGFzc3dvcmQK' | base64 -d

结果如图:

【04】Kubernets:资源清单 随笔 第13张

创建密码文件:secret.yml

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4K
  password: cGFzc3dvcmQK

生成密码:

kubectl create -f secret.yml
kubectl get secrets

查看结果:

【04】Kubernets:资源清单 随笔 第14张

使用密码清单:

apiVersion: v1
kind: Pod
metadata:
  name: secret-demo1
  labels:
    name: secret-nginx
spec:
  volumes:
  - name: secret-nginx
    secret:
      secretName: my-secret
  containers:
  - name: secret-nginx
    image: nginx:1.14-alpine
    volumeMounts:
    - name: secret-nginx
      mountPath: "/etc/secrets"
      readOnly: true
    ports:
    - name: www
      containerPort: 8888
      hostPort: 8888

创建并查看:

kubectl create -f secret-demo.yml
kubectl get pod -o wide

结果如图:

【04】Kubernets:资源清单 随笔 第15张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄