k8s是一种可以实现容器集群的自动化部署、自动扩缩容、维护等功能的服务。Docker解决了应用运行时环境的问题,而k8s则可以用来构建大量应用服务,它能方便的管理海量应用容器。它拥有自动包装、自我修复、横向缩放、服务发现、负载均衡、自动部署、升级回滚、存储编排等特性。
Pod是k8s调度的基本单元,它封装了一个或多个容器。Pod中的容器会作为一个整体被k8s调度到一个Node上运行。同一个Pod内的容器可以互相操作对方的文件,这些容器就好像运行在同一个操作系统上的不同进程一样。
一般来说,用户不会直接创建Pod,而是创建控制器来管理Pod,因为控制器能够更细粒度的控制Pod的运行方式,比如副本数量、部署位置等。 控制器包含下面几种:
Service是对一组Pod的抽象,它定义了Pod的逻辑集合以及访问该集合的策略。前面的Deployment等控制器只定义了Pod运行数量和生命周期, 并没有定义如何访问这些Pod,由于Pod重启后IP会发生变化,没有固定IP和端口提供服务。
Service对象就是为了解决这个问题。Service可以自动跟踪并绑定后端控制器管理的多个Pod,即使发生重启、扩容等事件也能自动处理, 同时提供统一IP供前端访问,所以通过Service就可以获得服务发现的能力,部署微服务时就无需单独部署注册中心组件。
Ingress不是一种服务类型,而是一个路由规则集合,通过Ingress规则定义的规则,可以将多个Service组合成一个虚拟服务(如前端页面+后端API)。 它可实现业务网关的作用,类似Nginx的用法,可以实现负载均衡、SSL卸载、流量转发、流量控制等功能。
Storage是Pod中用于存储的抽象,它定义了Pod的存储卷,包括本地存储和网络存储;它的生命周期独立于Pod之外,可进行单独控制。
命名空间(Namespace):k8s通过namespace对同一台物理机上的k8s资源进行逻辑隔离。
标签(Labels):是一种语义化标记,可以附加到Pod、Node等对象之上,然后更高级的对象可以基于标签对它们进行筛选和调用, 例如Service可以将请求只路由到指定标签的Pod,或者Deployment可以将Pod只调度到指定标签的Node。
注解(Annotations):也是键值对数据,但更灵活,它的value允许包含结构化数据。一般用于元数据配置,不用于筛选。 例如Ingress中通过注解为nginx控制器配置禁用ssl重定向。
k8s的安装比较复杂,需要涉及到很多的Linux、网络、存储等设置。为了简单起见,我们先学习使用minikube安装单机的k8s环境,等学习并熟悉了k8s的使用之后,再去搭建k8s的集群环境。
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的官方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/
与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