rules <[ ] Object>
apiGroups <[ ] string>
nonResourceURLs <[ ] string>
resourceNames <[ ] string>
resources <[ ] string>
verbs <[ ] string> - required-
结果显示:
clusterrole相对于role的属性多了一个集中控制器的属性aggregationRule,而这是一个可选的属性
命令行创建clusterrole,查看具有pod资源的get、list权限的属性信息
[root@kubernetes-master1 ~]
apiVersion: rbac. authorization. k8s. io/v1
kind: ClusterRole
metadata:
creationTimestamp: null 时间信息
name: myclusterrole role的名称
rules: 授权规则
- apiGroups: 操作的对象
- "" 所有权限
resources: 资源对象
- pods pod的对象
verbs: 对pod允许的权限
- get 获取
- list 查看
结果显示:
ClusterRole与role的配置一样,也由三部分组成:apiGroup、resources、verbs
简单实践
按照上面的clusterrole格式,我们写一个clusterrole资源文件, 允许用户操作 Deployment、Pod、RS 的所有权限
[root@kubernetes-master1 /data/kubernetes/secure]
apiVersion: rbac. authorization. k8s. io/v1
kind: ClusterRole
metadata:
name: myclusterrole
rules:
- apiGroups: [ "" ]
resources: [ "pods" ]
verbs: [ "get" , "list" , "watch" ]
创建资源对象
[root@kubernetes-master1 /data/kubernetes/secure]
clusterrole. rbac. authorization. k8s. io/myclusterrole created
查看效果
[root@kubernetes-master1 /data/kubernetes/secure]
Name: myclusterrole
Labels:
Annotations:
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
-- -- -- -- - -- -- -- -- -- -- -- -- - -- -- -- -- -- -- -- -- -- -
pods [ ] [ ] [get list watch]
ClusterRole用户授权实践
限定用户只能访问命名空间资源
[root@kubernetes-master1 /data/kubernetes/secure]
查看资源效果
[root@kubernetes-master1 /data/kubernetes/secure]
NAME READY STATUS RESTARTS AGE
nginx-web 1/1 Running 0 68m
[root@kubernetes-master1 /data/kubernetes/secure]
Error from server ( Forbidden) : services is forbidden: User "superopsmsb" cannot list resource "services" in API group "" in the namespace "default"
[root@kubernetes-master1 /data/kubernetes/secure]
NAME READY STATUS RESTARTS AGE
coredns-5d555c984-hzq8q 1/1 Running 0 9h
清理授权
[root@kubernetes-master1 /data/kubernetes/secure]
rolebinding. rbac. authorization. k8s. io "super-clusterrolebind" deleted
小结
1.3.4 用户组实践
学习目标
这一节,我们从 基础知识、简单实践、小结 三个方面来学习。
基础知识
简介
在实际的工作中,往往会有一大批用户具有相同的角色权限,那么我们就没有必要为每一个用户赋予一些权限,这样的话太过繁琐。有一种简单的方法就是将用户加入到一个用户组,然后为用户组赋予操作权限,这样的话,该用户组的所有用户都会具有对应的操作权限。
创建用户的时候,用户组的设定
]
查看证书的用户组信息
]
Certificate:
. . .
Signature Algorithm: sha256WithRSAEncryption
. . .
Subject: CN=superopsmsb, O=superopsmsb
创建普通用户
[root@kubernetes-master1 /data/scripts]
批量设定远程主机免密码认证管理界面
=====================================================
1: 创建证书 2: 创建config 3: 退出操作
=====================================================
请输入有效的操作id: 1
请输入有效的证书信息( 用户名 组名 有效时间) : zhangsan superopsmsb 365
开始创建证书操作. . .
Generating RSA private key, 2048 bit long modulus
. . ++ +
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ++ +
e is 65537 ( 0x10001)
Signature ok
subject=/ CN=zhangsan/O=superopsmsb
Getting CA Private Key
批量设定远程主机免密码认证管理界面
=====================================================
1: 创建证书 2: 创建config 3: 退出操作
=====================================================
请输入有效的操作id: 2
请输入config文件名称( 示例: zhangsan. conf) : zhangsan. conf
开始创建config操作. . .
User "zhangsan" set .
Cluster "zhangsan" set .
Context "zhangsan@zhangsan" created.
Switched to context "zhangsan@zhangsan" .
批量设定远程主机免密码认证管理界面
=====================================================
1: 创建证书 2: 创建config 3: 退出操作
=====================================================
请输入有效的操作id: 3
开始退出管理界面. . .
简单实践
role用户赋权
创建role资源对象
kubectl apply - f 05_kubernetes_platform_secure_rbac_role. yaml
创建基于组的 rolebinding
kubectl create rolebinding super-rolebind -- role=myrole -- group =superopsmsb
正常演示效果效果
kubectl get pod -- kubeconfig=/ tmp/superopsmsb. conf
kubectl get pod -- kubeconfig=/ tmp/zhangsan. conf
异常演示效果
kubectl get svc -- kubeconfig=/ tmp/superopsmsb. conf
kubectl get svc -- kubeconfig=/ tmp/zhangsan. conf
还原环境
kubectl delete rolebindings super-rolebind
clusterrole用户赋权
创建clusterrole资源对象
kubectl apply - f 06_kubernetes_platform_secure_rbac_clusterrole. yaml
创建基于组的 rolebinding
kubectl create clusterrolebinding super-clusterrolebind -- clusterrole=myclusterrole -- group =superopsmsb
正常演示效果效果
kubectl get pod -- kubeconfig=/ tmp/superopsmsb. conf
kubectl get pod -- kubeconfig=/ tmp/zhangsan. conf
异常演示效果
kubectl get svc -- kubeconfig=/ tmp/superopsmsb. conf - n kube-system
kubectl get svc -- kubeconfig=/ tmp/zhangsan. conf - n kube-system
还原环境
kubectl delete clusterrolebinding super-clusterrolebind
小结
1.3.5 SA授权
学习目标
这一节,我们从 场景需求、简单实践、小结 三个方面来学习。
场景需求
简介
作为k8s平台的应用资源,肯定会出现平台上的A应用需要访问B应用的资源对象的一些情况,对于这种场景的需求,我们一般是直接借助于kubernetes的SA的token机制来实现的。
基本操作流程:
1 创建SA账号
2 创建Role角色
3 SA和Role角色进行绑定
4 使用pod内部的token进行通信认证测试
准备工作 - 升级django镜像(旧有django镜像的Python版本太低了,需要升级)
准备python镜像
docker pull python
docker tag python kubernetes-register. superopsmsb. com/superopsmsb/python
准备基准代码文件
cd / data / images/web/django/
cp - a django python
修改首页信息
. . .
version=os. environ. get( "PYTHON_VERSION" )
. . . .
定制Dockerfile文件
[root@kubernetes-master1 ~]
FROM kubernetes-register. superopsmsb. com/superopsmsb/python
MAINTAINER shuji@superopsmsb. com
RUN pip install django==3. 1. 2
ADD blog / data / code/blog
ADD scripts/startup. sh / data / scripts/startup. sh
EXPOSE 8000
CMD [ "/bin/bash" , "/data/scripts/startup.sh" ]
定制构造镜像
docker build - t kubernetes-register. superopsmsb. com/superopsmsb/django_web:v0. 2 / data / images/web/python/
测试构造镜像
docker run - d -- name django-test - p 666:8000 kubernetes-register. superopsmsb. com/superopsmsb/django_web:v0. 2
测试效果
curl 10. 0. 0. 12:666
docker rm - f django-test
提交镜像到远程仓库
docker push kubernetes-register. superopsmsb. com/superopsmsb/django_web:v0. 2
测试脚本
准备测试脚本
]
"" "
检测Kubernetes的SA令牌文件权限
" ""
from kubernetes import client, config
with open( '/var/run/secrets/kubernetes.io/serviceaccount/token' ) as f:
token = f. read( )
configuration = client. Configuration( )
configuration. host = "https://kubernetes"
configuration. ssl_ca_cert = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
configuration. verify_ssl = True
configuration. api_key = { "authorization" : "Bearer " + token}
client. Configuration. set_default( configuration)
apps_api = client. AppsV1Api( )
core_api = client. CoreV1Api( )
try :
print( "----显示default空间的Service资源对象----" )
for svc in apps_api. list_namespaced_service( "default" ) . items:
print( svc. metadata. name)
print( "Service名称: %s, 命名空间: %s" % ( svc. metadata. name, svc. metadata. namespace) )
except:
print( "没有访问default空间的Service资源对象的权限" )
try :
print( "----显示default空间的Pod资源对象----" )
for pod in core_api. list_namespaced_pod( "default" ) . items:
print( "Pod名称: %s, Pod地址: %s, 命名空间: %s" % ( pod. metadata. name, pod. status. pod_ip, pod. metadata. namespace) )
except:
print( "没有访问default空间的Pod资源对象的权限" )
try :
print( "----显示kube-system空间的Pod资源对象----" )
for pod in core_api. list_namespaced_pod( "kube-system" ) . items:
print( "Pod名称: %s, Pod地址: %s, 命名空间: %s" % ( pod. metadata. name, pod. status. pod_ip, pod. metadata. namespace) )
except:
print( "没有访问kube-system空间的Pod资源对象的权限" )
简单实践
创建资源
资源清单文件内容 08_kubernetes_platform_secure_sa_username. yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: superopsmsb
-- -
apiVersion: v1
kind: Pod
metadata:
name: django-web
spec:
containers:
- image: kubernetes-register. superopsmsb. com/superopsmsb/django_web:v0. 2
name: django
volumeMounts:
- mountPath: / var / run/secrets/tokens
name: superopsmsb-token
serviceAccountName: superopsmsb
应用资源对象
kubectl apply - f 08_kubernetes_platform_secure_sa_username. yaml
拷贝脚本文件到容器内部
kubectl cp / data / scripts/06_kubernetes_test_pod. py django-web:/
进入django-web环境中
kubectl exec - it django-web -- / bin/bash
安装模块插件
pip install kubernetes
测试效果
role赋权操作
kubectl apply - f 05_kubernetes_platform_secure_rbac_role. yaml
kubectl create rolebinding super-rolebind -- role=myrole -- serviceaccount=default:superopsmsb
django-web环境中测试效果
root@django-web:/
-- -- 显示default空间的Service资源对象-- --
没有访问default空间的Service资源对象的权限
-- -- 显示default空间的Pod资源对象-- --
Pod名称: django-web, Pod地址: 10. 244. 4. 9, 命名空间: default
Pod名称: my-deploy-6c44c54668-rzhmg, Pod地址: 10. 244. 5. 9, 命名空间: default
Pod名称: nginx, Pod地址: 10. 244. 4. 6, 命名空间: default
Pod名称: nginx-nosa, Pod地址: 10. 244. 5. 2, 命名空间: default
-- -- 显示kube-system空间的Pod资源对象-- --
没有访问kube-system空间的Pod资源对象的权限
clusterrole赋权操作
kubectl apply - f 06_kubernetes_platform_secure_rbac_clusterrole. yaml
kubectl create clusterrolebinding super-clusterrolebind -- clusterrole=myclusterrole -- serviceaccount=default:superopsmsb
django-web环境中测试效果
root@django-web:/
-- -- 显示default空间的Service资源对象-- --
没有访问default空间的Service资源对象的权限
-- -- 显示default空间的Pod资源对象-- --
Pod名称: django-web, Pod地址: 10. 244. 4. 9, 命名空间: default
. . .
-- -- 显示kube-system空间的Pod资源对象-- --
Pod名称: coredns-7dc9dcf7fd-4b8vp, Pod地址: 10. 244. 2. 4, 命名空间: kube-system
. . .
小结
1.3.6 SA秘钥
学习目标
这一节,我们从 场景需求、简单实践、小结 三个方面来学习。
场景需求
简介
我们以kubernetes的dashboard页面访问为例,基于SA的token信息做一个config的文件认证。
功能需求:
基于zhangsan的SA账号定制config文件,只允许访问superopsmsb的命名空间资源对象。
基于lisi的SA账号定制config文件,允许访问所有命名空间资源对象。
注意:
集群级别的权限,可以借助于默认的 Clusterrole -- cluster-admin
准备工作
创建命名空间
kubectl create ns superopsmsb
创建资源对象
kubectl create deployment nginx -- image kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1 -- replicas 3 - n superopsmsb
kubectl expose deployment nginx -- port 80 - n superopsmsb
简单实践
命名空间SA实践
定制SA资源清单文件
cat 03_kubernetes_platform_secure_sa_secret. yaml > 09_kubernetes_platform_secure_zhangsan_config. yaml
修改资源清单文件 09_kubernetes_platform_secure_zhangsan_config. yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: zhangsan
namespace: superopsmsb
-- -
apiVersion: v1
kind: Secret
metadata:
name: zhangsan-secret
namespace: superopsmsb
annotations:
kubernetes. io/service-account. name: zhangsan
type : kubernetes. io/service-account-token
定制集群权限角色策略
kubectl - n superopsmsb create role zhangsan -- verb="*" -- resource="*" -- dry-run=client
echo '---' >> 09_kubernetes_platform_secure_zhangsan_config. yaml
kubectl - n superopsmsb create role zhangsan -- verb="*" -- resource="*" -- dry-run=client - o yaml >> 09_kubernetes_platform_secure_zhangsan_config. yaml
定制集群权限绑定策略
kubectl - n superopsmsb create rolebinding zhangsan-rolebind -- role=zhangsan -- serviceaccount=superopsmsb:zhangsan -- dry-run=client
echo '---' >> 09_kubernetes_platform_secure_zhangsan_config. yaml
kubectl - n superopsmsb create rolebinding zhangsan-rolebind -- role=zhangsan -- serviceaccount=superopsmsb:zhangsan -- dry-run=client - o yaml >> 09_kubernetes_platform_secure_zhangsan_config. yaml
创建资源对象
kubectl apply - f 09_kubernetes_platform_secure_zhangsan_config. yaml
定制config文件的集群内容
kubectl config set-cluster kubernetes -- certificate-authority=/ etc/kubernetes/pki/ca. crt -- server="https://10.0.0.200:6443" -- embed-certs=true -- kubeconfig=/ root/dashboard-zhangsan. conf
定制config文件的用户内容
NAMESPACE_TOKEN=$( kubectl - n superopsmsb get secrets $( kubectl get secret - n superopsmsb | awk '/zhangsan/{print $1}' ) - o jsonpath={ . data . token} | base64 - d)
kubectl config set-credentials dashboard-zhangsan -- token=$NAMESPACE_TOKEN -- kubeconfig=/ root/dashboard-zhangsan. conf
定制config文件的上下文内容
kubectl config set-context dashboard-zhangsan@kubernetes -- cluster=kubernetes -- user=dashboard-zhangsan -- kubeconfig=/ root/dashboard-zhangsan. conf
kubectl config use-context dashboard-zhangsan@kubernetes -- kubeconfig=/ root/dashboard-zhangsan. conf
确认效果
kubectl get pod - n superopsmsb -- kubeconfig / root/dashboard-zhangsan. conf
kubectl get pod - n kube-system -- kubeconfig / root/dashboard-zhangsan. conf
下载 dashboard-superopsmsb. conf 文件到宿主机,然后用宿主机进行应用访问
集群级别SA实践
定制SA资源清单文件
cat 03_kubernetes_platform_secure_sa_secret. yaml > 10_kubernetes_platform_secure_lisi_config. yaml
修改资源清单文件 10_kubernetes_platform_secure_lisi_config. yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: lisi
namespace: superopsmsb
-- -
apiVersion: v1
kind: Secret
metadata:
name: lisi-secret
namespace: superopsmsb
annotations:
kubernetes. io/service-account. name: lisi
type : kubernetes. io/service-account-token
定制集群权限绑定策略
kubectl create clusterrolebinding lisi-clusterrolebind -- clusterrole=cluster-admin -- serviceaccount=superopsmsb:lisi -- dry-run=client
echo '---' >> 10_kubernetes_platform_secure_lisi_config. yaml
kubectl create clusterrolebinding lisi-clusterrolebind -- clusterrole=cluster-admin -- serviceaccount=superopsmsb:lisi -- dry-run=client - o yaml >> 10_kubernetes_platform_secure_lisi_config. yaml
创建资源对象
kubectl apply - f 10_kubernetes_platform_secure_lisi_config. yaml
定制config文件的集群内容
kubectl config set-cluster kubernetes -- certificate-authority=/ etc/kubernetes/pki/ca. crt -- server="https://10.0.0.200:6443" -- embed-certs=true -- kubeconfig=/ root/dashboard-lisi. conf
定制config文件的用户内容
NAMESPACE_TOKEN=$( kubectl - n superopsmsb get secrets $( kubectl get secret - n superopsmsb | awk '/lisi/{print $1}' ) - o jsonpath={ . data . token} | base64 - d)
kubectl config set-credentials dashboard-lisi -- token=$NAMESPACE_TOKEN -- kubeconfig=/ root/dashboard-lisi. conf
定制config文件的上下文内容
kubectl config set-context dashboard-lisi@kubernetes -- cluster=kubernetes -- user=dashboard-lisi -- kubeconfig=/ root/dashboard-lisi. conf
kubectl config use-context dashboard-lisi@kubernetes -- kubeconfig=/ root/dashboard-lisi. conf
测试效果
kubectl get pod - n kube-system -- kubeconfig / root/dashboard-lisi. conf
下载 dashboard-cluster. conf 文件到宿主机,然后用宿主机进行应用访问
小结
1.4 准入实践
1.4.1 准入基础
学习目标
这一节,我们从 基础知识、流程解读、小结 三个方面来学习。
基础知识
简介
准入控制( Admission Control) 是一段代码,它会在请求通过认证和授权之后、对象被持久化之前拦截到达 API 服务器的请求。实际上是一个准入控制器插件列表并编译进 kube-apiserver 可执行文件,并且只能由集群管理员配置。准入控制器可以执行 “验证(Validating)” 和/ 或 “变更(Mutating)” 操作。
发送到APIServer的请求都需要经过这个列表中的每个准入控制器插件的检查,如果某一个控制器插件准入失败,就准入失败。它主要涉及到pod和容器对特定用户和特定权限之间的关联关系。
比如操作的对象是否存在依赖关系、被操作的对象是否能够增删改查等限制。
Kubernetes 的许多高级功能都要求启用一个准入控制器,以便正确地支持该特性。 因此,没有正确配置准入控制器的 Kubernetes API 服务器是不完整的,它无法支持你所期望的所有特性。而且越来越多的控制性功能组件以准入控制器的样式出现。
准入机制
准入控制过程分为两个阶段,运行变更准入控制器 和 运行验证准入控制器。 实际上,某些控制器既是变更准入控制器又是验证准入控制器。如果任何一个阶段的任何控制器拒绝了该请求,则整个请求将立即被拒绝,并向终端用户返回一个错误。
最后,除了对对象进行变更外,准入控制器还可以有其它作用:将相关资源作为请求处理的一部分进行变更。 增加使用配额就是一个典型的示例,说明了这样做的必要性。 此类用法都需要相应的回收或回调过程,因为任一准入控制器都无法确定某个请求能否通过所有其它准入控制器。
准入控制器类型
kubernetes的准入控制器主要有两种类型:
内置的静态准入控制器组件
- 基于kube-apiserver启动时候设置的控制器属性
扩展的动态准入控制器组件
- 用于接收准入请求并对其进行处理的 HTTP 回调机制
流程解读
控制器配置
准入控制器需要在kube-apiserver中进行配置,我们的kubeadm的kube-apiserver的配置文件中就通过属性开启了准入控制器:
20: - -- enable-admission - plugins=NodeRestriction
准入控制器使用
启用准入控制器
kube-apiserver -- enable-admission - plugins=xxx, xxx, . . .
关闭准入控制器
kube-apiserver -- disable-admission - plugins=xxx, xxx, . . .
查看准入控制器
kube-apiserver - h | grep enable-admission - plugins
更多控制器的作用:https:/ / kubernetes. io/zh-cn/docs/reference/access-authn-authz/admission-controllers/
查看默认开启的准入控制器
[root@kubernetes-master1 ~]
-- enable-admission - plugins strings admission plugins that should be enabled in addition to default enabled ones ( NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, PodSecurity, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota) . Comma-delimited list of admission plugins: AlwaysAdmit, . . . .
结果显示:
默认启用了 18个 准入控制器。
常见与pod相关的准入控制器
limitranger
为Pod添加默认的计算资源需求和计算资源限制;以及存储资源需求和存储资源限制; 支持分别在容器和Pod级别进行限制;
resourcequota
限制资源数量,限制计算资源总量,存储资源总量;资源类型名称
ResourceQuotapodsecuritpolicy
在集群级别限制用户能够在Pod上可配置使用的所有securityContext。由于RBAC的加强,该功能在 Kubernetes v1. 21 版本中被弃用,将在 v1. 25 中删除
小结
1.4.2 优先调度
学习目标
这一节,我们从 场景解析、简单实践、小结 三个方面来学习。
场景解析
资源调度
资源调度为即将执行的任务,选择合理的节点Pod调度为即将执行的任务,分配合理的逻辑关联搭配污点调度在任务调度的时候,设定一些避免措施拓扑调度在任务已确定调度的前提下,合理的分配任务,实现资源的高效利用。按照调度的基本属性可以划分为:
节点调度、pod调度、污点调度、拓扑调度
调度优先级
在实际的工作场景中,往往会因为应用资源的需求特点,我们在调度的时候,可能先出现的应用可以正常的运行,在后出现的资源对象往往会因为资源不足而无法调度。
如果后续创建的pod的重要性比较高,如果以默认的资源调度方式实现pod创建的话,导致无法创建,所以我们会引入pod优先级的概念,如果当前pod优先级比较高的话,我们可以抢占优先级值较低的pod资源。
在一个并非所有用户都是可信的集群中,恶意用户可能以最高优先级创建 Pod, 导致"调度队列" 中的其他 Pod 被驱逐或者无法被调度。管理员可以使用 ResourceQuota 来阻止用户创建高优先级的 Pod。
注意:
它不会对已经调度的资源对象进行驱逐, 它主要针对的是调度队列里面的pod
优先级和抢占
要使用优先级和抢占:
1 新增一个或多个 PriorityClass。
2 创建 Pod,并将其 priorityClassName 设置为新增的 PriorityClass。
- PriorityClass 可以内嵌到deployment的模板属性中
注意:
PriorityClass 是一个无命名空间对象,它定义了从优先级类名称到优先级整数值的映射
默认的优先级抢占
Kubernetes 已经提供了 2 个 PriorityClass: system-cluster-critical 和 system-node-critical
[root@kubernetes-master1 /data/kubernetes/secure]
NAME VALUE GLOBAL-DEFAULT AGE
system-cluster-critical 2000000000 false 3d18h
system-node-critical 2000001000 false 3d18h
注意:
这两个值是20亿,远远超过可以定义的优先级值,它用于确保始终优先调度关键组件
属性解析
apiVersion: scheduling. k8s. io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
preemptionPolicy: Never
globalDefault: false
description: "xxx"
简单实践
定制优先级
资源对象文件 11_kubernetes_platform_secure_priorityclass. yaml
apiVersion: scheduling. k8s. io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "定制高优先级"
-- -
apiVersion: scheduling. k8s. io/v1
kind: PriorityClass
metadata:
name: low-priority
value: 100000
globalDefault: false
description: "定制低优先级"
应用资源对象
kubectl apply - f 11_kubernetes_platform_secure_priorityclass. yaml
确认效果
kubectl get priorityclass
kubectl describe priorityclass
应用优先级
在node1上创建资源对象
apiVersion: v1
kind: Pod
metadata:
name: low-priority
spec:
nodeName: "kubernetes-node1"
containers:
- name: low-priority
image: kubernetes-register. superopsmsb. com/superopsmsb/busybox
command: [ "/bin/sh" ]
args: [ "-c" , "while true; do echo hello; sleep 10;done" ]
resources:
requests:
memory: "2Gi"
cpu: "1"
priorityClassName: low-priority
应用资源清单文件
kubectl apply - f 12_kubernetes_platform_secure_priorityclass_pod. yaml
确认效果
]
]
cpu 1250m ( 62%) 0 ( 0%)
memory 2Gi ( 55%) 0 ( 0%)
清理环境
kubectl delete - f 12_kubernetes_platform_secure_priorityclass_pod. yaml
kubectl apply - f 11_kubernetes_platform_secure_priorityclass. yaml
小结
1.4.3 资源配额
学习目标
这一节,我们从 属性解读、简单实践、小结 三个方面来学习。
属性解读
简介
Kubernetes技术已经对Pod做了相应的资源配额设置,这些资源主要体现在:CPU和内存、存储,因为存储在k8s中有专门的资源对象来进行管控,所以我们在说到pod资源限制的时候,一半指的是 CPU和内存。Kubernetes中,对于每种资源的配额限定都需要两个参数:Resquests和Limits
申请配额( Requests) :
业务运行时最小的资源申请使用量,该参数的值必须满足,若不满足,业务运行不起来。
最大配额( Limits) :
业务运行时最大的资源允许使用量,该参数的值不能被突破,若突破,该资源对象会被重启或删除
资源配额
当k8s集群被多个用户或团队使用时,为了避免因为团队的资源对象使用导致资源抢占的问题,我们需要借助于资源配额( ResourceQuota) ,来帮助集群管理员为不同的团队或资源对象分配资源的使用量。
ResourceQuota是命名空间级别的资源对象,它主要基于资源对象的数量 和 资源消耗的总量来进行限制。
-- ResourceQuota 处理的是 资源的不均匀使用
参考资料:https:/ / kubernetes. io/zh/docs/concepts/policy/resource-quotas/
工作方式
资源配额的工作方式如下:
ResourceQuota为命名空间做资源配额,不同的团队在不同的命名空间下工作。
ResourceQuota为命名空间做多个资源配额,团队针对场景使用不同的配额,实现精细化配置
结合LimitRange 准入控制器对资源的使用量进行更加精细化的设置
超出配额限制,返回403 FORBIDDEN
使用示例
k8s集群的资源量:32 GiB 内存 和 16 核CPU资源,该集群被两个团队使用:
- 允许A团队使用 15 GiB 内存 和 8 核的CPU资源
- 允许B团队使用 10 GiB 内存 和 4 核的CPU资源
- 预留 7 GiB 内存 和 4 核的CPU资源供将来分配。
- 限制 “dev” 命名空间使用 1 GiB 内存 和 核的CPU资源
- 允许 “superopsmsb”命名空间使用任意数量。
常见资源配额限制
计算资源配额
limits. cpu| memory 所有非终止状态的 Pod,其 CPU| MEM 限额总量不能超过该值。
requests. cpu| memory 所有非终止状态的 Pod,其 CPU| MEM 需求总量不能超过该值。
cpu| memory 与 requests. cpu| memory 相同。
存储资源配置
requests. storage 所有 PVC,存储资源的需求总量不能超过该值。
persistentvolumeclaims 在该命名空间中所允许的 PVC 总量。
class- name>. storageclass. storage. k8s. io/requests. storage
在与 class- name> 相关的持久卷申领中,存储请求的总和不能超过该值。
class- name>. storageclass. storage. k8s. io/persistentvolumeclaims
在与 class- name> 相关的所有持久卷申领中,命名空间中可以存在的持久卷申领总数。
资源对象配额
样式:
count/. <group >:用于非核心(core)组的资源的数量上限
count/:用于核心组的资源的数量上限
资源对象
configmaps、persistentvolumeclaims、pods、replicationcontrollers
ReplicationController、resourcequotas、services、services. loadbalancers
services. nodeports、secrets
属性解读
ResourceQuota的配置属性
apiVersion: v1
kind: ResourceQuota
metadata:
name:
spec:
hard:
cpu: "1000"
memory: 200Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: [ "high" ]
注意:
如果 operator 为 Exists 或 DoesNotExist,则不可以设置 values 字段。
定制优先调度
资源对象文件 13_kubernetes_platform_secure_priorityclass_list. yaml
apiVersion: scheduling. k8s. io/v1
kind: PriorityClass
metadata:
name: high
value: 10000
globalDefault: false
description: "high priority"
-- -
apiVersion: scheduling. k8s. io/v1
kind: PriorityClass
metadata:
name: low
value: 100
globalDefault: false
description: "low priority"
-- -
apiVersion: scheduling. k8s. io/v1
kind: PriorityClass
metadata:
name: medium
value: 1000
globalDefault: false
description: "medium priority"
应用资源对象文件
kubectl apply - f 13_kubernetes_platform_secure_priorityclass_list. yaml
查看效果
kubectl get priorityclass
设定资源配额
资源清单文件 14_kubernetes_platform_secure_resourcequota_list. yaml
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-high
spec:
hard:
cpu: "2"
memory: 2Gi
pods: "5"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: [ "high" ]
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-medium
spec:
hard:
cpu: "2"
memory: 1Gi
pods: "4"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: [ "medium" ]
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-low
spec:
hard:
cpu: "1"
memory: 1Gi
pods: "3"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: [ "low" ]
创建资源对象
kubectl apply - f 14_kubernetes_platform_secure_resourcequota_list. yaml
检查效果
[root@kubernetes-master1 /data/kubernetes/secure]
Name: pods-high
Namespace: default
Resource Used Hard
-- -- -- -- -- -- -- --
cpu 0 2
memory 0 2Gi
pods 0 5
. . .
Name: pods-medium
Namespace: default
Resource Used Hard
-- -- -- -- -- -- -- --
cpu 0 2
memory 0 1Gi
pods 0 4
使用资源配额
资源对象文件 15_kubernetes_platform_secure_resourcequota_pod. yaml
apiVersion: v1
kind: Pod
metadata:
name: high-priority
spec:
containers:
- name: high-priority
image: kubernetes-register. superopsmsb. com/superopsmsb/busybox
command: [ "/bin/sh" ]
args: [ "-c" , "while true; do echo hello; sleep 10;done" ]
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
priorityClassName: high
创建资源对象
kubectl apply - f 15_kubernetes_platform_secure_resourcequota_pod. yaml
检查效果
[root@kubernetes-master1 /data/kubernetes/secure]
NAME AGE REQUEST LIMIT
pods-high 89m cpu: 0/1k, memory: 0/200Gi, pods: 0/10
pods-low 89m cpu: 300m/5, memory: 500Mi/10Gi, pods: 1/10
pods-medium 89m cpu: 0/10, memory: 0/20Gi, pods: 0/10
小结
1.4.4 配额实践
学习目标
这一节,我们从 pod资源、对象数量、小结 三个方面来学习。
pod资源
简介
ResourceQuota是命名空间级别的资源对象,它主要基于资源对象的数量 和 资源消耗的总量来进行限制。这一节,我们针对pod的资源使用量来进行调整。
关于资源的使用量,我们主要是针对 cpu、mem、storage 对象来进行设置
简单实践
资源对象文件 16_kubernetes_platform_secure_resourcequota_compute. yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: superopsmsb
spec:
hard:
requests. cpu: "1"
requests. memory: 1Gi
limits. cpu: "2"
limits. memory: 2Gi
-- -
apiVersion: v1
kind: ResourceQuota
metadata:
name: storage-resources
namespace: superopsmsb
spec:
hard:
requests. storage: "5Gi"
应用资源对象
kubectl apply - f 16_kubernetes_platform_secure_resourcequota_compute. yaml
查看效果
[root@kubernetes-master1 /data/kubernetes/secure]
Name: compute-resources
Namespace: superopsmsb
Resource Used Hard
-- -- -- -- -- -- -- --
limits. cpu 0 2
limits. memory 0 2Gi
requests. cpu 0 1
requests. memory 0 1Gi
Name: storage-resources
Namespace: superopsmsb
Resource Used Hard
-- -- -- -- -- -- -- --
requests. storage 0 5Gi
创建资源对象 17_kubernetes_platform_secure_resourcequota_compute_test. yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx1
namespace: superopsmsb
spec:
containers:
- name: nginx
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
resources:
requests:
memory: "1Gi"
cpu: "1"
limits:
memory: "1Gi"
cpu: "1"
-- -
apiVersion: v1
kind: Pod
metadata:
name: nginx2
namespace: superopsmsb
spec:
containers:
- name: nginx
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
resources:
requests:
memory: "1Gi"
cpu: "1"
limits:
memory: "1Gi"
cpu: "1"
应用资源对象
kubectl apply - f 17_kubernetes_platform_secure_resourcequota_compute_test. yaml
删除对象
kubectl delete - f 17_kubernetes_platform_secure_resourcequota_compute_test. yaml
kubectl delete - f 16_kubernetes_platform_secure_resourcequota_compute. yaml
对象数量
简介
ResourceQuota是命名空间级别的资源对象,它主要基于资源对象的数量 和 资源消耗的总量来进行限制。这一节,我们针对资源对象的使用数量来进行限制。
简单实践
资源对象文件 18_kubernetes_platform_secure_resourcequota_count. yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
namespace: superopsmsb
spec:
hard:
configmaps: "2"
persistentvolumeclaims: "2"
pods: "7"
replicationcontrollers: "6"
secrets: "2"
services: "6"
services. loadbalancers: "2"
应用资源对象
kubectl apply - f 18_kubernetes_platform_secure_resourcequota_count. yaml
查看效果
[root@kubernetes-master1 /data/kubernetes/secure]
Name: object-counts
Namespace: superopsmsb
Resource Used Hard
-- -- -- -- -- -- -- --
configmaps 1 2
persistentvolumeclaims 0 2
pods 3 7
replicationcontrollers 0 6
secrets 0 2
services 1 6
services. loadbalancers 0 2
测试效果
[root@kubernetes-master1 /data/kubernetes/secure]
configmap/cm1 created
[root@kubernetes-master1 /data/kubernetes/secure]
error: failed to create configmap: configmaps "cm2" is forbidden: exceeded quota: object-counts, requested: configmaps=1, used: configmaps=2, limited: configmaps=2
清理环境
kubectl delete - f 18_kubernetes_platform_secure_resourcequota_count. yaml
小结
1.4.5 资源限制
学习目标
这一节,我们从 属性解读、简单实践、小结 三个方面来学习。
属性解读
简介
默认情况下, Kubernetes 集群上的容器运行使用的计算资源没有限制。 使用资源配额,集群管理员可以以名字空间为单位,限制其资源的使用与创建。 在命名空间中,一个 Pod 或 Container 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。 这可能导致 Pod 或 Container 会垄断所有可用的资源。 LimitRange 是在命名空间内限制资源分配(给多个 Pod 或 Container)的策略对象。
limitranger可以对集群内Request和Limits的配置做一个全局的统一的限制,相当于批量设置了某一个范围内( 某个命名空间) 的Pod的资源使用限制。
Limitrange的功能特点:
在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
设置一个命名空间中对计算资源的默认申请/ 限制值,并且自动的在运行时注入到多个 Container 中。
属性解析
apiVersion: v1
kind: LimitRange
metadata:
name:
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "200m"
default:
cpu: 800m
defaultRequest:
cpu: "110m"
maxLimitRequestRatio:
memory: 2
type : Container
简单实践
容器资源限制
资源对象内容 19_kubernetes_platform_secure_limitrange_container. yaml
apiVersion: v1
kind: LimitRange
metadata:
name: limit-container
spec:
limits:
- max:
cpu: "800m"
memory: "1Gi"
min:
cpu: "100m"
memory: "99Mi"
default:
cpu: "700m"
memory: "900Mi"
defaultRequest:
cpu: "110m"
memory: "111Mi"
type : Container
应用资源对象
kubectl apply - f 19_kubernetes_platform_secure_limitrange_contaner. yaml
查看效果
[root@kubernetes-master1 /data/kubernetes/secure]
Name: limit-container
Namespace: default
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
-- -- -- -- -- -- -- - -- - -- -- -- -- -- -- -- - -- -- -- -- -- -- - -- -- -- -- -- -- -- -- -- -
Container cpu 100m 800m 110m 700m -
Container memory 99Mi 1Gi 111Mi 900Mi -
创建测试资源对象 20_kubernetes_platform_secure_limitrange_container_test. yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx-1
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
- name: nginx-2
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
resources:
requests:
memory: "100Mi"
cpu: "100m"
- name: nginx-3
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
resources:
limits:
memory: "200Mi"
cpu: "500m"
应用资源对象
kubectl apply - f 20_kubernetes_platform_secure_limitrange_container_test. yaml
确认效果
[root@kubernetes-master1 /data/kubernetes/secure]
Name: nginx
. . .
Containers:
nginx-1:
. . .
Limits:
cpu: 700m
memory: 900Mi
Requests:
cpu: 110m
memory: 111Mi
nginx-2:
. . .
Limits:
cpu: 700m
memory: 900Mi
Requests:
cpu: 100m
memory: 100Mi
nginx-3:
. . .
Limits:
cpu: 500m
memory: 200Mi
Requests:
cpu: 500m
memory: 200Mi
清理环境
kubectl delete - f 19_kubernetes_platform_secure_limitrange_container. yaml - f 20_kubernetes_platform_secure_limitrange_container_test. yaml
pvc资源限制
资源对象内容 21_kubernetes_platform_secure_limitrange_pvc. yaml
apiVersion: v1
kind: LimitRange
metadata:
name: limit-pvc
spec:
limits:
- type : PersistentVolumeClaim
max:
storage: 2Gi
min:
storage: 1Gi
应用资源对象
kubectl apply - f kubectl apply - f 21_kubernetes_platform_secure_limitrange_pvc. yaml
查看效果
[root@kubernetes-master1 /data/kubernetes/secure]
Name: limit-pvc
Namespace: default
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
-- -- -- -- -- -- -- - -- - -- -- -- -- -- -- -- - -- -- -- -- -- -- - -- -- -- -- -- -- -- -- -- -- -- -
PersistentVolumeClaim storage 1Gi 2Gi - - -
创建测试资源对象 22_kubernetes_platform_secure_limitrange_pvc_test. yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp"
-- -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
应用资源对象
kubectl apply - f 22_kubernetes_platform_secure_limitrange_pvc_test. yaml
清理资源对象
kubectl delete - f 21_kubernetes_platform_secure_limitrange_pvc. yaml - f 22_kubernetes_platform_secure_limitrange_pvc_test. yaml
小结
1.4.6 Pod策略
学习目标
这一节,我们从 功能解读、环境部署、小结 三个方面来学习。
功能解读
简介
在 Kubernetes 中,我们定义了代表软件应用程序构建块的资源,例如 Deployment、StatefulSet 和 Services。Kubernetes 集群内的各种控制器对这些资源做出反应,创建更多的 Kubernetes 资源或配置一些软件或硬件来实现我们的目标。
虽然我们可以借助于与RBAC实现资源对象的权限管控,但是安全的管理粒度还是比较大,PodSecurityPolicy是一个内置的准入控制器,允许集群管理员控制 Pod 规范的安全敏感方面,而且它还可以与PodSecurityContext 实现pod级别的更深层次的安全管控。
只不过,由于kubernetes管理人员的能力水平不足,导致在使用PSP的时候,意外授予比预期更广泛的权限,而且难以检查在给定情况下应用哪些 PSP可以被我们进行正常使用,所以为了照顾大部分的普通kubernetes管理人员的玻璃心,PSP被废弃了,预计在1. 25版本清除掉。但是PSP并没有完全移除,而是以 PodSecurity 准入控制器的方式来进行存在了。
基本信息
查看默认的准入控制器列表
kubectl - n kube-system exec - it kube-apiserver-kubernetes-master1 -- kube-apiserver - h | grep 'enable-admission-plugins strings'
结果显示:
PodSecurityPolicy 默认情况下,没有启用
注意:
由于默认psp是拒绝所有pod的,所以我们在启用psp的时候,需要额外做一些措施 -- 即提前做好psp相关的策略,然后再开启PSP功能。
PodSecurityPolicy默认情况下可以进行多个维度的安全限制:
pod级别的特权:
privileged 创建具有特权命令执行权限的容器
volumes 允许使用的数据卷
宿主机资源:
hostNetwork| hostPorts 使用宿主机网络资源
hostPID| hostIPC 使用宿主机命名空间
容器级别属性:
runAsUser| runAsGroup| supplementalGroups 指定容器的用户属性信息
其他属性:
allowedCapabilities、defaultAddCapabilities、等
参考资料:
https:/ / kubernetes. io/zh-cn/docs/reference/access-authn-authz/psp-to-pod-security-standards/
实践步骤
Policy本身并不会产生实际作用,需要将其与用户或者serviceaccount绑定才可以完成授权。所以生产中PSP的基本的操作步骤是:
1 定义psp资源的策略
2 定制PSP相关的账号授权
3 集群启用PSP功能
如果要在生产环境中使用,必须要提前测试一下,否则不推荐使用,因为它的门槛较多
我们这里直接从集群直接启用PSP的步骤开始,来给大家演示一个完整的安全过程
环境部署
启用psp功能
编辑 / etc/kubernetes/manifests/kube-apiserver. yaml 文件,添加如下配置
-- enable-admission - plugins=NodeRestriction, PodSecurityPolicy
由于kubeadm集群中,api-server是以静态pod的方式来进行管控的,所以我们不用重启,稍等一会,环境自然就开启了PSP功能
因为PSP默认已经禁用所有的pod创建权限,所以默认情况下,我们也看不到api-server的pod的
kubectl get pod - n kube-system | grep api
注意:
如果出现api-server的pod,是因为其他master启用PSP太慢导致的。
我们只能通过端口方式来进行检测
[root@kubernetes-master1 ~]
tcp 0 0 10. 0. 0. 12:52818 10. 0. 0. 12:6443 ESTABLISHED 108627/kube-control
tcp 0 0 10. 0. 0. 12:36852 10. 0. 0. 200:6443 ESTABLISHED 127389/kubelet
tcp 0 0 10. 0. 0. 12:52350 10. 0. 0. 12:6443 ESTABLISHED 123701/kube-schedul
tcp 0 0 10. 0. 0. 12:36314 10. 0. 0. 200:6443 ESTABLISHED 3109/kube-proxy
. . .
结果显示:
只要我们能够看到 6443,说明kube-apiserver服务已经启动成功了
检查效果
定制资源清单文件 23_kubernetes_platform_secure_psp_deployment. yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
创建资源清单文件
[root@kubernetes-master1 /data/kubernetes/secure]
deployment. apps/nginx-deployment created
检查效果
[root@kubernetes-master1 /data/kubernetes/secure]
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/1 0 0 79s
[root@kubernetes-master1 /data/kubernetes/secure]
NAME DESIRED CURRENT READY AGE
nginx-deployment-647c85d77f 1 0 0 84s
[root@kubernetes-master1 /data/kubernetes/secure]
No resources found in default namespace.
结果显示:
除了pod没有创建成功,其他的都创建成功了
手工测试创建pod
[root@kubernetes-master1 /data/kubernetes/secure]
Error from server ( Forbidden) : pods "pod-client" is forbidden: PodSecurityPolicy: no providers available to validate pod request
结果显示:
没有权限操作PSP资源
临时允许PSP开启所有权限
资源对象文件 24_kubernetes_platform_secure_psp_all. yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: privileged
spec:
privileged: true
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
seLinux:
rule: RunAsAny
volumes:
- '*'
创建资源对象
kubectl apply - f 24_kubernetes_platform_secure_psp_all. yaml
创建pod
[root@kubernetes-master1 /data/kubernetes/secure]
pod/pod-client created
[root@kubernetes-master1 /data/kubernetes/secure]
NAME READY STATUS RESTARTS AGE
pod-client 1/1 Running 0 3s
结果显示:
经过psp的授权,所以我们能够创建pod了
清理环境
kubectl delete - f 23_kubernetes_platform_secure_psp_deployment. yaml - f 24_kubernetes_platform_secure_psp_all. yaml
小结
1.4.7 策略实践
学习目标
这一节,我们从 属性解读、简单实践、小结 三个方面来学习。
属性解读
简介
根据我们刚才的实践,应该能够感受的到,PSP的核心就是针对Pod资源对象的所有权限的精细化管控,如果要实现Pod的更加精细的安全性,我们需要定制特定的PSP规则。
为了让管理员可以自由的管理pod资源对象,所以我们还需要针对PSP的策略规则定制RBAC的授权,才可以放心的交给相关的人员去使用,否则会导致更大的问题。
策略属性
PSP策略基本属性
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: privileged
spec:
privileged: true
hostNetwork: false
hostPorts:
- min: 10000
max: 13000
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
seLinux:
rule: RunAsAny
volumes:
- '*'
简单实践
定制PSP策略
资源清单文件 25_kubernetes_platform_secure_psp_mul. yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-restrictive
spec:
privileged: false
hostNetwork: false
allowPrivilegeEscalation: false
defaultAllowPrivilegeEscalation: false
hostPID: false
hostIPC: false
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
volumes:
- '*'
-- -
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-permissive
spec:
privileged: true
hostNetwork: true
hostIPC: true
hostPID: true
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
应用资源清单文件
kubectl apply - f 25_kubernetes_platform_secure_psp_mul. yaml
查看效果
[root@kubernetes-master1 /data/kubernetes/secure]
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1. 21+, unavailable in v1. 25+
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
psp-permissive true RunAsAny RunAsAny RunAsAny RunAsAny false *
psp-restrictive false RunAsAny RunAsAny RunAsAny RunAsAny false *
定制SA使用PSP的RBAC
定制角色权限
kubectl create clusterrole psp-restrictive -- verb=use -- resource=podsecuritypolicies -- resource-name=psp-restrictive -- dry-run=client
kubectl create clusterrole psp-restrictive -- verb=use -- resource=podsecuritypolicies -- resource-name=psp-restrictive -- dry-run=client - o yaml >> 26_kubernetes_platform_secure_psp_restrictive_rbac. yaml
echo '---' >> 26_kubernetes_platform_secure_psp_restrictive_rbac. yaml
定制角色授权
kubectl create clusterrolebinding psp-restrictive -- clusterrole=psp-restrictive -- group ="system:serviceaccounts" -- dry-run=client - o yaml
kubectl create clusterrolebinding psp-restrictive -- clusterrole=psp-restrictive -- group ="system:serviceaccounts" -- dry-run=client - o yaml >> 26_kubernetes_platform_secure_psp_restrictive_rbac. yaml
应用资源清单文件
kubectl apply - f 26_kubernetes_platform_secure_psp_restrictive_rbac. yaml
测试效果
kubectl apply - f 23_kubernetes_platform_secure_psp_deployment. yaml
kubectl get all
kubectl apply - f 23_kubernetes_platform_secure_psp_deployment. yaml - n superopsmsb
kubectl get all - n superopsmsb
结果显示:
正常的资源可以正常的创建
清理环境
kubectl delete - f 23_kubernetes_platform_secure_psp_deployment. yaml
kubectl delete - f 23_kubernetes_platform_secure_psp_deployment. yaml - n superopsmsb
小结
1.4.8 策略进阶
学习目标
这一节,我们从 网络策略、SA策略、小结 三个方面来学习。
网络策略
简介
虽然我们刚才实现了通用用户组创建资源对象的效果,但是对于一些特殊场景来说,比如 kube-apiserver之类的服务需要底层网络的支持才能够建立起来:。
]
hostNetwork: true
如果当前的psp没有hostNetwork的支持的话,很多特殊的依赖于底层网络的应用pod都无法建立。
改造实践
改造deployment
cp 23_kubernetes_platform_secure_psp_deployment. yaml 27_kubernetes_platform_secure_psp_deployment_hostnetwork. yaml
改造文件
[root@kubernetes-master1 /data/kubernetes/secure]
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
hostNetwork: true
containers:
- name: nginx
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
创建资源对象
kubectl apply - f 27_kubernetes_platform_secure_psp_deployment_hostnetwork. yaml
查看效果
kubectl get deployments. apps
结果显示:
pod无法创建
分析:
我们刚才定制的RBAC使用的PSP策略是没有包含 hostNetwork 等宿主机属性的使用权限的。所以我们要使用另外一个PSP的策略来进行管理
定制网络使用PSP的RBAC
定制角色权限
kubectl create clusterrole psp-permissive -- verb=use -- resource=podsecuritypolicies -- resource-name=psp-permissive -- dry-run=client
kubectl create clusterrole psp-permissive -- verb=use -- resource=podsecuritypolicies -- resource-name=psp-permissive -- dry-run=client - o yaml >> 28_kubernetes_platform_secure_psp_permissive_rbac. yaml
echo '---' >> 28_kubernetes_platform_secure_psp_permissive_rbac. yaml
定制角色授权
kubectl create clusterrolebinding psp-permissive -- clusterrole=psp-permissive -- group ="system:serviceaccounts" -- dry-run=client - o yaml
kubectl create clusterrolebinding psp-permissive -- clusterrole=psp-permissive -- group ="system:serviceaccounts" -- dry-run=client - o yaml >> 28_kubernetes_platform_secure_psp_permissive_rbac. yaml
应用资源清单文件
kubectl apply - f 28_kubernetes_platform_secure_psp_permissive_rbac. yaml
测试效果
kubectl delete - f 27_kubernetes_platform_secure_psp_deployment_hostnetwork. yaml
kubectl apply - f 27_kubernetes_platform_secure_psp_deployment_hostnetwork. yaml
kubectl get deployments. apps
结果显示:
正常的资源可以正常的创建
清理环境
kubectl delete - f 27_kubernetes_platform_secure_psp_deployment_hostnetwork. yaml
kubectl delete - f 28_kubernetes_platform_secure_psp_permissive_rbac. yaml
SA策略
简介
如果我们有一个需求: 在某个命名空间下面要使用受限制的psp_restrictive策略,但是个别应用需要使用 psp_permissive策略。
对于这种场景,我们可以为应用的 ServiceAccount 提供使用 psp_permissive 策略,其思路与Clusterrole和rolebinding的逻辑类似。
准备资源清单
准备资源清单文件
kubectl create sa superopsmsb - n superopsmsb -- dry-run=client - o yaml > 29_kubernetes_platform_secure_psp_deployment_sa. yaml
echo '---' >> 29_kubernetes_platform_secure_psp_deployment_sa. yaml
cat 27_kubernetes_platform_secure_psp_deployment_hostnetwork. yaml >> 29_kubernetes_platform_secure_psp_deployment_sa. yaml
定制资源清单文件 29_kubernetes_platform_secure_psp_deployment_sa. yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: null
name: superopsmsb
namespace: superopsmsb
-- -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: superopsmsb
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
serviceAccount: superopsmsb
hostNetwork: true
containers:
- name: nginx
image: kubernetes-register. superopsmsb. com/superopsmsb/nginx_web:v0. 1
尝试创建资源清单文件
kubectl apply - f 29_kubernetes_platform_secure_psp_deployment_sa. yaml
检查效果
kubectl get deployments. apps - n superopsmsb
结果显示:
没有创建成功
kubectl delete - f 29_kubernetes_platform_secure_psp_deployment_sa. yaml
定制特定SA使用PSP的RBAC
定制角色权限
kubectl create clusterrole psp-permissive -- verb=use -- resource=podsecuritypolicies -- resource-name=psp-permissive -- dry-run=client
kubectl create clusterrole psp-permissive -- verb=use -- resource=podsecuritypolicies -- resource-name=psp-permissive -- dry-run=client - o yaml >> 30_kubernetes_platform_secure_psp_permissive_rbac_sa. yaml
echo '---' >> 30_kubernetes_platform_secure_psp_permissive_rbac_sa. yaml
定制角色授权
kubectl create clusterrolebinding psp-permissive -- clusterrole=psp-permissive -- serviceaccount=superopsmsb:superopsmsb -- dry-run=client - o yaml
kubectl create clusterrolebinding psp-permissive -- clusterrole=psp-permissive -- serviceaccount=superopsmsb:superopsmsb -- dry-run=client - o yaml >>30_kubernetes_platform_secure_psp_permissive_rbac_sa. yaml
应用资源清单文件
kubectl apply - f 30_kubernetes_platform_secure_psp_permissive_rbac_sa. yaml
测试效果
kubectl apply - f 30_kubernetes_platform_secure_psp_permissive_rbac_sa. yaml
kubectl get deployments. apps
结果显示:
正常的资源可以正常的创建
清理环境
kubectl delete - f 29_kubernetes_platform_secure_psp_deployment_sa. yaml
kubectl delete - f 30_kubernetes_platform_secure_psp_permissive_rbac_sa. yaml
收尾动作
为了不影响后续知识点的学习,我们这里将所有kube-apiserver的服务的PSP功能移除,查看最终效果
[root@kubernetes-master1 ~]
kube-apiserver-kubernetes-master1 1/1 Running 0 6s
kube-apiserver-kubernetes-master2 1/1 Running 0 8s
kube-apiserver-kubernetes-master3 1/1 Pending 0 1s
小结
你可能感兴趣的:(云,安全,K8S,认证)
华为HCIE认证用处大吗
腾科张老师
服务器 运维
华为HCIE的证书在ICT领域用处非常大,就业的时候有一本HCIE证书入职成功率非常高,众所周知,华为是国内最大的厂商,而且国内大部分的网络设备都是国产的华为设备,首先可以肯定的就是其权威性,是大部分公司都认可的,并且在维护使用华为设备过程中所应用到的技术需求也是相当大的。一、华为HCIE认证机价值高的具体体现:(1),华为认证在国内的权威性越来越高,权威性可以比肩思科,华为代理商有证书挂靠需求;
【软件测试】- 公有云、私有云、混合云简介以及如何在公有云与私有云上分别搭建测试环境
阿寻寻
软件测试 大厂软件测试面试题 阿里云 功能测试
在公有云与私有云上分别如何搭建测试环境一、公有云、私有云、混合云简介1.公有云(PublicCloud):2.私有云(PrivateCloud):3.混合云(HybridCloud):4.他们的区别与联系:5.应用实例:二、公有云上搭建测试环境1.创建云服务器实例阿里云腾讯云2.安装Docker和Kubernetes3.配置Kubernetes集群4.网络配置细节5.数据库配置6.部署测试应用7.
46. HarmonyOS NEXT 登录模块开发教程(一):模态窗口登录概述
harmonyos-next
温馨提示:本篇博客的详细代码已发布到git:https://gitcode.com/nutpi/HarmonyosNext可以下载运行哦!HarmonyOSNEXT登录模块开发教程(一):模态窗口登录概述效果预览1.引言在移动应用开发中,登录功能是几乎所有应用必不可少的组成部分。一个设计良好的登录界面不仅能提升用户体验,还能增强应用的安全性和可用性。本系列教程将详细讲解如何使用HarmonyOSN
WLAN(无线局域网)安全
花开盛夏^.^
网络工程师 安全 网络 服务器
WLAN安全涉及到保护无线局域网免受各种威胁和攻击,以确保数据的保密性、完整性和可用性。以下是关于WLAN安全的多方面介绍:一、主要安全威胁窃听:攻击者利用特殊设备监听无线信号,获取传输中的数据,如用户的账号密码、敏感信息等。身份假冒:攻击者伪装成合法的无线接入点或用户设备,骗取用户信任,进而获取敏感信息或干扰网络正常运行。数据篡改:攻击者在数据传输过程中对数据进行修改、删除或插入,破坏数据的完整
前端 CDN 深度解析:从加速优化到工程化实践
斯~内克
前端 前端
一、前端CDN的核心价值与挑战1.1现代前端资源的分发困境资源体积爆炸:主流框架生产包平均大小突破2MB全球化访问需求:跨国访问延迟差异可达500ms以上版本管理复杂度:多环境部署导致的缓存污染问题安全防护压力:XSS、资源劫持等攻击频发1.2前端CDN的技术指标指标传统方案CDN优化后提升幅度首屏加载时间3.8s1.2s68%资源下载速度12MB/s85MB/s608%缓存命中率65%98%51
视频孪生与三维视频融合:重构工业现场的“数字视网膜“
数字孪生家族
视频孪生智慧工业产线 工业元宇宙 工业三维视频融合平台 视频孪生赋予工业设备
在浙江某精密制造企业的总控中心,30米长的曲面屏上实时跳动着工厂的每个生产细节:机械臂的运动轨迹与数字模型完全同步,质检工位的操作误差被自动标记,AGV小车的行进路径在三维空间中以光带形式可视化呈现。这种虚实交融的场景并非科幻电影,而是由智汇云舟首倡的视频孪生与三维视频融合技术为制造业打造的“超感知车间”。这两项技术的融合应用,正在为制造业构建起一套具有感知、认知和决策能力的"数字视网膜"系统。一
网络安全之防御保护8 - 11 天笔记
温柔小胖
web安全 笔记 网络
一、内容安全1、攻击可能只是一个点,防御需要全方面进行2、IAE引擎3、DFI和DPI技术---深度检测技术深度行为检测技术分为:深度包检测技术(DPI)、深度流检测技术(DFI)DPI---深度包检测技术---主要针对完整的数据包(数据包分片,分段需要重组),之后对数据包的内容进行识别。(应用层)深度包检测技术分类:1、基于“特征字”的检测技术2、基于应用网关的检测技术3、基于行为模式的检测技术
VulnHub靶机系列:Os-ByteSec
墨痕诉清风
国际证书研究 网络 linux 服务器
一前言Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目标,大多是Boot2root,从启动虚机到获取操作系统的root权限和查看flag。网址:https://www.vulnhub.com二运行说明靶机名称:Os-Bytesec靶机难度:初学者
ssl和tsl的区别及如何使用
噔噔噔噔@
ssl 网络协议 网络
SSL(SecureSocketsLayer)和TLS(TransportLayerSecurity)都是用于加密和保护网络通信安全的协议。TLS实际上是SSL的升级版本,更加安全和强大。下面是它们之间的主要区别以及如何使用它们:区别:SSL是最早用于加密网络通信的协议,随着安全漏洞的暴露,逐渐被TLS所取代。TLS提供了更强大的加密算法和更严格的安全性要求,相比SSL更安全可靠。SSL和TLS之
npm --unsafe-perm 参数,解决权限错误,permission denied
你的微笑像拥抱
笔记
https://docs.npmjs.com/misc/config#unsafe-perm解决办法:添加–unsafe-perm参数,如#npminstallXXX--registry=https://registry.npm.taobao.org--unsafe-permnpm会有生命周期,某个包会有生命周期来执行一些东西,安全起见会自动降级导致没有权限执行一些操作,通过–unsafe-per
PostgreSQL教程(一)入门介绍
空说
postgresql 数据库
PostgreSQL介绍PostgreSQL是一个功能强大的开源关系型数据库系统,它使用并扩展了SQL语言,并结合了许多功能,可以安全地存储和扩展复杂的数据工作PostgreSQL因其经过验证的架构、可靠性、数据完整性、强大的功能集、可扩展性以及软件背后的开源社区始终如一地提供高性能和创新解决方案的奉献精神而赢得了良好的声誉。PostgreSQL可在所有主要操作系统上运行,自2001年以来一直符合
车间图纸安全传输需要注意什么?
jinan886
服务器 运维 大数据 安全
在车间图纸的安全传输过程中,除了确保信息的准确无误外,还需特别关注以下几个关键环节,以保障生产流程的高效与安全。在车间图纸的安全传输中,需注意以下几点:1.加密传输使用SSL/TLS等加密协议,确保数据在传输过程中不被窃取或篡改。2.访问控制实施严格的权限管理,确保只有授权人员可以访问和下载图纸。使用多因素认证增强安全性。3.安全存储图纸应存储在安全的服务器或云平台,并定期备份。存储时进行加密,防
台风信息查询API:数据赋能,守护安全
安静的小员
java javascript 后端 前端
前言台风,作为自然界最具破坏力的天气系统之一,每年都会给沿海地区带来巨大的经济损失和人员伤亡。及时、准确地获取台风信息,对于防灾减灾、保障人民生命财产安全至关重要。随着互联网技术的快速发展,台风信息查询API应运而生,为开发者提供了便捷、高效的台风数据接口,赋能各行各业,共同抵御台风灾害。台风信息查询API:数据获取的利器传统的台风信息获取方式,往往依赖于气象部门发布的公告或新闻媒体,存在信息滞后
Solidity基础 -- 哈希算法
第十六年盛夏.
智能合约 区块链应用搭建 区块链 智能合约
一、引言在当今数字化时代,数据的安全性、完整性和高效处理变得至关重要。哈希算法作为一种强大的数学工具,在计算机科学、密码学、区块链等众多领域发挥着关键作用。它为数据的存储、传输和验证提供了一种可靠的方式,极大地推动了信息技术的发展。二、哈希算法基础介绍(一)定义哈希算法(HashAlgorithm),也称为散列算法,是一种将任意长度的输入数据(也称为消息)通过特定的数学函数转换为固定长度输出的过程
使用 ConfigMaps 可以优化 Spring Boot应用
李鲶鱼
学习 开发语言 virtualenv
基本概念ConfigMaps:Kubernetes中的一种资源对象,用于存储非敏感的配置数据,如应用程序属性、环境变量等。主要优势简化部署:无需在容器镜像中嵌入配置,减少镜像大小,加快部署速度。动态更新:无需重新部署应用程序,即可实时修改配置。增强安全性:安全存储敏感信息,如数据库凭证、API密钥等。提高可维护性:将配置与代码分离,使代码更清晰,便于维护和理解。使用方法1.创建ConfigMap命
2025年入职/转行网络安全,该如何规划?网络安全职业规划
教网络安全的毛老师
web安全 安全 网络 运维 云计算
网络安全是一个日益增长的行业,对于打算进入或转行进入该领域的人来说,制定一个清晰且系统的职业规划非常重要。2025年,网络安全领域将继续发展并面临新的挑战,包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关于网络安全职业规划的详细指南,涵盖了从入门到高级岗位的成长路径、技能要求、资源获取等方面的内容。第一部分:网络安全行业概述1.1网络安全的现状与未来网络安全已经成为全球企业和政府的
红队OPSEC(安全运营)个人总结
安全检测中
安全
OPSEC又称:运营安全,是指在红队的视角下,蓝队对我方的威胁。OPSEC漏洞的五个流程:关键信息识别:指红队的关键信息不泄露,包括但不限于红队的攻击意图,能力,人员,活动及限制等。威胁分析:指蓝队的操作可能发现我方行动的威胁,如使用同一个IP地址进行nmap和msf等漏洞分析:指蓝队成员已发现我方行动或关键信息,并对其进行防范的行为,如封禁红队使用的IP等。风险评估:指对事件发生的概率和预期成本
golang学习笔记23——golang微服务中服务间通信问题探讨
GoppViper
golang学习笔记 golang 学习 笔记 后端 微服务 信息与通信
推荐学习文档golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔记专栏文章目录引言服务间通信的常见问题1.数据序列化与反序列化效率2.网络延迟与可靠性3.服务发现与负载均衡4.安全与认证解决方
iOS 18 系统功能解析目录
蓝鲸忘了海
IOS 1-18系统功能解析 ios cocoa macos
iOS18系统功能解析目录iOS18系统功能解析引言第一部分:iOS18系统架构全解析1.1全新系统设计理念1.2核心架构与硬件协同1.3安全架构与隐私保护1.4跨平台生态协同第二部分:用户界面与交互体验的革新2.1全新视觉设计2.2自定义UI与多任务切换2.3通知中心与交互体验2.4动态交互动画与手势识别第三部分:人工智能与机器学习的深度整合3.1新一代智能助手3.2CoreML与机器学习框架进
Ubuntu、CentOs更换源(阿里云的源)
C000kie
Linux ubuntu centos 阿里云 linux
ubuntu备份当前的apt配置文件sudomv/etc/apt/sources.list/etc/apt/sources.list.backup编辑配置文件,将以下内容写到文件中sudovi/etc/apt/sources.listdebhttps://mirrors.aliyun.com/ubuntu/focalmainrestricteduniversemultiversedeb-srcht
基于HarmonyNext的跨平台文件加密与安全存储实战指南
harmonyos-next
基于HarmonyNext的跨平台文件加密与安全存储实战指南引言在当今数字化时代,数据安全已成为应用开发中不可忽视的重要环节。HarmonyNext作为华为最新的操作系统,提供了强大的安全机制和高效的开发工具。本文将深入探讨如何在HarmonyNext平台上使用ArkTS实现跨平台文件加密与安全存储,并通过一个实战案例来详细讲解如何实现一个安全的文件存储应用。环境准备在开始之前,确保你已经安装了以
OC与Swift混编 注意事项
ReyZhang
iOS开发小记 oc swift 混编
前言随着Swift发展,很多新的项目开始使用Swift作为首选语言。Swift语言以其简洁、快速、安全的特点获得了一大波粉丝,我也是其中之一。项目背景:公司一些旧项目大都使用OC编写,运营中的项目也会时常维护。所以在新需求开发时,我也会尝试使用Swift语言来编写(使用OC还是Swift根据项目需要来),这就涉及到OC与Swift语言的混编。大部分的情况是OC代码调用部分Swift编写的模块。而在
K8s 1.27.1 实战系列(十一)ConfigMap
白昼ron
K8s kubernetes 容器 云原生 ConfigMap K8s 环境变量 注入
ConfigMap是Kubernetes中管理非敏感配置的核心资源,通过解耦应用与配置实现灵活性和可维护性。一、ConfigMap的核心功能及优势1、配置解耦将配置文件(如数据库地址、日志级别)与容器镜像分离,支持动态更新而无需重建镜像。2、多形式注入环境变量:将键值对注入容器环境变量。文件挂载:以文件或目录形式挂载到容器文件系统(如Nginx的conf.d)。命令行参数:通过环境变量间接传递配置
视觉拣选机械臂
骞途
人工智能 经验分享 笔记
本项目机器人拣选工作站应用于以下场景:机器人拣选系统,用于3C产品,美妆个护产品,免注册模式,散乱、密排放置,目的箱视觉引导投放,可实现柔性放货。以上所有相关系统均包括相关配套设备,包括机器人本体、机器视觉系统、控制系统、视觉机械臂工作平台及保证系统正常使用的所有设备、辅材、支架和安全围栏等的设计、制造、包装、运输、安装、调试和售后服务,同时支持前后端系统及设备对接、联调工作。1.机械臂机械臂,即
k8s pod内部容器_K8S中Pod内部容器通信原理
weixin_39689394
k8s pod内部容器
要了解和分析Pod中的container容器网络,那么首先肯定是要了解docker容器网络的几种模式以及常见用法。之后我们再带着这个问题一步一步地去进行实操验证一下我们的推断是否正确。1.docker容器网络模式1.1默认bridge桥接网络默认分配docker0网桥网段上的ip给容器,每个容器的networknamespace都是相互隔离的。docker自身生成一个vethpair(虚拟网卡对)
JavaScript泄露浏览器插件信息引发的安全漏洞及防护措施
w2361734601
网络 web安全 安全
本文所述技术原理、漏洞案例及防御方案仅用于安全研究交流,旨在提升网络安全防护意识。任何试图利用文中提及的技术手段进行非法攻击的行为,均与作者/发布方无关。目录引言:被忽视的信息泄露风险一、插件信息泄露的三大途径1.Navigator.plugins对象检测2.MIME类型检测3.特性嗅探技术二、漏洞利用的典型案例1.已知漏洞直接利用2.精准社会工程攻击3.零日漏洞预埋攻击三、四层防御体系构建1.客
【K8s】使用Kubernetes的resources字段中的requests和limits字段控制Pod资源使用
ThisIsClark
Kubernetes kubernetes 容器 云原生
随着容器化技术的蓬勃发展,Kubernetes(简称K8s)已成为管理容器化应用的核心平台。在K8s集群中,合理控制Pod的资源使用对于确保集群的稳定性和性能至关重要。resources字段作为K8s提供的一种资源限制机制,允许用户为Pod设置资源请求(request)和限制(limit),以实现精细化的资源管理。本文将深入探讨resources字段中的request和limit字段,通过对比它们
K8S 持久化之静态PV (nfs)
oToyix
K8S Devops k8s 静态PV pvc pv
K8S持久化之静态PV(NFS)K8S部署见上篇:https://blog.csdn.net/oToyix/article/details/117963839一、概念PersistentvolumePersistentVolume(持久存储卷)简称PV,是一个K8S资源对象,所以我们可以单独创建一个PV。它不和Pod直接发生关系,而是通过PersistentVolumeClaim(PV索取),简称
chrome内核大版本升级涉及核心事项
ปรัชญา แค้วคำมูล
chrome c++ 性能优化
Chrome内核(Chromium)大版本升级涉及多个核心事项,需要从技术、兼容性、安全、性能等多维度进行系统规划。以下是关键核心事项及应对策略:1.技术架构调整V8引擎升级:JavaScript引擎优化可能引入新语法支持(如ES新特性)、性能改进或GC机制调整,需验证业务代码兼容性。渲染引擎变更:Blink引擎的渲染逻辑调整可能导致页面布局差异(如CSSFlexbox/Grid实现变化),需全面
Java多线程与高并发专题——阻塞和非阻塞队列的并发安全原理是什么?
黄雪超
技术基础 java 开发语言 并发编程
引入之前我们探究了常见的阻塞队列的特点,在本文我们就以ArrayBlockingQueue为例,首先分析BlockingQueue,也就是阻塞队列的线程安全原理,然后再看看它的兄弟——非阻塞队列的并发安全原理。ArrayBlockingQueue源码分析我们首先看一下ArrayBlockingQueue的源码,ArrayBlockingQueue有以下几个重要的属性:/***用于存储队列元素的数组
java责任链模式
3213213333332132
java 责任链模式 村民告县长
责任链模式,通常就是一个请求从最低级开始往上层层的请求,当在某一层满足条件时,请求将被处理,当请求到最高层仍未满足时,则请求不会被处理。
就是一个请求在这个链条的责任范围内,会被相应的处理,如果超出链条的责任范围外,请求不会被相应的处理。
下面代码模拟这样的效果:
创建一个政府抽象类,方便所有的具体政府部门继承它。
package 责任链模式;
/**
*
linux、mysql、nginx、tomcat 性能参数优化
ronin47
一、linux 系统内核参数
/etc/sysctl.conf文件常用参数 net.core.netdev_max_backlog = 32768 #允许送到队列的数据包的最大数目
net.core.rmem_max = 8388608 #SOCKET读缓存区大小
net.core.wmem_max = 8388608 #SOCKET写缓存区大
php命令行界面
dcj3sjt126com
PHP cli
常用选项
php -v
php -i PHP安装的有关信息
php -h 访问帮助文件
php -m 列出编译到当前PHP安装的所有模块
执行一段代码
php -r 'echo "hello, world!";'
php -r 'echo "Hello, World!\n";'
php -r '$ts = filemtime("
Filter&Session
171815164
session
Filter
HttpServletRequest requ = (HttpServletRequest) req;
HttpSession session = requ.getSession();
if (session.getAttribute("admin") == null) {
PrintWriter out = res.ge
连接池与Spring,Hibernate结合
g21121
Hibernate
前几篇关于Java连接池的介绍都是基于Java应用的,而我们常用的场景是与Spring和ORM框架结合,下面就利用实例学习一下这方面的配置。
1.下载相关内容: &nb
[简单]mybatis判断数字类型
53873039oycg
mybatis
昨天同事反馈mybatis保存不了int类型的属性,一直报错,错误信息如下:
Caused by: java.lang.NumberFormatException: For input string: "null"
at sun.mis
项目启动时或者启动后ava.lang.OutOfMemoryError: PermGen space
程序员是怎么炼成的
eclipse jvm tomcat catalina.sh eclipse.ini
在启动比较大的项目时,因为存在大量的jsp页面,所以在编译的时候会生成很多的.class文件,.class文件是都会被加载到jvm的方法区中,如果要加载的class文件很多,就会出现方法区溢出异常 java.lang.OutOfMemoryError: PermGen space.
解决办法是点击eclipse里的tomcat,在
我的crm小结
aijuans
crm
各种原因吧,crm今天才完了。主要是接触了几个新技术:
Struts2、poi、ibatis这几个都是以前的项目中用过的。
Jsf、tapestry是这次新接触的,都是界面层的框架,用起来也不难。思路和struts不太一样,传说比较简单方便。不过个人感觉还是struts用着顺手啊,当然springmvc也很顺手,不知道是因为习惯还是什么。jsf和tapestry应用的时候需要知道他们的标签、主
spring里配置使用hibernate的二级缓存几步
antonyup_2006
java spring Hibernate xml cache
.在spring的配置文件中 applicationContent.xml,hibernate部分加入
xml 代码
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hi
JAVA基础面试题
百合不是茶
抽象实现接口 String类 接口继承 抽象类继承实体类 自定义异常
/* * 栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、 *int、long、 float、double、boolean)和对象的引用,数据可以共享,速度仅次于 * 寄存器(register),快于堆。堆(heap):用于存储对象。 */ &
让sqlmap文件 "继承" 起来
bijian1013
java ibatis sqlmap
多个项目中使用ibatis , 和数据库表对应的 sqlmap文件(增删改查等基本语句),dao, pojo 都是由工具自动生成的, 现在将这些自动生成的文件放在一个单独的工程中,其它项目工程中通过jar包来引用 ,并通过"继承"为基础的sqlmap文件,dao,pojo 添加新的方法来满足项
精通Oracle10编程SQL(13)开发触发器
bijian1013
oracle 数据库 plsql
/*
*开发触发器
*/
--得到日期是周几
select to_char(sysdate+4,'DY','nls_date_language=AMERICAN') from dual;
select to_char(sysdate,'DY','nls_date_language=AMERICAN') from dual;
--建立BEFORE语句触发器
CREATE O
【EhCache三】EhCache查询
bit1129
ehcache
本文介绍EhCache查询缓存中数据,EhCache提供了类似Hibernate的查询API,可以按照给定的条件进行查询。
要对EhCache进行查询,需要在ehcache.xml中设定要查询的属性
数据准备
@Before
public void setUp() {
//加载EhCache配置文件
Inpu
CXF框架入门实例
白糖_
spring Web 框架 webservice servlet
CXF是apache旗下的开源框架,由Celtix + XFire这两门经典的框架合成,是一套非常流行的web service框架。
它提供了JAX-WS的全面支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用,同时它能与spring进行完美结合。
在apache cxf官网提供
angular.equals
boyitech
AngularJS AngularJS API AnguarJS 中文API angular.equals
angular.equals
描述:
比较两个值或者两个对象是不是 相等。还支持值的类型,正则表达式和数组的比较。 两个值或对象被认为是 相等的前提条件是以下的情况至少能满足一项:
两个值或者对象能通过=== (恒等) 的比较
两个值或者对象是同样类型,并且他们的属性都能通过angular
java-腾讯暑期实习生-输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]
bylijinnan
java
这道题的具体思路请参看 何海涛的微博:http://weibo.com/zhedahht
import java.math.BigInteger;
import java.util.Arrays;
public class CreateBFromATencent {
/**
* 题目:输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A
FastDFS 的安装和配置 修订版
Chen.H
linux fastDFS 分布式文件系统
FastDFS Home:http://code.google.com/p/fastdfs/
1. 安装
http://code.google.com/p/fastdfs/wiki/Setup http://hi.baidu.com/leolance/blog/item/3c273327978ae55f93580703.html
安装libevent (对libevent的版本要求为1.4.
[强人工智能]拓扑扫描与自适应构造器
comsci
人工智能
当我们面对一个有限拓扑网络的时候,在对已知的拓扑结构进行分析之后,发现在连通点之后,还存在若干个子网络,且这些网络的结构是未知的,数据库中并未存在这些网络的拓扑结构数据....这个时候,我们该怎么办呢?
那么,现在我们必须设计新的模块和代码包来处理上面的问题
oracle merge into的用法
daizj
oracle sql merget into
Oracle中merge into的使用
http://blog.csdn.net/yuzhic/article/details/1896878
http://blog.csdn.net/macle2010/article/details/5980965
该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSE
不适合使用Hadoop的场景
datamachine
hadoop
转自:http://dev.yesky.com/296/35381296.shtml。
Hadoop通常被认定是能够帮助你解决所有问题的唯一方案。 当人们提到“大数据”或是“数据分析”等相关问题的时候,会听到脱口而出的回答:Hadoop! 实际上Hadoop被设计和建造出来,是用来解决一系列特定问题的。对某些问题来说,Hadoop至多算是一个不好的选择,对另一些问题来说,选择Ha
YII findAll的用法
dcj3sjt126com
yii
看文档比较糊涂,其实挺简单的:
$predictions=Prediction::model()->findAll("uid=:uid",array(":uid"=>10));
第一个参数是选择条件:”uid=10″。其中:uid是一个占位符,在后面的array(“:uid”=>10)对齐进行了赋值;
更完善的查询需要
vim 常用 NERDTree 快捷键
dcj3sjt126com
vim
下面给大家整理了一些vim NERDTree的常用快捷键了,这里几乎包括了所有的快捷键了,希望文章对各位会带来帮助。
切换工作台和目录
ctrl + w + h 光标 focus 左侧树形目录ctrl + w + l 光标 focus 右侧文件显示窗口ctrl + w + w 光标自动在左右侧窗口切换ctrl + w + r 移动当前窗口的布局位置
o 在已有窗口中打开文件、目录或书签,并跳
Java把目录下的文件打印出来
蕃薯耀
列出目录下的文件 文件夹下面的文件 目录下的文件
Java把目录下的文件打印出来
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年7月11日 11:02:
linux远程桌面----VNCServer与rdesktop
hanqunfeng
Desktop
windows远程桌面到linux,需要在linux上安装vncserver,并开启vnc服务,同时需要在windows下使用vnc-viewer访问Linux。vncserver同时支持linux远程桌面到linux。
linux远程桌面到windows,需要在linux上安装rdesktop,同时开启windows的远程桌面访问。
下面分别介绍,以windo
guava中的join和split功能
jackyrong
java
guava库中,包含了很好的join和split的功能,例子如下:
1) 将LIST转换为使用字符串连接的字符串
List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
Web开发技术十年发展历程
lampcy
android Web 浏览器 html5
回顾web开发技术这十年发展历程:
Ajax
03年的时候我上六年级,那时候网吧刚在小县城的角落萌生。传奇,大话西游第一代网游一时风靡。我抱着试一试的心态给了网吧老板两块钱想申请个号玩玩,然后接下来的一个小时我一直在,注,册,账,号。
彼时网吧用的512k的带宽,注册的时候,填了一堆信息,提交,页面跳转,嘣,”您填写的信息有误,请重填”。然后跳转回注册页面,以此循环。我现在时常想,如果当时a
架构师之mima-----------------mina的非NIO控制IOBuffer(说得比较好)
nannan408
buffer
1.前言。
如题。
2.代码。
IoService
IoService是一个接口,有两种实现:IoAcceptor和IoConnector;其中IoAcceptor是针对Server端的实现,IoConnector是针对Client端的实现;IoService的职责包括:
1、监听器管理
2、IoHandler
3、IoSession
ORA-00054:resource busy and acquire with NOWAIT specified
Everyday都不同
oracle session Lock
[Oracle]
今天对一个数据量很大的表进行操作时,出现如题所示的异常。此时表明数据库的事务处于“忙”的状态,而且被lock了,所以必须先关闭占用的session。
step1,查看被lock的session:
select t2.username, t2.sid, t2.serial#, t2.logon_time
from v$locked_obj
javascript学习笔记
tntxia
JavaScript
javascript里面有6种基本类型的值:number、string、boolean、object、function和undefined。number:就是数字值,包括整数、小数、NaN、正负无穷。string:字符串类型、单双引号引起来的内容。boolean:true、false object:表示所有的javascript对象,不用多说function:我们熟悉的方法,也就是
Java enum的用法详解
xieke90
enum 枚举
Java中枚举实现的分析:
示例:
public static enum SEVERITY{
INFO,WARN,ERROR
}
enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类 (java.l