官网参阅链接 https://katacontainers.io/

第五十四节  k8s 容器运行时之Kata container学习_配置文件

一、什么是容器运行时

容器的运行时(runtime)
就是运行和管理容器进程、镜像的工具。

二、容器运行时分类

Docker属于容器技术早期的发展项目,也是目前最广泛的容器引擎技术。
当然,随着容器生态圈的日益繁荣,业界慢慢也出现了其他各种运行时工具,
如Containerd、rkt、Kata Container、CRO等。

这些工具提供的功能不尽相同,
有些只有容器运行的功能,有些除运行容器外还提供了容器镜像的管理功能。
根据容器运行时提供功能,可以将容器运行时分为低层运行时和高层运行时。

2.1 低容器运行时

低层运行时主要负责与宿主机操作系统打交道,根据指定的容器镜像在宿主机上运行容器的进程,
并对容器的整个生命周期进行管理。而这个低层运行时,正是负责执行我们前面讲解过的设置
容器 Namespace、Cgroups等基础操作的组件。

常见的低层运行时种类有:
1.runc:  传统的运行时,基于LinuxNamespace和Cgroups技术实现,代表实现Docker。

2.runv:  基于虚拟机管理程序的运行时,通过虚拟化guest kernel,将容器和主机隔离开来,
         使得其边界更加清晰,代表实现是Kata container和Firecracker。
         
3.runsc: runc+safety,通过拦截应用程序的所有系统调用,提供安全隔离的轻量级容器运行时
        沙箱,代表实现是谷歌的gVisor。

2.2 高容器运行时

高层运行时主要负责镜像的管理、转化等工作,为容器的运行做前提准备。

主流的高层运行时,主要containerd和CRI-O。

高层运行时与低层运行时各司其职,容器运行时一般先由高层运行时将容器镜像下载下来,
并解压转换为容器运行需要的操作系统文件,再由低层运行时启动和管理容器。

2.3 高低容器运行的关系

第五十四节  k8s 容器运行时之Kata container学习_初始化_02

容器运行时(Container Runtime)更侧重于运行容器,为容器设置
命名空间和控制组(cgroup),也被称为底层容器运行时。

高层的容器运行时或容器引擎专注于格式、解包、管理和镜像共享。 它们还为开发者提供 API服务。

三、安全容器运行时

Kubernetes目前作为企业级容器平台,企业生产最重要的是安全。
众所周知,Docker容器通过LinuxNamespace和Cgroups实现容器之间的资源限制和隔离,
在实际运行中各容器资源(网络、存储、计算)仍由宿主机直接提供,这就可能出现某个
容器进程夺取整个宿主机控制权的问题,在安全问题上存在一定的隐患。于是,Kata Container
和gVisr等安全容器运行时应用而生。

Kata Containers弥补了传统容器技术安全性的缺点,Kata Containers通过使用硬件虚拟化
来达到容器隔离的目的。每一个container/pod都个container/pod运行与独立的虚拟机上,
它们不再从宿主机内核上获取,而是基于一个独立的kernel实例来作为一个轻量级的虚拟机,
自动获取应用所有的权限。

Kata Container来源于Intel Clear Containers和Hyper runv项目的合并,它使用传统的虚拟化技术,
通过虚拟硬件模拟出了一台”小虚拟机”,然后再这台小虚拟机中安装了一个裁剪后的Linux内核来实现容器
建的隔离。

gVisor由谷歌公司发布,它通过为容器进程配置一个用Go语言实现的、在用户态实现的、极小的"独立内核”,
通过这个内核控制容器进程向宿主机发起有限可控的系统调用。

四、k8s 1.30.2集成kata container

4.1 kata集成原理

Kata Container支持OCI运行时规范,可以以插件形式嵌入到 Docker 中作为低层的容器运行时。
也支持Kubernetes的CRL接口,可以与CRLe和containerd集成。

由于目前Kubernetes默认的运行时是containerd,下面主要讲解Kata Container如何与containerd集成
以及集成后Kubernetes如何使用Kata Container创建负载。

