Kubernetes
Kubernetes
基本介绍
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。
功能
以下是 Kubernetes 的一些主要功能:
- 自动化部署和扩展:
- Kubernetes 允许您定义应用程序的部署规范,包括容器镜像、副本数量和资源限制等。然后,Kubernetes 可以根据定义的规范自动部署和扩展应用程序,以满足应用程序的需求和负载变化。
- 服务发现和负载均衡:
- Kubernetes 提供了内置的服务发现机制,允许容器之间通过 DNS 名称进行通信,而无需关心容器的具体 IP 地址。此外,Kubernetes 还支持负载均衡,可以将流量分发到多个副本实例。
- 自动容错和自愈:
- Kubernetes 监控集群中的容器和节点,并在容器失败或节点不可用时进行自动恢复。它可以自动替换失败的容器实例,并在节点发生故障时重新调度容器。
- 存储编排:
- Kubernetes 提供了存储卷(Volumes)和存储卷声明(PersistentVolumeClaims)的概念,允许容器挂载持久化存储,并通过存储类(StorageClass)动态地管理存储资源。
- 自动伸缩:
- Kubernetes 支持水平自动伸缩,可以根据应用程序的负载自动增加或减少副本数量。您可以定义自动伸缩的规则和阈值,以满足应用程序的性能和可用性要求。
- 密钥和配置管理:
- Kubernetes 提供了 Secrets 和 ConfigMaps 等机制,用于安全地存储和管理敏感信息和配置数据,并将它们注入到容器中。
- 批处理和定时任务:
- Kubernetes 支持批处理作业(Jobs)和定时任务(CronJobs),允许您在集群中运行周期性任务或一次性任务。
- 多环境支持:
- Kubernetes 允许您在多个环境(如开发、测试和生产)中轻松部署和管理应用程序,通过使用命名空间和环境变量等功能来隔离不同环境的资源。
这些是 Kubernetes 的一些主要功能,它们使得在容器化环境中部署、运行和管理应用程序变得更加简单、高效和可靠。
组件介绍
下图为k8s架构图
以下是 Kubernetes 的主要组件及其功能介绍:
- kube-apiserver:
- Kubernetes API 的前端服务,负责提供集群管理的 REST API。
- 处理对 API 对象的创建、修改、删除等操作。
- kube-controller-manager:
- 包含多个控制器,用于监控集群状态并进行自动化操作。
- 例如 Node 控制器、Replication 控制器、Endpoint 控制器等。
- 监控集群状态的变化,并根据预定义的期望状态进行调整和修复。
- kube-scheduler:
- 负责将 Pod 调度到集群中的节点上。
- 根据 Pod 的资源需求、亲和性和防亲和性等策略选择合适的节点进行调度。
- kubelet:
- 运行在每个节点上的代理,负责管理本地节点上的容器。
- 接收来自 kube-apiserver 的 Pod 规范,并确保节点上的容器按照规范运行。
- kube-proxy:
- 在每个节点上运行的网络代理,负责管理集群中的网络流量。
- 提供服务发现和负载均衡功能,实现服务间的通信和网络访问。
- etcd:
- 分布式键值存储系统,用于存储 Kubernetes 集群的所有配置信息和状态数据。
- 作为 Kubernetes 的数据存储后端,提供高可用性和一致性的数据存储服务。
- Container Runtime:
- 负责运行容器的软件组件,常用的容器运行时包括 Docker、containerd、CRI-O 等。
- Kubernetes 通过 CRI(Container Runtime Interface)与容器运行时进行交互。
除了上述核心组件之外,Kubernetes 还包括一些附加的组件,如:
- DNS 服务:用于为集群中的服务提供域名解析。
- Dashboard:提供图形化界面,用于监控和管理 Kubernetes 集群。
- Ingress Controller:提供 HTTP 和 HTTPS 路由功能,用于将外部流量路由到集群内部的服务。
- 日志和监控工具:如 Prometheus、Grafana 等,用于收集、存储和可视化集群的日志和监控数据。
这些组件共同协作,构成了 Kubernetes 的完整生态系统,为用户提供了高效、弹性和可扩展的容器化平台。
主要对象
在 Kubernetes 中,主要的对象包括:
- Pod(容器组):Pod 是 Kubernetes 中最小的调度单位,它可以包含一个或多个紧密关联的容器,并共享相同的网络命名空间、存储卷等资源。Pod 被用来运行应用程序的实例。Pod是k8s中最小的单元。它由一组、一个或者多个容器组成,每个Pod中包含一个Pause容器,
Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。 - Service(服务):Service 定义了一组相同功能的 Pod 的访问方式,提供了一个稳定的网络端点,用于与应用程序交互。Service 可以通过标签选择器来选择要路由的 Pod,并提供负载均衡功能。
- Endpoints (端点集合):对象包含了一个或多个地址(IP 地址)和端口的列表,这些地址和端口是 Service 要代理的后端 Pod 的信息。当 Service 接收到请求时,它会根据 Endpoints 中的地址和端口信息将请求转发给相应的后端 Pod。
- Namespace(命名空间):Namespace 是 Kubernetes 中用来划分资源的一种方式,它提供了一种逻辑上的隔离机制,可以将集群中的资源划分为多个逻辑单元,不同的命名空间之间相互隔离。
- Deployment(部署):Deployment 定义了应用程序的部署策略,包括副本数量、更新策略等,并负责创建和管理 Pod 的副本集,以确保应用程序的稳定运行。
- ReplicaSet(副本集):ReplicaSet 是 Deployment 的一部分,用于创建和管理一组相同的 Pod 的副本,并确保它们的数量与期望的副本数量保持一致。
- StatefulSet(有状态服务集):StatefulSet 类似于 ReplicaSet,但用于部署有状态的应用程序,它可以确保每个 Pod 的标识符和网络标识符在重启和迁移时保持不变。
- ConfigMap(配置映射):ConfigMap 用于存储应用程序的配置信息,如环境变量、配置文件等,可以通过卷挂载或环境变量的方式注入到 Pod 中。
- Secret(密钥):Secret 用于存储敏感信息,如密码、证书等,可以安全地存储和管理这些信息,并将其注入到 Pod 中。
- PersistentVolume(持久化卷):PersistentVolume 是 Kubernetes 中用于存储数据的抽象层,它可以独立于 Pod 存在,并提供持久化的存储功能,以保证数据的持久性和可靠性。
- PersistentVolumeClaim(持久化卷声明):PersistentVolumeClaim 用于声明对持久化卷的需求,定义了 Pod 对存储资源的需求和要求,并负责与 PersistentVolume 进行动态绑定。
这些对象构成了 Kubernetes 中的核心组件,通过它们可以管理和运行容器化应用程序,并提供强大的资源管理和调度功能。
常用kubectl命令
kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互和管理。通过 kubectl 可以执行各种操作,包括创建、删除、管理 Kubernetes 资源对象,以及查看集群状态、调试应用程序等。以下是一些常用的 kubectl 命令:
- kubectl create:创建资源对象,如 Pod、Service、Deployment 等。
- 示例:
kubectl create deployment my-deployment --image=my-image –-replicas=1
- 示例:
- kubectl apply:根据配置文件创建或更新资源对象。
- 示例:
kubectl apply -f my-manifest.yaml
- 示例:
- kubectl get:获取资源对象的信息。
- 示例:
kubectl get pods
- 示例:
- kubectl describe:获取资源对象的详细信息。
- 示例:
kubectl describe pod my-pod
- 示例:
- kubectl logs:获取容器的日志信息。
- 示例:
kubectl logs my-pod
- 示例:
- kubectl exec:在容器内执行命令。
- 示例:
kubectl exec -it my-pod -- /bin/bash
- 示例:
- kubectl delete:删除资源对象。
- 示例:
kubectl delete pod my-pod
- 示例:
- kubectl scale:调整 Deployment、ReplicaSet 等控制器的副本数量。
- 示例:
kubectl scale deployment my-deployment --replicas=3
- 示例:
- kubectl rollout:管理 Deployment 的滚动更新。
- 示例:
kubectl rollout status deployment/my-deployment
- 示例:
- kubectl port-forward:将本地端口与 Pod 的端口进行转发。
- 示例:
kubectl port-forward my-pod 8080:80
- 示例:
- kubectl create secret:创建密钥、密码等敏感信息的 Secret 对象。
- 示例:
kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypass
- 示例:
- kubectl expose:创建一个名称为nginx-deployment的service端口是8888代理容器端口80,并实现了负载均衡。
- 示例:
**kubectl expose deployment nginx-deployment –port=8888 –target-port=80**
- 示例:
安装部署
Kubernetes 可以使用两种主要的部署方式:单节点集群和多节点集群。
- 单节点集群部署:
单节点集群是在单个计算机上模拟一个完整的 Kubernetes 集群。这种部署方式通常用于开发和测试目的,或者在资源有限的环境中进行本地开发和调试。常见的单节点集群工具包括:- Minikube:Minikube 是一个用于在本地机器上快速部署 Kubernetes 的工具,它会在虚拟机中启动一个单节点 Kubernetes 集群。
- Docker Desktop:Docker Desktop for Mac 和 Docker Desktop for Windows 提供了一个内置的 Kubernetes 集成,可以方便地在本地机器上启动一个单节点 Kubernetes 集群。
- 多节点集群部署:
多节点集群是在多台计算机上部署一个真实的 Kubernetes 集群,每个节点都运行一个 Kubernetes 组件。这种部署方式通常用于生产环境和大规模的应用部署。常见的多节点集群部署- kubeadm:kubeadm 是一个用于在现有的 Linux 发行版上部署 Kubernetes 集群的命令行工具。它可以方便地在多个节点上快速部署一个简单的 Kubernetes 集群。
- 二进制部署:二进制部署是一种手动方式,在每个节点上手动下载、配置和安装 Kubernetes 组件的二进制文件,并手动配置和启动 Kubernetes 集群的各个组件。二进制部署提供了更多的灵活性和可定制性,用户可以根据特定的需求对 Kubernetes 架构和组件进行更细粒度的调整和配置。
本次学习和演示用,我们用 Docker Desktop for Windows 集成 ****Kubernetes,安装如下图所示:
部署
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
该命令是从Github上拉取recommended.yaml文件并运行。
验证
查看pod的状态为running说明dashboard部署成功
kubectl get svc,pods -n kubernetes-dashboard
查看代理是否正确安装部署
kubectl cluster-info
启用代理
kubectl proxy
输入上述命令后,光标一直在闪,命令行中无法继续输入其他命令。此时千万不要关闭命令窗口!一定要保持命令窗口不动,并打开浏览器。输入URL
需要获取token。
Token获取
新建dashboard-adminuser.yaml配置文件
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
应用dashboard-adminuser.yaml
kubectl create -f dashboard-adminuser.yaml
获取token,在登录使用。
kubectl create token dashboard-admin --namespace kubernetes-dashboard
k8s界面如下所示:
服务构建示例
参考k8s官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/run-stateless-application-deployment/
deployment.yaml 内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
创建 deployment
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
kubectl 扩缩容命令
kubectl scale -n default deployment nginx-deployment --replicas=5
dashboad 页面展示
Service创建
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。Service 用于在 Kubernetes 集群内部暴露应用程序,使得应用程序能够被其他组件或者其他应用程序访问。
创建Service的方法有两种:
1.通过kubectl expose创建
kubectl expose deployment nginx-deployment --port=88 --type=NodePort --target-port=80 --name=nginx-service
2.通过yaml文件创建
创建一个名为nginx-service的服务,将在端口80接收请求并将链接路由到具有标签选择器是app=nginx的pod的9376端口上。使用kubectl create来创建serivice
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
# 自己想暴露出的端口
port: 30001
# 对应容器暴露的端口
targetPort: 80
kubectl get svc 查看service 信息
nginx-service NodePort 10.100.84.239 <none> 88:30498/TCP 139m
dashboad显示如下
Ingress创建
Ingress 用于在 Kubernetes 集群外部暴露应用程序,使得应用程序可以通过外部网络访问。
kubectl create -f ingress.yml
配置文件内容如下
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: nginx.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
kubectl get ing 命令查看Ingress运行情况
nginx-ingress <none> nginx.example.com 80 64s
CI/CD
jenkins从代码到镜像,k8s从镜像到服务,CI(持续集成)和CD(持续交付/持续部署)。
通过使用 Jenkins 和 Kubernetes 来构建一个端到端的 CI/CD 流水线,将代码从版本控制系统(如 Git)中构建成 Docker 镜像,然后部署到 Kubernetes 集群中。
Helm
Helm 是 Kubernetes 的一个包管理工具,用于定义、安装和管理 Kubernetes 应用程序的配置。
1.Helm的三个基本概念
Chart:Helm应用(package),包括该应用的所有Kubernetes manifest模版,类似于YUM RPM或Apt dpkg文件
Repository:Helm package存储仓库
Release:chart的部署实例,每个chart可以部署一个或多个release
2.Helm工作原理
Helm把Kubernetes资源(比如deployments、services或 ingress等) 打包到一个chart中,而chart被保存到chart仓库。通过chart仓库可用来存储和分享chart。Helm使发布可配置,支持发布应用配置的版本管理,简化了Kubernetes部署应用的版本控制、打包、发布、删除、更新等操作。
Helm包括两个部分,helm客户端和tiller服务端。
3.helm客户端
helm客户端是一个命令行工具,负责管理charts、reprepository和release。它通过gPRC API(使用kubectl port-forward将tiller的端口映射到本地,然后再通过映射后的端口跟tiller通信)向tiller发送请求,并由tiller来管理对应的Kubernetes资源。
4.tiller服务端
tiller接收来自helm客户端的请求,并把相关资源的操作发送到Kubernetes,负责管理(安装、查询、升级或删除等)和跟踪Kubernetes资源。为了方便管理,tiller把release的相关信息保存在kubernetes的ConfigMap中。tiller对外暴露gRPC API,供helm客户端调用。
Rancher
Rancher 是一个开源的容器管理平台,用于简化 Kubernetes 和其他容器编排引擎的操作。方便管理多个K8s集群。
下载运行rancher/rancher:stable镜像
docker run -d --restart=unless-stopped --privileged --name rancher -p 80:80 -p 443:443 rancher/rancher:stable
浏览器打开localhost
执行命令获取密码, grep命令在 Windows PowerShell 中不可用。Select-String这个命令在 Unix 或 Linux 系统上是有效的。
docker logs container-id 2>&1 | grep "Bootstrap Password:"
docker logs container-id 2>&1 | Select-String "Bootstrap Password:"
输入初始密码后,初次登录需要修改密码