Kubernetes

2023-07-31 10:25:07 Docker /

Docker 是一种开源平台,一种快速构建、运行和管理应用的工具。它使用容器化技术,使得应用程序及其依赖性可以打包到一个容器中,并在任何支持 Docker 的环境中运行。
1 MobarXterm 通过 SSH 连接 linux虚拟机,操作虚拟机上的 Docker。
2 Windows本地:通过wsl安装Linux发行版本,安装docker desktop(将自动在WSL中配置Docker环境,借助linux内核运行)

容器(Container)

  • 容器是一个轻量级的、可移植的、自包含的单元,包括应用程序和其所有依赖项。
  • Docker 利用容器技术,将应用程序及其依赖项打包成一个容器,确保在不同环境中的一致性运行。
  • Docker 位于容器 和 服务器-操作系统/硬件 之间,是运行容器的引擎。
  • 隔离网络、文件、进程等环境。一个容器是一个沙盒隔离环境。
  • 相对于虚拟机技术,docker 启动更快、更清量。但容器共用宿主机的内存、CPU物理资源,多容器可能存在互相抢占资源的情况。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    docker run -d \                  # 创建并运行一个容器,-d 是让容器在后台运行;同一个镜像可创建多个容器
    --name mysgl \ # 给容器起名字,必须唯一
    -p 3306:3306 \ # 设置 宿主机端口:容器端口 映射
    -e TZ=Asia/Shanghai \ # 设置环境变量
    -e MYSQL_ROOT_PASSWORD=123 \ # 指定运行的镜像名,一般为 [镜像名]:[镜像版本]
    mysql
    docker ps # 查看本地容器(运行中的)
    docker ps a # 查看所有容器 (包括未运行)
    docker start <容器ID> # 启动容器
    docker stop <容器ID> # 停止容器中的进程,容器未删除
    docker rm <容器ID> # 删除容器
    docker inspect <容器ID> # 查看容器配置信息
    docker log <容器ID> # 查看容器日志
    docker exec -it <容器ID> bash # 进入容器内部,命令行模式(容器内部模拟出一个操作系统)
    容器打包成镜像: docker commit -a "作者信息" -m "log信息" <容器ID><目标镜像名称:tag版本>
    拷贝文件到容器: docker cp <文件目录> <容器ID>:<目标目录>
    拷贝容器文件到宿主机:docker cp <容器ID>:<文件目录><宿主机目标目录>
    更新容器设置:docker update <容器ID><相关设置>

镜像(Image)

  • 镜像是一个只读的模板,包含运行应用程序所需的所有信息,包括代码、运行时、库、环境变量和配置文件。
  • 容器是通过运行镜像创建的(像光盘),本地容器是真正运行的实例。镜像是容器的模板,是从容器打包来的,可以在不同操作系统,不同服务器之间传播。
  • 1
    2
    3
    4
    5
    6
    7
    docker images                                # 查看本地镜像
    docker search <名称关键字> # 搜索镜像仓库
    docker pull <镜像名:tag版本> # 下载镜像
    docker push <镜像名:tag版本> # 上传镜像
    docker rmi <镜像名:tag版本> # 删除镜像
    docker save -o <输出文件路径><镜像名:tag版本> # 打包本地镜像文件
    docker load -i <加载文件路径 # 导入本地镜像文件

仓库(Registry)

  • 仓库是存储和组织 Docker 镜像的地方。Docker Hub 是一个常见的公共仓库,你也可以搭建私有仓库。
  • Docker 镜像可以从仓库中拉取,也可以推送到仓库。

沙箱

  • 沙箱是一种安全机制,用于隔离和限制程序或应用程序的运行环境,以防止其对系统或其他程序产生潜在的危害。沙箱技术旨在创建一个受控制的环境,使得运行在其中的代码无法直接影响到系统的其他部分。这种隔离有助于确保安全性、防止恶意软件传播,同时提供一定程度的控制和监控。
  • 容器化平台(如 Docker)使用沙箱技术来隔离容器中的应用程序,确保它们互相独立运行。

容器创建

