基础概念

# 1、容器生态系统 - 容器运行时(runtime):是运行和管理容器进程、镜像的工具。 - docker、containerd、kata container、CRl-O等。有些只有容器运行的功能,有些除运行容器外还提供了容器镜像的管理功能。根据容器运行时提供功能 - 可以将容器运行时分为低层运行时和高层运行时: - 低层运行时主要负责与宿主机操作系统打交道,根据指定的容器镜像在宿主机上运行容器的进程,并对容器的整个生命周期进行管理。常见的低层运行时种类有: . runc (docker)、runv (kata container)、runsc: runc + safety (gVisor) - 高层运行时主要负责镜像的管理、转化等工作,为容器的运行做前提准备。如containerd和CRI-O。 - 容器运行时一般先由高层运行时将容器镜像下载下来,并解压转换为容器运行需要的操作系统文件,再由低层运行时启动和管理容器。 ![1.png](https://cos.easydoc.net/36024082/files/ludp2lxa.png) **Kubenetes运转过程:** ::: hljs-center ![2.png](https://cos.easydoc.net/36024082/files/ludp2fjm.png) ::: # 2、Kubenetes(K8s) - 是一个开源的容器编排平台,可帮助自动化容器部署、扩展和管理 - 节点(Node):主机或服务器 - Pods(最小执行单元):包含一个或多个容器(Container) - 集群(Cluster):主节点和工作节点 ![3 1.png](https://cos.easydoc.net/36024082/files/ludp40t0.png) ![4.png](https://cos.easydoc.net/36024082/files/ludp1sw7.png) **任何符合CRI标准实现的容器运行时都可以被 Kubernetes 所使用** ![image.png](https://cos.easydoc.net/36024082/files/ludorlsn.png) **实现方式:** ``` Minikube + docker + kata containers Minikube + containerd + kata containers 或 Kubeadm + docker + kata containers (需多台主机) Kubeadm + containerd + kata containers (需多台主机) ``` **部署集群** **用命令创建pod:** ``` kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 ·用pod文件创建pod: Kubectl apply -f pod.yaml Kubectl get pod Pod.yaml文件: apiVersion: v1 kind: Pod metadata: name: test-pod spec: # 定义容器,可以多个 containers: - name: test-k8s # 容器名字 image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像 ``` ![image.png](https://cos.easydoc.net/36024082/files/ludosjmo.png) **用deployment文件创建pod:** ``` Kubectl apply -f deployment.yaml Kubectl get deployment Kubectl get pod -o wide deployment.yaml: apiVersion: apps/v1 kind: Deployment metadata: # 部署名字 name: test-k8s spec: replicas: 2 # 用来查找关联的 Pod,所有标签都匹配才行 selector: matchLabels: app: test-k8s # 定义 Pod 相关数据 template: metadata: labels: app: test-k8s spec: # 定义容器,可以多个 containers: - name: test-k8s # 容器名字 image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像 ``` ![image.png](https://cos.easydoc.net/36024082/files/ludosqkb.png) ![image.png](https://cos.easydoc.net/36024082/files/ludosudh.png) **查看pod具体信息和日志:** ``` Kubectl describe pod pod_name Kubectl logs pod_name ·进入pod的container里面: Kubectl exec -it pod_name (-c container_name) -- bash ·更改pod数量: Kubectl scale deployment deployment_name --replicas-10 ·映射端口号: Kubectl port-forward pod_name 8080:8080 ·删除pod: kubectl delete pod <pod_name> kubectl delete pod --all ·删除deployment: kubectl delete deployment <deployment_name> kubectl delete deployment --all ``` **配置service:** ``` Service: service.yaml: apiVersion: v1 kind: Service metadata: name: test-k8s spec: selector: app: test-k8s type: ClusterIP ports: - port: 8080 # 本 Service 的端口 targetPort: 8080 # 容器端口 kubectl apply -f service.yaml kubectl get svc service_name ``` # 3、Minikube - 可以在本地模拟一个单节点的Kubenetes集群 - 链接:minikube start | minikube (k8s.io) - 安装: ``` Windows版: Powershell输入: New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' -UseBasicParsing 然后添加minikube.exe到path: $oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) if ($oldPath.Split(';') -inotcontains 'C:\minikube'){ [Environment]::SetEnvironmentVariable('Path', $('{0};C:\minikube' -f $oldPath), [EnvironmentVariableTarget]::Machine) } ``` ``` Linux版 安装kubectl: Curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl 查看kubectl版本: kubectl version 安装minikube: curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.13.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ 启动minikube: Minikube start ``` **常用命令:** ``` minikube start 启动集群 minikube start --kubernetes-version=latest 更新集群 minikube stop 停止集群 minikube delete 删除集群 minikube dashboard 访问控制面板 ``` # 4、Kata Containers - 是一个容器运行时(runtime),旨在提供容器更强的隔离性的同时仍然支持容器的性能和效率。快如容器,稳似虚机。 - 容器的缺点:容器与宿主机共享内核,可能会引发严重的安全漏洞问题。 - 通过Kata Containers让每个容器/pod采用其单独的内核,运行在一个轻量级的虚拟机中。由于每个容器/pod都运行在专属虚拟机中,恶意代码无法再利用共享内核来访问邻近的容器。 ![5.png](https://cos.easydoc.net/36024082/files/ludp14qz.png) ``` 安装方式(Linux):需开启嵌套虚拟化 下载: wget https://github.com/kata-containers/kata-containers/releases/download/3.2.0/kata-static-3.2.0-amd64.tar.xz 解压: tar xf kata-static-3.2.0-amd64.tar.xz 移动文件: sudo mv opt/kata /opt 创建文件夹: sudo mkdir /etc/kata-containers 移动文件: sudo cp /opt/kata/share/defaults/kata-containers/configuration.toml /etc/kata-containers/configuration.toml 创建软链接: sudo ln -sf /opt/kata/bin/containerd-shim-kata-v2 /usr/local/bin/containerd-shim-kata-v2 sudo ln -sf /opt/kata/bin/kata-runtime /usr/local/bin/kata-runtime sudo ln -sf /opt/kata/bin/kata-monitor /usr/local/bin/kata-monitor 解决VNW冲突问题: sudo cat > /etc/modprobe.d/blacklist-vmware.conf << EOF blacklist vmw_vsock_virtio_transport_common blacklist vmw_vsock_vmci_transport EOF 重启: init 6 或 sudo reboot 测试是否安装成功: kata-runtime check --no-network-checks 启动br_netfilter: sudo modprobe br_netfilter ``` ``` 与docker结合:修改docker的默认运行时 docker的默认运行时为runc 进入docker配置文件: sudo vim /etc/docker/daemon.json 写入: "runtimes": { "kata-runtime": { "path": "/usr/local/bin/kata-runtime" } }, "default-runtime": "kata-runtime" ``` ![image.png](https://cos.easydoc.net/36024082/files/ludou1bb.png) ``` 重启docker: sudo systemctl restart docker 检查是否成功: docker info | grep "Default Runtime" ``` ![image.png](https://cos.easydoc.net/36024082/files/ludoul79.png) # 5、Docker - Docker可以将应用程序及其依赖项打包成轻量级、可移植的容器。每个容器都是一个独立的运行环境,其中包含了应用程序所需的所有文件、库和配置,可以在不同的环境中快速部署、交付和扩展应用程序。 - Docker 运行一个容器是通过 Docker 守护程序、containerd 和 runc 来运行它。 ![image.png](https://cos.easydoc.net/36024082/files/ludouyuv.png) **安装(Linux):** ``` curl -fsSL https://test.docker.com -o test-docker.sh sudo sh test-docker.sh ``` **常用命令:** ``` systemctl start docker 启动docker systemctl stop docker 停止docker systemctl restart docker 重启docker systemctl status docker 查看docker状态 systemctl enable docker 开机自启动 docker version 查看docker版本 docker info 查看docker详细信息 docker –help 查看docker命令 docker images 查看docker镜像 docker pull image_name 从Docker Hub上下载镜像 docker rmi -f hello-world 从Docker中强制删除hello-world镜像 docker run image 根据镜像新建并启动容器 docker ps 列出当前所有正在运行的容器 docker start container 启动容器 docker restart container 重新启动容器 docker stop container 停止容器 docker kill container 强制停止容器 docker rm -f container 强制删除容器 docker exec container 进到容器内 ``` ![image.png](https://cos.easydoc.net/36024082/files/ludov80j.png) # 6、Containerd - containerd 提供一个简单、可靠的容器运行时环境,支持多种容器格式和运行时,可以与不同的容器编排平台和工具集成。 - containerd 与 docker 的关系是:docker 项目包括了多个组件,其中包括一个完整的容器引擎,该引擎基于 libcontainer 实现了容器运行时、镜像构建和管理、网络管理等功能。而 containerd 则是 docker 容器引擎中的核心组件,主要负责容器的生命周期管理(如创建、启动、停止和销毁容器等),还支持 CRI 规范,使得 Kubernetes 容器编排平台可以通过 CRI 接口与 containerd 进行交互。 - containerd相当于轻量化的docker **基本命令:** ``` ctr images list 列出所有镜像 ctr images pull <image> 拉取指定镜像 ctr images remove <image> 删除指定镜像 ctr containers list 列出所有容器 ctr container start <container> 启动指定容器 ctr container stop <container> 停止指定容器 ctr container delete <container> 删除指定容器 ```