kubernets Deployment 无状态服务

pod 是什么

运行中的一组容器,Pod是kubernetes中应用的最小单位.

1.0 pod

1.1创建pod

root@master kubernets]# kubectl run nginx --image=nginx
pod/nginx created
[root@master kubernets]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          2m9s
1.2删除pod
[root@master kubernets]# kubectl delete pod nginx
pod "nginx" deleted

1.3使用命令行创建pod

[root@master kubernets]# cat mynginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default     指定命名空间
spec:
  containers:
  - image: nginx
    name: mynginx

[root@master kubernets]# kubectl apply -f mynginx.yaml     #使用json文件创建
pod/mynginx created
[root@master kubernets]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
mynginx   1/1     Running   0          2m12s

==删除pod==
[root@master kubernets]# kubectl delete -f mynginx.yaml 
pod "mynginx" deleted

==同一个pod部署多个容器==
[root@master kubernets]# cat myapp.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp
  name: myapp
spec:
  containers:
  - image: nginx
    name: nginx
  - image: tomcat:8.5.68
    name: tomcat
    
[root@master kubernets]# kubectl apply -f myapp.yaml 
pod/myapp created
[root@master kubernets]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
myapp   2/2     Running   0          23s

==查看容器内部ip==
[root@master kubernets]# kubectl get pod -owide
NAME    READY   STATUS    RESTARTS   AGE    IP              NODE    NOMINATED NODE   READINESS GATES
myapp   2/2     Running   0          101s   192.168.104.6   node2   <none>           <none>

==查看pod创建详细信息==
[root@master kubernets]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
myapp   2/2     Running   0          2m33s
[root@master kubernets]# kubectl describe pod myapp
Name:         myapp
Namespace:    default
Priority:     0
Node:         node2/192.168.100.128
Start Time:   Wed, 27 Apr 2022 16:06:00 +0800
Labels:       run=myapp
Annotations:  cni.projectcalico.org/containerID: ebb80fd81a197d6a304710c78bf133b93c1f4acb1d1d55786a3ba3613cd12cf5
              cni.projectcalico.org/podIP: 192.168.104.6/32
              cni.projectcalico.org/podIPs: 192.168.104.6/32
Status:       Running
IP:           192.168.104.6
IPs:
  IP:  192.168.104.6
Containers:
  nginx:
    Container ID:   docker://c4ca41d2a94dc641c27f9f064a831e95bfbdf92d121ba4aae6c6bc4c745ea26f
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:859ab6768a6f26a79bc42b231664111317d095a4f04e4b6fe79ce37b3d199097
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 27 Apr 2022 16:06:21 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-g4kn9 (ro)
  tomcat:
    Container ID:   docker://feb9e8a9dc3eeb28a53a9e4fd880adfb86ce8d67e7771f2ef24683a8dd92ab39
    Image:          tomcat:8.5.68
    Image ID:       docker-pullable://tomcat@sha256:a266dd222864de2fe72e0464e6d91c406a687c861bb72a07218e6d7c89fe1d3e
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 27 Apr 2022 16:06:22 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-g4kn9 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-g4kn9:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-g4kn9
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  3m33s  default-scheduler  Successfully assigned default/myapp to node2
  Normal  Pulling    3m32s  kubelet            Pulling image "nginx"
  Normal  Pulled     3m12s  kubelet            Successfully pulled image "nginx" in 19.909840362s
  Normal  Created    3m12s  kubelet            Created container nginx
  Normal  Started    3m12s  kubelet            Started container nginx
  Normal  Pulled     3m11s  kubelet            Container image "tomcat:8.5.68" already present on machine
  Normal  Created    3m11s  kubelet            Created container tomcat
  Normal  Started    3m11s  kubelet            Started container tomcat

命令小结

==查看pod==
kubectl get pod 
# 加-A 查看所有命名空间pod

==查看pod创建详细信息==
kubectl describe pod myapp
#默认查看default命名空间pod 如果需要查看其他命名空间加-n

==创建pod==
kubectl apply -f myapp.yaml

==删除pod==
kubectl delete -f myapp.yaml

==查看pod内部ip==
kubectl get pod -owide 
#不同命名空间需要加-n指定

==查看pod日志==
ubectl logs myapp nginx --tail 50 -f
#不同命名空间需要-n指定

2.0 Deployment

