【04】Kubernets:资源清单
写在前面的话
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:
获取资源清单一级字段:
kubectl explain po
结果如图:
获取资源清单二级字段:
kubectl explain pod.metadata
结果如图:
同理,查看三级字段继续使用 . 加关键字就行了。
创建一个简单的 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
结果如图:
查看创建结果:
kubectl get pods
结果如图:
查看 Pod 详细信息:
kubectl describe pod pod-test
结果如图:
为了能够访问,可以再度创建一个 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
结果如图:
可以看到绑定的 label 和端口映射规则。
访问测试 Nginx 截图如图:
TOMCAT 结果如图:
通过现有的 pod 查看他的 yml:
kubectl get pod pod-test -o yaml
结果如图:
同理也可以查看 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
如下图:
查看值:
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
执行查看结果:
因为 nodeSelector 有配置,所以被分配到了我们指定标签的机器。
【2】传递密码清单:
CentOS base64 加密解密:
# 加密 echo "password" | base64 # 解密 echo 'cGFzc3dvcmQK' | base64 -d
结果如图:
创建密码文件: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
查看结果:
使用密码清单:
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
结果如图:
