在k8s集群中執行的容器缺省會使用utc時間,即北京時間為凌晨3點時,容器時間為晚上7點,中間會有8小時時差。而有些分布式系統對於時間極為敏感,不允許出現時間誤差
這裡我們構建乙個nginx映象,檢視構建前的時間
apiversion: v1kind: pod
metadata:
name: time-nginx
spec:
containers:
- name: time-nginx
image: nginx
args: [/bin/sh, -c,
'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
建立完pod後檢視一下時間
kubectl logs -f time337: fri may 1 19:01:30 utc 2020
338: fri may 1 19:01:31 utc 2020
339: fri may 1 19:01:32 utc 2020
解決問題
首先要確保宿主機時間同步
timedatectl set-timezone asia/shanghai#將當前的 utc 時間寫入硬體時鐘
timedatectl set-local-rtc 0
#重啟依賴於系統時間的服務
systemctl restart rsyslog
systemctl restart crond
目前解決pod和宿主機時間不一致有以下集中解決方案
1、通過定製dockerfile新增時區
2、通過將時區檔案掛在到pod中
3、通過環境變數定義時區
4、進入容器內修改時區,或者docker cp時區進去
5、網上資料還有通過podpreset
的方式
$ cat dockerfile.datefrom centos
run rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime \
&& echo "asia/shanghai" > /etc/timezone
# 構建容器映象
$ docker build -t centos7-date:test -f dockerfile.date .
$ docker run -it centos7-date:test /bin/sh
sh-4.2# date
wed mar 6 16:40:01 cst 2019
cat time-mount.yamlapiversion: v1
kind: pod
metadata:
name: time
spec:
containers:
- name: time
image: nginx
args: [/bin/sh, -c,
'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
volumemounts:
- name: timezone
mountpath: /etc/localtime
volumes:
- name: timezone
hostpath:
path: /usr/share/zoneinfo/asia/shanghai
通過命令檢視,/etc/localtime
的目錄實際上就是個軟連線
如果需要系統修改時區,那麼只需要將時區檔案覆蓋到/etc/localtime,前提是宿主機設定好上海的時區。
ll /etc/localtimelrwxrwxrwx. 1 root root 35 apr 20 00:11 /etc/localtime -> ../usr/share/zoneinfo/asia/shanghai
cat time.yamlapiversion: v1
kind: pod
metadata:
name: time-nginx
spec:
containers:
- name: time-nginx
image: nginx
args: [/bin/sh, -c,
'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
env:
- name: tz
value: asia/shanghai
kubectl exec -it time-nginx /bin/sh# date
fri may 1 19:28:33 utc 2020
# rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime
# date
sat may 2 03:29:11 cst 2020
k8s pod的yaml檔案詳解
apiversion v1 版本 kind pod 型別,pod metadata 元資料 name string 元資料,pod的名字 namespace string 元資料,pod的命名空間 labels 元資料,標籤列表 name string 元資料,標籤的名字 annotations 元...
k8s pod的狀態為evicted
使用kubectl get pods,發現很多pod的狀態為evicted。原因eviction,即驅趕的意思,意思是當節點出現異常時,kubernetes將有相應的機制驅趕該節點上的pod。多見於資源不足時導致的驅趕。解決方案 排查資源和異常原因,防止新的驅趕產生。使用如下命令刪除舊驅趕的遺留 k...
k8s pod多種處理邏輯過程
kubernetes 建立pod 的 工作流 1 kubectl 向 k8s api server 發起乙個create pod 請求 即我們使用kubectl敲乙個create pod命令 2 k8s api server接收到pod建立請求後,不會去直接建立pod 而是生成乙個包含建立資訊的ya...