在pod的yaml文件中就设置spec.hostNetwork: true html
这个时候pod使用宿主机的网络,若是设置了端口,则使用宿主机的端口。linux
apiVersion: v1 kind: pod metadata: name: pod-host-yaohong spec: hostNetwork: true //使用宿主节点的网络命名空间 containers: - image: luksa/kubia command: ["/bin/sleep", "9999"]
在pod的yaml文件中就设置spec.containers.ports字段来设置web
在ports字段中可使用api
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
在linux下的多个进程间的通讯机制叫作IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。ide
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"]
查看某个pod运行的用户post
$ 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中指定,若是没有指定则为rootui
指定pod的运行的用户方法以下
apiVersion: v1 kind: pod metadata: name: pod-as-user spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: runAsUser: 405 //你须要指定的用户ID,而不是用户名
apiVersion: v1 kind: pod metadata: name: pod-as-user spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: runAsNonRoot: true //这个容器只容许以非root用户运行
为了得到宿主机内核完整的权限,该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 //这个容器将在特权模式下运行
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 //添加修改系统时间参数
apiVersion: v1 kind: pod metadata: name: pod-as-capability spec: containers: - name: main image: alpine command: ["/bin/sleep", "99999"] securityContext: capabilities: //该参数用于pod添加或者禁用某项内核功能 drop: - CHOWN //禁用容器修改文件的全部者
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
PodSecurityPolicy是一种集群级别(无命名空间)的资源,它定义了用户可否在pod中使用各类安全相关的特性。
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
三个字段会影响容器的使用
apiVersion: v1 kind: PodSecurityPolicy spec: allowedCapabilities: - SYS_TIME //容许容器添加SYS_time功能 defaultAddCapabilities: - CHOWN //为每一个容器自动添加CHOWN功能 requiredDropCapabilities: - SYS_ADMIN //要求容器禁用SYS_ADMIN和SYS_MODULE功能
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 //容许对这个端口的访问
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 //容许对这个端口的访问
ingress: - from: - ipBlock: cidr: 192.168.1.0/24 //指明容许访问的ip段
使用egress进行限制
spec: podSelector: //这个策略确保了对具备app=databases标签的pod的访问安全性 matchLabels: app: database egress: //限制pod的出网流量 - to: - podSelector: matchLables: //database的pod只能与有app: webserver的pod进行通讯 app: webserver