06 k8s考试基础知识(五)
对于需要使用 Linux 权能字(如操控网络堆栈和访问设备)的容器而言是有用的。默认的数值1024,对于绝大多数应用来说已经足够了,但是对于一些用户基数很大的高并发应用,则是远远不够的。一个高并发的应用,面临的并发连接数往往是十万级、百万级、千万级、甚至像腾讯QQ一样的上亿级。原因是,Linux的系统默认值为1024,也就是说,一个进程最多可以接受1024个socket连接。什么是ulimit命令
插一嘴 安全上下文
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
更多推荐
所有评论(0)