20.Kubernetes(二)-----集群部署(Pod管理、资源清单、pod生命周期、控制器)

一、pod管理

1.创建Pod应用

  • Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
[root@server4 ~]# kubectl run demo --image=myapp:v1		##创建一个pod应用,nginx是名字,myapp是景象
        #--replicas=2   扩容参数  --record   记录参数
pod/demo created
[root@server4 ~]# kubectl get pod -n default 		#查看指定namespace的节点
NAME                    READY   STATUS    RESTARTS   AGE
demo-5b4fc8bb88-7qp65   1/1     Running   0          9m51s
demo-5b4fc8bb88-sl7j6   1/1     Running   0          9m52s

[root@server4 ~]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          13s
[root@server4 ~]# kubectl get pod -o wide			 ##查看节点的具体信息
NAME   READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
demo   1/1     Running   0          52s   10.244.1.2   server2   <none>           <none>
[root@server4 ~]# cat /var/run/flannel/subnet.env 
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
[root@server4 ~]# curl 10.244.1.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# 

[root@server4 ~]# kubectl delete  pod demo
pod "demo" deleted
    	
[root@server4 ~]# 
[root@server4 ~]# kubectl get pod
No resources found in default namespace

##deployment(控制器)
[root@server4 ~]# kubectl create deployment  demo --image=myapp:v1 --replicas=2		##生成一个新的deployment控制器的pod,删除之后会自动重新生成不同id的pod
deployment.apps/demo created
[root@server4 ~]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
demo-5b4fc8bb88-bd9hm   1/1     Running   0          12s   10.244.1.4   server2   <none>           <none>
demo-5b4fc8bb88-t8vsf   1/1     Running   0          12s   10.244.1.3   server2   <none>           <none>
[root@server4 ~]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

请添加图片描述
请添加图片描述
请添加图片描述

2.删除后,会重新拉取

[root@server4 ~]# kubectl delete pod nginx   ##删除pod
pod "nginx" deleted
[root@server4 ~]# kubectl describe pod demo   ##查看详细描述
[root@server4 ~]# kubectl logs demo     ##查看日志

 [root@server4 ~]# kubectl delete deployment nginx     ##彻底删除deployment
 [root@server4 ~]# kubectl get pod    ##删除成功
