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