由于Kata Container使用虚拟化技术实现,
首先需要集成Kubernetes环境支持Intel VT-xtechnology、ARM Hyp mode、
1BM Power Systems或IBM Zmanframes四种中的任意一种CPU虚拟化技术。

第五十四节  k8s 容器运行时之Kata container学习_配置文件_03

4.2 实验环境

#系统版本
AlmaLinux 9.4
cat /etc/os-release 
NAME="AlmaLinux"  
VERSION="9.4 (Seafoam Ocelot)"
#系统内核
uname -r
5.14.0-427.37.1.el9_4.x86_64

# 3台主机host
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#:1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.80.61 lyc-80-61
192.168.80.62 lyc-80-62
192.168.80.63 lyc-80-63

4.3 系统初始化

系统初始化
1、关闭防火墙
systemctl stop firewalld 
systemctl disable firewalld 
systemctl status firewalld 

2、关闭selinux
vim /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled

3、修改网络IP
vim /etc/NetworkManager/system-connections/ens33.nmconnection
----
#编辑ipv4配置
[ipv4]
address1=192.168.80.76/24,192.168.80.2
dns=192.168.80.2;114.114.114.114;
method=manual     //原auto自动,改为manual 手动

4、修改hosts文件
vim  /etc/hosts

5、时间同步
sudo yum install chrony
vim /etc/chrony.conf 
-----------------------
# 添加同步服务器
server ntp1.aliyun.com  iburst
----------------------
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone
chkconfig  chronyd  on
# 启动系统服务chronyd,并设为开机自启
systemctl  restart  chronyd    #重启校时服务
systemctl  enable  chronyd     #开机自启
输入date  查看时间
timedatectl   #查看2个yes,表示同步成功

6、关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab
#查看关闭状态
cat  /etc/fstab

7、开放网络规则
iptables -P  INPUT  ACCEPT
iptables -P  FORWARD  ACCEPT
iptables -F
iptables -L  -n
#查看规则
iptables -L

8、安装依赖包
yum -y install wget jq psmisc vim net-tools nfs-utils socat telnet device-mapper-persistent-data lvm2 git network-scripts tar curl -y
yum install -y conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

9、开启ipvs转发
yum install ipvsadm ipset sysstat conntrack libseccomp -y
--------------------------
modprobe br_netfilter 
mkdir -p /etc/sysconfig/modules/
cat > /etc/sysconfig/modules/ipvs.modules << EOF 
#!/bin/bash 
modprobe -- ip_vs 
modprobe -- ip_vs_rr 
modprobe -- ip_vs_wrr 
modprobe -- ip_vs_sh 
modprobe -- nf_conntrack
EOF
---------------------------
chmod 755 /etc/sysconfig/modules/ipvs.modules 
bash /etc/sysconfig/modules/ipvs.modules 
lsmod | grep -e ip_vs -e nf_conntrack
-----------------------------------
# 重启服务
systemctl restart systemd-modules-load.service

10、句柄数最大化
ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOF
#查看修改结果
ulimit -a

11、资源最大化
vim  /etc/default/grub
添加  numa=off

12、系统参数优化
cat > /etc/sysctl.d/k8s_better.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
modprobe br_netfilter
lsmod |grep conntrack
modprobe ip_conntrack
sysctl -p /etc/sysctl.d/k8s_better.conf

13、执行ssh互认免密
ssh-keygen -t rsa 
#敲3下回车,生成秘钥
ssh-copy-id lyc-80-61
ssh-copy-id lyc-80-62
ssh-copy-id lyc-80-63
# 以上命令,每台机器都需要执行

4.4 安装containerd

4.4.1 创建配置文件

【3台机器全部执行】
创建 /etc/modules-load.d/containerd.conf 配置文件
----------------------
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
----------------------
modprobe overlay
modprobe br_netfilter

第五十四节  k8s 容器运行时之Kata container学习_初始化_04

