自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)戰(zhàn)直擊:Kubernetes棄用Docker?

開發(fā)
前段時間,kubernetes推出了1.24版本,曾經(jīng)轟動一時的docker棄用也正式實(shí)裝了,這意味著1.24版本之后,docker將不能作為k8s的容器運(yùn)行時。docker作為云原生的基礎(chǔ)技術(shù)底座,如果kubernetes不再支持docker,這在互聯(lián)網(wǎng)IT業(yè)界都會引發(fā)不大不小的恐慌,這到底該怎么辦?

作者 | 劉啟偉,廣東公司網(wǎng)絡(luò)管理中心網(wǎng)管系統(tǒng)室平臺團(tuán)隊(duì)核心專家。近年來,網(wǎng)管系統(tǒng)室一方面大力推進(jìn)OSS應(yīng)用建設(shè),為“三零三自”的自智網(wǎng)絡(luò)賦能;另一方面,積極推動微服務(wù)、容器化、PaaS、DevOps等云原生技術(shù)的實(shí)踐落地。在團(tuán)隊(duì)中負(fù)責(zé)DevOps平臺和容器云的建設(shè)運(yùn)營工作,擁有豐富的Kubernetes、Istio、DevOps工具鏈落地實(shí)踐經(jīng)驗(yàn),致力于克服技術(shù)落地難題,用云原生技術(shù)賦能應(yīng)用。

Labs 導(dǎo)讀

?Kubernetes是一個可移植、可擴(kuò)展的開源平臺,用于管理容器化的工作負(fù)載和服務(wù),可促進(jìn)聲明式配置和自動化。Kubernetes擁有一個龐大且快速增長的生態(tài)系統(tǒng),其服務(wù)、支持和工具的使用范圍廣泛。

1前言

前段時間,kubernetes推出了1.24版本,曾經(jīng)轟動一時的docker棄用也正式實(shí)裝了,這意味著1.24版本之后,docker將不能作為k8s的容器運(yùn)行時。docker作為云原生的基礎(chǔ)技術(shù)底座,如果kubernetes不再支持docker,這在互聯(lián)網(wǎng)IT業(yè)界都會引發(fā)不大不小的恐慌,這到底該怎么辦?是不是docker完全不能使用了?

2技術(shù)的真相

其實(shí)kubernetes只是棄用了dockershim,并不是棄用了docker的全部。docker體系中的containerd是符合CRI標(biāo)準(zhǔn)的,可以繼續(xù)作為kubernetes的容器運(yùn)行時。而OCI標(biāo)準(zhǔn)的實(shí)現(xiàn)者runC也是docker體系的。

另一方面,docker構(gòu)建的鏡像符合OCI標(biāo)準(zhǔn),可以運(yùn)行在kubernetes集群中,所以仍然可以在本地使用docker進(jìn)行開發(fā)和測試。

2.1 OCI和CRI標(biāo)準(zhǔn)分別是什么?

OCI(Open Container Initiative)是一組圍繞容器技術(shù)的開放標(biāo)準(zhǔn)和規(guī)范,主要定義了容器的生命周期管理規(guī)范。OCI的實(shí)現(xiàn)者通常被稱為“低級容器運(yùn)行時”,例如runC。低級運(yùn)行時的主要功能是按照給定的容器文件系統(tǒng)和JSON配置文件,創(chuàng)建容器,并管理容器的生命周期。

CRI(Container Runtime Interface)是一組插件接口,定義了kubernetes(kubelet)與容器運(yùn)行時的接口規(guī)范,實(shí)現(xiàn)兩者之間的解耦。通過CRI與kubernetes交互的運(yùn)行時通常被稱為“高級容器運(yùn)行時”。高級運(yùn)行時的功能是為容器準(zhǔn)備必要的運(yùn)行環(huán)境,比如拉取鏡像、解壓鏡像并創(chuàng)建容器文件系統(tǒng)、創(chuàng)建容器網(wǎng)絡(luò)等,然后調(diào)用低級容器運(yùn)行時,創(chuàng)建和運(yùn)行容器。

