Kubernetes

如何保证服务持续性

  • Application设计和部署
    • 在日常使用和在Application的升级过程中,为了保持高可用,K8S需要了解Application的运行状态,这要求Application要正确实现Startup,ReadinessLiveness探针。
      • Readiness探针:当应用暂时不能提供服务,但可以在某个时间恢复,使用Readiness探针网络流量先暂时不被路由到这个应用。
      • Liveness探针:当应用处于broken状态,必须要被重新deploy来解决时,使用Liveness探针。
      • Startup探针:某些应用在首次初始化时需要额外的启动时间,但将Liveness探针设置成这个时间又会丧失后续应用的敏感性,这种情况可以使用Startup探针。可以将它设置成和Liveness探针一样的命令,但拥有更长的时间。
    • 使用Pod Anti-AffinityNode Affinity来保证Replica部署在不同的AZ(Availability Zone)和Node中,以减轻单AZ或单Node故障带来的影响。
    • 如使用默认的Rolling Upgrade策略,利用maxSurgemaxUnavailable来调整升级的最大并发数,以保证高可用。
      • maxSurge:可以多启动多少个Replica。
      • maxUnavailable:可以接受同时最多有多少个Replica被减除。
    • 确保SIGTERM可以graceful关闭Pod,如SIGTERM不能被正确处理时,考虑使用Lifecycle hook PreStop钩子。
  • Kubernetes集群升级
    • 每次升级1个Node,以保证集群的高可用。使用drain同evict的Pod。
    • 配置Pod Disruption Budgets限制Application在升级期间同时关闭的Pod数量。通过定义PDB可以确保始终运行最少数量的Pod,从而保持应用程序的可用性。

RBAC

RBAC 在Kubernetes中通过以下几个关键资源实现:

  • Role 和 ClusterRole:这些资源定义了一组规则,表示一组权限。Role 通常用于命名空间范围内的权限分配,而 ClusterRole 用于集群范围内的权限分配。
  • RoleBinding 和 ClusterRoleBinding:这些资源将角色(Role 或 ClusterRole)绑定到用户、组或服务账户上。RoleBinding 是命名空间级别的,而 ClusterRoleBinding 可以授予访问集群范围内所有命名空间的权限。

假设有定义如下的Role:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

将Role绑定到用户和组:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: john.doe@example.com
  apiGroup: rbac.authorization.k8s.io
- kind: Group
  name: developers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

将Role绑定到Service Account:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: cross-namespace-accessor
  namespace: default
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: pod-reader-global
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods-global
subjects:
- kind: ServiceAccount
  name: cross-namespace-accessor
  namespace: default
roleRef:
  kind: ClusterRole
  name: pod-reader-global
  apiGroup: rbac.authorization.k8s.io

参考资料