插一嘴 安全上下文

docker login 
docker tag l:v1 yellowo/libpsi:v1     
docker push $_

linux操作系统中文件句柄数的限制

在生产环境Linux系统中,基本上都需要解除文件句柄数的限制。原因是,Linux的系统默认值为1024,也就是说,一个进程最多可以接受1024个socket连接。这是远远不够的。

在Linux下,通过调用ulimit命令,可以看到单个进程能够打开的最大文件句柄数量,这个命令的具体使用方法是:

ulimit -n
# 1024

什么是ulimit命令呢?它是用来显示和修改当前用户进程一些基础限制的命令,-n命令选项用于引用或设置当前的文件句柄数量的限制值。Linux的系统默认值为1024。

默认的数值1024,对于绝大多数应用来说已经足够了,但是对于一些用户基数很大的高并发应用,则是远远不够的。一个高并发的应用,面临的并发连接数往往是十万级、百万级、千万级、甚至像腾讯QQ一样的上亿级。

文件句柄数不够,会导致出现"Socket/File:Can’t open so many files"的错误提示。

cat << eof | k apply -f - -n csdn-test
apiVersion: v1
kind: Pod
metadata: 
  name: p1
spec:
  securityContext:
    # runAsUser: 1000字段指定 Pod 中的所有容器内的进程都使用ID 1000运行。
    runAsUser: 1000
    # runAsGroup: 3000字段指定所有容器中的进程都以主组 ID 3000 来运行。 如果忽略此字段,则容器的主组 ID 将是 root(0)。 当runAsGroup被设置时,所有创建的文件也会划归用户 1000 和组 3000。 
    runAsGroup: 3000
    # fsGroup: 2000被设置,容器中所有进程也会是附组 ID 2000 的一部分。 卷/data/demo及在该卷中创建的任何文件的属主都会是组 ID 2000。
    fsGroup: 2000
  containers: 
  - name: c1
    image: yellowo/libpsi:v1
    command: ["/bin/sh"]
    args: ["-c", "sleep 3600"]
    securityContext:
      privileged: true
      capabilities:
        add: ["SYS_RESOURCE"]
eof
k exec -it p1 -- bash
frontend.exe
# Illegal instruction (core dumped)

不过一个“privileged(特权的)” 容器则被授权访问宿主上所有设备。 这种容器几乎享有宿主上运行的进程的所有访问权限。 对于需要使用 Linux 权能字(如操控网络堆栈和访问设备)的容器而言是有用的

插一嘴 docker 修改容器时间

# --cap-add SYS_TIME
docker run --rm -it busybox:1.28 sh 
date -s "2021-3-10 11:42:45" 
# date: can't set date: Operation not permitted
docker run --rm -it --cap-add SYS_TIME busybox:1.28 sh 
date -s "2021-3-10 11:42:45" 
date -R

cka 模拟考题九

Create a new Pod called super-user-pod with image busybox:1.28. Allow the pod to be able to set system_time

The container should sleep for 4800 seconds

Pod: super-user-pod
Container Image: busybox:1.28
SYS_TIME capabilities for the conatiner?

一般看到capabilities就要搜索安全上下文了,一般很少用

高级一点

容器是基于Linux的Capability机制来进行隔离。
而修改系统时间是需要有SYS_TIME权限才可以修改,容器默认是没有这个权限的。所以我们可以在启动容器的时候,加一个参数

cat << eof | k apply -f - -n csdn-test
---
apiVersion: v1
kind: Pod
metadata: {name: super-user-pod0}
spec:
  containers: 
  - name: c1
    image: busybox:1.28
    command: ["/bin/sh"]
    args: ["-c", "sleep 4800"]
---
apiVersion: v1
kind: Pod
metadata: 
  name: super-user-pod
spec:
  containers: 
  - name: c1
    image: busybox:1.28
    command: ["/bin/sh"]
    args: ["-c", "sleep 4800"]
    securityContext:
      capabilities:
        add: ["SYS_TIME"]
eof
k exec -it super-user-pod0 -- sh 
# 修改当前时间
date -s "2021-3-10 11:42:45" 
# date: can't set date: Operation not permitted
# 查看当前时间
date -R
####### 
k exec -it super-user-pod -- sh 
# 修改当前时间
date -s "2021-3-10 11:42:45"
# 查看当前时间
date -R

cka 模拟考题十

A pod definition file is created at q9-pod.yaml. Make use of this manifest file and mount the persistent volume called pv-1. Ensure the pod is running and the PV is bound.

mountPath: /data persistentVolumeClaim Name: my-pvc

  • persistentVolume Claim configured correctly
  • pod using the correct mountPath
  • pod using the persistent volume claim?
k explain pv
k explain pv.spec
k explain pv.spec.capacity
k explain pvc
k explain pod.spec.volumes
cat << eof | k apply -f - -n csdn-test
---
kind: PersistentVolume
apiVersion: v1
metadata: { name: pv-1, namespace: csdn-test, labels: {aa: bb}}
spec: 
  accessModes: [ ReadWriteMany ]
  hostPath: { path: /data }
  capacity: { storage: 2Gi }
...
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata: { name: my-pvc, namespace: csdn-test, labels: {aa: bb}}
spec: 
  accessModes: [ ReadWriteMany ]
  resources: {requests: { storage: 2Gi }}
...
---
kind: Pod
apiVersion: v1
metadata: { name: q9-pod, namespace: csdn-test, labels: {aa: bb}}
spec: 
  volumes:
  - name: my-pvc
    persistentVolumeClaim: { claimName: my-pvc}
  containers:
  - image: nginx 
    name: c1
    volumeMounts:
    - name: my-pvc
      mountPath: /data
...
eof
k get all -n  csdn-test -l 'aa in (bb)'
# all 只能显示po和svc
k exec q9-pod -- ls /data

注意文件是保存在pv里面的,这个hostPath 的pv是随着pod的所在的节点的位置保存的

cka 模拟考题十一

Create a pod as follow:

name:my-nginx
image: nginx

Add an Init Container within the Pod, the role of Init Container is to create an empty file under /cache/test.txt, Pod Containers determine whether the file exists, exiting if it does not exist.

k explain pod.spec
k explain pod.spec.containers.livenessProbe

注意: 一开始执行k apply -f ,之后如果有些参数不能更改,需要执行 k replace -f ,这个replace的效果是自动帮你删除之前的资源,重新在建立一个

cat << eof | k replace -f - -n csdn-test --force
---
kind: Pod
apiVersion: v1
metadata: { name: l-pod, namespace: csdn-test, labels: {aa: bb}}
spec: 
  volumes:
  - name: my-dir
    emptyDir: {}
  initContainers:
  - image: nginx 
    name: ic1
    command:
    - /bin/sh
    - -c
    - >
      touch /cache/test.txt
    volumeMounts:
    - name: my-dir
      mountPath: /cache 
  containers:
  - image: nginx 
    name: c1
    livenessProbe:
      exec:
        command: 
        - /bin/sh
        - -c 
        - |
           test -e /cache/test.txt                   
    volumeMounts:
    - name: my-dir
      mountPath: /cache
...
eof
k describe po l-pod
k exec  po/l-pod -- ls /cache/test.txt   

插一嘴

查看pod中的容器所在的命名空间

cat /var/run/secrets/kubernetes.io/serviceaccount/namespace

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