4.4.2 配置源文件

获取阿里云YUM源
vim /etc/yum.repos.d/docker-ce.repo
------------------
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/9/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
----------------------
yum makecache

yum list containerd.io --showduplicates

第五十四节  k8s 容器运行时之Kata container学习_初始化_05

第五十四节  k8s 容器运行时之Kata container学习_初始化_06

下载安装指定版本:
yum -y install containerd.io-1.7.19-3.1.el9

验证版本
containerd --version

第五十四节  k8s 容器运行时之Kata container学习_初始化_07

4.4.3 配置config文件

【3台机器全部执行】

生成containerd的配置文件
mkdir -p /etc/containerd 

生成配置文件
containerd config default > /etc/containerd/config.toml
编辑配置文件
vim /etc/containerd/config.toml
------------
SystemdCgroup = false 改为 
【搜索】:/SystemdCgroup
SystemdCgroup = true   //第139行

sandbox_image = "k8s.gcr.io/pause:3.6"
改为:
【搜索】:/sandbox_image
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"  //第67行
-----------

# 设置开机启动
systemctl enable containerd
# 启动服务
systemctl start containerd
# 查看镜像,验证安装是否成功
ctr images ls

第五十四节  k8s 容器运行时之Kata container学习_初始化_08

4.5 安装kata container

wget https://github.com/kata-containers/kata-containers/releases/download/3.6.0/kata-static-3.6.0-amd64.tar.xz

tar -xvf kata-static-3.6.0-amd64.tar.xz
mv opt/kata/ /opt/
cd /opt/kata/

# 新建kata-containers文件夹
mkdir -p /etc/kata-containers

cp -p share/defaults/kata-containers/configuration.toml /etc/kata-containers/

# 软连接到/usr/local/bin目录
ln -sf /opt/kata/bin/containerd-shim-kata-v2 /usr/local/bin/containerd-shim-kata-v2
ln -sf /opt/kata/bin/kata-runtime /usr/local/bin/kata-runtime
ln -sf /opt/kata/bin/kata-monitor /usr/local/bin/kata-monitor

kata-runtime check --no-network-checks
---提示以下信息---说明正常
System is capable of running Kata Containers
System can currently create Kata Containers

# 如果报错,使用以下命令
# VMware 虚拟机的bug
sudo tee /etc/modprobe.d/blacklist-vmware.conf << EOF
blacklist vmw_vsock_virtio_transport_common
blacklist vmw_vsock_vmci_transport
EOF
重新启动机器
reboot

第五十四节  k8s 容器运行时之Kata container学习_vim_09

第五十四节  k8s 容器运行时之Kata container学习_vim_10

4.6 配置容器运行时

### 第113行-126行复制后,在下边进行修改
vim /etc/containerd/config.toml
---
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
base_runtime_spec = ""
cni_conf_dir = ""
cni_max_conf_num = 0
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
privileged_without_host_devices_all_devices_allowed = false
runtime_engine = ""
runtime_path = ""
runtime_root = ""
runtime_type = "io.containerd.kata.v2
sandbox_mode = "podsandbox"
snapshotter = ""
---
scp config.toml lyc-80-62:/etc/containerd
scp config.toml lyc-80-63:/etc/containerd

### 也可以 cd /etc/containerd,然后用编辑工具Notepad++直接进行编辑。

第五十四节  k8s 容器运行时之Kata container学习_配置文件_11

第五十四节  k8s 容器运行时之Kata container学习_vim_12

【拉取镜像,验证配置】
ctr image pull registry.cn-hangzhou.aliyuncs.com/ywflyfish/busybox:latest
ctr run --rm -t registry.cn-hangzhou.aliyuncs.com/ywflyfish/busybox:latest kata-test
ctr run --runtime "io.containerd.kata.v2" --rm -t registry.cn-hangzhou.aliyuncs.com/ywflyfish/busybox:latest kata-test

第五十四节  k8s 容器运行时之Kata container学习_vim_13

kata-runtime env

