一、简介
在编写kubernetes的manifest清单文件的时候,一般会涉及到变量的使用,用以替换yaml文件中某字段的实际值。我们在实际使用过程中,为了使目录结构简单明了,通常会结合kustomize来渲染清单文件,从而对kubernetes的对象进行控制和管理。下面就针对kustomization来对变量的定义和使用做演示。
二、文件格式变量
1.定义变量
1.在自定义文件中定义变量
在文件中以key=value的形式定义变量,多个变量可以写多行。如下,编辑名为params.env的文件,内容如下:
COP_DUMP_URL=__COP_DUMP_URL__
2.定义变量可使用位置
如下所示,列出来的项目不一定全面,如果所定义的变量无法引用可以基于如下内容进行补充。
varReference: - path: metadata/name kind: Deployment - path: metadata/namespace kind: Deployment - path: metadata/labels kind: Deployment - path: spec/template/metadata/labels kind: Deployment - path: spec/template/spec/containers/name kind: Deployment - path: spec/template/spec/containers/env/value kind: Deployment - path: spec/template/spec/containers/env/valueFrom/secretKeyRef kind: Deployment - path: spec/template/spec/containers/volumeMounts/name kind: Deployment - path: spec/template/spec/containers/volumeMounts/mountPath kind: Deployment - path: spec/template/spec/containers/envFrom/configMapRef kind: Deployment - path: spec/template/spec/containers/envFrom/secretRef kind: Deployment - path: spec/template/spec/volumes/configMap/name kind: Deployment - path: spec/template/spec/volumes/secret/secretName kind: Deployment - path: spec/template/spec/volumes/secret/items/key kind: Deployment - path: spec/template/spec/volumes/secret/items/path kind: Deployment - path: spec/template/spec/volumes/name kind: Deployment - path: spec/selector/matchLabels kind: Deployment - path: metadata/labels kind: Service - path: metadata/name kind: Service - path: metadata/namespace kind: Service - path: metadata/annotations kind: Service - path: spec/ports/name kind: Service - path: spec/selector kind: Service - path: metadata/name kind: Ingress - path: metadata/namespace kind: Ingress - path: spec/rules/http/paths/backend kind: Ingress - path: spec/rules/host kind: Ingress - path: spec/tls/secretName kind: Ingress - path: spec/tls/hosts kind: Ingress - path: metadata/name kind: BackendConfig - path: metadata/namespace kind: BackendConfig - path: metadata/name kind: Namespace - path: metadata/name kind: Secret - path: metadata/namespace kind: Secret - path: data kind: Secret - path: metadata/name kind: ConfigMap - path: metadata/namespace kind: ConfigMap - path: data kind: ConfigMap - path: metadata/name kind: VirtualService - path: metadata/namespace kind: VirtualService - path: spec/gateways kind: VirtualService - path: spec/http/route/destination/host kind: VirtualService - path: metadata/name kind: Gateway - path: metadata/namespace kind: Gateway
3.在kustomization.yaml中定义变量
这里定义的主要作用是对前面定义的parames.env和params.yaml的引用,原理是通过将变量内容创建为configmap,然后从configmap中读取变量。参考内容如下:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- job.yaml
vars:
- name: COP_DUMP_URL
objref:
kind: ConfigMap
name: update-esa-policy-cop
apiVersion: v1
fieldref:
fieldpath: data.COP_DUMP_URL
generatorOptions:
disableNameSuffixHash: true
configMapGenerator:
- name: update-esa-policy-cop
env: params.env
configurations:
- params.yaml
2.使用变量
这里使用变量就比较简单了,只需要在yaml清单文件中通过$()的方式进行引用。如下$(COP_DUMP_URL):
---
apiVersion: batch/v1
kind: Job
metadata:
name: update-esa-policy-cop
namespace: edsf-dsg
labels:
app.kubernetes.io/name: update-esa-policy-cop
app.kubernetes.io/instance: update-esa-policy-cop
spec:
backoffLimit: 0
template:
metadata:
labels:
app.kubernetes.io/name: update-esa-policy-cop
spec:
automountServiceAccountToken: false
restartPolicy: Never
containers:
- args:
- "-c"
- "curl -k $(COP_DUMP_URL) -o /var/data/policy/cop_dump.tgz"
command:
- "/bin/sh"
name: update-esa-policy-cop
image: update-esa-policy-cop
imagePullPolicy: IfNotPresent
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
volumeMounts:
- name: policy-storage
mountPath: /var/data/policy
subPath: policy-storage
resources:
limits:
cpu: 500m
memory: 3500Mi
requests:
cpu: 200m
memory: 256Mi
volumes:
- name: policy-storage
persistentVolumeClaim:
claimName: dsg-policy-pv-claim
三、pod信息变量
将pod信息作为变量传递给容器,一般有两种使用场景:
1.用 Pod 字段作为环境变量的值
参考代码如下:
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "sh", "-c"]
args:
- while true; do
echo -en '\n';
printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
sleep 10;
done;
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
restartPolicy: Never
这个配置文件中,你可以看到五个环境变量。env 字段是一个 EnvVars. 对象的数组。 数组中第一个元素指定 MY_NODE_NAME 这个环境变量从 Pod 的 spec.nodeName 字段获取变量值。 同样,其它环境变量也是从 Pod 的字段获取它们的变量值。
2.用 Container 字段作为环境变量的值
参考代码如下:
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-resourcefieldref
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox:1.24
command: [ "sh", "-c"]
args:
- while true; do
echo -en '\n';
printenv MY_CPU_REQUEST MY_CPU_LIMIT;
printenv MY_MEM_REQUEST MY_MEM_LIMIT;
sleep 10;
done;
resources:
requests:
memory: "32Mi"
cpu: "125m"
limits:
memory: "64Mi"
cpu: "250m"
env:
- name: MY_CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.cpu
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.cpu
- name: MY_MEM_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.memory
- name: MY_MEM_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.memory
restartPolicy: Never
这个配置文件中,你可以看到四个环境变量。env 字段是一个 EnvVars. 对象的数组。数组中第一个元素指定 MY_CPU_REQUEST 这个环境变量从 Container 的 requests.cpu 字段获取变量值。同样,其它环境变量也是从 Container 的字段获取它们的变量值。
琼杰笔记





评论前必须登录!
注册