2.2 kubernetes支持哪些容器運(yùn)行時?

kubernetes支持任何符合CRI標(biāo)準(zhǔn)的容器運(yùn)行時。在1.23版本之前,常用的容器運(yùn)行時有三種:docker、containerd、cri-o.

docker

docker守護(hù)進(jìn)程是不符合CRI標(biāo)準(zhǔn)的。為了支持docker作為容器運(yùn)行時,kubelet內(nèi)置了一個dockershim模塊,kubelet通過CRI調(diào)用dockershim,再由它轉(zhuǎn)換請求,調(diào)用docker守護(hù)進(jìn)程,而1.24版本將要移除的就是這個模塊。此模式下創(chuàng)建容器時的調(diào)用過程如下:

  • kubelet通過CRI調(diào)用dockershim;
  • dockershim轉(zhuǎn)換請求,調(diào)用docker守護(hù)進(jìn)程;
  • docker調(diào)用containerd;
  • containerd創(chuàng)建containerd-shim進(jìn)程,再由containerd-shim調(diào)用runC完成容器創(chuàng)建。最終容器由containerd-shim管理,容器內(nèi)所有進(jìn)程都是containerd-shim的子進(jìn)程。

containerd

containerd是從docker守護(hù)進(jìn)程中獨(dú)立出來的容器運(yùn)行時,最終也要通過runC運(yùn)行容器。

在CRI標(biāo)準(zhǔn)被提出后,為了兼容CRI,減少調(diào)用開銷,containerd開發(fā)了一個守護(hù)進(jìn)程,叫CRI-containerd。原先調(diào)用鏈kubelet -> dockershim -> dockerd -> containerd 被簡化成為 kubelet -> CRI-containerd -> containerd。后來,containerd干脆將CRI-containerd以CRI插件形式內(nèi)建在項(xiàng)目中,直接通過方法調(diào)用,進(jìn)一步將調(diào)用鏈簡化為 kubelet -> containerd。

cri-o

CRI標(biāo)準(zhǔn)被提出后,紅帽按照CRI開發(fā)的一個輕量級容器運(yùn)行時,是CRI標(biāo)準(zhǔn)的最小實(shí)現(xiàn)。此模式下kubelet直接調(diào)用cri-o,再由cri-o調(diào)用runC完成容器創(chuàng)建和管理,調(diào)用鏈比較簡潔。

廣東公司網(wǎng)絡(luò)管理中心網(wǎng)管系統(tǒng)室負(fù)責(zé)建設(shè)和維護(hù)O域容器云,近期剛好啟動kubernetes 版本升級工作,借此機(jī)會,我們決定在測試環(huán)境上將容器運(yùn)行時從docker遷移至cri-o,并驗(yàn)證下kubernetes 1.23 -> 1.24版本升級方案,以下是遷移的部分注意事項(xiàng)及詳細(xì)步驟。

3遷移注意事項(xiàng)和詳細(xì)步驟

注意事項(xiàng):

  1. 對于使用docker in docker的pod,如果是掛載宿主機(jī)的docker.sock守護(hù)進(jìn)程,遷移后將不能運(yùn)行,如果是在容器中安裝獨(dú)立的docker守護(hù)進(jìn)程,遷移后仍然可以正常運(yùn)行。
  2. /etc/docker/daemon.json中的配置需要同步到新的運(yùn)行時,比如倉庫的鏡像站點(diǎn)。
  3. 檢查各種運(yùn)維腳本,如果包含docker命令需要修改。
  4. 容器stdout/stderr日志形式變更,如果使用Fluentd或者Filebeat收集日志,需要修改配置。

① 日志目錄:使用docker時,日志通過/var/log/containers鏈接到/var/log/pods/目錄,最后鏈接到/var/lib/docker/containers/xxx/目錄,如果使用其他運(yùn)行時,一般是通過/var/log/containers鏈接到/var/log/pods/目錄,由kubelet管理。

