Kubernetes

Kubernetes

基本介绍

Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。

功能

以下是 Kubernetes 的一些主要功能:

  1. 自动化部署和扩展
    • Kubernetes 允许您定义应用程序的部署规范,包括容器镜像、副本数量和资源限制等。然后,Kubernetes 可以根据定义的规范自动部署和扩展应用程序,以满足应用程序的需求和负载变化。
  2. 服务发现和负载均衡
    • Kubernetes 提供了内置的服务发现机制,允许容器之间通过 DNS 名称进行通信,而无需关心容器的具体 IP 地址。此外,Kubernetes 还支持负载均衡,可以将流量分发到多个副本实例。
  3. 自动容错和自愈
    • Kubernetes 监控集群中的容器和节点,并在容器失败或节点不可用时进行自动恢复。它可以自动替换失败的容器实例,并在节点发生故障时重新调度容器。
  4. 存储编排
    • Kubernetes 提供了存储卷(Volumes)和存储卷声明(PersistentVolumeClaims)的概念,允许容器挂载持久化存储,并通过存储类(StorageClass)动态地管理存储资源。
  5. 自动伸缩
    • Kubernetes 支持水平自动伸缩,可以根据应用程序的负载自动增加或减少副本数量。您可以定义自动伸缩的规则和阈值,以满足应用程序的性能和可用性要求。
  6. 密钥和配置管理
    • Kubernetes 提供了 Secrets 和 ConfigMaps 等机制,用于安全地存储和管理敏感信息和配置数据,并将它们注入到容器中。
  7. 批处理和定时任务
    • Kubernetes 支持批处理作业(Jobs)和定时任务(CronJobs),允许您在集群中运行周期性任务或一次性任务。
  8. 多环境支持
    • Kubernetes 允许您在多个环境(如开发、测试和生产)中轻松部署和管理应用程序,通过使用命名空间和环境变量等功能来隔离不同环境的资源。

这些是 Kubernetes 的一些主要功能,它们使得在容器化环境中部署、运行和管理应用程序变得更加简单、高效和可靠。

组件介绍

下图为k8s架构图

以下是 Kubernetes 的主要组件及其功能介绍:

  1. kube-apiserver
    • Kubernetes API 的前端服务,负责提供集群管理的 REST API。
    • 处理对 API 对象的创建、修改、删除等操作。
  2. kube-controller-manager
    • 包含多个控制器,用于监控集群状态并进行自动化操作。
    • 例如 Node 控制器、Replication 控制器、Endpoint 控制器等。
    • 监控集群状态的变化,并根据预定义的期望状态进行调整和修复。
  3. kube-scheduler
    • 负责将 Pod 调度到集群中的节点上。
    • 根据 Pod 的资源需求、亲和性和防亲和性等策略选择合适的节点进行调度。
  4. kubelet
    • 运行在每个节点上的代理,负责管理本地节点上的容器。
    • 接收来自 kube-apiserver 的 Pod 规范,并确保节点上的容器按照规范运行。
  5. kube-proxy
    • 在每个节点上运行的网络代理,负责管理集群中的网络流量。
    • 提供服务发现和负载均衡功能,实现服务间的通信和网络访问。
  6. etcd
    • 分布式键值存储系统,用于存储 Kubernetes 集群的所有配置信息和状态数据。
    • 作为 Kubernetes 的数据存储后端,提供高可用性和一致性的数据存储服务。
  7. Container Runtime
    • 负责运行容器的软件组件,常用的容器运行时包括 Docker、containerd、CRI-O 等。
    • Kubernetes 通过 CRI(Container Runtime Interface)与容器运行时进行交互。

除了上述核心组件之外,Kubernetes 还包括一些附加的组件,如:

  • DNS 服务:用于为集群中的服务提供域名解析。
  • Dashboard:提供图形化界面,用于监控和管理 Kubernetes 集群。
  • Ingress Controller:提供 HTTP 和 HTTPS 路由功能,用于将外部流量路由到集群内部的服务。
  • 日志和监控工具:如 Prometheus、Grafana 等,用于收集、存储和可视化集群的日志和监控数据。

这些组件共同协作,构成了 Kubernetes 的完整生态系统,为用户提供了高效、弹性和可扩展的容器化平台。

主要对象

