Kubernetes运维:小知识点合集
文章目录
Kubernetes 开发使用过程中的一些Tips,持续更新!
调整 Pod 迁移时间
当节点宕机时,Kubernetes会自动迁移该节点上的部分Pod,以下调整以下参数可以加快故障发现和迁移时间。
由于 Kubernetes 1.13 -> 1.18 版本中Pod驱逐策略有所修改,1.18以上版本完全基于 TaintBasedEvictions 进行节点驱逐,部分低版本参数已经完全失效。
以下参数在 1.20 版本上测试OK:
Kube-Controller-Mangaer服务相关参数:
- node-monitor-period:同步节点状态的周期,默认5s
- node-monitor-grace-period:运行节点在标记为NotReady之前没有响应的时间,默认40s
- node-startup-grace-period:启动节点在标记为NotReady之前没有响应的时间,默认1m0s
- pod-eviction-timeout:NotReady节点Pod驱逐时间,,默认300s(TaintBasedEvictions开启时,这个配置不生效)
TaintBasedEvictions当功能开启时,Kube-Apiserver基于Admission在节点创建时自动添加Toleration,对应的Admission名称为 DefaultTolerationSeconds,默认情况下是开启的。
Kube-Apiserver服务相关参数:
- default-not-ready-toleration-seconds:300s
- default-unreachable-toleration-seconds:300s
Kubelet服务相关参数:
- node-status-update-frequency:指定kubelet多长时间向master发布一次节点状态,默认40s,且必须是node-monitor-grace-period的N分之一
参考:https://blog.csdn.net/hongxiaolu/article/details/113711739
处理宕机节点的PVC卷
当容器使用持久卷时,K8S中的卷控制器会根据accessModes的模式限制卷的挂载和卸载行为。
在宕机场景下,ReadWriteOnce和ReadWriteOncePod模式可能会导致Pod新副本的创建阻塞。此时需要使用“–force –grace-period=0”参数强制删除Pod,并且等待6~10min,Kubernetes会对PVC进行强制dettach操作。
Service的DNS域名
- 普通服务 clusterIP or NodePortNodePort:
. 。.svc.cluster.local - Headless Services:
. 表示多个IP,解析的情况可能是每次不同的。pod的确定IP通过**.svc.cluster.local - . . .svc.cluster.local, - SVC包含多个端口:通过 <_my-port-name>.<_my-port-protocol>.
. 的方式访问服务,Kubernetes将这个域名解析为SRV records,表示domain:port.svc.cluster.local
关于DNS服务
CoreDNS通过Deployment的方式部署,对应的SVC kube-dns,默认情况的这个服务的IP非常重要。
每个Pod可以独立设定DNS解析策略,包括:
DNS策略 | 说明 |
---|---|
Default | 完全宿主机继承resolv.conf |
None | 用户需要额外配置 dnsConfig 来描述DNS参数 |
ClusterFirst | 默认配置,kube-dns作为DNS服务的地址。如果用户使用HostNetWork=true,ClusterFirst 就会被强制转换成 Default。 |
ClusterFirstWithHostNet | 使用 HostNetwork 同时使用ClusterFirst。 |
Pod的DNS配置
通过 DNS Config 手工指定Pod的DNS解析方式。
|
|
DNS解析规则
默认情况,resolv.conf的配置如下,参考这个blog理解配置的含义。
|
|
关于DNS解析失败时如何排除故障:参考
Pod的DNS
Pod 同样可以分配到相应的DNS记录,格式为:pod-ip-address.my-namespace.pod.cluster.local。但是一般不会使用该记录访问Pod,pod间通信依然通过svc。
在 Pod 的Spec中可以指定 Hostname 以及 subdomain。Kubernetes会将在Pod中 my_hostname.my_default-subdomain.default.svc.cluster.local 的映射关系添加到/etc/hosts文件中。
Pod安全策略
PodSecurityPolicy
Pod安全策略是集群级别的用于控制 pod 安全相关选项的一种资源,对应的资源是PodSecurityPolicy。
通过Pod的安全策略可以限制以下内容(【参考】):
Control Aspect | Field Names | 说明 |
---|---|---|
容器Root权限 | privileged | 1.为true时,容器内的root用户在容器外有真正的root权限,否则该用户只是一个普通用户。 |
虚拟化ns相关 | hostPID hostIPC |
1. 使用数组机的PID和IPC空间 |
网络相关 | hostNetwork hostPorts |
使用宿主机网络; hostPort通过iptable的手段连通容器和调度node的一个端口; |
存储相关 | volumes allowedHostPaths allowedFlexVolumes |
1. 允许使用volume的类型 2.允许使用的hostPath路径列表 3.flex存储卷的白名单 |
只读root文件系统 | readOnlyRootFilesystem | 将除了volume以外的文件全部设定为只读 |
容器的用户id和组id | runAsUser runAsGroup fsGroup supplementalGroups |
1. 指定容器的 user ID 和 primary group ID。默认情况下,用户使用root(0) 2. fsGroup 用拿来指定volume所属的Group ID,并且将fsGroup指定的ID作为容器进程补充Group 3. supplementalGroups和fsGroup同样用于存储,但是主要用于共享存储 |
禁止提升到root权限 | allowPrivilegeEscalation defaultAllowPrivilegeEscalation |
决定容器进程能否进行权限提升,该配置直接影响容器的 NO_NEW_PRIVS |
Linux Capabilities | defaultAddCapabilities requiredDropCapabilities allowedCapabilities |
基于Linux Capabilities功能来进行权限控制。 |
SELinux上下文 | seLinux |
使用PodSecurityPolicy
时,需要在 KUBE-APISERVER 中设置 --enable-adminssion-plugins=PodSecurityPolicy
。默认情况下,K8S不会启动PodSecurityPolicy,可以通过在enable-adminssion-plugins中附加PodSecurityPolicy开启这个功能。
PodSecurityPolicy产生作用的路径:
- 创建PodSecurityPolicy资源
- 将PodSecurityPolicy和serviceaccount绑定
- 在Deploy或者其他控制器中指定serviceaccount
- 创建准入的Pod
SecurityContext和PodSecurityContext
用户可以在容器/Pod级别进行安全控制,对应的字段为 securityContext/podSecurityContext
,当同时定义时前者覆盖后者。
securityContext
字段可以指定以下内容:【参考SecurityContext 】,
PodSecurityContext
包含SecurityContext
大部分选项(更少一些),但是多出一个sysctls
,通过这个配置可以控制启动容器的系统参数。
PVC:reclaimPolicy
PVC 支持三种卷回收模式,包括:
- Delete
- Recycle
- Retain:删除PVC时
参考
编译 Kubernetes
注意事项:
- 编译时依赖以下镜像:
- k8s.gcr.io/build-image/kube-cross:v1.15.15-legacy-1(手工从 linqing2017/kube-cross:v1.15.15-legacy-1 拉取镜像,之后 tag 成原有名字)
- 关于编译的基础镜像可以通过环境变量 KUBE_CROSS_IMAGE 和 KUBE_CROSS_VERSION 指定
- 编译命令:
- build/run.sh make: 只编译linux版本的二进制文件
- build/run.sh make cross: 交叉编译所有版本(PS:KUBE_BUILD_PLATFORMS=
/ 指定特殊版本) - build/run.sh make kubectl: 编译指定的二进制文件
- 生成release安装包:
- build/release.sh
文章作者 yoaz
上次更新 2021-11-26
许可协议 MIT