引子
kubernetes的资源对象是kubernetes体系中的重要组成部分,简单理解就是生成的kubernetes的系统应用,用来调度、编排我们的业务应用。是我们的业务应用与kubernetes的kube-controller组件,如:apiserver、kube-controller、kube-scheduler等之间的中间层,起到承上启下的作用。
将kubernetes的资源对象简单的分类为以下几种资源对象:
类别 | 名称 |
---|---|
资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling、Node、Namespace、Service、Ingress、Label、CustomResourceDefinition |
存储对象 | Volume、PersistentVolume、Secret、ConfigMap |
策略对象 | SecurityContext、ResourceQuota、LimitRange |
身份对象 | ServiceAccount、Role、ClusterRole |
学习kubernetes的资源对象对入门kubernetes是十分重要的,但kubernetes的资源对象比较多,概念繁杂,容易让人困惑。
单单从理论出发,也容易让人无法留下较深的印象,故本系列直接从各种小练习出发,以练促学,在实践中加深对kubernetes资源对象的理解。同时也在实践找那个插入响应的理论讲解,理论与实践相辅相成,相符促进。
关于kubernetes的简单入门,以及搭建一个简单的kubernetes集群,百度或者其他资讯平台都有很好的教程。关注作者,私信留言(kubernetes)直接赠送。
探测
创建一个pod
满足如下要求:
1)pod名为web-nginx,使用的镜像为nginx
2)用livenessProbe探测/usr/share/nginx/index.html,如果此文件丢失了,则通过重启pod来解决问题
3)在pod启动的前10s不探测,然后每隔5s探测一次
4)等此pod运行起来之后,删除pod里的/usr/share/nginx/html/index.html,检查pod是否会重启
5)删除此pod
yaml文件模板
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: web-nginx
name: web-nginx
spec:
containers:
- image: nginx
name: web-nginx
livenessProbe: #监测探针的写法
httpGet:
path: /usr/share/nginx/html/index.html
port: 80
initialDelaySeconds: 10
periodSeconds: 5
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
job及cronjob
Job
负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod
成功结束。而CronJob
则就是在Job
上加上了时间调度。
Job完成后,不会再创建其他Pod,但是Pod也不会被删除。这样使我们仍然可以查看已完成容器的日志,以检查是否有错误、警告或其他诊断输出。Job对象在完成后也将保留下来,以便您查看其状态。
如果第一个Pod发生故障或被删除(例如,由于节点硬件故障或节点重启),则Job对象将启动一个新的Pod。
1.创建job,满足如下要求:
1)job的名字为job1,镜像为busybox。
2)在pod里执行 echo “hello k8s” &&sleep 10。
3)重启策略为 Nerver,执行此job时,一次性运行3个pod。
4.)此job只有6个pod正确运行完毕,此job才算是成功。
生成k8s源文件
kubectl create job job1 --image=busybox --dry-run=client -o yaml -- echo "hello k8s" \&\& sleep 10 > job.yaml
job的yaml文件
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job1
spec:
completions: 6 #completions 可以设置 Job 成功执行任务的数量。
parallelism: 3 #并行的pod数
template:
metadata:
creationTimestamp: null
spec:
containers:
- command: ["sh","-c","echo 'hello k8s' && sleep 10"] #容器启动之后先睡眠10秒再执行前面的命令打印输出
image: busybox
name: job1
resources: {}
restartPolicy: Never
status: {}
检查job的创建效果,job创建好,执行完一次性人物就处于完成状态,删除pod和job后不会在重建
2.创建job,名字为job2,镜像为perl,计算圆周率后100位。
yaml文件
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job2
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command: ["perl","-Mbignum=bpi","-wle","print bpi(100)"]
image: perl
name: job2
resources: {}
restartPolicy: Never
status: {}
检查创建结果
3.创建cronjob,满足如下要求:
1)cronjob的名字为testcj。
2)容器名为c1,镜像为busybox。
3)每隔2分钟,执行一次date命令。
创建源yaml文件
kubectl create cronjob testcj --image=busybox --schedule="*/2 * * * *" --dry-run=client -o yaml -- date > cj.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
creationTimestamp: null
name: testcj
spec:
jobTemplate:
metadata:
creationTimestamp: null
name: testcj
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- date
image: busybox
imagePullPolicy: IfNotPresent
name: c1
resources: {}
restartPolicy: OnFailure
schedule: '*/2 * * * *'
status: {}
验证cronjob
svc
service负责为一组pod启动网络访问,可以提供标准化的特性:负载均衡、应用间的服务发现以及零宕机应用程序deployment。每个服务都有独一无二的ip地址以及dns主机名称。可以为需要使用服务的应用程序手动配置相应的ip地址和主机名,然后负载均衡会将流量正确的导入到pod。
Service 在 K8s 中有以下四种类型
- ClusterIp: 默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟IP
- NodePort: 在 ClusterlP 基础上为 Service 在台机器上绑定一个端口,这样就叫以通过:NodePort来访问该服务
- LoadBalancer: 在 NodePort 的基础上,借肋 cloud provider 创建一个外部负载均衡器,将清求转发到:NodePort
- ExternalName: 把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 kubernetes 1.7 更高版本的 kube-dns 才支持。
1. 列出命名空间kube-system里名字为kube-dns的svc所对应的pod名称。
首先查询kube-system对应的svc标签,再通过标签来定位有哪些pod
[root@vms31 10-test]# kubectl get svc -n kube-system -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 102d k8s-app=kube-dns
metrics-server ClusterIP 10.102.164.140 <none> 443/TCP 101d k8s-app=metrics-server
[root@vms31 10-test]#
[root@vms31 10-test]#
[root@vms31 10-test]# kubectl get pod -l k8s-app=kube-dns -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7f89b7bc75-s8ml6 1/1 Running 30 102d
coredns-7f89b7bc75-z624k 1/1 Running 33 102d
[root@vms31 10-test]#
[root@vms31 10-test]#
[root@vms31 10-test]# kubectl get pods -l k8s-app=metrics-server -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
metrics-server-bcfb98c76-fchc6 1/1 Running 29 101d 10.244.252.41 vms33 <none> <none>
2. 创建deployment,满足如下要求
1)deployment的名字为web2。
2)pod使用两个标签,app-name1=web1 和app-name2=web2。
3)容器所使用镜像为nginx,端口为80。
创建yaml源文件
kubectl create deployment web2 --image=nginx --port=80 --dry-run=client -o yaml > deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web2
name: web2
spec:
replicas: 1
selector:
matchLabels:
app-name1: web1
app-name2: web2
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app-name1: web1
app-name2: web2
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
resources: {}
status: {}
3. 创建svc,满足如下要求
1)服务名为svc-web。
2)类型为NodePort。
[root@vms31 10-test]# kubectl expose --name=svc-web deployment web2 --port=80 --type=NodePort
service/svc-web exposed
[root@vms31 10-test]#
[root@vms31 10-test]#
[root@vms31 10-test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-web NodePort 10.102.93.97 <none> 80:30357/TCP 17s
[root@vms31 10-test]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web2-8477d7dcb6-l5s7d 1/1 Running 0 6m53s 10.244.252.50 vms33 <none> <none>
[root@vms31 10-test]#
[root@vms31 10-test]#
[root@vms31 10-test]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web2 1/1 1 1 7m5s nginx nginx app-name1=web1,app-name2=web2
4. 查看此NodePort映射的物理机端口是多少。
5. 在其他非集群机器上打开浏览器,访问此服务。
因为是把服务暴露成了svc,所以是访问master节点的ip加端口,端口根据kubectl get svc -o wide
评论区