目录
k8s平台使用:
Pod管理
外部访问集群节点:
回滚【undo】
集群外部访问:
资源清单构建与应用
pod生命周期
探针
pod的生命
控制器
job控制器:
周期化job
k8s平台使用:
server2
kubectl get node #查看节点 kubectl get pod #查看pod(pod是k8s最小调度单位) 【默认是在default namespace来进行查询】 kubectl get pod -n kube-system #-n后跟其他的namespace kubectl get namespaces #查看的有多少个namespaces kubectl get pod --all-namespaces #查看所有的namespaces kubectl get all #查看所有资源 kubectl get svc
kubectl命令指南:
• https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
kubectl run demo --image=myapp:v1 运行demo容器 kubectl get pod #查看是否运行 kubectl get pod -o wide #查看运行在那个节点【默认master不参加调度】 curl 10.244.1.2 #此地址所有集群节点都可以访问,但是不能从集群外部访问 kubectl logs demo #查看容器日志 kubectl describe pod demo #查看pod详细信息 kubectl delete pod demo #删除 kubectl get pod
Pod管理
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
server2
kubectl create deployment demo --image=myapp:v1 --replicas=3 #创建容器,指定镜像,指定副本数为3 kubectl get pod kubectl get pod -o wide #查看运行的节点是否全部就绪【可以看到在3、4两个节点上均衡】 kubectl scale deployment demo --replicas=6 #设置副本数为6【拉伸】 kubectl get pod kubectl set image deployment/demo myapp=myapp:v2 #设置更新镜像 kubectl get pod kubectl get pod -o wide curl 10.244.2.5 #访问ip地址查看是否更新镜像成功
外部访问集群节点:
kubectl expose deployment demo --port=80 --target-port=80
#expose后跟暴露的服务器(deployment)指定暴露容器端口为80,目标端口为80
kubectl get all
kubectl describe svc demo
#可以看到svc的名字和刚才创建的demo一样
curl 10.109.148.15
#访问svx地址
curl 10.109.148.15/hostname.html
此命令多执行几次,可以实现pod的负载均衡(算法是随即的)
kubectl scale deployment demo --replicas=3
#调至副本数为3
kubectl get pod
kubectl describe svc demo
#查看资源变为三(动态的去修改svc底下的Endpoint)【svc在这里是个负载均衡器】
curl 10.109.148.15
回滚【undo】
kubectl get all
#可以看到有两个rs
kubectl rollout history deployment demo
#可以看到deployment控制器的历史
kubectl rollout undo deployment demo --to-revision=1
#undo到1上
kubectl get pod
#可以看到更新到v1上
kubectl get svc
curl 10.109.148.15
kubectl get svc #回滚之后可以看到rs又变了(一个rs管控一个版本)【之前在67上现在在7c上】 #对于deployment而言,更新一次镜像变了会创建一个rs,之前的也会保留,但会使其副本数为0 kubectl get all kubectl edit svc demo #编辑svc type:NodePort kubectl get svc 多了一个80端口分配了30270【端口影射】
集群外部访问:
curl 172.25.70.2:30270
#访问集群内任何一个节点都可以访问到集群
curl 172.25.70.2:30270/hostname.html
curl 172.25.70.3:30270/hostname.html
curl 172.25.70.4:30270/hostname.html
#均衡的但是也是随即的
server2
kubectl get pod 注意:回收pod,自主式的删除pod,没有用。因为在容器集群中是自愈的,刚才删的pod又会自己创建 kubectl delete deployments.apps demo #要删除控制器 kubectl get pod kubectl get all kubectl delete svc demo kubectl get pod
资源清单构建与应用
kubectl api-versions #查看api资源版本 kubectl run demo --image=myapp:v1 kubectl get pod kubectl get pod -o yaml #生成资源清单 kubectl delete pod demo ls mkdir pod cd pod/ ls vim pod.yml #编写资源清单【注意缩进】
查询帮助文档:
kubectl explain pod.spec #查看参数 kubectl explain pod.spec.containers
kubectl apply -f pod.yml #创建 kubectl get pod kubectl delete -f pod.yml #删除 kubectl get pod
vim pod.yml kubectl apply -f pod.yml kubectl get pod kubectl get pod -o wide #查看运行的节点 curl 172.25.70.3 #只能访问在运行的主机
查看帮助文档【可以一级一级往下走】
kubectl explain pod.spec.containers.resources kubectl explain pod.spec.containers.resources.limits
kubectl get pod kubectl describe pod pod-example #可以看有无资源单位 kubectl delete -f pod.yml #删除(自主式的pod不支持滚动更新) vim pod.yml kubectl apply -f pod.yml kubectl describe pod pod-example #可以看到cgroup直接把资源设定好 kubectl run -it demo --image=busybox --restart=Never #使用busybox镜像 --restart=Never:pod终止后kubectl退出并报告给master,不会在重启该pod kubectl get pod #可以看到没有刚才pod kubectl delete pod demo
kubectl run -it demo --image=busybox kubectl get pod #可以看到RESTARTS 有重启1次 kubectl attach demo -c demo -i -t #-c指容器名称 kubectl describe pod demo #可以看到name就是demo kubectl get pod #可以看到重启两次 kubectl delete pod demo #删除 kubectl get pod kubectl delete -f pod.yml ls
kubectl apply -f pod.yml #没改再次创建 kubectl get pod -o wide #可以发现运行在server4上 kubectl delete -f pod.yml #删除 kubectl apply -f pod.yml #再次创建 kubectl get pod -o wide #这次运行在3上 kubectl delete -f pod.yml #删除
vim pod.yml #修改清单,让pod在server4上 kubectl apply -f pod.yml kubectl get pod -o wide kubectl delete -f pod.yml
vim pod.yml #注释掉端口,使用物理网络 kubectl apply -f pod.yml kubectl get pod -o wide #查看运行在哪
server4
netstat -antlp| grep 80 #使用的是物理网络
server2
kubectl delete -f pod.yml
pod生命周期
vim pod.yml
#编写启动两个容器
kubectl apply -f pod.yml #创建
kubectl get pod
#有一个重启动作,有错误,两个容器只有一个是就绪的
kubectl describe pod pod-example
#查看详细信息
kubectl logs pod-example myapp2
#myapp2有报错,端口冲突【在同一个pod内所有容器是共享网络盏】
kubectl logs pod-example myapp1
#没有报错,占用了80端口,所有myapp2不能用
kubectl delete -f pod.yml #删除
vim pod.yml #把myapp2的镜像改为busybox(交互式) kubectl apply -f pod.yml kubectl get pod #可以看到2个都已经准备就绪 kubectl attach -it pod-example -c myapp2 --/ # curl localhost #其实访问的是myapp1 kubectl get pod -o wide #两者用的是同一ip curl 10.244.2.16 #访问的是myapp1 kubectl delete -f pod.yml
vim pod.yml #初始化容器 kubectl apply -f pod.yml kubectl get pod #可以看到正在初始化 kubectl describe pod pod-example #执行指令不成功 kubectl get svc #当前没有svc kubectl logs pod-example -c busybox #查看busybox日志
vim pod.yml kubectl apply -f pod.yml kubectl get pod #pod没变,新创建了myservice kubectl logs pod-example -c busybox kubectl get pod #解析成功状态运行 kubectl get pod -o wide curl 10.244.1.14 #访问容器ip kubectl run -it demo --image=busyboxplus --restart=Never --/ # nslookup myservice.default.svc.cluster.local #解析 kubectl get svc #查看svc kubectl delete -f pod.yml kubectl get pod kubectl delete pod demo
探针
vim pod1.yaml
kubectl apply -f pod1.yaml
kubectl get pod
#容器状态运行
kubectl delete -f pod1.yaml
vim pod1.yaml 【端口改为8080】 kubectl apply -f pod1.yaml kubectl get pod #状态running kubectl get pod kubectl get pod -w #可以看到容器一直在重启(认为是不存活的)检测发现8080端口不存在,就会一直重启容器 kubectl describe pod liveness-http kubectl get pod kubectl delete -f pod1.yaml
vim pod1.yaml kubectl apply -f pod1.yaml kubectl get pod #可以看到没有重启,但状态始终没有就绪 kubectl describe pod liveness-http #存活探针没有问题,就绪有问题:404找不到test.html页面 【如果pod不是就绪状态,就不会被svc发现,不会出现在svc上】 kubectl get pod kubectl expose pod liveness-http --port=80 --target-port=80 #暴露端口,端口80,目标端口80 kubectl get svc kubectl describe svc liveness-http #svc名称和pod名称保持一致【Endpoints是空的,不能访问地址】 kubectl get pod kubectl exec -it liveness-http -- bash --/# ls --/# cd /usr/share/nginx/html/ --/usr/share/nginx/html# ls --/usr/share/nginx/html# echo www.westos.org > test.html --/usr/share/nginx/html# ls kubectl get pod #状态就绪 kubectl describe pod liveness-http kubectl describe svc liveness-http #Endpoint,地址出现 kubectl exec liveness-http -- rm -f /usr/share/nginx/html/test.html #删除页面 kubectl exec liveness-http -- ls /usr/share/nginx/html kubectl get pod #删除页面后不能就绪 kubectl describe svc liveness-http #Endpoint又变成空的
pod的生命
vim deploy.yml
kubectl apply -f deploy.yml
kubectl get pod
#出现3个pod
kubectl delete -f pod1.yaml
#删掉探针
kubectl get pod
kubectl get all
kubectl get pod --show-labels
kubectl label pod myapp-deployment-678fcbc488-4vqrc app=nginx --overwrite
#改标签,--overwrite覆盖
kubectl get pod --show-labels
#副本数还是3,之前改了标签的pod就不能被匹配
kubectl get all
kubectl label pod myapp-deployment-678fcbc488-4vqrc app=myapp --overwrite
#改回原来的标签
kubectl get pod --show-labels
#副本又是三个,之前的副本还在,最后启动的被回收了
kubectl label pod myapp-deployment-678fcbc488-4vqrc app=nginx --overwrite kubectl get pod --show-labels 改标签之后,符合副本数的标签不对,就会在拉取一个 kubectl delete pod myapp-deployment-678fcbc488-4vqrc 把nginx标签的副本删除,没有控制器控制 kubectl get pod --show-labels #被删掉了 kubectl delete pod myapp-deployment-678fcbc488-fqzmc 删除myapp标签的副本 kubectl get pod --show-labels 又被拉了一个副本 kubectl get pod kubectl get rs 副本数的控制直接由rs来控制
vim deploy.yml 【清单中改副本数为6个】 deployment控制器可以直接运行生效不需要delete kubectl apply -f deploy.yml kubectl get pod kubectl get all
vim deploy.yml 【副本数改为3】 kubectl apply -f deploy.yml kubectl get pod
vim deploy.yml 【版本更新:镜像改为v2镜像】 kubectl apply -f deploy.yml kubectl get pod kubectl get pod -o wide curl 10.244.2.22 #访问是v2 kubectl get all #又出现了一个57rs,之前67的不用了
vim deploy.yml 【版本更新:镜像改为v1镜像】 kubectl apply -f deploy.yml kubectl get pod -o wide #里面容器ip变了 curl 10.244.1.27 #访问是v1 kubectl get all #现有又用的是67,之前的57变成0了
kubectl -n kube-system get pod 网络组建和proxy是每个节点都会部署的 kubectl -n kube-system get all 有一个daemonset控制器,确保每个新加节点都会部署一个
(需要有zabbix监控,如果没有,可以拉取之后上传到私有仓库)
docker pull zabbix/zabbix-agent docker tag zabbix/zabbix-agent:latest reg.westos.org/library/zabbix-agent:latest docker push reg.westos.org/library/zabbix-agent:latest
vim daemonset.yml 【布置监控】 kubectl delete -f deploy.yml kubectl get pod kubectl apply -f daemonset.yml kubectl get pod kubectl get pod -o wide 在所有节点都会创建,检测到多几个node就会创建几个副本,2没有创建是因为管理端不参加调度 kubectl get node kubectl delete -f daemonset.yml
控制器
job控制器:
用来做计算的,(精确到小数点后两千位)
一次性计算
(需要有perl镜像,如果没有,可以拉取之后上传到私有仓库)
docker pull perl
docker tag perl:latest reg.westos.org/library/perl:latest
docker push reg.westos.org/library/perl:latest
vim job.yml 【用perl镜像】 kubectl apply -f job.yml kubectl get pod kubectl describe pod pi-kwtc2 被调度到server3上 kubectl get pod #Completed出现就是计算完成 kubectl logs pi-kwtc2 #查看信息 kubectl get pod kubectl delete pod pi-kwtc2 kubectl get jobs.batch kubectl delete -f job.yml kubectl get pod kubectl get jobs.batch
周期化job
vim cronjob.yml 【每分钟执行data】
kubectl apply -f cronjob.yml
kubectl ls
kubectl get pod
kubectl get pod -w
kubectl logs cronjob-example-27365014-5nrg6
第一次运行时间是11:34:00
kubectl get pod
kubectl logs cronjob-example-27365015-qswrw
第二次运行时间是11:35:00【一分钟执行一次】
kubectl delete -f cronjob.yml
kubectl get cronjobs.batch
kubectl get pod
kubectl get all