第五十四节  k8s 容器运行时之Kata container学习_配置文件_14

五、安装k8s 1.30.2版本并测试

5.1 配置k8s yum源

# 参考阿里云镜像站,把里面的1.31改为1.30即可
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.73281b11BEAEr6


# 添加阿里云YUM软件源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
----

# 清除原有 yum 缓存
yum clean all
# 生成新的缓存
yum makecache

第五十四节  k8s 容器运行时之Kata container学习_vim_15

5.2 下载指定版本

# 查看版本列表
yum list kubelet --showduplicates | sort -r | grep 1.30


# 我们这里下载1.30.2
yum -y install kubectl-1.30.2-150500.1.1 kubelet-1.30.2-150500.1.1 kubeadm-1.30.2-150500.1.1

会自动安装5个包,明细如下:
kubeadm-1.30.2-150500.1.1.x86_64        
kubectl-1.30.2-150500.1.1.x86_64   
kubelet-1.30.2-150500.1.1.x86_64   
kubernetes-cni-1.4.0-150500.1.1.x86_64
cri-tools-1.30.1-150500.1.1.x86_64

第五十四节  k8s 容器运行时之Kata container学习_配置文件_16

第五十四节  k8s 容器运行时之Kata container学习_配置文件_17

5.3 配置Cgroup

为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
vim /etc/sysconfig/kubelet
---------------------
添加
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
---------------------
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet

第五十四节  k8s 容器运行时之Kata container学习_配置文件_18

5.4 下载所需要的镜像

查看安装 k8s1.30.2 所需要的镜像
kubeadm config images list --kubernetes-version=v1.30.2
---
registry.k8s.io/kube-apiserver:v1.30.2
registry.k8s.io/kube-controller-manager:v1.30.2
registry.k8s.io/kube-scheduler:v1.30.2
registry.k8s.io/kube-proxy:v1.30.2
registry.k8s.io/coredns/coredns:v1.11.1
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0

# 拉取 k8s1.30.2 版本镜像所需镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=v1.30.2


#【扩展: 拉取默认最新版本的镜像】
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

第五十四节  k8s 容器运行时之Kata container学习_初始化_19

5.4集群初始化

集群初始化 【主机76安装即可】
使用kubeadm init命令初始化

在lyc-80-76上执行,报错请看k8s报错汇总
vim kubeinit.sh
. ./kubeinit.sh
-------------------------------------
kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.80.61 --image-repository registry.aliyuncs.com/google_containers
------------------------------------------
--apiserver-advertise-address 集群通告地址
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与上面安装的一致
--service-cidr 集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致

第五十四节  k8s 容器运行时之Kata container学习_初始化_20

【安装成功后会有提示】
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.80.61:6443 --token ox111p.ppqgb5d2gn0jgfzl \
	--discovery-token-ca-cert-hash sha256:3771c7139381b7545f560001cd22904455fc3ac141d5da38080cca8dc52807dd

/////要记住token,一会登录web管理界面会使用到token

5.5 node节点加入

【62/63集群加入】
kubeadm join 192.168.80.61:6443 --token ox111p.ppqgb5d2gn0jgfzl \
	--discovery-token-ca-cert-hash sha256:3771c7139381b7545f560001cd22904455fc3ac141d5da38080cca8dc52807dd

第五十四节  k8s 容器运行时之Kata container学习_初始化_21

第五十四节  k8s 容器运行时之Kata container学习_初始化_22

【查看加入后的节点】
kubectl get node
kubectl get pod -A

此时集群状态为NotReady,
coredns为Peding状态,
是因为缺少网络插件,安装完插件后就会正常!

第五十四节  k8s 容器运行时之Kata container学习_vim_23

第五十四节  k8s 容器运行时之Kata container学习_vim_24

5.6 安装Calico网络插件

