k8s是一种可以实现容器集群的自动化部署、自动扩缩容、维护等功能的服务。Docker解决了应用运行时环境的问题,而k8s则可以用来构建大量应用服务,它能方便的管理海量应用容器。它拥有自动包装、自我修复、横向缩放、服务发现、负载均衡、自动部署、升级回滚、存储编排等特性。

k8s的节点分为master和node,它的架构如下

Master:官方叫做控制平面(Control Plane),它用于负责整个集群的管控。master由4个部分组成

  1. API Server进程,负责任何资源的管理和操作
  2. etcd,用于保存集群状态,只有apiServer可以读写
  3. 调度器(Scheduler),用于调度Pod资源
  4. 控制器管理器(kube-controller-manager)

Node:数据平面,是实际的工作节点,直接负责对容器的资源控制。node由3个部分组成

  1. kubelet,运行在每个节点上面的代理进程
  2. kube-proxy,负责每个节点的网络服务
  3. 容器运行时,例如docker

k8s还定义了一些内核抽象

1. Pod

Pod是k8s调度的基本单元,它封装了一个或多个容器。Pod中的容器会作为一个整体被k8s调度到一个Node上运行。同一个Pod内的容器可以互相操作对方的文件,这些容器就好像运行在同一个操作系统上的不同进程一样。

2. 控制器

一般来说,用户不会直接创建Pod,而是创建控制器来管理Pod,因为控制器能够更细粒度的控制Pod的运行方式,比如副本数量、部署位置等。 控制器包含下面几种:

  • Replication控制器(以及ReplicaSet控制器):负责保证Pod副本数量符合预期(涉及对Pod的启动、停止等操作)
  • Deployment控制器:是高于Replication控制器的对象,也是最常用的控制器,用于管理Pod的发布、更新、回滚等
  • StatefulSet控制器:与Deployment同级,提供排序和唯一性保证的特殊Pod控制器。用于管理有状态服务,比如数据库等
  • DaemonSet控制器:与Deployment同级,用于在集群中的每个Node上运行单个Pod,多用于日志收集和转发、监控等功能的服务。并且它可以绕过常规Pod无法调度到Master运行的限制
  • Job控制器:与Deployment同级,用于管理一次性任务,比如批处理任务
  • CronJob控制器:与Deployment同级,在Job控制器基础上增加了时间调度,用于执行定时任务

3. Service、Ingress和Storage

Service是对一组Pod的抽象,它定义了Pod的逻辑集合以及访问该集合的策略。前面的Deployment等控制器只定义了Pod运行数量和生命周期, 并没有定义如何访问这些Pod,由于Pod重启后IP会发生变化,没有固定IP和端口提供服务。
Service对象就是为了解决这个问题。Service可以自动跟踪并绑定后端控制器管理的多个Pod,即使发生重启、扩容等事件也能自动处理, 同时提供统一IP供前端访问,所以通过Service就可以获得服务发现的能力,部署微服务时就无需单独部署注册中心组件。
Ingress不是一种服务类型,而是一个路由规则集合,通过Ingress规则定义的规则,可以将多个Service组合成一个虚拟服务(如前端页面+后端API)。 它可实现业务网关的作用,类似Nginx的用法,可以实现负载均衡、SSL卸载、流量转发、流量控制等功能。
Storage是Pod中用于存储的抽象,它定义了Pod的存储卷,包括本地存储和网络存储;它的生命周期独立于Pod之外,可进行单独控制。

4. 资源划分

命名空间(Namespace):k8s通过namespace对同一台物理机上的k8s资源进行逻辑隔离。
标签(Labels):是一种语义化标记,可以附加到Pod、Node等对象之上,然后更高级的对象可以基于标签对它们进行筛选和调用, 例如Service可以将请求只路由到指定标签的Pod,或者Deployment可以将Pod只调度到指定标签的Node。
注解(Annotations):也是键值对数据,但更灵活,它的value允许包含结构化数据。一般用于元数据配置,不用于筛选。 例如Ingress中通过注解为nginx控制器配置禁用ssl重定向。

