《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在OpenShift 4.8环境中验证
Kubernetes 的 Namespace 与 OpenShift 的 Project 区别
在功能上 OpenShift 和 Kubernetes 完全兼容,但在很多地方 OpenShift 都进行了功能增强,以实现更多的功能或更便捷的操作。这其中之一就是OpenShift 的 Project 对 Kubernetes 的 Namespace 功能增强。
- 执行命令,分别创建一个 Project 和 Namespace。
$ oc new-project my-project
$ kubectl create namespace my-namespace
- 在 OpenShift 控制台的项目中可以看到两者显示稍有不同,这是因为在创建 Project 的时候会自动为其添加说明 “请求者” 的 Annotation,而在创建 Namespace 的时候就不会自动添加 Annotation。
- 分别执行以下命令,还可以看出在 my-project 中除了三个默认的 “system:xxxxx” Role 外有一个名为 “admin” 的 Role,而在 my-namespace 中只有默认的 Role。
$ oc get rolebinding -n my-project
NAME ROLE AGE
admin ClusterRole/admin 16m
system:deployers ClusterRole/system:deployer 15m
system:image-builders ClusterRole/system:image-builder 15m
system:image-pullers ClusterRole/system:image-puller 15m
$ oc get rolebinding -n my-namespace
NAME ROLE AGE
system:deployers ClusterRole/system:deployer 15m
system:image-builders ClusterRole/system:image-builder 15m
system:image-pullers ClusterRole/system:image-puller 15m
在 OpenShift 中创建 Project 是通过 Template 实现的。执行 Template 的过程不但会创建 Namespace,还能创建其对应的 RoleBinding 对象。用户在执行 “oc new-project <PROJECT_NAME>” 命令的时候,在 OpenShift 收到的是创建 ProjectRequest 的 API 请求,然后 OpenShift 再使用 Temple 创建对应的资源。
在 OpenShift 控制台的 API Explore中可以找到 “Project” 和 “ProjectRequest ” 这两个不同的对象。 而在 OpenShift 中创建 Project 所使用的 Template 是在 “集群设置” 中指定的。因此可以通过修改 Project 使用 Template 来改变创建 Project 的缺省操作,比如更加严格的网络隔离策略、Namespace 级的资源限制等。
个性化 Project 对象,提升 Namespace 使用安全
- 执行以下命令可以获得负责创建 Project 对应的 Template 内容。
$ oc adm create-bootstrap-project-template -o yaml > template_project-request-extended.yaml
- 查看 template_project-request-extended.yaml 的内容。
apiVersion: template.openshift.io/v1
kind: Template
metadata:
creationTimestamp: null
name: project-request
objects:
- apiVersion: project.openshift.io/v1
kind: Project
metadata:
annotations:
openshift.io/description: ${PROJECT_DESCRIPTION}
openshift.io/display-name: ${PROJECT_DISPLAYNAME}
openshift.io/requester: ${PROJECT_REQUESTING_USER}
creationTimestamp: null
name: ${PROJECT_NAME}
spec: {}
status: {}
- apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
creationTimestamp: null
name: admin
namespace: ${PROJECT_NAME}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: ${PROJECT_ADMIN_USER}
parameters:
- name: PROJECT_NAME
- name: PROJECT_DISPLAYNAME
- name: PROJECT_DESCRIPTION
- name: PROJECT_ADMIN_USER
- name: PROJECT_REQUESTING_USER
- 修改 template_project-request-extended.yaml 文件,为 Template 增加 allow-from-openshift-ingress、allow-from-openshift-monitoring、allow-same-namespace 三个 NetworkPolicy,它们关闭在项目之间彼此访问的能力,只允许项目内部的 Pod 之间项目访问、以及来自项目外部 OpenShift Ingress 和 OpenShift Monitoring 的访问。另外还为项目增加了Namespace 级的缺省 LimitRange。
$ cat << EOF > template_project-request-extended.yaml
apiVersion: template.openshift.io/v1
kind: Template
metadata:
creationTimestamp: null
name: project-request-extended
namespace: openshift-config
objects:
- apiVersion: project.openshift.io/v1
kind: Project
metadata:
annotations:
openshift.io/description: ${PROJECT_DESCRIPTION}
openshift.io/display-name: ${PROJECT_DISPLAYNAME}
openshift.io/requester: ${PROJECT_REQUESTING_USER}
creationTimestamp: null
name: ${PROJECT_NAME}
spec: {}
status: {}
- apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
creationTimestamp: null
name: admin
namespace: ${PROJECT_NAME}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: ${PROJECT_ADMIN_USER}
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-openshift-ingress
namespace: ${PROJECT_NAME}
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
network.openshift.io/policy-group: ingress
podSelector: {}
policyTypes:
- Ingress
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-openshift-monitoring
namespace: ${PROJECT_NAME}
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
network.openshift.io/policy-group: monitoring
podSelector: {}
policyTypes:
- Ingress
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: ${PROJECT_NAME}
spec:
podSelector:
ingress:
- from:
- podSelector: {}
- apiVersion: v1
kind: LimitRange
metadata:
name: limitrange
namespace: ${PROJECT_NAME}
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 10m
memory: 32Mi
type: Container
parameters:
- name: PROJECT_NAME
- name: PROJECT_DISPLAYNAME
- name: PROJECT_DESCRIPTION
- name: PROJECT_ADMIN_USER
- name: PROJECT_REQUESTING_USER
EOF
- 执行命令,在 openshift-config 中创建新 Template。
$ oc apply -f template_project-request-extended.yaml
- 执行命令,更新 Project 使用的 Template。
$ oc patch project.config.openshift.io cluster --type=merge --patch '{"spec": {"projectRequestTemplate": {"name": "project-request-extended"}}}'
- 为了允许 Ingress 对项目的访问,为 “default” 的命名空间打标签。
$ oc label namespace default 'network.openshift.io/policy-group=ingress'
- 创建一个新项目,然后验证 OpenShift 会自动该项目创建 LimitRange 和 NetworkPolicy。
$ new-project my-project1
$ get limitrange -n my-project1
NAME CREATED AT
limitrange 2022-03-07T01:54:38Z
$ get networkpolicy -n my-project1
NAME POD-SELECTOR AGE
allow-from-openshift-ingress <none> 2m18s
allow-from-openshift-monitoring <none> 2m18s
allow-same-namespace <none> 2m18s
参考
https://github.com/acend/openshift-4-ops-training/blob/main/content/en/docs/01/02_configuration.md
|