DevOps - Kubernetes

Kubernetes 帮助我们自动化部署、扩展和管理容器化应用程序的方式。这使它成为我们在 DevOps 中的重要工具。

在本章中,我们将介绍 Kubernetes 的基础知识。我们将讨论它的架构以及如何设置集群。我们还将讨论如何部署应用程序、管理配置、集成 CI/CD 以及监控策略。

了解 Kubernetes 架构

我们可以将 Kubernetes 架构视为主从设置。它有许多部分可以协同工作以管理容器中的应用程序。主要部分是:

1. 控制平面

  • API 服务器 − 这是 Kubernetes 控制平面的前端部分。它处理所有 REST 操作。
  • 调度程序 − 这有助于将工作负载分配给节点。它查看可用的资源并遵循某些规则。
  • 控制器管理器 − 它管理用于检查集群状态的控制器。例如,它与复制控制器一起工作。
  • etcd − 这是一个分布式键值存储。它保存所有集群数据,是主要的事实来源。

2. 工作节点

工作节点运行应用程序。它们有 −

  • Kubelet − 这是一个与控制平面对话的代理。它管理容器的生命周期。
  • Kube Proxy −这负责服务的网络路由和负载平衡。
  • 容器运行时 − 这是运行容器的软件。示例包括 Docker 和 containerd。

3. 网络

Kubernetes 网络帮助 pod 和服务相互通信。它使用:

  • 集群 IP − 这是用于访问服务的内部 IP。
  • NodePort − 这会在每个节点 IP 上的固定端口上公开服务。
  • LoadBalancer − 这与云提供商合作,为服务设置负载均衡器。

我们需要很好地理解这个架构。它帮助我们有效地管理和部署 Kubernetes 中的应用程序。

设置 Kubernetes 集群

我们可以通过几个步骤设置 Kubernetes 集群。我们可以在本地机器、云服务或我们自己的服务器上执行此操作。在这里,我们将展示使用 kubeadm 设置 Kubernetes 集群的步骤。这是启动集群的常用工具。

以下是先决条件 −

  • 操作系统 − 我们需要 Ubuntu、CentOS 或其他 Linux 系统。
  • 硬件 − 每个节点应至少具有 2 个 CPU 和 2GB RAM。
  • Docker −我们必须安装 Docker 并确保它正在运行以管理容器映像。

设置 Kubernetes 集群的步骤

安装 Kubernetes 组件 − 首先,我们运行这些命令 −

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

初始化集群 − 在主节点上,我们运行 −

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

设置本地 Kubeconfig − 我们需要为用户设置 kubeconfig−

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装 Pod 网络插件(如 Calico) − 我们可以使用此命令安装 Calico −

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

加入工作节点 − 对于每个工作节点,我们使用初始化步骤中的令牌 −

kubeadm join <master-ip>:6443 --token <token> 
   --discovery-token-ca-cert-hash sha256:<hash>

验证 − 要检查节点的状态,我们运行 −

kubectl get nodes

此命令向我们显示主节点和工作节点的状态。这样,我们可以确认我们已正确设置了 Kubernetes 集群。

在 Kubernetes 上部署应用程序

我们可以通过使用 Kubernetes 清单定义应用程序的外观,在 Kubernetes 上部署应用程序。我们通常用 YAML 编写这些清单。我们用于部署的最常见资源是 Pod、ReplicaSet 和 Deployments。在本节中,我们将讨论部署的关键步骤 −

创建部署 − 我们需要在部署清单中定义我们的应用程序的外观。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app-image:latest
        ports:
        - containerPort: 80

应用清单 − 我们使用 kubectl 应用部署 −

kubectl apply -f deploy.yaml

公开应用程序 − 我们创建一个服务以让外部流量到达我们的应用程序。

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: my-app

验证部署 − 我们检查 Pod 和服务的状态 −

kubectl get pods
kubectl get services

通过遵循这些步骤,我们可以在 Kubernetes 集群上成功部署和管理应用程序。

管理配置和机密