控制Pod,使Pod拥有多副本,自愈,扩缩容等能力

2.1自愈能力

先使用命令创建一个

[root@master kubernets]# kubectl create deployment mytomcat --image=tomcat:8.5.68
deployment.apps/mytomcat created

==create 创建一个 deployment==
[root@master kubernets]# kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
mytomcat-6f5f895f4f-p2mgl   1/1     Running   0          48s

==当我们删除它==
==他会将原来的pod删除,又会重新拉起一台这就是他的自愈能力==
[root@master kubernets]# kubectl delete pod mytomcat-6f5f895f4f-p2mgl
pod "mytomcat-6f5f895f4f-p2mgl" deleted
[root@master kubernets]# kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
mytomcat-6f5f895f4f-9drhd   1/1     Running   0          7s

==删除==
[root@master kubernets]# kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
mytomcat   1/1     1            1           5m41s
[root@master kubernets]# kubectl delete deploy mytomcat
deployment.apps "mytomcat" deleted

2.2多副本

命令行创建

[root@master kubernets]# kubectl create deployment my-dep --image=nginx --replicas=3
deployment.apps/my-dep created
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-5b7868d854-25lcq   1/1     Running   0          64s
my-dep-5b7868d854-8v8mq   1/1     Running   0          64s
my-dep-5b7868d854-vb55x   1/1     Running   0          64s
==查看 deployment==
[root@master kubernets]# kubectl get deploy
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep   3/3     3            3           2m20s
==再去查看pod发现已经在删除==
root@master kubernets]# kubectl get pod
NAME                      READY   STATUS        RESTARTS   AGE
my-dep-5b7868d854-25lcq   0/1     Terminating   0          3m47s
my-dep-5b7868d854-8v8mq   0/1     Terminating   0          3m47s
my-dep-5b7868d854-vb55x   0/1     Terminating   0          3m47s

使用yaml创建

[root@master kubernets]# cat myapp.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep
  template:
    metadata:
      labels:
        app: my-dep
    spec:
      containers:
      - image: nginx
        name: nginx
[root@master kubernets]# kubectl apply -f myapp.yaml 
deployment.apps/my-dep created
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-5b7868d854-kcmpm   1/1     Running   0          2m
my-dep-5b7868d854-mlwgf   1/1     Running   0          2m
my-dep-5b7868d854-pwbdn   1/1     Running   0          2m
2.2.1 扩缩容
[root@master kubernets]# kubectl scale --replicas=5 deployment/my-dep
deployment.apps/my-dep scaled
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS              RESTARTS   AGE
my-dep-5b7868d854-kcmpm   1/1     Running             0          4m31s
my-dep-5b7868d854-l8wgq   0/1     ContainerCreating   0          6s
my-dep-5b7868d854-mlwgf   1/1     Running             0          4m31s
my-dep-5b7868d854-pwbdn   1/1     Running             0          4m31s
my-dep-5b7868d854-xrwgw   0/1     ContainerCreating   0          6s
[root@master kubernets]# kubectl scale --replicas=3 deployment/my-dep
deployment.apps/my-dep scaled
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-5b7868d854-kcmpm   1/1     Running   0          17m
my-dep-5b7868d854-mlwgf   1/1     Running   0          17m
my-dep-5b7868d854-pwbdn   1/1     Running   0          17m

命令小结

kubectl scale --replicas=3 deployment/my-dep
==可直接修改--replicas=数量 进行扩缩容==
kubectl edit deployment my-dep
==也可以进入他的xml编辑replicas后面的数量进行修改==
==修改 replicas==

2.3 滚动更新

[root@master kubernets]# kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
deployment.apps/my-dep image updated
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS              RESTARTS   AGE
my-dep-5b7868d854-kcmpm   1/1     Running             0          22m
my-dep-5b7868d854-mlwgf   1/1     Running             0          22m
my-dep-5b7868d854-pwbdn   1/1     Running             0          22m
my-dep-6b48cbf4f9-sd6cl   0/1     ContainerCreating   0          6s

==他会先拉起一个新版本的pod容器,在将老版本的删除掉,进行滚动更新==
==--record 记录这次更新==
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-6b48cbf4f9-c56dj   1/1     Running   0          5m34s
my-dep-6b48cbf4f9-nbqzv   1/1     Running   0          4m8s
my-dep-6b48cbf4f9-sd6cl   1/1     Running   0          13m