在 Kubernetes 中,主要的对象包括:

  1. Pod(容器组):Pod 是 Kubernetes 中最小的调度单位,它可以包含一个或多个紧密关联的容器,并共享相同的网络命名空间、存储卷等资源。Pod 被用来运行应用程序的实例。Pod是k8s中最小的单元。它由一组、一个或者多个容器组成,每个Pod中包含一个Pause容器,
    Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。
  2. Service(服务):Service 定义了一组相同功能的 Pod 的访问方式,提供了一个稳定的网络端点,用于与应用程序交互。Service 可以通过标签选择器来选择要路由的 Pod,并提供负载均衡功能。
  3. Endpoints (端点集合):对象包含了一个或多个地址(IP 地址)和端口的列表,这些地址和端口是 Service 要代理的后端 Pod 的信息。当 Service 接收到请求时,它会根据 Endpoints 中的地址和端口信息将请求转发给相应的后端 Pod。
  4. Namespace(命名空间):Namespace 是 Kubernetes 中用来划分资源的一种方式,它提供了一种逻辑上的隔离机制,可以将集群中的资源划分为多个逻辑单元,不同的命名空间之间相互隔离。
  5. Deployment(部署):Deployment 定义了应用程序的部署策略,包括副本数量、更新策略等,并负责创建和管理 Pod 的副本集,以确保应用程序的稳定运行。
  6. ReplicaSet(副本集):ReplicaSet 是 Deployment 的一部分,用于创建和管理一组相同的 Pod 的副本,并确保它们的数量与期望的副本数量保持一致。
  7. StatefulSet(有状态服务集):StatefulSet 类似于 ReplicaSet,但用于部署有状态的应用程序,它可以确保每个 Pod 的标识符和网络标识符在重启和迁移时保持不变。
  8. ConfigMap(配置映射):ConfigMap 用于存储应用程序的配置信息,如环境变量、配置文件等,可以通过卷挂载或环境变量的方式注入到 Pod 中。
  9. Secret(密钥):Secret 用于存储敏感信息,如密码、证书等,可以安全地存储和管理这些信息,并将其注入到 Pod 中。
  10. PersistentVolume(持久化卷):PersistentVolume 是 Kubernetes 中用于存储数据的抽象层,它可以独立于 Pod 存在,并提供持久化的存储功能,以保证数据的持久性和可靠性。
  11. PersistentVolumeClaim(持久化卷声明):PersistentVolumeClaim 用于声明对持久化卷的需求,定义了 Pod 对存储资源的需求和要求,并负责与 PersistentVolume 进行动态绑定。

这些对象构成了 Kubernetes 中的核心组件,通过它们可以管理和运行容器化应用程序,并提供强大的资源管理和调度功能。

常用kubectl命令

kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互和管理。通过 kubectl 可以执行各种操作,包括创建、删除、管理 Kubernetes 资源对象,以及查看集群状态、调试应用程序等。以下是一些常用的 kubectl 命令:

  1. kubectl create:创建资源对象,如 Pod、Service、Deployment 等。
    • 示例:kubectl create deployment my-deployment --image=my-image –-replicas=1
  2. kubectl apply:根据配置文件创建或更新资源对象。
    • 示例:kubectl apply -f my-manifest.yaml
  3. kubectl get:获取资源对象的信息。
    • 示例:kubectl get pods
  4. kubectl describe:获取资源对象的详细信息。
    • 示例:kubectl describe pod my-pod
  5. kubectl logs:获取容器的日志信息。
    • 示例:kubectl logs my-pod
  6. kubectl exec:在容器内执行命令。
    • 示例:kubectl exec -it my-pod -- /bin/bash
  7. kubectl delete:删除资源对象。
    • 示例:kubectl delete pod my-pod
  8. kubectl scale:调整 Deployment、ReplicaSet 等控制器的副本数量。
    • 示例:kubectl scale deployment my-deployment --replicas=3
  9. kubectl rollout:管理 Deployment 的滚动更新。
    • 示例:kubectl rollout status deployment/my-deployment
  10. kubectl port-forward:将本地端口与 Pod 的端口进行转发。
    • 示例:kubectl port-forward my-pod 8080:80
  11. kubectl create secret:创建密钥、密码等敏感信息的 Secret 对象。
    • 示例:kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypass
  12. kubectl expose:创建一个名称为nginx-deployment的service端口是8888代理容器端口80,并实现了负载均衡。
    • 示例:**kubectl expose deployment nginx-deployment –port=8888 –target-port=80**

安装部署

Kubernetes 可以使用两种主要的部署方式:单节点集群和多节点集群。

  1. 单节点集群部署
    单节点集群是在单个计算机上模拟一个完整的 Kubernetes 集群。这种部署方式通常用于开发和测试目的,或者在资源有限的环境中进行本地开发和调试。常见的单节点集群工具包括:
    • Minikube:Minikube 是一个用于在本地机器上快速部署 Kubernetes 的工具,它会在虚拟机中启动一个单节点 Kubernetes 集群。
    • Docker Desktop:Docker Desktop for Mac 和 Docker Desktop for Windows 提供了一个内置的 Kubernetes 集成,可以方便地在本地机器上启动一个单节点 Kubernetes 集群。
  2. 多节点集群部署
    多节点集群是在多台计算机上部署一个真实的 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

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

需要获取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:"

输入初始密码后,初次登录需要修改密码

posted @ 2024-03-19 16:58  曹化金  阅读(20)  评论(0编辑  收藏  举报