默认的情况,在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0。例如中国客户在UTC8。如果不把容器的时区和主机主机设置为一致,查找日志的时候非常不便,并且在监控数据方便也会出现较大差异,容易造成误解。
通过Pod Preset预设置时区环境变量
Pod Preset目前还是alpha阶段,默认是没有激活的,所以需要通过以下步骤激活:
我的k8s集群是通过kubeadm安装完成的,这里已此为例,kubeadm安装的k8s(API Server,Scheduler,Controller)都是通过Static Pod的方式用kubelet启动,所以需要该对应的yaml激活Pod Preset:
编辑/etc/kubernetes/manifests/kube-apiserver.yaml,在- command:下的配置添加
- --enable-admission-plugins=NodeRestriction,PodPreset - --runtime-config=settings.k8s.io/v1alpha1=true
使用docker ps -a |grep apiserver查看状态,API Server会自动重启,待重启成功
[root@master manifests]# kubectl get podpresets No resources found.
kubectl可以查询Pod Preset。在开关没有开启成功前,是无法调用以下命令的
在default命名空间下创建Pod Preset对象
vi tz.yaml apiVersion: settings.k8s.io/v1alpha1 kind: PodPreset metadata: name: allow-tz-env namespace: monit spec: selector: matchLabels: env: - name: TZ value: Asia/Shanghai kubectl apply -f tz.yaml [root@master manifests]# kubectl get podpresets NAME CREATED AT allow-tz-env 2019-04-21T12:32:28Z
通过命令行创建一个容器,并查看相应信息
kubectl run mytest1 --image=congcong126/mynginx:v1 -it --rm /bin/sh # env MYAPP_CUSTOM_SERVICE_PORT=80 MYAPP_CUSTOM_PORT=tcp://10.91.93.137:80 MYNGINX_CUSTOM_SERVICE_HOST=10.95.110.206 MYNGINX_AUTOSCLAE_CUSTOM_PORT_80_TCP_ADDR=10.83.153.92 KUBERNETES_PORT=tcp://10.80.0.1:443 KUBERNETES_SERVICE_PORT=443 HOSTNAME=mytest2-679bd59cd-fc4sb MYNGINX_AUTOSCLAE_CUSTOM_PORT_80_TCP_PORT=80 MYNGINX_AUTOSCLAE_CUSTOM_PORT_80_TCP_PROTO=tcp MYAPP_CUSTOM_PORT_80_TCP_ADDR=10.91.93.137 HOME=/root MYNGINX_CUSTOM_PORT=tcp://10.95.110.206:80 MYNGINX_CUSTOM_SERVICE_PORT=80 MYAPP_CUSTOM_PORT_80_TCP_PORT=80 MYAPP_CUSTOM_PORT_80_TCP_PROTO=tcp MYNGINX_AUTOSCLAE_CUSTOM_PORT_80_TCP=tcp://10.83.153.92:80 MYNGINX_CUSTOM_PORT_80_TCP_ADDR=10.95.110.206 MYNGINX_CUSTOM_PORT_80_TCP_PORT=80 MYNGINX_CUSTOM_PORT_80_TCP_PROTO=tcp TERM=xterm MYAPP_CUSTOM_PORT_80_TCP=tcp://10.91.93.137:80 KUBERNETES_PORT_443_TCP_ADDR=10.80.0.1 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp MYNGINX_CUSTOM_PORT_80_TCP=tcp://10.95.110.206:80 MYNGINX_AUTOSCLAE_CUSTOM_SERVICE_HOST=10.83.153.92 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP=tcp://10.80.0.1:443 MYAPP_CUSTOM_SERVICE_HOST=10.91.93.137 KUBERNETES_SERVICE_HOST=10.80.0.1 PWD=/ MYNGINX_AUTOSCLAE_CUSTOM_PORT=tcp://10.83.153.92:80 MYNGINX_AUTOSCLAE_CUSTOM_SERVICE_PORT=80 TZ=Asia/Shanghai
从输出变量可以看出来,容器的默认时区已经更改为Asia/Shanghai
date # date Mon Apr 22 11:57:25 CST 2019
可以看到时间也已经正常显示
至此,我们顺利完成了容器时区的自动配置。Pod Preset的预设功能还是非常便利的,目前这块还在演进中,但是已经能大大简化了相关的管理工作,将这些配置从开发者手中解脱出来,变成系统管理配置。
参考文档
Pod Preset: https://kubernetes.io/docs/concepts/workloads/pods/podpreset/