Container(s) in a pod do not inherit time zones from host worker machines on which they are running. Usually, the default timezone for most of the container images is UTC. So this may lead to inconsistencies in time management within the cluster. We may need to change the timezone of a container so the time discrepancies can be avoided.
For example, we are running an Nginx pod in our K8s cluster using the official Nginx image.
Let’s create a deployment configuration file for the Nginx pod nginx-timezone.yaml is as below:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-timezone
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
Now we are creating the deployment:
# kubectl apply -f nginx-timezone.yaml
Our deployment is created, so the nginx pod.
Now if we check the timezone in the host and the Pod’s container, we can see that the host has IST timezone and the Nginx container has UTC timezone.
I am going to write about two methods using which we can change the container’s timezone so that our host’s & container’s time are in sync.
Method 1:
The first method is to use the TZ environment variable.
We will update the deployment configuration file to add the TZ environment variable, in our case we are going to set the timezone of the container to Asia/Kolkata. The modified nginx-timezone.yaml is shown below:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-timezone
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
env:
- name: TZ
value: "Asia/Kolkata"
Now we will apply the new configuration, and as the new pod is created, terminating the previous one, we can see in the below image that the new container’s timezone is now showing as IST which is our desirable timezone.
Method 2:
Sometimes the TZ environment variable method does not work. In those cases, we can use the hostPath volume mount method to change the container’s timezone.
Linux systems look at the /etc/localtime file to determine the timezone of the machine. The /etc/localtime is symliked to one of the zoneinfo files located in the /usr/share/zoneinfo directory. So if we are located in India, we will be under the Asia - Kolkata zone. We set our timezone to Asia/Kolkata, then /etc/localtime will be symlinked to /usr/share/zoneinfo/Asia/Kolkata file.
We are going to use the host worker machine’s /usr/share/zoneinfo directory’s specific zone file to mount as the /etc/localtime file in the container. e.g. we need to set the timezone of the container as Asia/Kolkata, so we will mount the host machine’s /usr/share/zoneinfo/Asia/Kolkata file into the container’s /etc/localtime file.
This will make the container to use the timezone of the zone file that we mounted as hostPath volume.
Note: A hostPath volume mounts a file or directory from the host node's filesystem into your Pod.
So our updated Nginx deployment configuration file will be:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-timezone
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: zoneconfig
mountPath: /etc/localtime
readOnly: true
volumes:
- name: zoneconfig
hostPath:
path: /usr/share/zoneinfo/Asia/Kolkata
Now applying the changes:
We can see that the timezone of our container changed to IST (Asia/Kolkata) ✌✌