备战CKA: 使用 sidecar 代理容器日志|升级集群

262 阅读3分钟

使用 sidecar 代理容器日志

  1. 获取现有 Pod 的 YAML 文件

    kubectl get pod 11-factor-app -o yaml > 11-factor-app.yaml
    
  2. 编辑 YAML 文件

    • 在 containers 列表中添加 sidecar 容器。
    • 设置 sidecar 容器的 image 为 busybox
    • 设置 command 为 ["/bin/sh", "-c", "tail -n+1 -f /var/log/11-factor-app.log"]
    • 添加 volumeMounts 使 /var/log 可用于 sidecar 容器。
  3. 应用更新后的 YAML 文件

    kubectl apply -f 11-factor-app.yaml
    

这样就可以成功将 sidecar 容器添加到现有的 Pod 11-factor-app 中,并使其运行所需的命令。同时,日志文件 11-factor-app.log 也能够通过挂载的 Volume 被 sidecar 容器访问

模拟题目:

设置配置环境: [candidate@node-1] $ kubectl config use-context k8s

Context

将一个现有的 Pod 集成到 Kubernetes 的内置日志记录体系结构中(例如 kubectl logs)。 添加 streaming sidecar 容器是实现此要求的一种好方法。

Task

使用busybox Image来将名为sidecar的sidecar容器添加到现有的Pod 11-factor-app中。 新的sidecar容器必须运行以下命令: /bin/sh -c tail -n+1 -f /var/log/11-factor-app.log 使用挂载在/var/log的Volume,使日志文件11-factor-app.log可用于sidecar 容器。 除了添加所需要的volume mount以外,请勿更改现有容器的规格。


参考:

image.png

概念 --> 集群管理 --> 日志架构 kubernetes.io/zh-cn/docs/…


解答:

传输数据流的边车容器

带数据流容器的边车容器

利用边车容器,写入到自己的 stdout 和 stderr 传输流, 你就可以利用每个节点上的 kubelet 和日志代理来处理日志。 边车容器从文件、套接字或 journald 读取日志。 每个边车容器向自己的 stdout 和 stderr 流中输出日志。

这种方法允许你将日志流从应用程序的不同部分分离开,其中一些可能缺乏对写入 stdout 或 stderr 的支持。重定向日志背后的逻辑是最小的,因此它的开销不大。 另外,因为 stdout 和 stderr 由 kubelet 处理,所以你可以使用内置的工具 kubectl logs

考试的时候务必记住切换集群, 注意集群名称 kubectl config use-context k8s

导出pod文件并备份

kubectl get pod 11-factor-app -o yaml > varlog.yaml cp varlog.yaml varlog-bak.yaml

删除原pod

kubectl delete pod 11-factor-app kubectl get pod 11-factor-app

编辑文件

vim varlog.yaml

假设原始的 YAML 文件如下所示(简化版):

apiVersion: v1
kind: Pod
metadata:
  name: 11-factor-app
spec:
  containers:
  - name: main-container
    image: your-main-image
    volumeMounts:
    - name: log-volume
      mountPath: /var/log
  volumes:
  - name: log-volume
    emptyDir: {}

在上面的基础上,添加 sidecar 容器:

apiVersion: v1
kind: Pod
metadata:
  name: 11-factor-app
spec:
  containers:
  - name: main-container
    image: your-main-image
    volumeMounts:
    - name: log-volume
      mountPath: /var/log
  - name: sidecar
    image: busybox
    command: ["/bin/sh", "-c", "tail -n+1 -f /var/log/11-factor-app.log"]
    volumeMounts:
    - name: log-volume
      mountPath: /var/log
  volumes:
  - name: log-volume
    emptyDir: {}
    - name: varlog
      mountPath: /var/log

  - name: count-log-2
    image: busybox:1.28
    args: [/bin/sh, -c, 'tail -n+1 -F /var/log/2.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log

  #volumes:
  - name: varlog
    emptyDir: {}

image.png

升级集群

模拟题目:

设置配置环境: [candidate@node-1] $ kubectl config use-context mk8s

Task

现有的Kubernetes 集群正在运行版本1.25.1。仅将master节点上的所有 Kubernetes控制平面和节点组件升级到版本1.25.2。 确保在升级之前 drain master节点,并在升级后 uncordon master节点。 可以使用以下命令,通过ssh连接到master节点: ssh master01 可以使用以下命令,在该master节点上获取更高权限: sudo -i 另外,在主节点上升级kubelet和kubectl。 请不要升级工作节点,etcd,container 管理器,CNI插件, DNS服务或任何其他插件。


参考:

任务 --> 管理集群 --> 用 kubeadm 进行管理 --> 升级 kubeadm 集群 kubernetes.io/zh-cn/docs/…


解答:

(1)Kubernetes集群版本升级

(2)apt-get update apt-get upgrade

apt-get update 和 apt-get upgrade 是两个用于管理 Debian 系统软件包的命令,它们的主要区别在于功能和执行时机。

apt-get update:*

apt-get update 命令用于更新本地存储库索引。它会从软件包源(repository)中下载最新的软件包列表和信息,但不会安装任何新的软件包。这个命令确保你的本地软件包信息是最新的,以便后续的软件包管理操作。

示例:

sudo apt-get update

apt-get upgrade:

apt-get upgrade 命令用于安装当前系统上已安装的软件包的最新版本。它会检查系统上已安装软件包的新版本,并升级这些软件包到最新版本。在执行之前,通常需要先运行 apt-get update 确保软件包信息是最新的。

示例:

sudo apt-get upgrade

因此,一般的更新软件包的步骤是先运行 apt-get update 更新软件包索引,然后再运行 apt-get upgrade

image.png

kubectl get nodes

维护和驱逐

kubectl cordon master01 
kubectl drain master01 --ignore-daemonsets

连接master01 并 提升权限

ssh master01 sudo -i

更新软件列表查看可更新版本, 升级对应版本


# 用最新的补丁版本替换 1.31.x-* 中的 x
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.31.x-*' kubectl='1.31.x-*' && \
sudo apt-mark hold kubelet kubectl

重启 kubelet:

sudo systemctl daemon-reload
sudo systemctl restart kubelet

解除节点的保护

通过将节点标记为可调度,让其重新上线:

# 将 <node-to-uncordon> 替换为你的节点名称
kubectl uncordon <node-to-uncordon>

检查:

kubectl get node

总结

  1. 登录并获取root权限:通过SSH登录Master节点并切换到root用户。
  2. 隔离节点:通过draincordon命令隔离Master节点。
  3. 停止服务:停止所有Kubernetes相关服务。
  4. 卸载旧版本:卸载旧版本的Kubernetes软件包。
  5. 安装新版本:安装新版本的Kubernetes软件包。
  6. 启动服务:启动新的Kubernetes服务。
  7. 验证升级:检查升级后的版本是否正确。
  8. 解除隔离:解除Master节点的隔离状态。
  9. 检查集群状态:确保集群状态正常。