kubernetes 开启Pod Preset 解决时区问题

默认的情况,在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/

此条目发表在kubernetes分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注