Kubernetes 的安装和使用(一)
目录
Kubernetes 的安装和使用(一)
Kubernetes 的安装和使用(二)
Kubernetes 的安装和使用(三)
k8s 的介绍
k8s 是一种可以实现容器集群的自动化部署、自动扩缩容、维护等功能的服务。Docker 解决了应用运行时环境的问题,而 k8s 则可以用来构建大量应用服务,它能方便的管理海量应用容器。它拥有自动包装、自我修复、横向缩放、服务发现、负载均衡、自动部署、升级回滚、存储编排等特性。
k8s 的节点分为 master 和 node,它的架构如下
Master:官方叫做控制平面(Control Plane),它用于负责整个集群的管控。master 由 4 个部分组成
- API Server 进程,负责任何资源的管理和操作
- etcd,用于保存集群状态,只有 apiServer 可以读写
- 调度器(Scheduler),用于调度 Pod 资源
- 控制器管理器(kube-controller-manager)
Node:数据平面,是实际的工作节点,直接负责对容器的资源控制。node 由 3 个部分组成
- kubelet,运行在每个节点上面的代理进程
- kube-proxy,负责每个节点的网络服务
- 容器运行时,例如 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 update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo 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/null
sudo 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.sock
sudo 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 bash
Share 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 version
Client Version: v1.29.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3
查看 k8s 集群信息
~ kc cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
查看节点信息
~ kc get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 4h48m v1.28.3