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:..svc.cluster.local 表示多个IP,解析的情况可能是每次不同的。pod的确定IP通过**-...svc.cluster.local,
  • SVC包含多个端口:通过 <_my-port-name>.<_my-port-protocol>...svc.cluster.local 的方式访问服务,Kubernetes将这个域名解析为SRV records,表示domain:port

关于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解析方式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4
    searches:
      - ns1.svc.cluster.local
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0

DNS解析规则

默认情况,resolv.conf的配置如下,参考这个blog理解配置的含义。

1
2
3
4
nameserver 10.96.0.10
search <namespace>.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

关于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时

参考

Pod 安全策略 Kubernetes API

编译 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

【参考文档】