「Wine」- Windows Emulator But Not An Emulator
使用 Wine,能够在 Unix-like 中运行 Windows 程序。
https://wiki.winehq.org/Gecko https://wiki.winehq.org/Mono https://wiki.winehq.org/Winetricks https://www.winehq.org/
相关站点
主页:https://www.winehq.org 维基百科中有关Wine的介绍[……]
「Linux下」- 安装 Wine 服务
解决方案
从仓库中直接安装
# Kali GNU/Linux Rolling
apt-get install wine wine64 libwine:amd64 fonts-wine winexe
安装的可执行程序
wine
/usr/bin wine-stable msiexec-stable regedit-stable regsvr32-stablels
wineboot-stable winecfg-stable wineconsole-stable winedbg-stable winefile-stable winepath-stable wineserver-stable
wine64
wine64-stable
winexe
winexe[……]
「Wine」- Play On Linux
PlayOnLinux是Wine的前端工具。以一种简单的方式安装Windows中的软件。软件截图如下:
安装「Play On Linux」
从Linux发行版的源中安装
apt-get install playonlinux
直接下载软件包
从官网下载Play On Linux
PlayOnLinux是Python写的,所以必须先安装Python。
下载Play On Linux: https://www.playonlinux.com/en/download.html
运行:/path/to/package/playonlinux
从GitHub下载Play On Linux PlayOnLinux是Python写的,所以必须先安装Python。 项目地址: https://github.com/PlayOnLinux/POL-POM-4 运行程序:/path/to/package/playonlinux
安装的可执行程序
playonlinux Wine的前端程序。提供了一种简单的方式来安装和使用Windows中的软件。
playonlinux-pgk 管理playonlinux包的工具。
常见错误列表
#1 PlayOnLinux is not supposed to be run as root. Sorry
PlayOnLinux是不允许以ROOT运行的,在程序中执行用户检查。不过,还好Play On Linux是Python开发的,所以可以修改脚本文件,移除ROOT检查。一共有两处需要修改:
1)修改/usr/share/playonlinux/python/mainwindow.py文件,注释以下行:
if(os.popen(“id -u”).read() == “0\n” or os.popen(“id -u”).read() == “0”):
wx.MessageBox(_(“{0} is not supposed to be run as root. Sorry”).format(os.environ[“APPLICATION_TITLE”]),_(“Error”))
os._exit(1)
2)修改/usr/share/playonlinux/lib/sources文件,注释以下行:
if [ “$(id -u)” = “0” ]
then
echo “PlayOnLinux is not supposed to be run as root. Sorry”
exit
fi
参考文献
PlayOnLinux的官网[……]
「Wine」- 常见问题处理
系统图盘(Systemtray)
How to Hide Wine System Tray – ibndias
默认会自动启动 Wine System Tray 悬浮窗口。
如果想要合并到 GNOME 桌面环境的系统托盘中,需要安装 TopIcons 插件: TopIcons – GNOME Shell Extensions TopIconsFix – GNOME Shell Extensions
配置字体抗锯齿、解决字体模糊
How do I enable font anti-aliasing in Wine?
2018-04-09 PM 03:46
The easiest way is through winetricks
mkdir ~/bin
cd ~/bin
wget http://winetricks.org/winetricks
chmod +x ./winetricks
winetricks fontsmooth-rgb
In newer version of winetricks the command to use is
winetricks settings fontsmooth=rgb
There are other LCD pixel orders available. You can read about them and the rest of the impressive winetricks feature list on its WineHQ site.[……]
「Docker」- 操作系统层的虚拟化
Docker – OS-Level Virtualization, Enterprise Container Platform
基于LXC技术,使用AUFS文件系统。
组件:Server(Docker Engine)、Client/API、Image、Register、Container
Client/API -> Server -> Container
Image:基于联合文件系统的一种层次的结构。说人话就是,组成操作系统目录结构的一些文件,这些文件保证了系统的运行。再简单的说,就是个操作系统,只不过移除了一些不必要的文件。
Register: 用于保存镜像的仓库。公有,私有。公用,供搭建使用,Docker Hub。私有,搭建自己的Register中心。
Container:运行中的镜像。
「镜像」是Docker生命周期中的打包或构建阶段,而「容器」则是启动或执行阶段。
用户界面:shipyard, DockerUI, Kitematic
# 待办事项
TODO ! Docker是如何存储镜像的,以及镜像的大小 「Where are Docker images stored on the host machine?」 「About images, containers, and storage drivers」 「 moby/daemon/graphdriver/driver.go 」 「Docker Image Size – Does It Matter?」
参考文献
绑定Dokcer容器到主机指定网卡的方法 Docker的4种网络模式 Docker Compose安装以及入门 Docker三剑客实践之部署集群 使Docker提供对外服务的网络配置(桥接与端口) docker一个镜像创建多实例启动多个容器分配不同的端口号,达到高可用的目的 单机跑多个container实例,如何让这些实例都能使用同一端口? 不同容器之间端口通信困惑 for docker[……]
「DOCKER-COMPOSE」- 配置与使用
docker-compose教程(安装,使用, 快速入门)
设置 PROJECT NAME 信息
Project name in docker-compose.yml · Issue #1123 · docker/compose Set $PROJECT_NAME in docker-compose file – Stack Overflow Declare default environment variables in file | Docker Documentation
问题描述
在 Docker Compose 中,默认使用当前目录名作为应用名,并前缀到容器目录。
当我将 docker-compose.yml 文件保存在 application/ 中,导致容器被前缀 application 作为项目名。
该笔记将记录:在 Docker Compose 中,如何设置项目名。
解决方法
创建 .env 文件,定义 COMPOSE_PROJECT_NAME 变量,以此指定应用名。[……]
「Docker Compose」- docker-compose.yaml(学习笔记)
官方文档
Compose file version 3 reference | Docker Documentation
模板文件(docker-compose.yaml)
我们常用的 docker-compose.yaml 模板(直接复制):
version: ‘3’
services:
backend:
# 镜像配置
image: <image address>
# 容器配置
container_name: <container name>
# 网络配置
hostname: <hostname>
network_mode: host
ports:
– “<host port>:<container port>”
# 服务管理配置
restart: always
# 运行命令、及其环境信息
volumes:
– /etc/localtime:/etc/localtime
environment:
– <key>=<value>
# 覆盖 ENTRYPOINT 参数
entrypoint: /bin/entrypoint
command: [“ls”, “-l”]
运行命令
docker-compose, run a script after container has started? – Stack Overflow
运行多行命令(多行脚本):
version: ‘3’
services:
backend:
…
entrypoint:
– sh
– -c
command:
– |
while true
do
// do some stuff
done
环境变量(Environment)
Environment variables in Compose | Docker Documentation docker-compose invalid type, it should be a string – DevOps Stack Exchange
供 Container 使用的环境变量
这里的“环境变量”是指“在运行时传递到容器中的环境变量”,等价于 docker run –env 命令。
使用如下形式定义环境变量(注意 environment 为数组):[……]
「CONTAINERD」- 场景及方案
配置 Registry Mirror 服务
1)How to configure containerd to use a registry mirror? 2)containerd/registry.md at main · containerd/containerd 3)containerd/config.md at main · containerd/containerd 4)containerd/hosts.md at main · containerd/containerd
# vim /etc/containerd/config.toml
…
[plugins.”io.containerd.grpc.v1.cri”.registry]
config_path = “/etc/containerd/certs.d”
…
# mkdir -pv /etc/containerd/certs.d
# mkdir -pv /etc/containerd/certs.d/_default/
# vim /etc/containerd/certs.d/_default/hosts.toml
server = “https://docker.io”
[host.”https://registry-1.docker.io”]
capabilities = [“resolve”, “pull”][……]
「Kubernetes」- 企业级容器编排(Production-Grade Container Orchestration)
问题描述
该部分笔记侧重于集群的管理,不涉及使用;
解决方案
研究方法
教育培训:WIP
书籍文献 《Kubernetes: Up and Running: Dive into the Future of Infrastructure》 《Kubernetes Cookbook: Building Cloud Native Applications》 《Kubernetes Cookbook》- O’Reilly Media >> http://shop.oreilly.com/product/0636920064947.do >> https://github.com/k8s-cookbook/recipes 0voice/k8s_awesome_document: 【2021年新鲜出炉】K8s(Kubernetes)的工程师资料合辑,书籍推荐,面试题,精选文章,开源项目,PPT,视频,大厂资料
官方文档
https://kubernetes.io/docs/home 在官方主页中,主要由以下几个部分: HOME – 基本介绍,文档分类,快速入口 GETTING STARTED – 快速开始,集群部署,最佳实践 CONCEPTS – 在集群中的一些基本概念。比如,API 对象,网络,集群组件等等。; TASKS – 执行某些特定任务示例,相当于使用教程; TUTORIALS – 与 TASK 类似,该部分包含使用讲解,更加偏向一些示例; REFERENCE – 对象使用方法,调用 API 的方法。这一部分更加偏向于开发人员; CONTRIBUTE – 文档的共享方法;
博客文章:WIP
代码仓库:https://github.com/kubernetes/kubernetes 访问社区:https://github.com/kubernetes/community 相关示例:http://kubernetesbyexample.com 在线练习:https://katacoda.com/courses/kubernetes/playground[……]
「KUBERNETES-TROUBLESHOOT」- 排错与调试
我们从来没有遇到这种事情:以前不管使用什么系统,即使出现各种运行错误,也很容易处理。但是,现在我们需要建立专门的章节,来学习 Kubernetes 相关的排错与调试内容(也许是我们以前使用的东西太简单了)。而且在 Kubernetes 官方文档中关于排错调试的内容远多余我们用过的其他服务,从来没见过哪个工具服务有这么多排错及调试相关的文档 :-)。不过这也很正常,虽然 Kubernetes 的很多新概念,但是底层的 Docker IPVS iptables PKI Storage 等等技术都是建立在已有技术的基础之上,这么多技术粘合在一起,出现各种错误也是相当正常的。所以 Kubernetes 的使用是件简单的事情,通过阅读官方文档即可,但是维护、排错、调试可不简单;
鉴于此,我们创建该章节,专门用来学习和记录与 Kuberntes 排错及调试相关的内容。比如 Pod 为什么处于 Pending 状态、Pod 为什么会重启、apiserver 为什么会退出、etcd 为什么会突然重新选举……各种各样的问题;
集群使用感悟
# 04/10/2019 难点不在于应用,而在于问题处理;
在应用方面,由于多数东西都存在于官方文档上,在使用方面没有太大难度。通过阅读官方文档,可以顺利进行使用,无非是用的好、用的坏、是否是最佳实践方面的问题;
真正难的地方在于维护及问题处理。要想处理集群发生的问题,尤其是突发问题,就要深入理解系统各组件之间的协作关系。与以往我们使用的程序不同,它更像是一个集成系统。我们以往使用的应用,比如监控、日志等等,架构简单且常规,无非就是服务端、客户端,网络、防火墙、权限之类的技术。但是 Kubernetes 不一样,它是一个集成系统,它将很多东西柔合在一起。基础知识方面,需要掌握容器、IPVS、防火墙、证书。除了基础知识,还有 Kubernetes 内部所使用的一些概念;
随着我写下的这一段内容,我也渐渐意识到这是运维知识体系的变革。传统应用管理及问题处理,基本遵循相同的模式,客户端、服务端,不管怎么弄,都没有跳出这个模式。但是 Kubernetes 不一样,它通过各个组件来操作底层组件(防火墙、路由、存储)。以前又有多少应用程序会去操作防火墙呢?又有哪个应用程序在使用 IPVS 呢?[……]
「Kubernetes」- Event
问题描述
该笔记将记录:在 Kubernetes 中,借助 Event 排查问题的方法,以及相关问题的解决办法。
解决方案
Event 实际上是 Kubernetes Cluster 中的一种资源。当 Kubernetes 集群中资源状态发生变化时,可以产生新的 Event;
对不同的资源对象进行 describe 的时候,能看到的 Event 内容都是与自己有直接关联的。 Event 对象中是包含它所描述的资源对象的信息的;
在 Event.involvedObject 字段中,内容就是与该 Event 相关联的资源对象的信息。 Kubernetes 会自动将重复的 events 进行合并
常用命令
// 获取 Event
kubectl get events –namespace=my-namespace
// 查看 Event
kubectl -n moelove get events redis-687967dbc5-27vmr.16c4fb7bde8c69d2 -o yaml
// 将 Event 排序显示
kubectl -n moelove get events –sort-by='{.metadata.creationTimestamp}’
参考文献
彻底搞懂 Kubernetes 中的 Events | MoeLove[……]
「Kubernetes」- 网络调试(Testing,Troubleshooting)
问题描述
https://kubernetes.io/docs/concepts/cluster-administration/networking/
Networking is a central part of Kubernetes, but it can be challenging to understand exactly how it is expected to work. There are 4 distinct networking problems to address:
Highly-coupled container-to-container communications: this is solved by Pods and localhost communications.
Pod-to-Pod communications: this is the primary focus of this document.
Pod-to-Service communications: this is covered by Services.
External-to-Service communications: this is also covered by Services.
Kubernetes is all about sharing machines between applications. Typically, sharing machines requires ensuring that two applications do not try to use the same ports. Coordinating ports across multiple developers is very difficult to do at scale and exposes users to cluster-level issues outside of their control.
Dynamic port allocation brings a lot of complications to the system – every application has to take ports as flags, the API servers have to know how to insert dynamic port numbers into configuration blocks, services have to know how to find each other, etc.
解决方案
Kubernetes 网络插件是一种扩[……]
「Kubernetes」- 配置 Calico 组件
解决方案
Install Calico networking and network policy for on-premises deployments Troubleshoot and diagnostics/Configure NetworkManager
cat > /etc/NetworkManager/conf.d/calico.conf <<EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico
EOF
参考文献
About Calico About Kubernetes Networking[……]
「Calico」- 常见问题处理
问题描述
该笔记将记录:在 Kubernetes Cluster 中,与 Calico 有关的常用设置,以及相关问题处理。
解决方案
FIXME Kubernetes Calico 在 ARM64 中,经常重启无法成功运行;
calico/node is not ready: BIRD is not ready: BGP not established with 172.21.0.1
Calico readiness and liveliness probe fails · Issue #2042 · projectcalico/calico Configuring calico/node calico/node is not ready: BIRD is not ready: BGP not established (Calico 3.6 / k8s 1.14.1) #2561
问题描述
在集群中的 calico-node 处于 Ready 0/1 状态,并且 Events 显示 calico/node is not ready: BIRD is not ready: BGP not established with 172.21.0.1 消息:
# kubectl get pods -n kube-system -o wide
…
calico-node-77gbb 0/1 Running 0 25s 172.16.187.21 k8scp-01 <none> <none>
calico-node-p6g6x 0/1 Running 0 25s 172.16.159.15 cita-cloud-staging <none> <none>
…
# kubectl describe pods -n kube-system calico-node-77gbb
…
Normal Started 102s kubelet Started container calico-node
Normal Pulled 102s kubelet Container image “docker.io/calico/node:v3.18.1” already present on machine
Normal Created[……]
「Kubernetes」- 使用calico插件时,拉取pause镜像失败
问题描述
在部署Calico网络组件时,它会拉取k8s.gcr.io/pause镜像。
即使初始化时指定私有镜像仓库,它还是会拉取k8s.gcr.io/pause镜像。(可能这与初始化并无关系)
问题原因
该镜像(pause)用于使多个容器运行在壹个POD中。该容器持有POD的网络命令空间,使用该容器获取各自POD的IP地址,并设置加入该POD的其他容器的网络命名空间。
解决办法
使用kubelet的–pod-infra-container-image选项指定pause镜像地址。
在CentOS 7中,可以修改/etc/sysconfig/kubelet配置文件,内容大致如下:
KUBELET_EXTRA_ARGS=”–pod-infra-container-image=’private-registry/foo/pause:<tag>'”
参考文献
bootstrap kubernetes from private registry #76155 What is the use of a pause image in Kubernetes? Kubernetes/REFERENCE/kubelet[……]
「12.Maintenance and Troubleshooting」
在本章的各节中,我们将介绍「应用级别」和「集群级别」的维护。
我们还将从多个角度介绍「故障排除」,包括调试pod和容器,测试服务的连接性,解读资源的状态,以及节点维护。
最后我们还将介绍如何使用etcd,即 Kubernetes的控制层面的存储组件。
本章主要面向集群管理员和应用开发人员。
12.2. Removing a Pod from a Service
对于定义良好并由几个pod支持的服务(请参阅5.1节),如果其中一个pod出现了问题,如何将这个pod从访问点列表中移除,以便稍后再进行检查?
可以使用–overwrite-参数重新标记该pod,通过该参数可以改写pod上run命令的标签。通过改写标签,可以确保该pod不会被服务选择器(请参阅5.1节)选中,并从访问点列表中移除该pod同时,负责监视pod的副本集会发现一个pod消失不见了,从而启动一个新的副本。
(1)首先使用 kubectl run(参阅4.4节)生成一个简单的部署: kubectl run nginx –image nginx –replicas 4
(2)当查看pod时,请注意观察字段run中显示的标签,你会看到有4个pod的值为 nginx (run=nginx是 kubectl run命令自动生成的标签):
# kubectl get pods -Lrun
(3)然后为这个部署建立一个服务并查看访问点(每个访问点对应于各自的podIP地址):
# kubectl expose deployments nginx –port 80
# kubectl get endpoints
(4)接下来,可以通过一个简单的命令将第一个pod从服务列表中删除:
# kubectl label pods “nginx-d5dc44cf7-5845r” run=notworking –overwrite
(!!!本质上就是修改了LABEL,使得Service不再选择该Pod!!!)
为了找到pod的IP地址,你可以通过JSON格式查看pod清单文件并运行一个 JQuery查询:
#kubectl get pods nginx-d5dc44cf7-5845r -o json | jq-r. status.podIP
一个新的标记为run=nginx的Pod出现在列表中, notworking的pod依然存在,但是不会再出现在服务访问点列表中:
12.3. Accessing a ClusterIP Service Outside the Cluster
如果内部服务[……]
「Kubernetes」- 使用DaemonSet时,主节点没有运行Pod实例
内容简介
处理「当使用DaemonSet时,没有在主节点创建Pod实例」问题。
问题描述
在以DaemonSet方式部署Traefik Ingress Controller之后,没有在Master节点上创建Pod实例。因此不能通过Master节点来访问服务,但是我们希望Master节点中也运行Pod实例。
经过一番Google查找,学习「Taints and Tolerations」文档。
问题原因(正常情况)
因为从1.6开始,不会再将DaemonSet调度到主节点上。由于主节点上有node-role.kubernetes.io/master及NoSchedule污点,而Pod没有容忍该污点,所以不会调度到主节点上。
!!!既然官方已经不建议这么做了,如果没有必要就不要向主机调度Pod了,除非是出于监控或者指标收集等原因。
解决办法(正常情况)
我参考了「Kubernetes ds won’t run pod on master node」与「Scheduler is not scheduling Pod for DaemonSet in Master node」这两个问题。
正确的解决办法其实是在DaemonSets的Pod定义中添加如下配置:
tolerations:
– key: node-role.kubernetes.io/master
effect: NoSchedule
问题原因(我的情况)
我的情况有点特殊:症状是常见的症状,但是成因却稍微有所不同。
因为在第一次遇到这个问题之后,由于不懂,我一顿搜索搜索之后,执行了kubectl taint nodes k8s-master key=value:NoSchedule与kubectl taint nodes –all node-role.kubernetes.io/master-命令。当执行第一条命令之后,将不会有Pod调度到主节点上。之后,执行第二条命令,虽然删除了node-role.kubernetes.io/master污点,但是依旧不能调度,因为Pod不能容忍第一个污点。
解决办法(我的情况)
不是常规成因,所以也不是常规的解决办法。
最后我也发现:由于之前的测试,在Master节点上添加了Taint的NoSchedule标记,从而导致后面创建的Pod示例无法调度到该节点上。因此去掉该Taint即可。(而最好的解决办法是把Master的node-role.kubernetes.io/master污点还给人家,然后运行正常的解决办法。)
注意事项
由于主节点具有一定的特殊性,出于安全及角色的原因,其实不建议在Master节点上运行Pod实例。[……]
「Kubernetes」- etcd-k8scp-01
[……]
「Kubernetes」- 无法从主节点访问 NodePort 服务
# 10/01/2019 我们首次遇见该问题 # 05/08/2021 从那以后我们未再遇到该问题,当时是因为 Docker 的版本过旧(完全能够这样理解)。如果再次遇到该问题,很可能是因为其他原因导致的; # 04/14/2022 我们再次遇到类似问题,除了 Pod 所在节点能够通过 NodePort 访问,而无法从其他节点通过 NodePort 访问;
问题描述
定义 Deployment 资源,定义 Service 资源,并且 Selector 与 Label 都是正确的。启动 Service 的 NodePort 为 32340 端口。
正常结果:在正常情况下,不管是通过 Master 还是 Node 节点,都可以访问 NodePort 服务。
问题状况:我们无法通过 Master 节点的 IP 地址来访问 NodePort 服务。通过 http://node-address:32340/ 正常访问服务,但是通过 http://master-address:32340/ 只会得到超时。
系统环境
CentOS Linux release 7.5.1804 (Core) Docker version 1.13.1, build b2f74b2/1.13.1 Kubernetes v1.14.0
原因分析
这个问题已经有人遇到过了:Handle nodes with iptables FORWARD DROP better #39823
这个问题是由 Docker 导致的。如「vendor libnetwork \@1861587 #28257」所述: 1)如果 net.ipv4.ip_forward=1 参数是由 Docker 所设置,则 iptables 的 FORWARD 会被设置为 DORP 策略。 2)如果是由用户设置 net.ipv4.ip_forward=1 参数,则用户可能会进行某些意图需要 FORWARD 为 ACCEPT 策略,这时候 Docker 就不会去修改 FORWARD 策略。
解决办法
设置 net.ipv4.ip_forward=1 参数:
cat > /etc/sysctl.d/99-ipv4_forward.conf <<EOF
net.ipv4.ip_forward=1
EOF
sysctl –load=/etc/sysctl.d/99-ipv4_forward.conf
虽然我们用的是 Docker CE 版本,但是 moby 是 Docker 的”始祖“,并且那个 PR 已经合并到 Docker CE 了,所以上面的修改才生效。
相关链接
Kubernetes/Tasks/Debu[……]
「KUBERNETES-TROUBLESHOOT」- kube-controller-manager
[……]
「Kubernetes」- kube-scheduler-k8scp-01
当将节点加入集群时,主节点的 kube-scheduler-k8scp-01 发生重启。日志如下:
I0408 10:23:44.110342 1 configmap_cafile_content.go:202] Starting client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I0408 10:23:44.110368 1 shared_informer.go:240] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I0408 10:23:44.110404 1 configmap_cafile_content.go:202] Starting client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I0408 10:23:44.110424 1 shared_informer.go:240] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I0408 10:23:44.209318 1 shared_informer.go:247] Caches are synced for RequestHeaderAuthRequestController
I0408 10:23:44.209532 1 leaderelection.go:243] attempting to acquire leader lease kube-system/kube-scheduler…
I0408 10:23:44.210501 1 shared_informer.go:247] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I0408 10:23:44.210578 1 shared_informer.go:247] Caches are synced for client-ca::kube-system::exten[……]
「Kubernetes Troubleshoot」- 删除 CRD 资源
删除 CRD 资源
kubeless – Not able to completely remove Kubernetes CustomResource – Stack Overflow Custom resources with finalizers can “deadlock” customresourcecleanup.apiextensions.k8s.io finalizer · Issue #60538 · kubernetes/kubernetes
问题描述:部分 CRD 资源无法删除
原因分析:
So it turns out , the root cause was that Custom resources with finalizers can “deadlock”. The CustomResource “functions.kubeless.io” had a
Finalizers:
customresourcecleanup.apiextensions.k8s.io
and this is can leave it in a bad state when deleting.
https://github.com/kubernetes/kubernetes/issues/60538
解决方案:类似 Workaround 方案
# kubectl –kubeconfig /tmp/config get customresourcedefinitions.apiextensions.k8s.io | grep cattle
for i in $(kubectl –kubeconfig /tmp/config get customresourcedefinitions.apiextensions.k8s.io 2>/dev/null | grep cattle | awk ‘{print $1}’)
do
echo “# ———— $i ”
kubectl –kubeconfig /tmp/config patch crd/${i} -p ‘{“metadata”:{“finalizers”:[]}}’ –type=merge
kubectl –kubeconfig /tmp/config delete customresourcedefinitions.apiextensions.k8s.io ${i}
done[……]
「Kubernetes Debugging」- node XXX already cordoned
在执行 kubectl drain node1 –ignore-daemonsets 剔除节点时卡住
参考文献
When you try to drain a Kubernetes node but it blocks ?[……]
「Kubernetes」- Namespace 卡在 Terminating 状态
解决方案
# kubectl get namespace <terminating-namespace> -o json >tmp.json
{
“apiVersion”: “v1”,
“kind”: “Namespace”,
“metadata”: {
“creationTimestamp”: “2018-11-19T18:48:30Z”,
“deletionTimestamp”: “2018-11-19T18:59:36Z”,
“name”: “<terminating-namespace>”,
“resourceVersion”: “1385077”,
“selfLink”: “/api/v1/namespaces/<terminating-namespace>”,
“uid”: “b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5”
},
“spec”: {
“finalizers”: []
},
“status”: {
“phase”: “Terminating”
}
}
kubectl proxy
curl -k -H “Content-Type: application/json” -X PUT –data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize
临时记录
删除其他资源:
kubectl -n rook-ceph patch cephclusters.ceph.rook.io rook-ceph -p ‘{“metadata”:{“finalizers”: []}}’ –type=merge
参考文献
A namespace is stuck in the Terminating state – IBM Documentation rook-ceph stuck in Terminating state : unable to delete · Issue #2668 · rook/rook · GitHub[……]
「Kubernetes」- etcd,常用维护操作
问题描述
该笔记将记录:在 Kubernetes Cluster 中,如何维护 etcd 组件,以及常见问题解决方案。
解决方案
管理 etcd 集群
How to access kubernetes keys in etcd – Stack Overflow Operating etcd clusters for Kubernetes | Kubernetes etcdctl v3 environment variables · Issue #6645 · etcd-io/etcd · GitHub
export ETCDCTL_API=3
export ETCDCTL_CACERT=’/etc/kubernetes/pki/etcd/ca.crt’ # –cacert
export ETCDCTL_CERT=’/etc/kubernetes/pki/etcd/server.crt’ # –cert
export ETCDCTL_KEY=’/etc/kubernetes/pki/etcd/server.key’ # –key
export ETCDCTL_ENDPOINTS=’172.31.253.61:2379,172.31.253.62:2379,172.31.253.63:2379′ # –endpoints
# etcdctl member list
4d763151a94a71ad, started, k8scp-02, https://172.31.253.62:2380, https://172.31.253.62:2379
704c9040de8224e9, started, k8scp-03, https://172.31.253.63:2380, https://172.31.253.63:2379
f15c34749947bfb8, started, k8scp-01, https://172.31.253.61:2380, https://172.31.253.61:2379
# etcdctl member remove 704c9040de8224e9
# etcdctl endpoint status
# etcdctl endpoint health
# 获取 certificate key 参数
kubeadm init phase upload-certs –upload-certs
# 获取加入集群的命令
kubeadm token create –print-join-command –certificate-key “[……]
「KUBERNETES-TROUBLESHOOT」- etcd
etcd 是 Kubernetes 集群中最关键的一部分。这一点从 etcd 在整个集群中引发的、以不同方式表现出来的大量问题可以看出来。经过非常仔细的研究,我们才找到根本原因,并扩展 etcd 以匹配我们预期的规模。
在扩展过程中,许多 Raft proposal 开始失败。
通过调查分析,我们发现,GCP 将 PD-SSD 磁盘的吞吐量限制在每秒 100MB 左右(如下图所示),我们的磁盘大小为 100G。GCP 没有提供增加吞吐量限制的方法——它只 随着磁盘的大小增加。尽管 etcd 节点只需要不到 10G 的空间,我们首先尝试了 1TB PD-SSD。然而,当所有 4k 个节点同时加入 Kubernetes 控制平面时,磁盘再大也会成为一个 瓶颈。我们决定使用本地 SSD,它的吞吐量非常高,代价是在出现故障时丢失数据的几率略高,因为它 不是持久化的。
在迁移到本地 SSD 后,我们并没有看到最快的 SSD 带来了预期的性能。我们用 FIO 直接在磁盘上做了一些基准测试,数值在意料之中。但是,对于所有成员的写入并发,etcd 基准测试讲述了一个不同的故事:本地 SSD 的表现更差!
经过深入调查,这是由 ext4 文件系统的写屏障缓存提交导致的。由于 etcd 使用写前日志,并在每次提交到 Raft 日志时调用 fsync,所以可以禁用写屏障。此外,我们在文件系统级和应用程序级有 DB 备份作业,用于 DR。在这样修改之后,使用本地 SSD 的数值提高到了与 PD-SSD 相当的程度。
这一改进的效果在 etcd 的 WAL 同步持续时间和后端提交延迟上体现了出来。
etcd 中默认的 MVCC 数据库大小为 2GB。在 DB 空间不足的告警被触发时,这个大小最大会增加到 8GB。由于该数据库的 利用率约为 60%,所以我们能够扩展到 20 万个无状态 Pod。
经过上述这些优化,在预期的规模下,集群更加稳定了,然而,在 API 延迟方面,我们的 SLI 还差很多。
etcd 服务器还会偶尔重启,仅一次重启就会破坏基准测试结果,尤其是 P99 值。仔细观察发现,v1.20 版的 etcd YAML 中有一个存活探针 Bug。为了解决这个问题,我们采用了一个变通办法,即增加失败阈值的计数。
在用尽所有方法对 etcd 进行了垂直扩展之后,主要是在资源方面(CPU、内存、磁盘),我们发现,etcd 的性能受到范围查询的影响。当范围查询很多时,etcd 的表现并不好,对 Raft 日志的写入也受到影响,增加了集群的延迟。
由于这些查询很耗时,etcd 的后端延迟受到了很大的影响。在事件资源上对 etcd 服务器进行分片管理后,我们看到,在 Pod 高度竞争的情况下,集群的稳定性有[……]
「kubelet」- 磁盘 I/O 极高
原因分析
内存压力导致磁盘 IO 极高。
解决方案
Kubelet & heapster extremely high disk i/o (reads) · Issue #47928 · kubernetes/kubernetes · GitHub Reserve Compute Resources for System Daemons | Kubernetes
1)通过处理内存占用高的应用,来环节内存压力; 2)然后,为应用程序增加 CPU、MEM 资源限制;
参考文献
Kubelet & heapster extremely high disk i/o (reads) · Issue #47928 · kubernetes/kubernetes · GitHub Reserve Compute Resources for System Daemons | Kubernetes[……]
「Kubernetes」- 管理与配置
该部分笔记整理:Kubernetes Cluster 管理与日常维护工作。
但是本部分不包含:对象的管理(比如部署、服务、定时任务等等)
Namespaces Walkthrough Why disable swap on kubernetes
如何利用kubernetes实现应用的水平扩展(HPA)ingre
Networking and Network Policy K8S的apiVersion该用哪个 kubernetes-dashboard获取令牌登陆 Custom HTTP Port
# TODO kubelet https://kubernetes.io/docs/reference/kubectl/kubectl[……]
「K3s」- 搭建实验环境
问题描述
该笔记将记录:如何使用 K3s 快速搭建 Kubernetes 环境,以及相关问题解决方法。
解决方案
版本:v1.22.6+k3s1 https://github.com/k3s-io/k3s/releases/tag/v1.22.6%2Bk3s1
第一步、Run Master
# wget https://github.com/k3s-io/k3s/releases/download/v1.22.7%2Bk3s1/k3s # 下载 k3s 文件
# k3s server # 启动节点
INFO[0000] Acquiring lock file /var/lib/rancher/k3s/data/.lock
INFO[0000] Preparing data dir /var/lib/rancher/k3s/data/31ff0fd447a47323a7c863dbb0a3cd452e12b45f1ec67dc55efa575503c2c3ac INFO[0000] Starting k3s v1.22.7+k3s1 (8432d7f2)
INFO[0006] Configuring sqlite3 database connection pooling: maxIdleConns=2, maxOpenConns=0, connMaxLifetime=0s
…
# k3s kubectl get nodes # 查看状态
NAME STATUS ROLES[……]
「Kubernetes」- 创建集群
使用kubeadm安装集群,kubeadm也是安装其他程序的基础。
如何获取工作平面;工作节点相关的可执行文件。
使用hyperkube建立容器化的Kubernetes,并演示如果创建systemd文件以监管Kubernetes组件。
在Google Cloud和Azure上建立集群。
2.3. Downloading a Kubernetes Release from GitHub
https://github.com/kubernetes/kubernetes/releases
记得检查下载文件的HASH值。
2.4. Downloading Client and Server Binaries
源码中并不包含可执行文件(考虑到大小),需要单独下载:
kubernetes/cluster/get-kube-binaries.sh
-> kubernetes/cluster/client/bin/
kubectl
kubefed
-> kubernetes/cluster/server/bin/
cloud-controller-manager
kube-api-server
上面下载的是最新的版本。如果要下载指定版本,可以访问“https://storage.googleapis.com/kubernetes-release/”%E4%B8%8B%E8%BD%BD
2.5. Using a hyperkube Image to Run a Kubernetes Master Node with Docker
将Kubernetes运行在容器中:hyperkube + etcd
etcd:键值分布式存储。用于保存集群的状态;
hyperkube:以Docker镜像的方式提供的一站式可执行文件。使用该镜像启动所有的Kubernetes进程。
#!/bin/sh
# 首先启动etcd服务:
docker run -d –name=k8s -p 8080:8080 \
gci.io/google_containers/etcd:3.1.10 etcd \
–data-dir /var/lib/data
# 使用hyperkube启动API服务:
docker run -d –net=container:k8s
gcr.io/google_containers/hyperkube:v1.7.11 apiserver \
–etcd-servers=http:/[……]