13.1. 在 pod 中使用宿主节点的 Linux 命名空间
13.1.1. 在 pod 中使用宿主节点的网络命名空间
在 pod 的 YAML 文件中就设置 spec.hostNetwork: true
这个时候 pod 使用宿主机的网络, 如果设置了端口, 则使用宿主机的端口.
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-host-yaohong
- spec:
- hostNetwork: true // 使用宿主节点的网络命名空间
- containers:
- - image: luksa/kubia
- command: ["/bin/sleep", "9999"]
13.1.2. 绑定宿主节点上的端口而不使用宿主节点的网络命名空间
在 pod 的 YAML 文件中就设置 spec.containers.ports 字段来设置
在 ports 字段中可以使用
containerPorts 设置通过 pod 的 ip 访问的端口
container.hostPort 设置通过所在节点的端口访问
- apiVersion: v1
- kind: pod
- metadata:
- name: kubia-hostport-yaohong
- spec:
- containers:
- - image: luksa/kubia
- - name: kubia
- ports:
- - containerport: 8080 // 该容器通过 pod IP 访问该端口
- hostport: 9000 // 该容器可以通过它所在节点 9000 端口访问
- protocol: Tcp
13.1.3. 使用宿主节点的 PID 与 IPC
PID 是进程 ID,PPID 是父进程 ID.
在 Linux 下的多个进程间的通信机制叫做 IPC(Inter-Process Communication), 它是多个进程之间相互沟通的一种方法.
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-with-host-pid-and-ipc-yaohong
- spec:
- hostPID: true // 你希望这个 pod 使用宿主节点的 PID 命名空间
- hostIPC: true // 你希望 pod 使用宿主节点的 IPC 命名空间
- containers:
- - name: main
- image: alpine
- command: ["/bin/sleep", "99999"]
13.2. 配置节点的安全上下文
13.2.1. 使用指定用户运行容器
查看某个 pod 运行的用户
- $ kubectl -n kube-system exec coredns-7b8dbb87dd-6ll7z id
- uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
容器的运行用户再 DockerFile 中指定, 如果没有指定则为 root
指定 pod 的运行的用户方法如下
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-as-user
- spec:
- containers:
- - name: main
- image: alpine
- command: ["/bin/sleep", "99999"]
- securityContext:
- runAsUser: 405 // 你需要指定的用户 ID, 而不是用户名
13.2.2. 阻止容器以 root 用户运行
runAsNonRoot 来设置
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-as-user
- spec:
- containers:
- - name: main
- image: alpine
- command: ["/bin/sleep", "99999"]
- securityContext:
- runAsNonRoot: true // 这个容器只允许以非 root 用户运行
13.2.3. 使用特权模式运行 pod
为了获得宿主机内核完整的权限, 该 pod 需要在特权模式下运行. 需要添加 privileged 参数为 true.
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-as-privileged
- spec:
- containers:
- - name: main
- image: alpine
- command: ["/bin/sleep", "99999"]
- securityContext:
- privileged: true // 这个容器将在特权模式下运行
13.2.4. 为容器单独添加内核功能
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-as-capability
- spec:
- containers:
- - name: main
- image: alpine
- command: ["/bin/sleep", "99999"]
- securityContext:
- capabilities: // 该参数用于 pod 添加或者禁用某项内核功能
- add:
- - SYS_TIME // 添加修改系统时间参数
13.2.5. 在容器中禁止使用内核功能
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-as-capability
- spec:
- containers:
- - name: main
- image: alpine
- command: ["/bin/sleep", "99999"]
- securityContext:
- capabilities: // 该参数用于 pod 添加或者禁用某项内核功能
- drop:
- - CHOWN // 禁用容器修改文件的所有者
13.2.6. 阻止对容器根文件系统的写入
securityContext.readyOnlyFilesystem 设置为 true 来实现阻止对容器根文件系统的写入.
- apiVersion: v1
- kind: pod
- metadata:
- name: pod-with-readonly-filesystem
- spec:
- containers:
- - name: main
- image: alpine
- command: ["/bin/sleep", "99999"]
- securityContext:
- readyOnlyFilesystem: true // 这个容器的根文件系统不允许写入
- volumeMounts:
- - name: my-volume
- mountPath: /volume //volume 写入是允许的, 因为这个目录挂载一个存储卷
- readOnly: false
13.3. 限制 pod 使用安全相关的特性
13.3.1.PodSecurityPolicy 资源介绍
PodSecurityPolicy 是一种集群级别 (无命名空间) 的资源, 它定义了用户能否在 pod 中使用各种安全相关的特性.
13.3.2. 了解 runAsUser,fsGroups 和 supplementalGroup 策略
- runAsUser:
- runle: MustRunAs
- ranges:
- - min: 2 // 添加一个 max=min 的 range, 来指定一个 ID 为 2 的 user
- max: 2
- fsGroup:
- rule: MustRunAs
- ranges:
- - min: 2
- max: 10 // 添加多个区间 id 的限制, 为 2-10 或者 20-30
- - min: 20
- max: 30
- supplementalGroups:
- rule: MustRunAs
- ranges:
- - min: 2
- max: 10
- - min: 20
- max: 30
13.3.3. 配置允许, 默认添加, 禁止使用的内核功能
三个字段会影响容器的使用
allowedCapabilities: 指定容器可以添加的内核功能
defaultAddCapabilities: 为所有容器添加的内核功能
requiredDropCapabilities: 禁止容器中的内核功能
- apiVersion: v1
- kind: PodSecurityPolicy
- spec:
- allowedCapabilities:
- - SYS_TIME // 允许容器添加 SYS_time 功能
- defaultAddCapabilities:
- - CHOWN // 为每个容器自动添加 CHOWN 功能
- requiredDropCapabilities:
- - SYS_ADMIN // 要求容器禁用 SYS_ADMIN 和 SYS_MODULE 功能
13.4. 隔离 pod 网络
13.4.1. 在一个命名空间中使用网络隔离
podSelector 进行对一个命名空间下的 pod 进行隔离
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: postgres-netpolicy
- spec:
- podSelector: // 这个策略确保了对具有 App=databases 标签的 pod 的访问安全性
- matchLabels:
- App: database
- ingress:
- - from:
- - podSelector: // 它只允许来自具有 App=webserver 标签的 pod 的访问
- matchLabels:
- App: webserver
- ports:
- - port: 5432 // 允许对这个端口的访问
13.4.2. 在 不同的 kubernetes 命名空间之间进行网络隔离
namespaceSelector 进行对不同命名空间间进行网络隔离
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: postgres-netpolicy
- spec:
- podSelector: // 这个策略确保了对具有 App=databases 标签的 pod 的访问安全性
- matchLabels:
- App: database
- ingress:
- - from:
- - namespaceSelector: // 只允许 tenant: manning 标签的命名空间中运行的 pod 进行互相访问
- matchLabels:
- tenant: manning
- ports:
- - port: 5432 // 允许对这个端口的访问
13.4.3. 使用 CIDR 网络隔离
- ingress:
- - from:
- - ipBlock:
- cidr: 192.168.1.0/24 // 指明允许访问的 ip 段
13.4.4. 限制 pod 对外访问流量
使用 egress 进行限制
- spec:
- podSelector: // 这个策略确保了对具有 App=databases 标签的 pod 的访问安全性
- matchLabels:
- App: database
- egress: // 限制 pod 的出网流量
- - to:
- - podSelector:
- matchLables: //database 的 pod 只能与有 App: webserver 的 pod 进行通信
- App: webserver
来源: https://www.cnblogs.com/yaohong/p/11369084.html