侧边栏壁纸
博主头像
问道

问道的小花园,总能给你带来惊喜

  • 累计撰写 68 篇文章
  • 累计创建 35 个标签
  • 累计收到 3 条评论

kubernetes资源对象:以练促学(二)

问道
2022-08-01 / 0 评论 / 0 点赞 / 667 阅读 / 5,609 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-08-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

引子

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

0

评论区