网络组件有很多种,只需要部署其中一个即可,推荐Calico。

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器(vRouter)来负责数据转发,
而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。
***************************************************
下载Calico配置文件
wget  --no-check-certificate   https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml
vim calico.yaml
---------------
注意看2个地方的配置
搜索查看文件:
:/CALICO_IPV4POOL_CIDR
:/interface=ens33
改为10.244  【注意IP、网卡名,我第一次就因为网卡名没起来】

:/image   版本v3.28.0
-------------------
效果与上边wget的效果一样,只是版本不一样,最新版本v3.28.0

第五十四节  k8s 容器运行时之Kata container学习_配置文件_25

第五十四节  k8s 容器运行时之Kata container学习_初始化_26

执行calico插件安装
kubectl apply -f calico.yaml

kubectl get node
kubectl get pod -A

第五十四节  k8s 容器运行时之Kata container学习_vim_27

第五十四节  k8s 容器运行时之Kata container学习_初始化_28

5.7 安装metrics-server服务

metrics-server主要是采集k8s集群资源信息的,类似linux系统中的htop命令

vim components.yaml
--------------------
注意注意以下内容
135         - --cert-dir=/tmp
136         - --secure-port=4443
137         - --kubelet-preferred-address-types=InternalIP
138         - --kubelet-use-node-status-port
139         - --metric-resolution=15s
140         - --kubelet-insecure-tls
141         image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1
142         imagePullPolicy: IfNotPresent
-------------------
执行安装
kubectl  apply  -f  components.yaml

查看pod
kubectl get pod -n kube-system
查看pod资源
kubectl top pod -n kube-system
查看node资源
kubectl top node

第五十四节  k8s 容器运行时之Kata container学习_配置文件_29

5.7 安装dashboard控制面板

下载yaml文件,目前最新版本为v2.7.0
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

编辑文件,注意修改内容
vim recommended.yaml
--------------
spec:
 40   ports:
 41     - port: 443
 42       targetPort: 8443
 43       nodePort: 30001    //改动第43行端口为30001
 44   type: NodePort        //改动第44行端口为NodePort
 45   selector:
 46     k8s-app: kubernetes-dashboard
----------------
193       containers:
194         - name: kubernetes-dashboard
195           image: registry.cn-hangzhou.aliyuncs.com/ywflyfish/dashboard:v2.7.0  //换成国内镜像


启动recommended文件
kubectl apply -f recommended.yaml
-------------------
查看pod情况
kubectl get pod -A
kubectl get ns

第五十四节  k8s 容器运行时之Kata container学习_配置文件_30

5.8 创建dashboard用户

下载文件
wget https://raw.githubusercontent.com/cby-chen/Kubernetes/main/yaml/dashboard-user.yaml
vim dashboard-user.yaml
----------------------
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard   ///命名空间
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding   ///最大用户
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole    ///组用户
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user   ///单个用户
  namespace: kubernetes-dashboard
-----------------------
【说明】
用户权限传递:admin-user---->>>ClusterRole---->>>ClusterRoleBinding
# 创建用户权限
kubectl apply -f  dashboard-user.yaml

# 查看用户权限
kubectl get sa

# 创建用户token
kubectl create token admin-user  -n  kubernetes-dashboard
eyJhbGciOiJSUzI1NiIsImtpZCI6InBuUnAzVnpoM2hXQURiaTM0UktFRFJld3JXR3FBQm54S3VzWFJNQ3F3NzQifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzM2OTUyNjE4LCJpYXQiOjE3MzY5NDkwMTgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiOGFmNzQ5NDktZjliYS00NWY1LWJmZDctZGZkODZkYWFlZjI4Iiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiM2ZmNzFkN2MtZTkyOC00MDI2LWEzNzctMjZkYzUzMDg1Nzk4In19LCJuYmYiOjE3MzY5NDkwMTgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.HNolszKciTDvv0zRkSN0Nb0q015-_xfdNFCfSm-CRFAvyNpBDOEdE4WiDXEkiPNpfFtVVgmbo4LrQf6RWIVjPPqHDJJDPg-jN5DqoWTpwFy7Gy0-z-QmJ9717so3OSuzIvmT33sz-2a4DzHHPgauOmj1498BNlM1drVhxGha4jBDSt4dQ8IU7yBJIuuz-50ue9YJew33Qdr8hOgpC-LSNKxHapt6KY_I7p9KsRpC4covWP7bB_5EJu4iQ1re-8DEFdd6iMofxNA3s73aqPXfvXB1maNyoKOu__Z4rmYCxK7p0P42mMKdjg671f4ADhTiz1QRxmPu85Lqdi-bOpIAuQ
///复制token