② 日志格式:使用docker時,很多人習(xí)慣設(shè)置json格式,而切換到其他運(yùn)行時,默認(rèn)格式是text,格式為“time stream log-info”。日志解析配置需要修改。

③ 日志回滾:使用docker時,在daemon.json配置,切換運(yùn)行時后,通過kubelet的配置項(xiàng)containerLogMaxSize、containerLogMaxFiles設(shè)置。

怎么將kubernetes的容器運(yùn)行時從docker遷移至cri-o?

  • 操作系統(tǒng):centOS 7.9
  • 內(nèi)核版本:5.4.178
  • kubernetes版本:1.23.3
  • cri-o:1.22.3

1. 遷移按節(jié)點(diǎn)進(jìn)行,先驅(qū)逐pod并隔離節(jié)點(diǎn)

kubectl drain --delete-emptydir-data --force --ignore-daemonsets <NODE_NAME>

2. 卸載docker

systemctl stop kubelet
systemctl stop docker
systemctl disable docker
yum remove -y docker-ce
# docker數(shù)據(jù)目錄先保留一段時間,運(yùn)行沒異常再刪除
rm -rf /var/lib/docker

3. 內(nèi)核設(shè)置

這些設(shè)置一般在k8s安裝前都會設(shè)置,這里再確認(rèn)一次,已經(jīng)設(shè)置好的忽略這一步。

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl --system
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

4. 安裝cri-o

# 設(shè)置yum源
export OS=CentOS_7
export VERSION=1.22
curl -L -o
/etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo
curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo
# 安裝cri-o
yum install -y cri-o

5. 修改cri-o配置

# 查看conmon路徑
which conmon
# 修改cri-o配置文件
vi /etc/crio/crio.conf
# 修改crio.runtime表,加上conmon路徑配置
[crio.runtime]
conmon = "/usr/bin/conmon"
# 修改crio.image表,加上pause鏡像設(shè)置。xxx需要換成你的私有鏡像庫
[crio.image]
insecure_registries = ["xxx"]
pause_image = "xxx/k8s/pause:3.6"
# 修改registry配置
vi /etc/containers/registries.conf
# 添加私有鏡像庫,xxx需要替換成你的私有鏡像庫,這里設(shè)置了insecure,可按實(shí)現(xiàn)情況修改
# 因?yàn)槲矣玫氖撬接袀}庫,不需要設(shè)置鏡像站點(diǎn)
[[registry]]
prefix = "xxx"
insecure = true
blocked = false
location = "xxx"

6. 啟動cri-o服務(wù)

systemctl enable crio
systemctl start crio
systemctl status crio

7. 修改kubelet配置

設(shè)置kubelet命令行啟動參數(shù),指定使用cri-o運(yùn)行時。

vi /etc/sysconfig/kubelet
# 修改內(nèi)容,加上以下兩個參數(shù)
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint='unix:///var/run/crio/crio.sock'

修改 /var/lib/kubelet/kubeadm-flags.env 文件,文件中如果有以下3個參數(shù),請刪除。

  • --cgroup-driver k8s建議在配置文件設(shè)置,不要在命令行。
  • --cni-plugin 1.24版本后會和docker-shim一起被移除。
  • --pod-infra-container-image 當(dāng)使用cri-o運(yùn)行時,kubelet忽略這個參數(shù),需要在cri-o配置中指定。

修改kubelet的配置文件 /var/lib/kubelet/config.yaml,修改以下4個參數(shù),如果參數(shù)不存在則添加上去。

設(shè)置kubelet的cgroup驅(qū)動為systemd,因?yàn)閏ri-o默認(rèn)驅(qū)動是systemd,必須保持一致。舊版本kubelet默認(rèn)驅(qū)動是cgroupfs,1.22以上才是默認(rèn)systemd。

cgroupDriver: systemd

設(shè)置運(yùn)行時請求超時:

runtimeRequestTimeout: 5m

容器stdout/stderr日志文件的回滾設(shè)置,按實(shí)際需求修改。

containerLogMaxSize: 100Mi
containerLogMaxFiles: 3

