kubernetes
资源对象文件
模板与帮助信息
# 获取 Pod 模板
[root@master ~]# kubectl run myweb --image=myos:nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: myweb
name: myweb
spec:
containers:
- image: myos:nginx
name: myweb
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
# 获取资源对象模板
[root@master ~]# kubectl create namespace work --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: work
spec: {}
status: {}
# 查询帮助信息
[root@master ~]# kubectl explain Pod.spec.restartPolicy
KIND: Pod
VERSION: v1
FIELD: restartPolicy <string>
DESCRIPTION:
Restart policy for all containers within the pod. One of Always, OnFailure,
Never. Default to Always. More info:
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
Possible enum values:
- `"Always"`
- `"Never"`
- `"OnFailure"`
资源对象文件
[root@master ~]# mkdir app
[root@master ~]# cd app
[root@master app]# vim httpd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: httpd
spec:
containers:
- name: httpd
image: myos:httpd
[root@master app]# vim nginx.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: nginx
spec:
containers:
- name: nginx
image: myos:nginx
[root@master app]# vim phpfpm.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: php
spec:
containers:
- name: php
image: myos:php-fpm
管理资源对象管理
[root@master app]# ls
httpd.yaml nginx.yaml phpfpm.yaml
# 使用资源对象文件创建应用
[root@master ~]# kubectl apply -f httpd.yaml
pod/httpd created
[root@master app]# kubectl apply -f nginx.yaml -f phpfpm.yaml
pod/nginx created
pod/php created
# 删除应用
[root@master app]# kubectl delete -f /root/app/
pod "httpd" deleted
pod "nginx" deleted
pod "php" deleted
# 合并资源对象文件
[root@master app]# cat nginx.yaml >>app.yaml
[root@master app]# cat phpfpm.yaml >>app.yaml
# 创建资源对象
[root@master ~]# kubectl apply -f app.yaml
pod/nginx created
pod/php created
# 删除资源对象
[root@master ~]# kubectl delete -f app.yaml
pod "nginx" deleted
pod "php" deleted
自定义命令
[root@master app]# ls
httpd.yaml nginx.yaml phpfpm.yaml
# 使用资源对象文件创建应用
[root@master ~]# kubectl apply -f httpd.yaml
pod/httpd created
[root@master app]# kubectl apply -f nginx.yaml -f phpfpm.yaml
pod/nginx created
pod/php created
# 删除应用
[root@master app]# kubectl delete -f /root/app/
pod "httpd" deleted
pod "nginx" deleted
pod "php" deleted
# 合并资源对象文件
[root@master app]# cat nginx.yaml >>app.yaml
[root@master app]# cat phpfpm.yaml >>app.yaml
# 创建资源对象
[root@master ~]# kubectl apply -f app.yaml
pod/nginx created
pod/php created
# 删除资源对象
[root@master ~]# kubectl delete -f app.yaml
pod "nginx" deleted
pod "php" deleted
容器保护策略
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
restartPolicy: Never # 配置保护策略
containers:
- name: linux
image: myos:8.5
command: ["sleep"]
args: ["30"]
[root@master ~]# kubectl delete -f mycmd.yaml
pod "mycmd" deleted
[root@master ~]# kubectl apply -f mycmd.yaml
pod/mycmd created
[root@master ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
mycmd 1/1 Running 0 4s
mycmd 0/1 Completed 0 31s
宽限期策略
[root@master ~]# kubectl delete -f mycmd.yaml
pod "mycmd" deleted
[root@master ~]# kubectl apply -f mycmd.yaml
pod/mycmd created
[root@master ~]# kubectl delete -f mycmd.yaml
pod "mycmd" deleted
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0 # 设置宽限期
restartPolicy: Never
containers:
- name: linux
image: myos:8.5
command: ["sleep"]
args: ["30"]
[root@master ~]# kubectl apply -f mycmd.yaml
pod/mycmd created
[root@master ~]# kubectl delete -f mycmd.yaml
pod "mycmd" deleted
最大生命周期
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0
activeDeadlineSeconds: 60 # 可以执行的最大时长
restartPolicy: Never
containers:
- name: linux
image: myos:8.5
command: ["sleep"]
args: ["300"]
[root@master ~]# kubectl delete -f mycmd.yaml
pod "mycmd" deleted
[root@master ~]# kubectl apply -f mycmd.yaml
pod/mycmd created
[root@master ~]# kubectl get pods -w
mycmd 1/1 Running 0 1s
mycmd 1/1 Running 0 60s
mycmd 0/1 Error 0 64s
Pod嵌入脚本
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
containers:
- name: linux
image: myos:8.5
command: ["/bin/bash"]
args:
- -c
- |
while sleep 5;do
echo "hello world."
done
[root@master ~]# kubectl apply -f mycmd.yaml
pod/mycmd created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mycmd 1/1 Running 0 3s
[root@master ~]# kubectl logs mycmd
hello world.
hello world.
hello world.
案例2答案
---
kind: Pod
apiVersion: v1
metadata:
name: mymem
spec:
containers:
- name: linux
image: myos:8.5
command: ["/bin/bash"]
args:
- -c
- |
while sleep 5;do
use=$(free -m |awk '$1=="Mem:"{print $3}')
if (( ${use} < 1000 ));then
echo -e "\x1b[32mINFO:\x1b[39m running normally"
else
echo -e "\x1b[31mWARN:\x1b[39m high memory usage"
fi
done
多容器 Pod
[root@master ~]# vim mynginx.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mynginx
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
containers:
- name: nginx
image: myos:nginx
- name: php
image: myos:php-fpm
[root@master ~]# kubectl apply -f mynginx.yaml
pod/mynginx created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mynginx 2/2 Running 0 3s
管理多容器 Pod
- 受到多容器影响的命令: ["cp", "logs", "exec"]
-
[root@master ~]# echo "hello world" >hello.html [root@master ~]# kubectl cp hello.html mynginx:/usr/local/nginx/html/ -c nginx [root@master ~]# kubectl exec mynginx -c php -- ps PID TTY TIME CMD 1 ? 00:00:00 php-fpm 7 ? 00:00:00 ps [root@master ~]# kubectl logs mynginx -c nginx [root@master ~]#
排错案例3
[root@master ~]# vim web2.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: web2
spec:
containers:
- name: httpd
image: myos:httpd
- name: nginx
image: myos:nginx
[root@master ~]# kubectl apply -f web2.yaml
pod/web2 created
[root@master ~]# kubectl get pods web2
NAME READY STATUS RESTARTS AGE
web2 1/2 Error 1 (4s ago) 8s
资源监控组件
配置授权令牌
[root@master ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
[root@master ~]# systemctl restart kubelet
[root@master ~]# kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-2hg42 14s kubernetes.io/kubelet-serving system:node:master <none> Pending
[root@master ~]# kubectl certificate approve csr-2hg42
certificatesigningrequest.certificates.k8s.io/csr-2hg42 approved
[root@master ~]# kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-2hg42 28s kubernetes.io/kubelet-serving system:node:master <none> Approved,Issued
安装插件 metrics
- 导入插件镜像到私有仓库 plugins/metrics
-
[root@master metrics]# docker load -i metrics-server.tar.xz [root@master metrics]# docker images|while read i t _;do [[ "${t}" == "TAG" ]] && continue [[ "${i}" =~ ^"harbor:443/".+ ]] && continue docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t} docker push harbor:443/plugins/${i##*/}:${t} docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t} done
- 安装插件服务
-
[root@master metrics]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' components.yaml 140: image: harbor:443/plugins/metrics-server:v0.6.2 [root@master metrics]# kubectl apply -f components.yaml [root@master metrics]# kubectl -n kube-system get pods -l k8s-app=metrics-server NAME READY STATUS RESTARTS AGE metrics-server-ddb449849-c6lkc 1/1 Running 0 64s [root@master metrics]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master 99m 4% 1005Mi 27% node-0001 <unknown> <unknown> <unknown> <unknown> node-0002 <unknown> <unknown> <unknown> <unknown> node-0003 <unknown> <unknown> <unknown> <unknown> node-0004 <unknown> <unknown> <unknown> <unknown> node-0005 <unknown> <unknown> <unknown> <unknown>
计算节点签发证书
#--------------- 在所有计算节点配置证书 -----------------
[root@node ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
[root@node ~]# systemctl restart kubelet
#--------------- 在 master 签发证书 -------------------
[root@master ~]# kubectl certificate approve $(kubectl get csr -o name)
certificatesigningrequest.certificates.k8s.io/csr-2hg42 approved
certificatesigningrequest.certificates.k8s.io/csr-9gu29 approved
certificatesigningrequest.certificates.k8s.io/csr-xhp83 approved
certificatesigningrequest.certificates.k8s.io/csr-8k69w approved
certificatesigningrequest.certificates.k8s.io/csr-t8799 approved
certificatesigningrequest.certificates.k8s.io/csr-69qhz approved
[root@master ~]# kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-2hg42 14m kubernetes.io/kubelet-serving master <none> Approved,Issued
csr-9gu29 28s kubernetes.io/kubelet-serving node-0001 <none> Approved,Issued
csr-xhp83 21s kubernetes.io/kubelet-serving node-0002 <none> Approved,Issued
csr-69qhz 15s kubernetes.io/kubelet-serving node-0003 <none> Approved,Issued
csr-t8799 15s kubernetes.io/kubelet-serving node-0004 <none> Approved,Issued
csr-8k69w 15s kubernetes.io/kubelet-serving node-0005 <none> Approved,Issued
查看节点资源指标
# 获取资源指标有延时,等待 15s 即可查看
[root@master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 83m 4% 1789Mi 50%
node-0001 34m 1% 747Mi 20%
node-0002 30m 1% 894Mi 24%
node-0003 39m 1% 930Mi 25%
node-0004 45m 2% 896Mi 24%
node-0005 40m 2% 1079Mi 29%
监控Pod资源指标
- 拷贝 memtest.py 到 master
-
[root@ecs-proxy 5]# rsync -av public/memtest.py 192.168.1.50:./ #----- 增加执行权限 ----- [root@master ~]# vim memtest.py 1: #!/usr/libexec/platform-python [root@master ~]# chmod 0555 memtest.py
创建 Pod 对象
-
[root@master ~]# vim myhttp.yaml --- kind: Pod apiVersion: v1 metadata: name: myhttp spec: containers: - name: apache image: myos:httpd [root@master ~]# kubectl apply -f myhttp.yaml pod/myhttp created
- 查看 Pod 资源指标
-
[root@master ~]# kubectl top pods NAME CPU(cores) MEMORY(bytes) myhttp 1m 6Mi # 测试消耗 CPU 资源 [root@master ~]# kubectl exec -it myhttp -- /bin/bash [root@myhttp html]# awk 'BEGIN{while(1){}}' #--------------- 在另一个终端查看------------------------ [root@master ~]# kubectl top pods NAME CPU(cores) MEMORY(bytes) myhttp 1012m 7Mi # 测试消耗内存资源 [root@master ~]# kubectl cp memtest.py myhttp:/usr/bin/ [root@master ~]# kubectl exec -it myhttp -- memtest.py 2500 use memory success press any key to exit : #--------------- 在另一个终端查看------------------------ [root@master ~]# kubectl top pods NAME CPU(cores) MEMORY(bytes) myhttp 1061m 2513Mi