第五十四节  k8s 容器运行时之Kata container学习_vim_31

# 查看pod状态
kubectl get pod -n kubernetes-dashboard

# 查看网络信息
kubectl get pod -n kubernetes-dashboard  -o  wide

# 查看deploy状态
kubectl  get  deploy  -n kubernetes-dashboard

# 查看ep状态
kubectl  get  ep  -n  kubernetes-dashboard

# 查看svc状态
kubectl  get  svc -n  kubernetes-dashboard
【注意网络数据流3次转发,类似LVS转发】

第五十四节  k8s 容器运行时之Kata container学习_vim_32

登录dashboard页面
https://192.168.80.61:30001

第五十四节  k8s 容器运行时之Kata container学习_vim_33

查看ns
kubectl  get  ns

第五十四节  k8s 容器运行时之Kata container学习_vim_34

第五十四节  k8s 容器运行时之Kata container学习_vim_35

5.8 部署1个nginx测试

vim nginx-web.yaml 
------------
kind: Deployment      ////控制器
#apiVersion: extensions/v1beta1    ///已被弃用
apiVersion: apps/v1    【app端】
metadata:
  labels:
    app: nginx-deployment-label
  name: nginx-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-selector
  template:
    metadata:
      labels:
        app: nginx-selector
    spec:
      containers:
      - name: nginx-container
        image: registry.cn-hangzhou.aliyuncs.com/ywflyfish/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https

---------------
kind: Service    【服务端】
apiVersion: v1
metadata:
  labels:
    app: nginx-service-label
  name: nginx-service
  namespace: default
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 31180
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 31443
  selector:
    app: nginx-selector
------------------------

启动web文件
kubectl apply -f nginx-web.yaml

查看服务:
kubectl get pod -A
kubectl get deploy,svc,pod -o wide

第五十四节  k8s 容器运行时之Kata container学习_初始化_36

第五十四节  k8s 容器运行时之Kata container学习_vim_37

浏览器访问:
http://192.168.80.62:31180

第五十四节  k8s 容器运行时之Kata container学习_初始化_38

将nginx单个pod 副本改为3个试试

第五十四节  k8s 容器运行时之Kata container学习_vim_39

kubectl get pod
kubectl get pod -o wide

第五十四节  k8s 容器运行时之Kata container学习_初始化_40

第五十四节  k8s 容器运行时之Kata container学习_vim_41

六、k8s集成kata-container

配置了Kata Container之后,我们就可以在Kubernetes集群中使用Kata Container进行容器管理了。

如上所述,目前containerd中存在两个低层运行时,分别是默认的runC和新接入的Kata Container。

那我们该如何告诉Kubernetes哪些负载需要使用Kata Container呢?

根据不同的版本,Kata 提供了不同的方式:
使用 Kubernetes的 RuntimeClass(推荐)
使用Kubernetes的untrusted workload runtime

6.1 第一种 RuntimeClass

创建RuntimeClass资源对象
上述集成过程中对于Containerd配置既可使用RuntimeClass把
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]中的
kata将被作为RuntimeClass handler关键字。

第五十四节  k8s 容器运行时之Kata container学习_vim_42

创建runtime-kata.yaml文件

vim runtime-kata.yaml
----
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: kata
handler: kata
----

kubectl apply -f runtime-kata.yaml
kubectl get runtimeclass

第五十四节  k8s 容器运行时之Kata container学习_初始化_43