修改了 /var/lib/kubelet/config.yaml 文件后,建議同步修改內(nèi)容到kubelet-config-1.xx configmap,1.xx是kubernetes的版本。因?yàn)榧簲U(kuò)容時,新節(jié)點(diǎn)使用這個configmap生成配置文件,這樣可以保證新舊節(jié)點(diǎn)配置文件一致。

kubectl edit cm -n kube-system kubelet-config-1.23

8. 啟動kubelet,查看kubelet狀態(tài)、節(jié)點(diǎn)狀態(tài)、pod狀態(tài)是否正常。

systemctl start kubelet
systemctl status kubelet

9. 更新kubeadm使用的cri運(yùn)行時

kubeadm使用的cri運(yùn)行時在node annotations中定義,需要單獨(dú)修改,否則下次使用kubeadm時會出錯,比如升級k8s版本的時候。

# 查看當(dāng)前節(jié)點(diǎn)的kubeadm使用的cri運(yùn)行時
kubectl get node <NODE_NAME> -o jsonpath='{.metadata.annotations.kubeadm\.alpha\.kubernetes\.io/cri-socket}'
# 將dokcershim修改為cri-o
kubectl annotate node <NODE_NAME> --overwrite kubeadm.alpha.kubernetes.io/cri-socket=/var/run/crio/crio.sock

10. 安裝podman

podman是一個開源的容器管理工具,命令幾乎與docker一致,可以用于替換docker。相較于docker,它不存在守護(hù)進(jìn)程,因此podman避免了docker daemon引入的問題。另一方面,cri-o專注于CRI實(shí)現(xiàn),沒有提供build、tag鏡像等功能,而podman和cri-o的鏡像是共享的,可以為cri-o補(bǔ)充鏡像管理功能。

yum install -y podman
podman info

11. 重啟服務(wù)器

docker卸載后可能還有一些配置遺留,例如iptables規(guī)則,建議重啟服務(wù)器,防止被影響。

12. 將節(jié)點(diǎn)重新加入集群調(diào)度。

kubectl uncordon <NODE_NAME>

到這里,第一個節(jié)點(diǎn)的容器運(yùn)行時遷移就完成了,可以按照相同的方法再遷移其他節(jié)點(diǎn)。

遷移完成后就能愉快地把k8s版本升到1.24.0了。

4后記

雖然k8s已經(jīng)正式移除了dockershim,但是docker+kubernetes的方案經(jīng)過多年發(fā)展已經(jīng)成熟,被廣泛地應(yīng)用,短期內(nèi)地位仍然不可撼動。開發(fā)、測試環(huán)境可以按照需求折騰,遷移容器運(yùn)行時,積累實(shí)踐經(jīng)驗(yàn)。生產(chǎn)環(huán)境的話建議保持穩(wěn)定,等時機(jī)成熟再遷移。

責(zé)任編輯:未麗燕 來源: 移動Labs
相關(guān)推薦

2020-12-03 18:29:30

KubernetesDocker容器

2021-06-04 05:21:19

KubernetesDocker容器

2020-12-18 09:23:41

KubernetesDocker

2017-04-05 13:24:35

互聯(lián)網(wǎng)

2010-08-26 09:12:33

非法DHCP

2024-01-22 12:46:00

KubernetesAPI接口

2013-08-27 16:09:10

中關(guān)村在線

2015-08-10 18:32:09

2014-03-18 14:11:07

SAPd-code

2014-05-22 09:23:33

Teradata 大數(shù)據(jù)天睿

2009-08-11 15:39:11

CCIE學(xué)習(xí)計(jì)劃

2022-01-26 11:08:07

Kubernetes容器dockershim

2024-10-17 14:14:29

2024-09-30 10:11:04

2024-06-19 15:24:31

2009-06-12 16:55:10

VPN客戶端故障

2011-10-11 22:13:22

TechEd 2011云+端

2011-09-25 23:03:39

2013-05-07 20:53:44

2013GMGC移動開發(fā)手游開發(fā)

2009-12-21 15:12:37

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號