Kubernetes的多租户
参考资料
查看节点资源总量
$ kubectl describe nodes ln1
Name: ln1
...
Capacity:
cpu: 40
ephemeral-storage: 574345384Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 264015508Ki
pods: 110
Allocatable:
cpu: 40
ephemeral-storage: 529316705019
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 263913108Ki
pods: 110
Pod 中的容器申请资源 定义 Pod,通过容器指定 CPU 和内存的资源请求量 #requests-pod.
ifconfig & route
$ docker run -d --name centos1 centos
$ docker run -it --name centos2 centos bash
# yum install net-tools -y
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 3475 bytes 14166022 (13.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2988 bytes 214839 (209.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
规则
添加规则
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE
查看规则
# iptables -t raw -L -n --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 TRACE icmp -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 TRACE icmp -- 0.0.0.0/0 0.0.0.0/0
删除规则
iptables -t raw -D PREROUTING 1
iptables -t raw -D OUTPUT 1
参考资料
安装 Docker SDK for Python
pip install docker
例子
将本地文件或目录添加到容器,生成新的镜像。
import docker
import tarfile
import tempfile
import os
def simple_tar(path):
f = tempfile.NamedTemporaryFile()
t = tarfile.open(mode='w', fileobj=f)
abs_path = os.path.abspath(path)
t.add(abs_path, arcname=os.path.basename(path))
t.close()
f.seek(0)
return f
client = docker.from_env()
// ...
参考资料
模型打包成镜像
手工打包
project_dir=platen-switch
darknet_model_name=darknet-model-platen-switch
cd $project_dir
docker run -d --name $darknet_model_name alpine
docker cp model/ $darknet_model_name:/
docker commit -a 'wang-junjian@qq.com' -m 'darknet model [platen-switch recognition]' \
$darknet_model_name gouchicao/$darknet_model_name:latest
docker rm -v $darknet_model_name
docker push gouchicao/$darknet_model_name:latest
Python 脚本 import docker import tarfile import tempfile import os def simple_tar(path): f = tempfile.NamedTemporaryFile() t = tarfile.
Node
标签信息
查看单个节点
$ kubectl get node ln1 -o=jsonpath='{.metadata.labels}{"\n"}'
map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:ln1 kubernetes.io/os:linux node-role.kubernetes.io/master:]
查看集群所有节点 $ kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels}{"\n"}{end}' gpu1 map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux k8s.amazonaws.com/accelerator:vgpu kubernetes.io/arch:amd64 kubernetes.io/hostname:gpu1 kubernetes.
安装
安装 kubectl
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
安装 minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
install minikube-linux-amd64 /usr/local/bin/minikube
启动 Kubernetes 集群 # minikube start --force 😄 Centos 8.1.1911 (amd64) 上的 minikube v1.22.
官方的安装
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx
在中国
wget https://github.com/kubernetes/ingress-nginx/releases/download/ingress-nginx-3.3.0/ingress-nginx-3.3.0.tgz
tar xzvf ingress-nginx-3.3.0.tgz
cd ingress-nginx
替换镜像 vim values.yaml repository: k8s.gcr.
认证机制
API 服务器接收的请求经过认证插件列表,当遇到第一个成功返回用户名、用户ID和组信息给 API 服务器后,将停止剩余的认证调用,进入授权阶段。
ServiceAccount
镜像拉取密钥
向 ServiceAccount 中添加 imagePullSecrets,可以不必对每个 Pod 单独添加 imagePullSecrets。
创建 docker-registry Secret
kubectl create secret docker-registry mydockerhubsecret \
--docker-username=myusername \
--docker-password=mypassword \
--docker-email=myemail
编写 ServiceAccount YAML 文件(sa-image-pull-secret.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: image-pull-secret
imagePullSecrets:
- name: mydockerhubsecret
创建 ServiceAccount 对象
kubectl apply -f sa-image-pull-secret.yaml
编写 Pod YAML 文件(private-serviceacc
在删除标签的时候不小心删除了节点。
$ kubectl delete nodes ln6 server-type-
node "ln6" deleted
Error from server (NotFound): nodes "server-type-" not found
主节点
在 Master 节点创建加入节点用的 Token
kubeadm token create --print-join-command
W0706 08:09:27.126498 609025 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 172.16.33.157:6443 --token xxx.yyyyyy --discovery-token-ca-cert-hash sha256:zzzzzzzzzzzzzzzzzzzzzz
工作节点(被删除的)
登录 root 用户
su - root
重置 # kubeadm reset [reset] WARNING: Changes made to this host by 
ConfigMap
向容器传递命令行参数
在 Docker 中定义命令与参数
下面是 Dockerfile 中的指令 ENTRYPOINT 和 CMD。
| 指令 | 解释 |
|---|---|
| ENTRYPOINT | 容器启动时调用的命令 |
| CMD | 传递给 ENTRYPOINT 指定命令的参数 |
构建带参数的程序(date:args)
编写脚本 date.sh
#!/bin/sh
INTERVAL=$1
while :
do
echo $(date)
sleep $INTERVAL
done
编写 Dockerfile
FROM busybox
ADD date.sh /date.sh
RUN chmod +x /date.sh
ENTRYPOINT ["/date.sh"]
CMD ["1"]
参数默认值为 1,在运行容器可以设置参数覆盖默认值。
构建镜像
docker build -t wangjunjian/date:args .
在 Docker 中覆盖命令和参数
使用 Docker 运行镜像来设置命令和参数
docker run [--entrypoint=] <image> [arg1, arg2, arg3]
启动镜像 $ docker run wangjunjian/date:args Tue Aug 3 13:08:04 UTC 2021 Tue Aug 3
通过卷在容器之间共享数据
Build [Date HTML Generator] Image
编写 HTML 生成器(date-html-generator.sh)
#!/bin/sh
mkdir /var/htdocs
while :
do
echo $(date +'%Y-%m-%d %H:%M:%S') Writing to /var/htdocs/index.html
echo $(date +'%Y-%m-%d %H:%M:%S') > /var/htdocs/index.html
sleep 1
done
编写 Dockerfile
FROM busybox
ADD date-html-generator.sh /bin/date-html-generator.sh
RUN chmod +x /bin/date-html-generator.sh
ENTRYPOINT /bin/date-html-generator.sh
生成 date-html-generator 镜像 docker build -t wangjunjian/date-htm
节点亲和性(nodeAffinity)
实现 nodeSelector 一样的功能
编写 YAML 文件(kubia.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubia
labels:
app: kubia
spec:
selector:
matchLabels:
app: kubia
replicas: 4
template:
metadata:
labels:
app: kubia
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-type
operator: In
values:
- inference
containers:
- name: kubia
image: wangjunjian/kubia:latest
ports:
- containerPort: 8080
污点
通过给节点添加污点,可以拒绝 Pod 调度到节点上。
污点样式
<key>=[value]:<effect>
例子
dedicated=foo:PreferNoSchedule
node-role.kubernetes.io/master:NoSchedule
node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unreachable:NoSchedule
增加
kubectl taint node ln6 key1=value1:NoSchedule
# 增加多个
kubectl taint node ln6 key1=value1:NoSchedule key1=value1:PreferNoSchedule
一个 key 可以有多个 effect
删除 kubectl taint node ln6 key1=value1:NoSchedule- # 使用 key
Service
为一组功能相同的 Pod 提供固定地址的访问。
集群内部的服务
在集群内部运行多个 Pod 服务。
创建服务
先部署之前的 kubia Deployment (kubia.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubia
labels:
app: kubia
spec:
selector:
matchLabels:
app: kubia
replicas: 2
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: wangjunjian/kubia:latest
ports:
- containerPort: 8080
创建 Deployment 对象
$ kubectl apply -f kubia.yaml
deployment.apps/kubia created
apiVersion: v1
kind: Service
metadata:
name: kubia
labels:
app: kubia
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
创建 Service 对象 $ kubectl
没有找到匹配的文章