通过现代的 Web 服务,用户希望应用程序能够 24/7 全天候使用,开发人员希望每天可以多次发布部署新版本的应用程序。 容器化可以帮助软件包达成这些目标,使应用程序能够以简单快速的方式发布和更新,而无需停机。Kubernetes 帮助您确保这些容器化的应用程序在您想要的时间和地点运行,并帮助应用程序找到它们需要的资源和工具。Kubernetes 是一个可用于生产的开源平台,根据 Google 容器集群方面积累的经验,以及来自社区的最佳实践而设计。
1. 查看k8s版本minikube version2. 运行k8s
minikube start3. 查看客户端的版本
kubectl version4. 查看所有nodes(节点)
kubectl get nodes
输出
$ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready control-plane,master 48s v1.20.2master和nodes
Master 负责管理整个集群。 Master 协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。
Node 是一个虚拟机或者物理机,它在 Kubernetes 集群中充当工作机器的角色 每个Node都有 Kubelet , 它管理 Node 而且是 Node 与 Master 通信的代理。 Node 还应该具有用于处理容器 *** 作的工具,例如 Docker 或 rkt 。处理生产级流量的 Kubernetes 集群至少应具有三个 Node 。
Master 管理集群,Node 用于托管正在运行的应用。
在 Kubernetes 上部署应用时,您告诉 Master 启动应用容器。 Master 就编排容器在集群的 Node 上运行。 Node 使用 Master 暴露的 Kubernetes API 与 Master 通信。终端用户也可以使用 Kubernetes API 与集群交互。
Kubernetes 既可以部署在物理机上也可以部署在虚拟机上。您可以使用 Minikube 开始部署 Kubernetes 集群。 Minikube 是一种轻量级的 Kubernetes 实现,可在本地计算机上创建 VM 并部署仅包含一个节点的简单集群。 Minikube 可用于 Linux , macOS 和 Windows 系统。Minikube CLI 提供了用于引导集群工作的多种 *** 作,包括启动、停止、查看状态和删除。在本教程里,您可以使用预装有 Minikube 的在线终端进行体验。
既然您已经知道 Kubernetes 是什么,让我们转到在线教程并启动我们的第一个 Kubernetes 集群!
5. 查看所有Podkubectl get podsKubernetes Pods
在模块 2创建 Deployment 时, Kubernetes 添加了一个 Pod 来托管你的应用实例。Pod 是 Kubernetes 抽象出来的,表示一组一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源。这些资源包括:
共享存储,当作卷
网络,作为唯一的集群 IP 地址
有关每个容器如何运行的信息,例如容器映像版本或要使用的特定端口。
Pod 为特定于应用程序的“逻辑主机”建模,并且可以包含相对紧耦合的不同应用容器。例如,Pod 可能既包含带有 Node.js 应用的容器,也包含另一个不同的容器,用于提供 Node.js 网络服务器要发布的数据。Pod 中的容器共享 IP 地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行。
Pod是 Kubernetes 平台上的原子单元。 当我们在 Kubernetes 上创建 Deployment 时,该 Deployment 会在其中创建包含容器的 Pod (而不是直接创建容器)。每个 Pod 都与调度它的工作节点绑定,并保持在那里直到终止(根据重启策略)或删除。 如果工作节点发生故障,则会在群集中的其他可用工作节点上调度相同的 Pod。
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 kubectl get pods
输出
$ kubectl get podsNAME READY STATUS RESTARTS AGE kubernetes-bootcamp-57978f5f5d-4rmpx 1/1 Running 0 47s7. 查看deployment(app)
kubectl get deployment
输出
$ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1/1 1 1 3m11s8. 打开proxy
proxy是nodes和宿主机通信的渠道,我们需要先打开proxy才能范围nodes里面的app
kubectl proxy9. 查看pods的描述
kubectl describe pods
$ kubectl describe pods Name: kubernetes-bootcamp-fb5c67579-p592z Namespace: default Priority: 0 Node: minikube/172.17.0.53 Start Time: Tue, 11 Jan 2022 01:00:18 +0000 Labels: app=kubernetes-bootcamp pod-template-hash=fb5c67579 Annotations:10. 查看pods的日志Status: Running IP: 172.18.0.5 IPs: IP: 172.18.0.5 Controlled By: ReplicaSet/kubernetes-bootcamp-fb5c67579 Containers: kubernetes-bootcamp: Container ID: docker://0f5ebb522eb3b976122f505824dca18bb9f31ef05329f89cfc821c8534b92fac Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af Port: 8080/TCP Host Port: 0/TCP State: Running Started: Tue, 11 Jan 2022 01:00:21 +0000 Ready: True Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-v8wdv (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-v8wdv: Type: Secret (a volume populated by a Secret) SecretName: default-token-v8wdv Optional: false QoS Class: BestEffort Node-Selectors: 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 6m20s default-scheduler Successfully assigned default/kubernetes-bootcamp-fb5c67579-p592z to minikube Normal Pulled 6m18s kubelet Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine Normal Created 6m18s kubelet Created container kubernetes-bootcamp Normal Started 6m17s kubelet Started container kubernetes-bootcamp $
注意: 这里直接指定了pods的名字,而没有指定容器的名字,这是因为这个pod里面有且仅有一个容器.
kubectl logs $POD_NAME11. 进入容器的相关命令
进入pods里面容器的相关命令如下所示:
注意: 同理这里直接指定了pods的名字,而没有指定容器的名字,这是因为这个pod里面有且仅有一个容器.
查看容器环境变量
kubectl exec $POD_NAME -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=kubernetes-bootcamp-fb5c67579-p592z KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_SERVICE_HOST=10.96.0.1 KUBERNETES_SERVICE_PORT=443 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP_PROTO=tcp NPM_CONFIG_LOGLEVEL=info NODE_VERSION=6.3.1 HOME=/root
进入容器的命令
kubectl exec -ti $POD_NAME -- bash12. Kubernetes中的Service Kubernetes Service 总览
Kubernetes Pod 是转瞬即逝的。 Pod 实际上拥有 生命周期。 当一个工作 Node 挂掉后, 在 Node 上运行的 Pod 也会消亡。 ReplicaSet 会自动地通过创建新的 Pod 驱动集群回到目标状态,以保证应用程序正常运行。 换一个例子,考虑一个具有3个副本数的用作图像处理的后端程序。这些副本是可替换的; 前端系统不应该关心后端副本,即使 Pod 丢失或重新创建。也就是说,Kubernetes 集群中的每个 Pod (即使是在同一个 Node 上的 Pod )都有一个唯一的 IP 地址,因此需要一种方法自动协调 Pod 之间的变更,以便应用程序保持运行。
Kubernetes 中的服务(Service)是一种抽象概念,它定义了 Pod 的逻辑集和访问 Pod 的协议。Service 使从属 Pod 之间的松耦合成为可能。 和其他 Kubernetes 对象一样, Service 用 YAML (更推荐) 或者 JSON 来定义. Service 下的一组 Pod 通常由 LabelSelector (请参阅下面的说明为什么您可能想要一个 spec 中不包含selector的服务)来标记。
尽管每个 Pod 都有一个唯一的 IP 地址,但是如果没有 Service ,这些 IP 不会暴露在集群外部。Service 允许您的应用程序接收流量。Service 也可以用在 ServiceSpec 标记type的方式暴露
ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用: 从集群外部访问 Service。是 ClusterIP 的超集。LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。不使用代理。这种类型需要kube-dns的v1.7或更高版本。
更多关于不同 Service 类型的信息可以在使用源 IP 教程。 也请参阅 连接应用程序和 Service 。
另外,需要注意的是有一些 Service 的用例没有在 spec 中定义selector。 一个没有selector创建的 Service 也不会创建相应的端点对象。这允许用户手动将服务映射到特定的端点。没有 selector 的另一种可能是您严格使用type: ExternalName来标记。
12.1 获取集群里面的serviceskubectl get services
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.112.2 暴露一个应用443/TCP 23m $
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
查看这个已经暴露的应用,kubernetes-bootcamp是应用名字,NodePort 32402是暴露在外面的端口名称
kubectl describe services/kubernetes-bootcamp
$ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: app=kubernetes-bootcamp Annotations:13. label的相关 *** 作 13.1 查看应用的deploymentSelector: app=kubernetes-bootcamp Type: NodePort IP Families: IP: 10.107.150.239 IPs: 10.107.150.239 Port: 8080/TCP TargetPort: 8080/TCP NodePort: 32402/TCP Endpoints: 172.18.0.4:8080 Session Affinity: None External Traffic Policy: Cluster Events:
下面的语句可以查看所有的deployment,其中Name字段即为label的名称
kubectl describe deployment
$ kubectl describe deployment Name: kubernetes-bootcamp Namespace: default CreationTimestamp: Tue, 11 Jan 2022 01:39:01 +0000 Labels: app=kubernetes-bootcamp Annotations: deployment.kubernetes.io/revision: 1 Selector: app=kubernetes-bootcamp Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=kubernetes-bootcamp Containers: kubernetes-bootcamp: Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Port: 8080/TCP Host Port: 0/TCP Environment:13.2 使用label去查podMounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: NewReplicaSet: kubernetes-bootcamp-fb5c67579 (1/1 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 44m deployment-controller Scaled up replica set kubernetes-bootcamp-fb5c67579 to 1
kubectl get pods -l app=kubernetes-bootcamp
$ kubectl get pods -l app=kubernetes-bootcamp NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-fb5c67579-k8296 1/1 Running 0 8m56s13.3 新增为pod一个label
kubectl label pods $POD_NAME version=v1
$ echo Name of the Pod: $POD_NAME Name of the Pod: kubernetes-bootcamp-fb5c67579-5kv4c
使用label去查看访问pods
kubectl describe pods $POD_NAME14. 删除service
kubectl delete service -l app=kubernetes-bootcamp15. deployment应用的扩容,高可用
把一个应用复制4份
查看应用 deploymentkubectl get deployments
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 0/1 0 0 7s $
NAME lists the names of the Deployments in the cluster.READY shows the ratio of CURRENT/DESIRED replicasUP-TO-DATE displays the number of replicas that have been updated to achieve the desired state.AVAILABLE displays how many replicas of the application are available to your users.
AGE displays the amount of time that the application has been running.
查看应用的副本
kubectl get rs
$ kubectl get rs NAME DESIRED CURRENT READY AGE kubernetes-bootcamp-fb5c67579 1 1 1 60s
DESIRED displays the desired number of replicas of the application, which you define when you create the Deployment. This is the desired state.CURRENT displays how many replicas are currently running. 将应用复制成4份
kubectl scale deployments/kubernetes-bootcamp --replicas=4
$ kubectl scale deployments/kubernetes-bootcamp --replicas=4 deployment.apps/kubernetes-bootcamp scaled重新查看应用,已经有4个副本
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 4/4 4 4 3m51sPods也被复制成4个
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kubernetes-bootcamp-fb5c67579-kcl2v 1/1 Running 0 4m24s 172.18.0.4 minikube查看deployment的描述,发现有4个replicas了kubernetes-bootcamp-fb5c67579-mp5x5 1/1 Running 0 95s 172.18.0.9 minikube kubernetes-bootcamp-fb5c67579-nl48g 1/1 Running 0 95s 172.18.0.7 minikube kubernetes-bootcamp-fb5c67579-ppzw5 1/1 Running 0 95s 172.18.0.8 minikube
$ kubectl describe deployments/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default CreationTimestamp: Tue, 11 Jan 2022 03:28:11 +0000 Labels: app=kubernetes-bootcamp Annotations: deployment.kubernetes.io/revision: 1 Selector: app=kubernetes-bootcamp Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=kubernetes-bootcamp Containers: kubernetes-bootcamp: Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Port: 8080/TCP Host Port: 0/TCP Environment:16. deployment应用的负载均衡Mounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Progressing True NewReplicaSetAvailable Available True MinimumReplicasAvailable OldReplicaSets: NewReplicaSet: kubernetes-bootcamp-fb5c67579 (4/4 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 6m30s deployment-controller Scaled up replica set kubernetes-bootcamp-fb5c67579 to 1 Normal ScalingReplicaSet 3m40s deployment-controller Scaled up replica set kubernetes-bootcamp-fb5c67579 to 4
查看系统中的的deployment
kubectl describe services/kubernetes-bootcamp
获取k8s外暴露端口
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') echo NODE_PORT=$NODE_PORT
访问程序,发现每次访问的pod是不一样的
$ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-fgqdc | v=1 $ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-fgqdc | v=1 $ curl $(minikube ip):$NODE_PORT curl $(minikube ip):$NODE_PORT curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-fgqdc | v=1 $ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-cw855 | v=1 $ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-8hmn7 | v=117. 缩减应用的副本 下面把应用缩减到2个副本
kubectl scale deployments/kubernetes-bootcamp --replicas=2
$ kubectl scale deployments/kubernetes-bootcamp --replicas=2 deployment.apps/kubernetes-bootcamp scaled查看deployment发现已经缩减成2
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2/2 2 2 7m49s查看pods数量发现剩下2个
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kubernetes-bootcamp-fb5c67579-cw855 1/1 Running 0 6m51s 172.18.0.7 minikube17. k8s的滚动更新 查看所有的deploymentkubernetes-bootcamp-fb5c67579-fgqdc 1/1 Running 0 7m57s 172.18.0.5 minikube
可见是1个deployment+3个replicas
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 0/4 0 0 9s查看所有的pods
$ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-fb5c67579-hjwkm 1/1 Running 0 41s kubernetes-bootcamp-fb5c67579-jpckv 1/1 Running 0 41s kubernetes-bootcamp-fb5c67579-lkwxf 1/1 Running 0 41s kubernetes-bootcamp-fb5c67579-nnmmn 1/1 Running 0 41s查看pods的介绍
这里一共有4个pods,然后相对应的Image为:
gcr.io/google-samples/kubernetes-bootcamp:v1
$ kubectl describe pods Name: kubernetes-bootcamp-fb5c67579-hjwkm Namespace: default Priority: 0 Node: minikube/172.17.0.15 Start Time: Tue, 11 Jan 2022 06:38:53 +0000 Labels: app=kubernetes-bootcamp pod-template-hash=fb5c67579 Annotations:升级pods的deploymentStatus: Running IP: 172.18.0.3 IPs: IP: 172.18.0.3 Controlled By: ReplicaSet/kubernetes-bootcamp-fb5c67579 Containers: kubernetes-bootcamp: Container ID: docker://9bb4fcdc18fefe521bbae0ebab4f2c0073488307be6a4398c440dcbf352889d3 Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af Port: 8080/TCP Host Port: 0/TCP State: Running Started: Tue, 11 Jan 2022 06:38:57 +0000 Ready: True Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-j6nkn (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-j6nkn: Type: Secret (a volume populated by a Secret) SecretName: default-token-j6nkn Optional: false QoS Class: BestEffort Node-Selectors: 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 2m5s default-scheduler Successfully assigned default/kubernetes-bootcamp-fb5c67579-hjwkm to minikube Normal Pulled 2m2s kubelet Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine Normal Created 2m2s kubelet Created container kubernetes-bootcamp Normal Started 2m1s kubelet Started container kubernetes-bootcamp Name: kubernetes-bootcamp-fb5c67579-jpckv Namespace: default Priority: 0 Node: minikube/172.17.0.15 Start Time: Tue, 11 Jan 2022 06:38:53 +0000 Labels: app=kubernetes-bootcamp pod-template-hash=fb5c67579 Annotations: Status: Running IP: 172.18.0.2 IPs: IP: 172.18.0.2 Controlled By: ReplicaSet/kubernetes-bootcamp-fb5c67579 Containers: kubernetes-bootcamp: Container ID: docker://bc3f20b0764db96462fb9b908cd47dba61d2aec102658b0104232ded9d542b36 Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af Port: 8080/TCP Host Port: 0/TCP State: Running Started: Tue, 11 Jan 2022 06:38:57 +0000 Ready: True Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-j6nkn (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-j6nkn: Type: Secret (a volume populated by a Secret) SecretName: default-token-j6nkn Optional: false QoS Class: BestEffort Node-Selectors: 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 2m5s default-scheduler Successfully assigned default/kubernetes-bootcamp-fb5c67579-jpckv to minikube Normal Pulled 2m2s kubelet Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine Normal Created 2m2s kubelet Created container kubernetes-bootcamp Normal Started 2m1s kubelet Started container kubernetes-bootcamp Name: kubernetes-bootcamp-fb5c67579-lkwxf Namespace: default Priority: 0 Node: minikube/172.17.0.15 Start Time: Tue, 11 Jan 2022 06:38:53 +0000 Labels: app=kubernetes-bootcamp pod-template-hash=fb5c67579 Annotations: Status: Running IP: 172.18.0.4 IPs: IP: 172.18.0.4 Controlled By: ReplicaSet/kubernetes-bootcamp-fb5c67579 Containers: kubernetes-bootcamp: Container ID: docker://7bfe66523f83812467912fe95c7f9b9c9ba30f9a58a0ebe3f7fa39857d0fccb1 Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af Port: 8080/TCP Host Port: 0/TCP State: Running Started: Tue, 11 Jan 2022 06:38:58 +0000 Ready: True Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-j6nkn (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-j6nkn: Type: Secret (a volume populated by a Secret) SecretName: default-token-j6nkn Optional: false QoS Class: BestEffort Node-Selectors: 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 2m5s default-scheduler Successfully assigned default/kubernetes-bootcamp-fb5c67579-lkwxf to minikube Normal Pulled 2m2s kubelet Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine Normal Created 2m2s kubelet Created container kubernetes-bootcamp Normal Started 2m kubelet Started container kubernetes-bootcamp Name: kubernetes-bootcamp-fb5c67579-nnmmn Namespace: default Priority: 0 Node: minikube/172.17.0.15 Start Time: Tue, 11 Jan 2022 06:38:53 +0000 Labels: app=kubernetes-bootcamp pod-template-hash=fb5c67579 Annotations: Status: Running IP: 172.18.0.5 IPs: IP: 172.18.0.5 Controlled By: ReplicaSet/kubernetes-bootcamp-fb5c67579 Containers: kubernetes-bootcamp: Container ID: docker://6975f847f6662dfc4c63b865b15ec6a6f39ea3bcee00d5091294dd7bff248925 Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af Port: 8080/TCP Host Port: 0/TCP State: Running Started: Tue, 11 Jan 2022 06:38:58 +0000 Ready: True Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-j6nkn (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-j6nkn: Type: Secret (a volume populated by a Secret) SecretName: default-token-j6nkn Optional: false QoS Class: BestEffort Node-Selectors: 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 2m5s default-scheduler Successfully assigned default/kubernetes-bootcamp-fb5c67579-nnmmn to minikube Normal Pulled 2m2s kubelet Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine Normal Created 2m2s kubelet Created container kubernetes-bootcamp Normal Started 2m kubelet Started container kubernetes-bootcamp
这里升级到V2的版本
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2 deployment.apps/kubernetes-bootcamp image updated查看更新的过程
可以看到无感更新的过程,旧的pod被terminated新的被created
$ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-7d44784b7c-4l5ws 0/1 ContainerCreating 0 0s kubernetes-bootcamp-7d44784b7c-9fxz5 0/1 ContainerCreating 0 5s kubernetes-bootcamp-7d44784b7c-xg5cr 1/1 Running 0 5s kubernetes-bootcamp-fb5c67579-n7xwk 1/1 Running 0 49s kubernetes-bootcamp-fb5c67579-p6gs8 1/1 Running 0 50s kubernetes-bootcamp-fb5c67579-rq88z 1/1 Terminating 0 49s kubernetes-bootcamp-fb5c67579-zvpk5 1/1 Terminating 0 49s再次查看pods发现Image的版本已经是v2
$ kubectl describe pods Name: kubernetes-bootcamp-7d44784b7c-4l5ws Namespace: default Priority: 0 Node: minikube/172.17.0.116 Start Time: Tue, 11 Jan 2022 06:50:47 +0000 Labels: app=kubernetes-bootcamp pod-template-hash=7d44784b7c Annotations:验证是否升级成功Status: Running IP: 172.18.0.12 IPs: IP: 172.18.0.12 Controlled By: ReplicaSet/kubernetes-bootcamp-7d44784b7c Containers: kubernetes-bootcamp: Container ID: docker://a255b25824d3aeb0925c87be994039fb85b9abcf36b599b4cb66acf58cd662de Image: jocatalin/kubernetes-bootcamp:v2 Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5 Port: 8080/TCP Host Port: 0/TCP State: Running Started: Tue, 11 Jan 2022 06:50:51 +0000 Ready: True Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-twlzs (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-twlzs: Type: Secret (a volume populated by a Secret) SecretName: default-token-twlzs Optional: false QoS Class: BestEffort Node-Selectors: 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 2m42s default-scheduler Successfully assigned default/kubernetes-bootcamp-7d44784b7c-4l5ws to minikube Normal Pulled 2m40s kubelet Container image "jocatalin/kubernetes-bootcamp:v2" already present on machine Normal Created 2m39s kubelet Created container kubernetes-bootcamp Normal Started 2m38s kubelet Started container kubernetes-bootcamp
$ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: app=kubernetes-bootcamp Annotations:记录访问端口Selector: app=kubernetes-bootcamp Type: NodePort IP Families: IP: 10.109.66.156 IPs: 10.109.66.156 Port: 8080/TCP TargetPort: 8080/TCP NodePort: 32079/TCP Endpoints: 172.18.0.10:8080,172.18.0.11:8080,172.18.0.12:8080 + 1 more... Session Affinity: None External Traffic Policy: Cluster Events:
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') echo NODE_PORT=$NODE_PORT访问以后看到已经是v2版本
$ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7d44784b7c-h6plc | v=218. 回滚更新 先升级一个不存在的版本
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10 deployment.apps/kubernetes-bootcamp image updated发现部分节点报错了
$ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-59b7598c77-gnp7q 0/1 ErrImagePull 0 45s kubernetes-bootcamp-59b7598c77-qs5x4 0/1 ErrImagePull 0 46s kubernetes-bootcamp-7d44784b7c-4l5ws 1/1 Running 0 27m kubernetes-bootcamp-7d44784b7c-9fxz5 1/1 Running 0 27m kubernetes-bootcamp-7d44784b7c-xg5cr 1/1 Running参看pods的详情
kubectl describe pods
发现了v10版本不存在的报错
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 85s default-scheduler Successfully assigned default/kubernetes-bootcamp-59b7598c77-qs5x4 to minikube Normal Pulling 39s (x3 over 80s) kubelet Pulling image "gcr.io/google-samples/kubernetes-bootcamp:v10" Warning Failed 39s (x3 over 80s) kubelet Failed to pull image "gcr.io/google-samples/kubernetes-bootcamp:v10": rpc error: code = Unknown desc = Error response from daemon: manifest for gcr.io/google-samples/kubernetes-bootcamp:v10 not found: manifest unknown: Failed to fetch "v10" from request "/v2/google-samples/kubernetes-bootcamp/manifests/v10". Warning Failed 39s (x3 over 80s) kubelet Error: ErrImagePull Normal BackOff 10s (x5 over 79s) kubelet Back-off pulling image "gcr.io/google-samples/kubernetes-bootcamp:v10" Warning Failed 10s (x5 over 79s) kubelet Error: ImagePullBackOff回滚到上一个stable的版本
kubectl rollout undo deployments/kubernetes-bootcamp
$ kubectl rollout undo deployments/kubernetes-bootcamp deployment.apps/kubernetes-bootcamp rolled back再次查看pods发现回滚已经成功了
$ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-7d44784b7c-4l5ws 1/1 Running 0 30m kubernetes-bootcamp-7d44784b7c-9fxz5 1/1 Running 0 30m kubernetes-bootcamp-7d44784b7c-tdht7 1/1 Running 0 42s kubernetes-bootcamp-7d44784b7c-xg5cr 1/1 Running 0 30m
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)