Kubernetes中配置调度器
我们遇到一个场景,压榨出每一台节点的性能,需要优先调度到资源(CPU、Memory)使用最多的节点上。
我们遇到一个场景,压榨出每一台节点的性能,需要优先调度到资源(CPU、Memory)使用最多的节点上。
过几分钟后您将看到 kubernetes-dashboard 名字空间下会有 Pod 运行。
kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6b4884c9d5-27xf6 1/1 Running 0 4m
kubernetes-dashboard-7b544877d5-mfmbp 1/1 Running 0 4m
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
// ...
输入 Token 信息登录。完成后,我们可以看到 Kubernetes 集群信息。
在您的本地浏览器输入地址 http://loca
容器内运行 top
kubectl exec -it requests-pod top
Mem: 369767748K used, 26208028K free, 51000K shrd, 3765588K buff, 294978160K cached
CPU: 3.1% usr 1.5% sys 0.0% nic 95.2% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 1.44 1.65 1.66 4/6602 18
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 root R 1308 0.0 27 2.5 dd if /dev/zero of /dev/null
13 0 root R 1324 0.0 38 0.0 top
★ 在容器内看到的 CPU 和内存是节点的。
top 命令显示占用了 2.5% CPU,对于 40 核的系统来说显然是占用了一个核。requests 不会限制资源的使用数量,因为是单线程,最多也就能用满一个核。
容器内运行 top kubectl exec -it limits-pod top Mem: 370581688K used, 25394088K free, 50976K shrd, 3774664K buff, 292993444K cached
在删除标签的时候不小心删除了节点。
$ kubectl delete nodes ln6 server-type-
node "ln6" deleted
Error from server (NotFound): nodes "server-type-" not found
| 指令 | 解释 |
|---|---|
| ENTRYPOINT | 容器启动时调用的命令 |
| CMD | 传递给 ENTRYPOINT 指定命令的参数 |
编写 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 run wangjunjian/date:args
Tue Aug 3 13:08:04 UTC 2021
Tue Aug 3 13:08:05 UTC 2021
设置参数覆盖默认睡眠时间
$ docker run wangjunjian/date:args 3
Tue Aug 3 13:08:46 UTC 2021
Tue Aug 3 13:08:49 UTC 2021
覆盖默认的命令
$ docker run --entrypoint=/bin/sh wangjunjian/date:args
/ #
少量参数的设置可以使用上面的数组表示,当参数过多时可以使用下面的方式,如果参数是数值型需要使用引号。
args:
- str
- "3"
例子
dedicated=foo:PreferNoSchedule
node-role.kubernetes.io/master:NoSchedule
node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unreachable:NoSchedule
一个 key 可以有多个 effect
查看集群所有节点的污点信息 $ kubectl get nodes -o=jsonpath='{range .items[]}{.metadata.name}{"\t"}{.status.addresses[0].address}{"\n"}{range .spec.taints[]}{"\t"}{.key}{"="}{.value}{":"}{.effect}{"\n"}{end}{end}' gpu1 172.16.33.66 node.kubernetes.io/unreachable=:NoSchedule node.kubernetes.io/unreachable=:NoExecute ln1 172.16.33.157 node-role.kubernetes.
创建 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 apply -f kubia-service.yaml
service/kubia created
$ kubectl expose deployment kubia --name=kubia-http
service/kubia-http exposed
查看服务
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubia ClusterIP 10.109.180.140 <none> 80/TCP 11m
kubia-http ClusterIP 10.101.40.142 <none> 80/TCP 9m57s
svc 是 Service 的缩写
基于一个公共的模板运行多个Jobs。 你可以用这种方法来并行执行批处理任务。
查看 jobs 目录,可以看到下面的结果。
$ tree jobs
jobs
├── job-apple.yaml
├── job-banana.yaml
└── job-cherry.yaml
也可以直接创建 Job 对象
cat job.yaml.jinja2 | render_template | kubectl apply -f -
tan(π/4) = 1。所以,4*atan(1)正好就是π,也就是 3.1415926…。
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
restartPolicy: Never
containers:
- name: pi
image: alpine
command: ["sh", "-c", "echo 'scale=6000; 4*a(1)' | bc -l"]
运行完成后再次查看,Pod 的状态变为 Completed,不会自动删除,方便您查看日志。
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/pi-866nk 0/1 Completed 0 11m
NAME COMPLETIONS DURATION AGE
job.batch/pi 1/1 10m 11m
查看 Job 对象的描述 $ kubectl describe job pi
查看 Pod 对象
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubia-h48q8 1/1 Running 0 23s 10.38.0.19 ln2 <none> <none>
kubia-tx5hz 1/1 Running 0 23s 10.34.0.10 ln6 <none> <none>
kubia-x9479 0/1 ContainerCreating 0 23s <none> ln3 <none> <none>
修改 DaemonSet 的YAML文件(kubia-ds.yaml) apiVersion: apps/v1 kind: DaemonSet metadata: name: kubia spec: selector: matchLabels: app: kubia template: metadata: labels: app: kubia spec: tolerations: - key: node-role.kubernetes.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubia-j8tth 0/1 ContainerCreating 0 35s
kubia-jkt8g 1/1 Running 0 35s
$ kubectl describe rc kubia
Name: kubia
Namespace: kubia
Selector: app=kubia
Labels: app=kubia
Annotations: Replicas: 2 current / 2 desired
Pods Status: 1 Running / 1 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=kubia
Containers:
kubia:
Image: wangjunjian/kubia:latest
Port: 8080/TCP
Host Port: 0/TCP
Environment: <none>
// ...
当删除 Pod 对象后,ReplicationController 会自动创建新的 Pod 对象来满足期望的副本个数。
$ kubectl delete pod kubia-jkt8g
pod "kubia-jkt8g" deleted
apiVersion: v1
kind: Namespace
metadata:
name: kubia
$ kubectl apply -f kubia-namespace.yaml
namespace/kubia created
查看新创建的名字空间,ns 是 namespace 的缩写。
$ kubectl get ns kubia
NAME STATUS AGE
kubia Active 35s
$ kubectl describe pod kubia-manual
Name: kubia-manual
Namespace: default
Annotations: gouchicao.com/someannotation: test
通过添加两个标签将 Pod 组织为两个维度(基于应用的横向维度和基于版本的纵向维度)

--overwrite)$ kubectl label pod kubia-manual-v2 app=kubia --overwrite
pod/kubia-manual-v2 labeled
$ kubectl get pods -L app,rel
NAME READY STATUS RESTARTS AGE APP REL
kubia-864465c9d-744qc 1/1 Running 0 5d4h kubia
kubia-864465c9d-kzql7 1/1 Running 0 5d4h kubia
kubia-manual 1/1 Running 0 19h kubia
kubia-manual-v2 1/1 Running 0 22m kubia stable
删除(key-) $ kubectl label pod kubia-manual-v2 rel- pod/kubia-manual-v2 labeled $ kubectl get pods -L app,rel NAME READY STATUS RESTARTS AGE APP REL kubia-864465c9d-744qc 1/1 Running 0 5d4h kubia kubia-864465c9d-
通过端口转发(port-forward)可以连接到 Pod,方便测试和调试服务。
$ kubectl get pod kubia-manual -o json
$ kubectl logs kubia-manual
Kubia server starting...