在 Kubernetes 中,我们看到配置和机密非常重要。它们帮助我们管理应用程序设置并确保敏感数据的安全。Kubernetes 为我们提供了 ConfigMaps 来处理非敏感配置数据。它还为我们提供了密码或 API 密钥等敏感信息的机密。

ConfigMaps

ConfigMaps 将配置设置保存为键值对。我们可以从文件、文件夹或直接值创建 ConfigMap。

kubectl create configmap my-config --from-literal=key1=value1
    --from-file=my-config-file.conf

在 Pod 中的使用 − 我们可以将 ConfigMap 作为卷挂载或将其用作环境变量。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: CONFIG_KEY
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1

Secrets

Secrets 可确保敏感数据的安全。它们以 Base64 编码。我们像 ConfigMaps 一样创建 Secrets,但使用 kubectl create secret 命令。

kubectl create secret generic my-secret --from-literal=password=my-password

在 Pod 中的使用 − Secrets 也可以作为卷安装或用作环境变量。

apiVersion: v1
kind: Pod
metadata:
  name: my-secure-pod
spec:
  containers:
  - name: my-secure-container
    image: my-secure-image
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

使用 Kubernetes 实现 CI/CD 管道

我们知道持续集成 (CI) 和持续部署 (CD) 管道在 DevOps 中非常重要。它们帮助我们自动化应用程序的交付方式。Kubernetes 为我们提供了一个强大的平台来部署、管理和扩展应用程序,从而使 CI/CD 变得更好。

关键组件

  • 源代码控制 − 我们使用 Git 存储库来存储应用程序代码。
  • CI/CD 工具 − 我们使用的工具包括:Jenkins、GitLab CI 和 ArgoCD。
  • 容器注册表 −我们可以使用 Docker Hub 或私有注册表来保存我们的镜像。

CI/CD 流程

代码提交 − 我们将代码更改推送到存储库。

构建阶段 − 我们的 CI 工具构建 Docker 镜像。

docker build -t myapp:latest .

测试阶段 − 运行自动测试来检查我们的代码。

推送到注册表 − 我们将成功的构建推送到容器注册表。

docker push myapp:latest

部署 −我们使用 Kubernetes 清单(YAML 文件)进行部署。

 	apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:latest

Kubernetes 上的 CI/CD 工具

  • Helm − 它是 Kubernetes 的包管理器。
  • Tekton − 这是一个 Kubernetes 原生的 CI/CD 框架。
  • ArgoCD − 我们使用这个 GitOps 持续交付工具。

通过将所有这些部分组合在一起,我们可以使 Kubernetes 中的软件部署过程自动化、高效且可靠。

Kubernetes 中的监控和日志记录

我们知道良好的监控和日志记录对于保持 Kubernetes 集群健康且正常运行非常重要。这些工具可以帮助我们发现问题、检查性能并快速解决问题。

监控工具

  • Prometheus − 它是一个用于监控和警报的开源工具。它使用 HTTP 上的拉取模型收集数据。它允许我们使用多维数据和灵活的查询。
  • Grafana − 这是一个与 Prometheus 配合使用的可视化工具。我们可以创建仪表板来清楚地查看我们的指标。
  • Kube-state-metrics − 此工具为我们提供有关 Kubernetes 对象(如部署和 pod)状态的指标。它为我们提供了详细的监控信息。

日志解决方案

  • Fluentd −它是一个数据收集器,可帮助我们整合来自不同地方的日志。它帮助我们轻松地从节点和容器收集日志。
  • Elasticsearch & Kibana − Elasticsearch 存储日志。Kibana 帮助我们可视化它们。这些工具非常适合搜索和检查日志。

Prometheus 配置示例

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
    scrape_configs:
      - job_name: 'kubernetes-nodes'
        kubernetes_sd_configs:
          - role: node

结论

在本章中,我们了解了 Kubernetes 的基础知识。我们讨论了它的结构、如何设置集群、部署应用程序、管理配置、集成 CI/CD 以及监控系统。