2.4 版本回退

[root@master kubernets]# kubectl edit deployment/my-dep
#查看imge 镜像已经是1.16.1

==查看历史版本==
[root@master kubernets]# kubectl rollout history deployment/my-dep
deployment.apps/my-dep 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true

==查看某个历史详情==
==可以看到具体使用的某个镜像==
root@master kubernets]# kubectl rollout history deployment/my-dep --revision=2
deployment.apps/my-dep with revision #2
Pod Template:
  Labels:	app=my-dep
	pod-template-hash=6b48cbf4f9
  Annotations:	kubernetes.io/change-cause: kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
  Containers:
   nginx:
    Image:	nginx:1.16.1
    Port:	<none>
    Host Port:	<none>
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>

==回滚(回到上次)==
[root@master kubernets]# kubectl rollout undo deployment/my-dep
deployment.apps/my-dep rolled back
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-5b7868d854-59bf7   1/1     Running   0          40s
my-dep-5b7868d854-d9wpf   1/1     Running   0          88s
my-dep-5b7868d854-pktqr   1/1     Running   0          66s

==回滚(回到指定版本)==
[root@master kubernets]# kubectl rollout undo deployment/my-dep --to-revision=2
deployment.apps/my-dep rolled back
[root@master kubernets]# kubectl get pod
NAME                      READY   STATUS              RESTARTS   AGE
my-dep-5b7868d854-59bf7   1/1     Running             0          93s
my-dep-5b7868d854-d9wpf   1/1     Running             0          2m21s
my-dep-5b7868d854-pktqr   1/1     Running             0          119s
my-dep-6b48cbf4f9-ndpvn   0/1     ContainerCreating   0          7s

命令小结

==历史记录==
kubectl rollout history deployment/my-dep

==查看某个历史详情==
kubectl rollout history deployment/my-dep --revision=2

==回滚(回到上次)==
kubectl rollout undo deployment/my-dep

==回滚(回到指定版本)==
kubectl rollout undo deployment/my-dep --to-revision=2

==滚动更新==
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record

3.0 yaml详解

apiVersion: v1     #必选,版本号,例如v1
kind: Pod         #必选,资源类型,例如 Pod
metadata:         #必选,元数据
  name: string     #必选,Pod名称
annotations:       #选做,描述信息
  nginx: nginx
  namespace: string  #Pod所属的命名空间,默认为"default"
  labels:           #自定义标签列表
    - name: string                 
spec:  #必选,Pod中容器的详细定义
  containers:  #必选,Pod中容器列表
  - name: string   #必选,容器名称
    image: string  #必选,容器的镜像名称
    imagePullPolicy: [ Always|Never|IfNotPresent ]  #获取镜像的策略 
    command: [string]   #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]      #容器的启动命令参数列表
    workingDir: string  #容器的工作目录
    volumeMounts:       #挂载到容器内部的存储卷配置
    - name: string      #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean #是否为只读模式
    ports: #需要暴露的端口库号列表
    - name: string        #端口的名称
      containerPort: 80  #容器需要监听的端口号
      hostPort: int       #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string    #端口协议,支持TCP和UDP,默认TCP
    env:   #容器运行前需设置的环境变量列表
    - name: string  #环境变量名称
      value: string #环境变量的值
    resources: #资源限制和请求的设置
      limits:  #资源限制的设置
        cpu: string     #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string  #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests: #资源请求的设置
        cpu: string    #Cpu请求,容器启动的初始可用数量
        memory: string #内存请求,容器启动的初始可用数量
    lifecycle: #生命周期钩子
		postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
		preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
    livenessProbe:  #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
      exec:         #对Pod容器内检查方式设置为exec方式
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0       #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged: false
  restartPolicy: [Always | Never | OnFailure]  #Pod的重启策略
  nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
  nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
  imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: string
  hostNetwork: false   #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
  volumes:   #在该pod上定义共享存储卷列表
  - name: string    #共享存储卷名称 (volumes类型有很多种)
    emptyDir: {}       #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: string   #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      path: string                #Pod所在宿主机的目录,将被用于同期中mount的目录
    secret:          #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
      scretname: string  
      items:     
      - key: string
        path: string
    configMap:         #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string
        path: string

更多:
除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job 等 类型资源。我们都称为 工作负载。
有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署

官方详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值