在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