使用 sidecar 代理容器日志
-
获取现有 Pod 的 YAML 文件:
kubectl get pod 11-factor-app -o yaml > 11-factor-app.yaml -
编辑 YAML 文件:
- 在
containers列表中添加sidecar容器。 - 设置
sidecar容器的image为busybox。 - 设置
command为["/bin/sh", "-c", "tail -n+1 -f /var/log/11-factor-app.log"]。 - 添加
volumeMounts使/var/log可用于sidecar容器。
- 在
-
应用更新后的 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以外,请勿更改现有容器的规格。
参考:
概念 --> 集群管理 --> 日志架构 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: {}
升级集群
模拟题目:
设置配置环境: [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
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
总结
- 登录并获取root权限:通过SSH登录Master节点并切换到root用户。
- 隔离节点:通过
drain和cordon命令隔离Master节点。 - 停止服务:停止所有Kubernetes相关服务。
- 卸载旧版本:卸载旧版本的Kubernetes软件包。
- 安装新版本:安装新版本的Kubernetes软件包。
- 启动服务:启动新的Kubernetes服务。
- 验证升级:检查升级后的版本是否正确。
- 解除隔离:解除Master节点的隔离状态。
- 检查集群状态:确保集群状态正常。