[root@server4 ~]# kubectl get all
NAME                        READY   STATUS    RESTARTS   AGE
pod/demo-5b4fc8bb88-bd9hm   1/1     Running   0          95s
pod/demo-5b4fc8bb88-t8vsf   1/1     Running   0          95s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   47h

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/demo   2/2     2            2           95s

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/demo-5b4fc8bb88   2         2         2       95s
[root@server4 ~]# kubectl delete pod demo-5b4fc8bb88-bd9hm		#删除
pod "demo-5b4fc8bb88-bd9hm" deleted		##生成新的id的pod
[root@server4 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
demo-5b4fc8bb88-6skrw   1/1     Running   0          72s
demo-5b4fc8bb88-t8vsf   1/1     Running   0          3m42s

请添加图片描述

3.负载均衡

[root@server4 ~]# kubectl expose  deployment  demo --port=80 --target-port=80		#80端口的暴露
service/demo exposed
[root@server4 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
demo         ClusterIP   10.97.29.222   <none>        80/TCP    6s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   47h
[root@server4 ~]# curl 10.97.29.222
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# curl 10.97.29.222
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# curl 10.97.29.222/hostname.html
demo-5b4fc8bb88-sl7j6
[root@server4 ~]# curl 10.97.29.222/hostname.html
demo-5b4fc8bb88-ttqpj

请添加图片描述

4.更新回滚

## 更新镜像
[root@server4 ~]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
demo-5b4fc8bb88-6skrw   1/1     Running   0          4m39s   10.244.1.5   server2   <none>           <none>
demo-5b4fc8bb88-t8vsf   1/1     Running   0          7m9s    10.244.1.3   server2   <none>           <none>
[root@server4 ~]# kubectl set image deployment demo myapp=myapp:v2
deployment.apps/demo image updated
[root@server4 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
demo-7bd47bddfc-bhs5z   1/1     Running   0          9s
demo-7bd47bddfc-wbmjq   1/1     Running   0          7s
[root@server4 ~]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
demo-7bd47bddfc-bhs5z   1/1     Running   0          19s   10.244.1.6   server2   <none>           <none>
demo-7bd47bddfc-wbmjq   1/1     Running   0          17s   10.244.1.7   server2   <none>           <none>
[root@server4 ~]# kubectl rollout history deployment demo
deployment.apps/demo 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

[root@server4 ~]# curl 10.244.1.6
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# 

## 回滚
[root@server4 ~]# kubectl rollout undo deployment demo --to-revision=1 
deployment.apps/demo rolled back
[root@server4 ~]# kubectl get pod -o wide
NAME                    READY   STATUS        RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
demo-5b4fc8bb88-7qp65   1/1     Running       0          6s      10.244.1.9   server2   <none>           <none>
demo-5b4fc8bb88-sl7j6   1/1     Running       0          7s      10.244.1.8   server2   <none>           <none>
demo-7bd47bddfc-bhs5z   0/1     Terminating   0          4m21s   10.244.1.6   server2   <none>           <none>
demo-7bd47bddfc-wbmjq   0/1     Terminating   0          4m19s   10.244.1.7   server2   <none>           <none>
[root@server4 ~]# curl 10.244.1.9
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# 

请添加图片描述
请添加图片描述

5.Pod的扩容与缩容

[root@server4 ~]# kubectl scale deployment demo --replicas=6	#扩容
deployment.apps/demo scaled
[root@server4 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
demo-5b4fc8bb88-4pgfj   1/1     Running   0          8s
demo-5b4fc8bb88-7qp65   1/1     Running   0          16m
demo-5b4fc8bb88-8bxwg   1/1     Running   0          8s
demo-5b4fc8bb88-cd64p   1/1     Running   0          8s
demo-5b4fc8bb88-sl7j6   1/1     Running   0          16m
demo-5b4fc8bb88-ttqpj   1/1     Running   0          8s
[root@server4 ~]# kubectl scale deployment demo --replicas=2	#缩容
deployment.apps/demo scaled
[root@server4 ~]# kubectl get pod
NAME                    READY   STATUS        RESTARTS   AGE
demo-5b4fc8bb88-4pgfj   0/1     Terminating   0          15s
demo-5b4fc8bb88-7qp65   0/1     Terminating   0          17m
demo-5b4fc8bb88-8bxwg   0/1     Terminating   0          15s
demo-5b4fc8bb88-cd64p   0/1     Terminating   0          15s
demo-5b4fc8bb88-sl7j6   1/1     Running       0          17m
demo-5b4fc8bb88-ttqpj   1/1     Running       0          15s
[root@server4 ~]# 

请添加图片描述

二、资源清单

## 方法一:书写时候的查找方法,可以之直接通过explain一步一步查找参数内容用法
[root@server4~]# kubectl explain pod      ##查看pod所有参数,-required-带有required是必须存在的参数
[root@server4 ~]# kubectl explain pod.apiVersion   ##查看api对应需要添加的参数

## 方法二: 直接打开一个已经有的deployment,然后生成相应的yaml文件,进行参考
[root@server4 ~]# kubectl get pod 
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          3h51m 
[root@server4 ~]# kubectl get pod demo -o yaml   ##生成一个yaml文件

[root@server4 ~]# vim pod.yaml    ##编写yml文件,可用性较高
[root@server4 ~]# cat pod.yaml 
apiVersion: apps/v1
kind: Deployment    ##设置为deployment
metadata:
  name: nginx
  namespace: default   ##设置命名空间
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
  template:    ##模板
    metadata:
      labels:   ##标签
        run: nginx
    spec:
      #nodeSelector:        ##指定运行节点的俩种方法(方法一)
      #  kubernetes.io/hostname: server4
      #nodeName: server3    ##指定运行节点的俩种方法(方法二)
      #hostNetwork: true    ##可以通过直接访问节点ip的方式访问,[root@westos Desktop]# curl 172.25.13.4
      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent
        resources:    ##资源限制
          requests:
            cpu: 100m
            memeory: 100Mi
          limits:
            cpu: 0.5
            memory: 512Mi
        #- name: busyboxplus
        #  image: busyboxplus
        #  imagePullPolicy: IfNotPresent  ##本地有镜像,优先本地拉取,没有就需要联网拉取
        #  stdin: true     ##stdin和tty是为了保证交互式,相当于执行参数-it
        #  tty: true
[root@server4 ~]# kubectl apply -f pod.yaml    ##deployment使用apply,会自动更新修改内容
				## $ kubectl create -f demo.yaml  ##不是deployment使用create,不会自动更新修改内容
deployment.apps/nginx created

三、Pod生命周期

[root@server4 pod]# vim init.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busyboxplus
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busyboxplus
    command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busyboxplus
    command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377

[root@server4 pod]# kubectl apply -f init.yaml
pod/myapp-pod created
service/myservice created
service/mydb created
[root@server4 pod]# kubectl get pod
NAME          READY   STATUS              RESTARTS   AGE
myapp-pod     0/1     Init:ErrImagePull   0          13s
pod-example   1/1     Running             0          126m
[root@server4 pod]# kubectl delete -f init.yaml 
pod "myapp-pod" deleted
service "myservice" deleted
service "mydb" deleted
[root@server4 pod]# 

请添加图片描述

[root@server4 pod]# vim pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: myapp
spec:
  #hostNetwork: true
  #nodeName: server3
  #imagePullSecrets: 
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: "100m"
        memory: "50Mi"
      limits:
        cpu: "200m"
        memory: "100Mi"
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1
    readinessProbe:
      httpGet:
        path: /test.html
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1
[root@server4 pod]# kubectl apply -f pod.yaml 
pod/pod-example created
[root@server4 pod]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
pod-example   0/1     Running   0          7s
[root@server4 pod]# kubectl get pod -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
pod-example   0/1     Running   0          20s   10.244.1.17   server2   <none>           <none>
[root@server4 pod]# kubectl get pod -w
NAME          READY   STATUS    RESTARTS   AGE
pod-example   0/1     Running   0          38s

请添加图片描述
请添加图片描述

四、控制器

  • Pod 的分类:
    自主式 Pod:Pod 退出后不会被创建
    控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

  • 控制器类型:

Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler

1.ReplicaSet控制器

Replication Controller和ReplicaSet
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,
ReplicaSet 支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。

[root@server4 pod]# cat rs.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1
[root@server4 pod]# kubectl apply -f rs.yaml 
replicaset.apps/replicaset-example created
[root@server4 pod]# kubectl get pod
[root@server4 pod]# kubectl get pod -o wide
[root@server4 pod]# kubectl get pod --show-labels 

请添加图片描述
请添加图片描述

2.Deployment控制器

Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:
用来创建Pod和ReplicaSet
滚动更新和回滚
扩容和缩容
暂停与恢复

[root@server4 pod]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

[root@server4 pod]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deployment created
[root@server4 pod]# kubectl get pod
[root@server4 pod]# kubectl get pod --show-labels 


[root@server4 pod]# vim deployment.yaml
spec:
  replicas: 6
  selector:
    matchLabels:

[root@server4 pod]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deployment configured
[root@server4 pod]# kubectl get pod

请添加图片描述
请添加图片描述

3.cronjob

Cron Job 创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。

## 导入镜像
[root@server4 pod]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/  
lftp 172.25.15.250:/pub/images> get perl.tar 	#下载镜像
881826816 bytes transferred in 5 seconds (174.44M/s)             
lftp 172.25.15.250:/pub/images> exit
[root@server4 pod]# docker load -i perl.tar 	#导入镜像到本地
e2c6ff462357: Loading layer  119.3MB/119.3MB
26270c5e25fa: Loading layer  17.18MB/17.18MB
a42439ce9650: Loading layer  17.87MB/17.87MB
5d5962699bd5: Loading layer    150MB/150MB
651326e9f1ca: Loading layer  520.7MB/520.7MB
1f761580d1f6: Loading layer  3.584kB/3.584kB
11a4a76d22d2: Loading layer  56.71MB/56.71MB
Loaded image: perl:latest
[root@server4 pod]# docker tag perl:latest reg.westos.org/library/perl:latest	#打标签
[root@server4 pod]# docker push reg.westos.org/library/perl:latest 	#上传到网络仓库

请添加图片描述
请添加图片描述

[root@server4 pod]# vim job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
   spec:
    containers:
    - name: pi
      image: perl
      command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    restartPolicy: Never
  backoffLimit: 4

[root@server4 pod]# kubectl apply -f job.yaml 
job.batch/pi created
[root@server4 pod]# kubectl get pod

[root@server4 pod]# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-example
spec:
  schedule: "* * * * *"
  jobTemplate:
   spec:
    template:
     spec:
      containers:
      - name: cronjob
        image: busybox
        args:
        - /bin/sh
        - -c
        - date; echo Hello from k8s cluster
      restartPolicy: OnFailure

[root@server4 pod]# kubectl apply -f cronjob.yaml
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob
cronjob.batch/cronjob-example unchanged
[root@server4 pod]# kubectl get cronjob
NAME              SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-example   * * * * *   False     0        19s             35s

请添加图片描述
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值