镜像结构:入口,层,基础镜像。分层的好处是可复用,,

  • 通过命令直接创建,需要完整镜像,几个G常有,稳定。
  • 通过dockerfile创建,不需要完整镜像,更灵活。
    Dockerfile 是一个包含构建镜像步骤的文本文件,包含一个个的指令。通过编写 Dockerfile,你可以定义如何构建镜像,包括基础镜像、安装依赖、复制文件等步骤。
  • 使用 Docker 的基本步骤
    1. 安装 Docker: 根据操作系统的不同,安装适合的 Docker 版本。
    2. 创建 Dockerfile: 编写包含应用程序构建步骤的 Dockerfile。
    3. 构建镜像: 在包含 Dockerfile 的目录中运行 docker build 命令构建镜像。(如java项目还需要jar包)
    4. 运行容器: 使用 docker run 命令基于构建的镜像创建和运行容器。
    5. 发布镜像: 将构建的镜像推送到 Docker 仓库,以便其他人可以拉取使用。

数据卷

  • 数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁(两边文件同时修改)。
    (容器一般只包括支持运行的最少文件,一般无vi或其他编辑器,所以无法进入容器直接对容器中的文件进行修改)
  • 如何挂载数据卷?在创建容器时,利用-v 数据卷名:容器内目录完成挂载。创建时如果发现挂载的数据卷不存在,会自动创建。
    1
    2
    3
    4
    docker volumels        # 查看数据卷
    docker volume rm # 删除数据卷
    docker volume inspect # 查看数据卷详情
    docker volume prune # 删除未使用的数据卷

容器编排(Orchestration):运维人员

容器编排是指在生产环境中管理和协调多个容器的过程。Docker 提供了 Docker Compose 工具,用于定义和运行多容器的应用。


Kubernetes

1. 什么是Kubernetes

Kubernetes是一个开源的容器编排引擎,可以用来管理容器化的应用,包括容器的自动化的部署、扩容、缩容、升级、回滚等等;
它是Google在2014年开源的一个项目,它的前身是Google内部的Borg系统。

Kubernetes出现之前,我们一般都是使用Docker来管理容器化的应用,但是Docker只是一个单机的容器管理工具,它只能管理单个节点上的容器,当我们的应用程序需要运行在多个节点上的时候,就需要使用一些其他的工具来管理这些节点,比如Docker Swarm、Mesos、Kubernetes等等;
这些工具都是容器编排引擎,它们可以用来管理多个节点上的容器,但是它们之间也有一些区别,比如Docker Swarm是Docker官方提供的一个容器编排引擎,它的功能比较简单,适合于一些小型的、简单的场景,而Mesos和Kubernetes则是比较复杂的容器编排引擎;
Mesos是Apache基金会的一个开源项目,而Kubernetes是Google在2014年开源的,目前已经成为了CNCF(Cloud Native Computing Foundation)的一个顶级项目,基本上已经成为了容器编排引擎的事实标准了。

2.1 Kubernetes 资源对象

Node:k8s集群节点,可以是物理机/虚拟机
Pod:k8s最小调度单元,容器(运行app/数据库/..镜像)的抽象,可以是一/多个容器的组合,但除非高度耦合,一个pod只运行一个容器
Service:将一组pod封装成一个服务并且提供统一访问入口(解决了一组数据库pod中一个重建后ip变化的问题,类似于“服务发现”)
Ingress:为了对外提供服务,将外部请求路由转发到内部集群的service上

ConfigMap:封装配置信息
Secret:封装敏感信息
其他安全机制:网络安全,访问控制,身份认证
Volumn:将数据挂在到本地磁盘或远程存储上,实现持久化存储

Deployment:部署无状态应用程序,将一/多个Pod组合到一起;冗余备份,相当于对Pod的抽象;具有副本控制、滚动更新、自动扩缩容等功能,实现应用程序的高可用
Statefulset:部署有状态应用程序,如DB、MQ、缓存以及保留会话状态的应用程序

2.2 Kubernetes 架构

分为Master和Worker节点
apiserver:位于master节点上,是k8s集群的API接口;交互方式包括 kubectl 命令行、Dashboard界面或API接口

3. 使用minikube搭建kubernetes集群环境

minikube是一个轻量级的kubernetes集群环境,可以用来在本地快速搭建一个单节点的kubernetes集群;
https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/ 你好,Minikube

4. 使用Multipassk3s搭建kubernetes集群环境

minikube只能用来在本地搭建一个单节点的kubernetes集群环境,
下面介绍如何使用Multipassk3s来搭建一个多节点的kubernetes集群环境,

5. 在线实验环境

Killercoda Play-With-K8s

6. kubectl常用命令

6.1 基础使用

1
2
3
4
5
6
7
8
# 查看帮助
kubectl --help

# 查看API版本
kubectl api-versions

