应用部署、运行与管理(二)
管理容器进程的运行身份:
示例:
下面的资源配置清单securitycontext-runasuser-httpd.yaml配置以这个UID和GID的身份来运行这个httpd应用,考虑到非特权用户默认无法使用1024以下的端口号,文件中通过环境变量env 改变了应用监听端口
[root@k8s-master01 yaml]# cat securitycontext-runasuser-demo.yaml
apiVersion: v1 kind: Pod metadata: name: securitycontext-runasuser-demo namespace: dev spec: containers: - name: demo image: ikubernetes/demoapp:v1.0 imagePullPolicy: Always env: - name: PORT value: "8080" securityContext: runAsUser: 1001 runAsGroup: 1001
[root@k8s-master01 yaml]# kubectl apply -f securitycontext-runasuser-demo.yaml -n dev
pod/securitycontext-runasuser-demo created
[root@k8s-master01 yaml]# kubectl exec securitycontext-runasuser-demo -- ps aux Error from server (NotFound): pods "securitycontext-runasuser-demo" not found [root@k8s-master01 yaml]# kubectl exec securitycontext-runasuser-demo -n dev -- ps aux PID USER TIME COMMAND 1 1001 0:00 python3 /usr/local/bin/demo.py 8 1001 0:00 ps aux [root@k8s-master01 yaml]# kubectl exec securitycontext-runasuser-demo -n dev -- id uid=1001 gid=1001
查看容器日志:
[root@k8s-master01 yaml]# kubectl logs securitycontext-runasuser-demo -n dev
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
在容器中额外运行其他程序:(kubectl exec命令)
查看端口、查看id等如上代码
自定义容器应用与参数
容器镜像启动容器时运行的默认程序由其Dockerfile文件中的ENTRYPOINT指令进行定义,传递给程序的参数则通过CMD指令设定,ENTRYPOINT指令不存在时,CMD可以同时指定程序与参数。
要了解镜像的ENTRYPOINT与CMD,可以在任何存在此镜像的节点执行类似如下命令:
[root@k8s-master01 ~]# docker pull ikubernetes/demoapp:v1.0
v1.0: Pulling from ikubernetes/demoapp
c9b1b535fdd9: Pull complete
3cbce035cd7c: Pull complete
b83463f478a5: Pull complete
34b1f286d5e2: Pull complete
Digest: sha256:6698b205eb18fb0171398927f3a35fe27676c6bf5757ef57a35a4b055badf2c3
Status: Downloaded newer image for ikubernetes/demoapp:v1.0
docker.io/ikubernetes/demoapp:v1.0
[root@k8s-master01 ~]# docker inspect ikubernetes/demoapp:v1.0 -f {{.Config.Entrypoint}}
[/bin/sh -c python3 /usr/local/bin/demo.py]
[root@k8s-master01 ~]# docker inspect ikubernetes/demoapp:v1.0 -f {{.Config.Cmd}}
[]
下面资源配置清单pod-demo-with-cmd-and-args.yaml 文件将镜像ikubernetes/demoapp:v1.0 d 默认应用程序修改为/bin/sh -c,然后程序的参数定义为python3 /usr/local/bin/demo.py -p 8081
[root@k8s-master01 yaml]# cat pod-demo-with-cmd-and-args.yaml apiVersion: v1 kind: Pod metadata: name: pod-demo-with-cmd-and-args namespace: dev spec: containers: - name: demo image: ikubernetes/demoapp:v1.0 imagePullPolicy: IfNotPresent command: ["/bin/sh","-c"] args: ["python3 /usr/local/bin/demo.py -p 8081"]
[root@k8s-master01 yaml]# kubectl apply -f pod-demo-with-cmd-and-args.yaml -n dev pod/pod-demo-with-cmd-and-args created [root@k8s-master01 yaml]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE pod-demo-with-cmd-and-args 1/1 Running 0 10s pod-nginx-68dc879f46-fcwxh 1/1 Running 0 31h pod-nginx-68dc879f46-htp2z 1/1 Running 0 31h pod-nginx-68dc879f46-kzhb5 1/1 Running 0 31h pod-nginx-68dc879f46-rblxg 1/1 Running 0 31h pod-using-hostnetwork 1/1 Running 0 28h pod-using-hostport 1/1 Running 0 29h securitycontext-runasuser-demo 1/1 Running 0 25h
[root@k8s-master01 yaml]# kubectl exec pod-demo-with-cmd-and-args -n dev -- netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN
端口已经改为8081了
管理容器的内核功能
linux内核常用功能如下: 从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作. Capabilities的主要思想在于分割root用户的特权,即将root的特权分割成不同的能力,每种能力代表一定的特权操作。例如:能力CAP_SYS_MODULE表示用户能够加载(或卸载)内核模块的特权操作,而CAP_SETUID表示用户能够修改进程用户身份的特权操作。在Capbilities中系统将根据进程拥有的能力来进行特权操作的访问控制。 在Capilities中,只有进程和可执行文件才具有能力,每个进程拥有三组能力集,分别称为cap_effective, cap_inheritable, cap_permitted(分别简记为:pE,pI,pP),其中cap_permitted表示进程所拥有的最大能力集;cap_effective表示进程当前可用的能力集,可以看做是cap_permitted的一个子集;而cap_inheitable则表示进程可以传递给其子进程的能力集。系统根据进程的cap_effective能力集进行访问控制,cap_effective为cap_permitted的子集,进程可以通过取消cap_effective中的某些能力来放弃进程的一些特权。可执行文件也拥有三组能力集,对应于进程的三组能力集,分别称为cap_effective, cap_allowed 和 cap_forced(分别简记为fE,fI,fP),其中,cap_allowed表示程序运行时可从原进程的cap_inheritable中集成的能力集,cap_forced表示运行文件时必须拥有才能完成其服务的能力集;而cap_effective则表示文件开始运行时可以使用的能力。 各种能力: CAP_CHOWN:修改文件属主的权限 CAP_DAC_OVERRIDE:忽略文件的DAC访问限制 CAP_DAC_READ_SEARCH:忽略文件读及目录搜索的DAC访问限制 CAP_FOWNER:忽略文件属主ID必须和进程用户ID相匹配的限制 CAP_FSETID:允许设置文件的setuid位 CAP_KILL:允许对不属于自己的进程发送信号 CAP_SETGID:允许改变进程的组ID CAP_SETUID:允许改变进程的用户ID CAP_SETPCAP:允许向其他进程转移能力以及删除其他进程的能力 CAP_LINUX_IMMUTABLE:允许修改文件的IMMUTABLE和APPEND属性标志 CAP_NET_BIND_SERVICE:允许绑定到小于1024的端口 CAP_NET_BROADCAST:允许网络广播和多播访问 CAP_NET_ADMIN:允许执行网络管理任务 CAP_NET_RAW:允许使用原始套接字 CAP_IPC_LOCK:允许锁定共享内存片段 CAP_IPC_OWNER:忽略IPC所有权检查 CAP_SYS_MODULE:允许插入和删除内核模块 CAP_SYS_RAWIO:允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备 CAP_SYS_CHROOT:允许使用chroot()系统调用 CAP_SYS_PTRACE:允许跟踪任何进程 CAP_SYS_PACCT:允许执行进程的BSD式审计 CAP_SYS_ADMIN:允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 CAP_SYS_BOOT:允许重新启动系统 CAP_SYS_NICE:允许提升优先级及设置其他进程的优先级 CAP_SYS_RESOURCE:忽略资源限制 CAP_SYS_TIME:允许改变系统时钟 CAP_SYS_TTY_CONFIG:允许配置TTY设备 CAP_MKNOD:允许使用mknod()系统调用 CAP_LEASE:允许修改文件锁的FL_LEASE标志
下面的配置清单
securitycontext-capabilities-demo.yaml 文件在安全上下文启用了内核功能NET_ANMIN,并且禁用了CHOWN.demo容器未定义USER指令,所有默认用root身份运行容器
[root@k8s-master01 yaml]# cat securitycontext-capabilities-demo.yaml apiVersion: v1 kind: Pod metadata: name: securitycontext-capabilities-demo namespace: dev spec: containers: - name: demo image: ikubernetes/demoapp:v1.0 imagePullPolicy: IfNotPresent command: ["/bin/sh","-c"] args: ["/sbin/iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 && /usr/bin/python3 /usr/local/bin/demo.py"] securityContext: capabilities: add: ["NET_ADMIN"] drop: ["CHOWN"] [root@k8s-master01 yaml]# kubectl apply -f securitycontext-capabilities-demo.yaml -n dev pod/securitycontext-capabilities-demo created [root@k8s-master01 yaml]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE pod-demo-with-cmd-and-args 1/1 Running 0 35m pod-nginx-68dc879f46-fcwxh 1/1 Running 0 32h pod-nginx-68dc879f46-htp2z 1/1 Running 0 32h pod-nginx-68dc879f46-kzhb5 1/1 Running 0 32h pod-nginx-68dc879f46-rblxg 1/1 Running 0 32h pod-using-hostnetwork 1/1 Running 0 28h pod-using-hostport 1/1 Running 0 29h securitycontext-capabilities-demo 0/1 ContainerCreating 0 13s securitycontext-runasuser-demo 1/1 Running 0 25h [root@k8s-master01 yaml]# kubectl exec securitycontext-capabilities-demo -n dev -- iptables -t nat -nL PREROUTING Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 redir ports 80
清单中iptables 规则已经生成
[root@k8s-master01 yaml]# kubectl exec securitycontext-capabilities-demo -n dev -- chown 200.200 /etc/hosts
chown: /etc/hosts: Operation not permitted
command terminated with exit code 1
root用户不能修改容器文件属主属组,所以chown功能关闭成功
浙公网安备 33010602011771号