k8s的安装

k8s的安装比较复杂,需要涉及到很多的Linux、网络、存储等设置。为了简单起见,我们先学习使用minikube安装单机的k8s环境,等学习并熟悉了k8s的使用之后,再去搭建k8s的集群环境。

安装kubectl

kubectl是k8s的客户端,我们可以通过它和k8s的服务进行交互,我们直接从k8s的官网上下载它并将其安装到/usr/local/bin目录下

# 下载kubectl客户端,这里使用了代理curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" -x http://192.168.65.100:7890# 将kubectl客户端安装到指定的bin目录下sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

为了方便后面的使用,可以将kc设置为kubectl的别名,将如下配置添加到~/.zshrc文件中

alias kc="kubectl"

之后我们就可以查看kubectl的版本了

~ kc version --client --output=json{    "clientVersion": {        "major": "1",        "minor": "29",        "gitVersion": "v1.29.0",        "gitCommit": "3f7a50f38688eb332e2a1b013678c6435d539ae6",        "gitTreeState": "clean",        "buildDate": "2023-12-13T08:51:44Z",        "goVersion": "go1.21.5",        "compiler": "gc",        "platform": "linux/amd64"    },    "kustomizeVersion": "v5.0.4-0.20230601165947-6ce0bf390ce3"}

安装Docker

Docker的安装参考了官方文档,具体步骤如下

添加Docker的官方GPG秘钥

sudo apt-get updatesudo apt-get install ca-certificates curl gnupgsudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgsudo chmod a+r /etc/apt/keyrings/docker.gpg

把仓库添加到apt的资源列表中

echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get update

安装相关的程序并进行权限设置

# 安装程序sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 设置文件权限,并把当前用户添加到docker组中sudo chmod 666 /var/run/docker.socksudo usermod -aG docker $USER

安装好了Docker并设置完权限之后,可以执行Docker的hello-world查看是否安装成功了

docker run hello-world

安装成功的输出如下

Hello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:    1. The Docker client contacted the Docker daemon.    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.        (amd64)    3. The Docker daemon created a new container from that image which runs the        executable that produces the output you are currently reading.    4. The Docker daemon streamed that output to the Docker client, which sent it        to your terminal.To try something more ambitious, you can run an Ubuntu container with:    $ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:    https://hub.docker.com/For more examples and ideas, visit:    https://docs.docker.com/get-started/

安装minikube

与kubectl的安装类似,我们还是使用下载并安装的方式安装minikube

# 下载curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64# 安装到指定目录下面sudo install minikube-linux-amd64 /usr/local/bin/minikube

安装之后,我们就可以启动minikube了。因为网络原因,直接使用minikube start命令有的时候无法正常启动,因此我们可以使用代理

~ minikube start http_proxy=http://192.168.65.100:7890 https_proxy=http://192.168.65.100:7890😄  minikube v1.32.0 on Ubuntu 22.04✨  Using the docker driver based on existing profile👍  Starting control plane node minikube in cluster minikube🚜  Pulling base image ...🔄  Restarting existing docker container for "minikube" ...🐳  Preparing Kubernetes v1.28.3 on Docker 24.0.7 ...🔗  Configuring bridge CNI (Container Networking Interface) ...🔎  Verifying Kubernetes components...    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5🌟  Enabled addons: default-storageclass, storage-provisioner🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

看到以上内容,则说明k8s已经启动好了。接下来我们就可以使用kubectl来管理k8s了

查看版本信息

~ kc versionClient Version: v1.29.0Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3Server Version: v1.28.3

查看k8s集群信息

~ kc cluster-infoKubernetes control plane is running at https://192.168.49.2:8443CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

查看节点信息

~ kc get nodesNAME       STATUS   ROLES           AGE     VERSIONminikube   Ready    control-plane   4h48m   v1.28.3

参考

Kubernetes 安装小记
Kubernetes 使用小记
Kubernetes 基础教程
Docker 入门教程