配置一个busybox测试文件

vim busybox.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  runtimeClassName: kata
  containers:
  - name: busybox
    image: registry.cn-hangzhou.aliyuncs.com/ywflyfish/busybox:latest
---

kubectl apply -f busybox.yaml
kubectl get pod
kubectl exec busybox  -- uname -r

第五十四节  k8s 容器运行时之Kata container学习_初始化_44

【版本不匹配报错】
对于有些版本不匹配的情况,需使用untrusted workload runtime的方式

kubectl describe pod busybox
----**遇到pod报错**----
Failed to create pod sandbox: rpc error: code = Unknown desc = 
failed to get sandbox runtime: no runtime for "kata" is configured



需要修改以下文件到对应的node节点,或者直接scp主节点config.toml都其他node节点
vim /etc/containerd/config.toml
# 直接修改 167行
 runtime_type = "io.containerd.kata.v2" ### 这里添加默认容器 运行时

设置完成都要进行重启
systemctl restart containerd

第五十四节  k8s 容器运行时之Kata container学习_配置文件_45

第五十四节  k8s 容器运行时之Kata container学习_配置文件_46

6.2 第二种 直接调用kata模式

vim nginx-web-kata.yaml
---
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: nginx-deployment-kata
  annotations:
    io.kubernetes.cri.untrunsted-workload: "true"
  name: nginx-deployment-kata
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-selector-kata
  template:
    metadata:
      labels:
        app: nginx-selector-kata
    spec:
      runtimeClassName: kata
      containers:
      - name: nginx-container
        image: registry.cn-hangzhou.aliyuncs.com/ywflyfish/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: nginx-service-kata
  name: nginx-service-kata
  namespace: default
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 31280
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 31543
  selector:
    app: nginx-selector
---

kubectl apply -f nginx-web-kata.yaml
kubectl get pod
kubectl exec -it nginx-deployment-kata-67bb5d8c9f-cdh4m -- uname -r

第五十四节  k8s 容器运行时之Kata container学习_vim_47

七、Kata设为默认容器运行时

### 3台机器所有节点都修改,也可以scp同步
vim /etc/containerd/config.toml 

# 直接修改 105行
---
[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
 105   runtime_type = "io.containerd.kata.v2" ### 这里添加默认容器运行时
---

scp config.toml lyc-80-62:/etc/containerd/
scp config.toml lyc-80-63:/etc/containerd/

## 3台机器全部重启containerd
systemctl restart containerd

第五十四节  k8s 容器运行时之Kata container学习_配置文件_48

【再次测试】
# 将刚才的yaml文件删除,把里面的runtimeclass的选择删除
kubectl delete -f nginx-web-kata.yaml

vim nginx-web-kata.yaml
---
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: nginx-deployment-kata
  annotations:
    io.kubernetes.cri.untrunsted-workload: "true"
  name: nginx-deployment-kata
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-selector-kata
  template:
    metadata:
      labels:
        app: nginx-selector-kata
    spec:
      containers:
      - name: nginx-container
        image: registry.cn-hangzhou.aliyuncs.com/ywflyfish/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: nginx-service-kata
  name: nginx-service-kata
  namespace: default
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 31280
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 31543
  selector:
    app: nginx-selector
---

第五十四节  k8s 容器运行时之Kata container学习_vim_49

kubectl apply -f nginx-web-kata.yaml
kubectl get pod -o wide
kubectl describe pod nginx-deployment-kata-66f967fdfc-5d98

第五十四节  k8s 容器运行时之Kata container学习_vim_50

第五十四节  k8s 容器运行时之Kata container学习_初始化_51

kubectl exec -it nginx-deployment-kata-66f967fdfc-5d98w -- uname -r

第五十四节  k8s 容器运行时之Kata container学习_配置文件_52

至此,Kata container实验测试完毕,最新功能请参考官方网站 https://katacontainers.io/ 有任何疑问,可以留言,好人点赞,一生平安!!!ε=(´ο`*´ο`)