# 查看集群信息
kubectl cluster-info

6.2 资源的创建和运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建并运行一个指定的镜像
kubectl run NAME --image=image [params...]
# e.g. 创建并运行一个名字为nginx的Pod
kubectl run nginx --image=nginx

# 根据YAML配置文件或者标准输入创建资源
kubectl create RESOURCE
# e.g.
# 根据nginx.yaml配置文件创建资源
kubectl create -f nginx.yaml
# 根据URL创建资源
kubectl create -f https://k8s.io/examples/application/deployment.yaml
# 根据目录下的所有配置文件创建资源
kubectl create -f ./dir

# 通过文件名或标准输入配置资源
kubectl apply -f (-k DIRECTORY | -f FILENAME | stdin)
# e.g.
# 根据nginx.yaml配置文件创建资源
kubectl apply -f nginx.yaml

6.3 查看资源信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看集群中某一类型的资源
kubectl get RESOURCE
# 其中,RESOURCE可以是以下类型:
kubectl get pods / po # 查看Pod
kubectl get svc # 查看Service
kubectl get deploy # 查看Deployment
kubectl get rs # 查看ReplicaSet
kubectl get cm # 查看ConfigMap
kubectl get secret # 查看Secret
kubectl get ing # 查看Ingress
kubectl get pv # 查看PersistentVolume
kubectl get pvc # 查看PersistentVolumeClaim
kubectl get ns # 查看Namespace
kubectl get node # 查看Node
kubectl get all # 查看所有资源

# 后面还可以加上 -o wide 参数来查看更多信息
kubectl get pods -o wide

# 查看某一类型资源的详细信息
kubectl describe RESOURCE NAME
# e.g. 查看名字为nginx的Pod的详细信息
kubectl describe pod nginx

6.4 资源的修改、删除和清理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 更新某个资源的标签
kubectl label RESOURCE NAME KEY_1=VALUE_1 ... KEY_N=VALUE_N
# e.g. 更新名字为nginx的Pod的标签
kubectl label pod nginx app=nginx

# 删除某个资源
kubectl delete RESOURCE NAME
# e.g. 删除名字为nginx的Pod
kubectl delete pod nginx

# 删除某个资源的所有实例
kubectl delete RESOURCE --all
# e.g. 删除所有Pod
kubectl delete pod --all

# 根据YAML配置文件删除资源
kubectl delete -f FILENAME
# e.g. 根据nginx.yaml配置文件删除资源
kubectl delete -f nginx.yaml

# 设置某个资源的副本数
kubectl scale --replicas=COUNT RESOURCE NAME
# e.g. 设置名字为nginx的Deployment的副本数为3
kubectl scale --replicas=3 deployment/nginx

# 根据配置文件或者标准输入替换某个资源
kubectl replace -f FILENAME
# e.g. 根据nginx.yaml配置文件替换名字为nginx的Deployment
kubectl replace -f nginx.yaml

6.5 调试和交互

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 进入某个Pod的容器中
kubectl exec [-it] POD [-c CONTAINER] -- COMMAND [args...]
# e.g. 进入名字为nginx的Pod的容器中,并执行/bin/bash命令
kubectl exec -it nginx -- /bin/bash

# 查看某个Pod的日志
kubectl logs [-f] [-p] [-c CONTAINER] POD [-n NAMESPACE]
# e.g. 查看名字为nginx的Pod的日志
kubectl logs nginx

# 将某个Pod的端口转发到本地
kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]
# e.g. 将名字为nginx的Pod的80端口转发到本地的8080端口
kubectl port-forward nginx 8080:80

# 连接到现有的某个Pod(将某个Pod的标准输入输出转发到本地)
kubectl attach POD -c CONTAINER
# e.g. 将名字为nginx的Pod的标准输入输出转发到本地
kubectl attach nginx

# 运行某个Pod的命令
kubectl run NAME --image=image -- COMMAND [args...]
# e.g. 运行名字为nginx的Pod
kubectl run nginx --image=nginx -- /bin/bash

7. Portainer的安装和使用

Portainer 是一个轻量级的容器管理工具,可以用来管理Docker和Kubernetes,它提供了一个Web界面来方便我们管理容器
官方网址: https://www.portainer.io/

8. Helm的安装和使用

Helm 是一个Kubernetes的包管理工具,可以用来管理Kubernetes的应用,它提供了一个命令行工具来方便我们管理Kubernetes的应用
官方网址: https://helm.sh/

集群存储

https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/