[TOC]
背景說明:
在 Kuberntes 平臺中,為了解決與容器運行時(例如 Docker)集成問題,在早期社區推出 CRI(Container Runtime Interface,容器運行時接口),以支持更多的容器運行時。而 Docker 本身并不支持 CRI(容器運行時接口)這一 Kubernetes 運行時 API,Kubernetes 用戶一直以來所使用的其實是名為 “dockershim” 的橋接服務。Dockershim 能夠轉換 Docker API 與 CRI,但在后續版本當中,Kubernetes 將不再提供這項橋接服務。
整體步驟:
1. 騰空節點
2. 停止相關服務
3. 安裝containerd服務
4. 修改kubelet配置
5. 啟動kubelet服務
6. 驗證功能
7. [可選]刪除docker服務
## 騰空節點
```shell
$ kubectl drain --ignore-daemonsets master03
node/master03 cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-fbzqw, kube-system/kube-proxy-95hst
node/master03 drained
```
## 停止相關服務
```shell
systemctl stop kubelet
systemctl stop containerd
systemctl disable docker --now
```
## 安裝containerd服務
請參考本人的博客文章 [containerd安裝](https://www.cnblogs.com/jiaxzeng/p/16708491.html)
## 修改kubelet配置
修改 kubelet 配置,將容器運行時配置為 containerd,打開 /etc/sysconfig/kubelet 文件,在該文件中可以添加一些額外的 kubelet 啟動參數,配置如下所示:
```shell
cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
```
上面的配置中我們增加了兩個參數,`--container-runtime` 參數是用來指定使用的容器運行時的,可選值為 docker 或者 remote,默認是 docker,由于我們這里使用的是 containerd 這種容器運行時,所以配置為 remote 值(也就是除 docker 之外的容器運行時都應該指定為 remote),然后第二個參數 `--container-runtime-endpoint` 是用來指定遠程的運行時服務的 endpiont 地址的,在 Linux 系統中一般都是使用 unix 套接字的形式,比如這里我們就是指定連接 containerd 的套接字地址 `unix:///run/containerd/containerd.sock`。
## 啟動kubelet服務
```shell
systemctl start kubelet
```
## 將節點設置運行調度
```shell
kubectl uncordon master03
```
## 驗證
```shell
# 確認CONTAINER-RUNTIME值
$ kubectl get nodes master03 -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master03 Ready control-plane,master 2d23h v1.20.15 192.168.32.184 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 containerd://1.6.9
# 創建deployment
kubectl create deployment alpine --image=alpine:3.16 -- sleep 3600
# 容忍任何污點 以及 調度到指定節點
kubectl patch deployment alpine -p '{"spec": {"template": {"spec": {"tolerations": [{"operator": "Exists"}], "nodeSelector": {"kubernetes.io/hostname": "master03"}}}}}'
# 查看pod運行情況
$ kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
alpine-5f7998d889-8kzpg 1/1 Running 0 9s 10.244.235.11 master03 <none> <none>
# 測試與pod的連通性
$ kubectl -n kube-system get pod -owide -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-7f89b7bc75-hw4pt 1/1 Running 0 158m 10.244.241.68 master01 <none> <none>
coredns-7f89b7bc75-pz9zb 1/1 Running 0 158m 10.244.59.198 master02 <none> <none>
$ kubectl exec -it alpine-5f7998d889-8kzpg -- ping -c4 10.244.241.68
PING 10.244.241.68 (10.244.241.68): 56 data bytes
64 bytes from 10.244.241.68: seq=0 ttl=62 time=0.550 ms
64 bytes from 10.244.241.68: seq=1 ttl=62 time=0.485 ms
64 bytes from 10.244.241.68: seq=2 ttl=62 time=0.520 ms
64 bytes from 10.244.241.68: seq=3 ttl=62 time=0.589 ms
--- 10.244.241.68 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.485/0.536/0.589 ms
# 測試service連通性
$ kubectl exec -it alpine-5f7998d889-8kzpg -- wget --no-check-certificate -q -O - https://kubernetes:443/version
{
"major": "1",
"minor": "20",
"gitVersion": "v1.20.15",
"gitCommit": "8f1e5bf0b9729a899b8df86249b56e2c74aebc55",
"gitTreeState": "clean",
"buildDate": "2022-01-19T17:23:01Z",
"goVersion": "go1.15.15",
"compiler": "gc",
"platform": "linux/amd64"
}
# 清理deployment
$ kubectl delete deploy alpine
```
## [可選]刪除docker服務
- 確認docker數據目錄[停服務前執行]
```shell
docker info | awk -F: '/Docker Root Dir/ {print $2}'
```
- **二進制安裝 docker 服務**
自行刪除 docker相關二進制文件、systemd配置、docker數據目錄
- **RPM 安裝的 docker 服務**
docker版本 >= 18.09.0
```shell
yum remove docker-ce docker-ce-cli containerd.io
```
17.03.0 <= docker版本 <= 18.09.0
```shell
yum remove docker-ce
```
## 參考文檔
官網文檔:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/
- 前言
- 架構
- 部署
- kubeadm部署
- kubeadm擴容節點
- 二進制安裝基礎組件
- 添加master節點
- 添加工作節點
- 選裝插件安裝
- Kubernetes使用
- k8s與dockerfile啟動參數
- hostPort與hostNetwork異同
- 應用上下線最佳實踐
- 進入容器命名空間
- 主機與pod之間拷貝
- events排序問題
- k8s會話保持
- 容器root特權
- CNI插件
- calico
- calicoctl安裝
- calico網絡通信
- calico更改pod地址范圍
- 新增節點網卡名不一致
- 修改calico模式
- calico數據存儲遷移
- 啟用 kubectl 來管理 Calico
- calico卸載
- cilium
- cilium架構
- cilium/hubble安裝
- cilium網絡路由
- IP地址管理(IPAM)
- Cilium替換KubeProxy
- NodePort運行DSR模式
- IP地址偽裝
- ingress使用
- nginx-ingress
- ingress安裝
- ingress高可用
- helm方式安裝
- 基本使用
- Rewrite配置
- tls安全路由
- ingress發布管理
- 代理k8s集群外的web應用
- ingress自定義日志
- ingress記錄真實IP地址
- 自定義參數
- traefik-ingress
- traefik名詞概念
- traefik安裝
- traefik初次使用
- traefik路由(IngressRoute)
- traefik中間件(middlewares)
- traefik記錄真實IP地址
- cert-manager
- 安裝教程
- 頒布者CA
- 創建證書
- 外部存儲
- 對接NFS
- 對接ceph-rbd
- 對接cephfs
- 監控平臺
- Prometheus
- Prometheus安裝
- grafana安裝
- Prometheus配置文件
- node_exporter安裝
- kube-state-metrics安裝
- Prometheus黑盒監控
- Prometheus告警
- grafana儀表盤設置
- 常用監控配置文件
- thanos
- Prometheus
- Sidecar組件
- Store Gateway組件
- Querier組件
- Compactor組件
- Prometheus監控項
- grafana
- Querier對接grafana
- alertmanager
- Prometheus對接alertmanager
- 日志中心
- filebeat安裝
- kafka安裝
- logstash安裝
- elasticsearch安裝
- elasticsearch索引生命周期管理
- kibana安裝
- event事件收集
- 資源預留
- 節點資源預留
- imagefs與nodefs驗證
- 資源預留 vs 驅逐 vs OOM
- scheduler調度原理
- Helm
- Helm安裝
- Helm基本使用
- 安全
- apiserver審計日志
- RBAC鑒權
- namespace資源限制
- 加密Secret數據
- 服務網格
- 備份恢復
- Velero安裝
- 備份與恢復
- 常用維護操作
- container runtime
- 拉取私有倉庫鏡像配置
- 拉取公網鏡像加速配置
- runtime網絡代理
- overlay2目錄占用過大
- 更改Docker的數據目錄
- Harbor
- 重置Harbor密碼
- 問題處理
- 關閉或開啟Harbor的認證
- 固定harbor的IP地址范圍
- ETCD
- ETCD擴縮容
- ETCD常用命令
- ETCD數據空間壓縮清理
- ingress
- ingress-nginx header配置
- kubernetes
- 驗證yaml合法性
- 切換KubeProxy模式
- 容器解析域名
- 刪除節點
- 修改鏡像倉庫
- 修改node名稱
- 升級k8s集群
- 切換容器運行時
- apiserver接口
- 其他
- 升級內核
- k8s組件性能分析
- ETCD
- calico
- calico健康檢查失敗
- Harbor
- harbor同步失敗
- Kubernetes
- 資源Terminating狀態
- 啟動容器報錯