<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>K8s on KePulsary</title><link>https://kepulsary.github.io/tags/k8s/</link><description>Recent content in K8s on KePulsary</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Mon, 27 Feb 2023 15:13:43 +0000</lastBuildDate><atom:link href="https://kepulsary.github.io/tags/k8s/index.xml" rel="self" type="application/rss+xml"/><item><title>k8s 初体验</title><link>https://kepulsary.github.io/2023/02/26/k8s-basics/</link><pubDate>Sun, 26 Feb 2023 12:46:22 +0000</pubDate><guid>https://kepulsary.github.io/2023/02/26/k8s-basics/</guid><description>&lt;h1 id="k8s-初体验"&gt;k8s 初体验&#10;&lt;/h1&gt;&lt;h2 id="什么是k8s"&gt;什么是k8s&#10;&lt;/h2&gt;&lt;p&gt;Kubernetes 是一个开源的容器编排引擎，用来对容器化应用进行自动化部署、 扩缩和管理。&lt;/p&gt;&#10;&lt;h2 id="为什么需要k8s"&gt;为什么需要k8s&#10;&lt;/h2&gt;&lt;p&gt;通过现代的 Web 服务，用户希望应用程序能够 24/7 全天候使用，开发人员希望每天可以多次发布部署新版本的应用程序。 容器化可以帮助软件包达成这些目标，使应用程序能够以简单快速的方式发布和更新，而无需停机。Kubernetes 帮助你确保这些容器化的应用程序在你想要的时间和地点运行，并帮助应用程序找到它们需要的资源和工具。Kubernetes 是一个可用于生产的开源平台，根据 Google 容器集群方面积累的经验，以及来自社区的最佳实践而设计。&lt;/p&gt;&#10;&lt;h2 id="k8s的使用"&gt;k8s的使用&#10;&lt;/h2&gt;&lt;h3 id="使用-minikube-创建集群"&gt;使用 Minikube 创建集群&#10;&lt;/h3&gt;&lt;p&gt;minikube start 时因为国内墙问题会有start失败的情况，自行百度&lt;/p&gt;&#10;&lt;p&gt;一个 Kubernetes 集群包含两种类型的资源:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Master&lt;/strong&gt; 调度整个集群。 Master 协调集群中的所有活动，例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Nodes&lt;/strong&gt; 负责运行应用。Node 是一个虚拟机或者物理机，它在 Kubernetes 集群中充当工作机器的角色&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-01-cluster.svg"&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;minikube version&lt;/strong&gt; - 确定minikube已经安装 &lt;a class="link" href="https://minikube.sigs.k8s.io/docs/start/" target="_blank" rel="noopener"&#10; &gt;https://minikube.sigs.k8s.io/docs/start/&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;minikube start&lt;/strong&gt; - 启动minikube&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl version&lt;/strong&gt; - 确定kubectl已安装&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl cluster-info&lt;/strong&gt; - 查看集群详细信息&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get nodes&lt;/strong&gt; - 查看集群中的节点&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="使用-kubectl-创建-deployment"&gt;使用 kubectl 创建 Deployment&#10;&lt;/h3&gt;&lt;p&gt;一旦运行了 Kubernetes 集群，就可以在其上部署容器化应用程序。 为此，你需要创建 Kubernetes &lt;strong&gt;Deployment&lt;/strong&gt; 配置。Deployment 指挥 Kubernetes 如何创建和更新应用程序的实例。创建 Deployment 后，Kubernetes master 将应用程序实例调度到集群中的各个节点上。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-02-first-app.svg"&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl version&lt;/strong&gt; - 确定kubectl已安装&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get nodes&lt;/strong&gt; - 查看集群中的节点&lt;/li&gt;&#10;&lt;li&gt;kubectl create deployment deployment-name –image=deployment-image&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get deployments&lt;/strong&gt; - 列出所有deployment&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl proxy&lt;/strong&gt; - 代理api出来使得能够被访问&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="查看-pod-和工作节点"&gt;查看 pod 和工作节点&#10;&lt;/h3&gt;&lt;p&gt;在创建 Deployment 时, Kubernetes 添加了一个 &lt;strong&gt;Pod&lt;/strong&gt; 来托管你的应用实例。Pod 是 Kubernetes 抽象出来的，表示一组一个或多个应用程序容器（如 Docker），以及这些容器的一些共享资源。这些资源包括:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;共享存储，当作卷&lt;/li&gt;&#10;&lt;li&gt;网络，作为唯一的集群 IP 地址&lt;/li&gt;&#10;&lt;li&gt;有关每个容器如何运行的信息，例如容器镜像版本或要使用的特定端口。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-03-pods.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;一个 pod 总是运行在 &lt;strong&gt;工作节点&lt;/strong&gt;。工作节点是 Kubernetes 中的参与计算的机器，可以是虚拟机或物理计算机，具体取决于集群。每个工作节点由主节点管理。工作节点可以有多个 pod ，Kubernetes 主节点会自动处理在集群中的工作节点上调度 pod 。 主节点的自动调度考量了每个工作节点上的可用资源。&lt;/p&gt;&#10;&lt;p&gt;每个 Kubernetes 工作节点至少运行:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Kubelet，负责 Kubernetes 主节点和工作节点之间通信的过程; 它管理 Pod 和机器上运行的容器。&lt;/li&gt;&#10;&lt;li&gt;容器运行时（如 Docker）负责从仓库中提取容器镜像，解压缩容器以及运行应用程序。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-03-nodes.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;使用 kubectl 进行故障排除。 最常见的操作可以使用以下 kubectl 命令来获取有关已部署的应用程序及其环境的信息：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get&lt;/strong&gt; - 列出资源&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl describe&lt;/strong&gt; - 显示有关资源的详细信息&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl logs&lt;/strong&gt; - 打印 pod 和其中容器的日志&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl exec&lt;/strong&gt; - 在 pod 中的容器上执行命令&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;详细的命令示例&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get pods&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY STATUS RESTARTS AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-4whtb 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 2m46s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl describe pods&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name: kubernetes-bootcamp-fb5c67579-4whtb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Namespace: default&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Priority: &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Node: minikube/10.0.0.30&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Start Time: Sun, &lt;span class="m"&gt;26&lt;/span&gt; Feb &lt;span class="m"&gt;2023&lt;/span&gt; 10:22:42 +0000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Labels: &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubernetes-bootcamp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pod-template-hash&lt;span class="o"&gt;=&lt;/span&gt;fb5c67579&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Annotations: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Status: Running&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.......................&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;POD_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get pods -o go-template --template &lt;span class="s1"&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; Name of the Pod: &lt;span class="nv"&gt;$POD_NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name of the Pod: kubernetes-bootcamp-fb5c67579-4whtb @ 实际是就是pod的name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl http://localhost:8001/api/v1/namespaces/default/pods/&lt;span class="nv"&gt;$POD_NAME&lt;/span&gt;/proxy/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello Kubernetes bootcamp! &lt;span class="p"&gt;|&lt;/span&gt; Running on: kubernetes-bootcamp-fb5c67579-4whtb &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl logs &lt;span class="nv"&gt;$POD_NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kubernetes Bootcamp App Started At: 2023-02-26T10:22:44.413Z &lt;span class="p"&gt;|&lt;/span&gt; Running On: kubernetes-bootcamp-fb5c67579-4whtb &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Running On: kubernetes-bootcamp-fb5c67579-4whtb &lt;span class="p"&gt;|&lt;/span&gt; Total Requests: &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; App Uptime: 2260.095 seconds &lt;span class="p"&gt;|&lt;/span&gt; Log Time: 2023-02-26T11:00:24.509Z&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$POD_NAME&lt;/span&gt; -- env &lt;span class="c1"&gt;# 类似docker exec 容器 命令 &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubernetes-bootcamp-fb5c67579-4whtb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_SERVICE_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_SERVICE_PORT_HTTPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp://10.96.0.1:443&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_PORT_443_TCP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp://10.96.0.1:443&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_PORT_443_TCP_PROTO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_PORT_443_TCP_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_PORT_443_TCP_ADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.96.0.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KUBERNETES_SERVICE_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.96.0.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NPM_CONFIG_LOGLEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NODE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; -ti &lt;span class="nv"&gt;$POD_NAME&lt;/span&gt; -- bash &lt;span class="c1"&gt;# 以交互式执行命令执行的bash即进入命令行...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="使用-service-暴露你的应用"&gt;使用 Service 暴露你的应用&#10;&lt;/h3&gt;&lt;p&gt;Kubernetes &lt;a class="link" href="https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/" target="_blank" rel="noopener"&#10; &gt;Pod&lt;/a&gt; 是转瞬即逝的。 Pod 实际上拥有 &lt;a class="link" href="https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/" target="_blank" rel="noopener"&#10; &gt;生命周期&lt;/a&gt;。 当一个工作 Node 挂掉后, 在 Node 上运行的 Pod 也会消亡。 &lt;a class="link" href="https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/replicaset/" target="_blank" rel="noopener"&#10; &gt;ReplicaSet&lt;/a&gt; 会自动地通过创建新的 Pod 驱动集群回到目标状态，以保证应用程序正常运行。 换一个例子，考虑一个具有3个副本数的用作图像处理的后端程序。这些副本是可替换的; 前端系统不应该关心后端副本，即使 Pod 丢失或重新创建。也就是说，Kubernetes 集群中的每个 Pod (即使是在同一个 Node 上的 Pod )都有一个唯一的 IP 地址，因此需要一种方法自动协调 Pod 之间的变更，以便应用程序保持运行。&lt;/p&gt;&#10;&lt;p&gt;Kubernetes 中的服务(Service)是一种抽象概念，它定义了 Pod 的逻辑集和访问 Pod 的协议。Service 使从属 Pod 之间的松耦合成为可能。 和其他 Kubernetes 对象一样, Service 用 YAML &lt;a class="link" href="https://kubernetes.io/zh-cn/docs/concepts/configuration/overview/#general-configuration-tips" target="_blank" rel="noopener"&#10; &gt;(更推荐)&lt;/a&gt; 或者 JSON 来定义. Service 下的一组 Pod 通常由 &lt;em&gt;LabelSelector&lt;/em&gt; (请参阅下面的说明为什么你可能想要一个 spec 中不包含&lt;code&gt;selector&lt;/code&gt;的服务)来标记。&lt;/p&gt;&#10;&lt;p&gt;尽管每个 Pod 都有一个唯一的 IP 地址，但是如果没有 Service ，这些 IP 不会暴露在集群外部。Service 允许你的应用程序接收流量。Service 也可以用在 ServiceSpec 标记&lt;code&gt;type&lt;/code&gt;的方式暴露&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;em&gt;ClusterIP&lt;/em&gt; (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;NodePort&lt;/em&gt; - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用&lt;code&gt;&amp;lt;NodeIP&amp;gt;:&amp;lt;NodePort&amp;gt;&lt;/code&gt; 从集群外部访问 Service。是 ClusterIP 的超集。&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;LoadBalancer&lt;/em&gt; - 在当前云中创建一个外部负载均衡器(如果支持的话)，并为 Service 分配一个固定的外部IP。是 NodePort 的超集。&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;ExternalName&lt;/em&gt; - 通过返回带有该名称的 CNAME 记录，使用任意名称(由 spec 中的&lt;code&gt;externalName&lt;/code&gt;指定)公开 Service。不使用代理。这种类型需要&lt;code&gt;kube-dns&lt;/code&gt;的v1.7或更高版本。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;另外，需要注意的是有一些 Service 的用例没有在 spec 中定义&lt;code&gt;selector&lt;/code&gt;。 一个没有&lt;code&gt;selector&lt;/code&gt;创建的 Service 也不会创建相应的端点对象。这允许用户手动将服务映射到特定的端点。没有 selector 的另一种可能是你严格使用&lt;code&gt;type: ExternalName&lt;/code&gt;来标记。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Service 和 Label&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-04-services.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;Service 通过一组 Pod 路由通信。Service 是一种抽象，它允许 Pod 死亡并在 Kubernetes 中复制，而不会影响应用程序。在依赖的 Pod (如应用程序中的前端和后端组件)之间进行发现和路由是由Kubernetes Service 处理的。&lt;/p&gt;&#10;&lt;p&gt;Service 匹配一组 Pod 是使用 &lt;a class="link" href="https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels" target="_blank" rel="noopener"&#10; &gt;标签(Label)和选择器(Selector)&lt;/a&gt;, 它们是允许对 Kubernetes 中的对象进行逻辑操作的一种分组原语。标签(Label)是附加在对象上的键/值对，可以以多种方式使用:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;指定用于开发，测试和生产的对象&lt;/li&gt;&#10;&lt;li&gt;嵌入版本标签&lt;/li&gt;&#10;&lt;li&gt;使用 Label 将对象进行分类&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-04-labels.svg"&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get pods&lt;/strong&gt; - 列出存在的pods&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get services/svc&lt;/strong&gt; - 列出存在的service&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl expose&lt;/strong&gt; (-f FILENAME | TYPE NAME) [–port=port]&#10;[–protocol=TCP|UDP|SCTP] [–target-port=number-or-name] [–name=name]&#10;[–external-ip=external-ip-of-service] [–type=type] [options] - 创建新服务并将其暴露给外部流量&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl describe services/服务名&lt;/strong&gt; - 查看服务的详情&lt;/li&gt;&#10;&lt;li&gt;curl $(minikube ip):$NODE_PORT 请求 这里的ip是哪个ip呢，node上面？应该是service上面&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl describe deployment&lt;/strong&gt; - deployment的详细内容&lt;/li&gt;&#10;&lt;li&gt;通过 -l app=xxxx 来筛选指定标签的内容 pods or svc 等等&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl label&lt;/strong&gt; pods $POD_NAME version=v1 - 要应用新标签，我们使用 label 命令，后跟对象类型、对象名称和新标签 我们便可以在对象详情的labels部分看见 version=v1&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="运行应用程序的多个实例"&gt;运行应用程序的多个实例&#10;&lt;/h3&gt;&lt;p&gt;Deployment 仅为跑这个应用程序创建了一个 Pod。 当流量增加时，我们需要扩容应用程序满足用户需求。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;扩缩&lt;/strong&gt; 是通过改变 Deployment 中的副本数量来实现的。&lt;/p&gt;&#10;&lt;p&gt;扩展 Deployment 将创建新的 Pods，并将资源调度请求分配到有可用资源的节点上，收缩 会将 Pods 数量减少至所需的状态。Kubernetes 还支持 Pods 的&lt;a class="link" href="https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/" target="_blank" rel="noopener"&#10; &gt;自动缩放&lt;/a&gt;，。将 Pods 数量收缩到0也是可以的，但这会终止 Deployment 上所有已经部署的 Pods。&lt;/p&gt;&#10;&lt;p&gt;运行应用程序的多个实例需要在它们之间分配流量。服务 (Service)有一种负载均衡器类型，可以将网络流量均衡分配到外部可访问的 Pods 上。服务将会一直通过端点来监视 Pods 的运行，保证流量只分配到可用的 Pods 上。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-05-scaling.svg"&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get deployments&lt;/strong&gt; - 列出 deployments&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get rs&lt;/strong&gt;查看 Deployment 创建的 ReplicaSet ReplicaSet的名字为 [DEPLOYMENT-NAME]-[RANDOM-STRING] 随机字符串使用pod-template-hash作为随机数种子&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl scale&lt;/strong&gt; deployment type –replicas=4 使用 kubectl scale 命令扩展副本，然后是部署类型、名称和所需的实例数 通过设置实例数来增加/减少pod数量&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;span class="lnt"&gt;44&#10;&lt;/span&gt;&lt;span class="lnt"&gt;45&#10;&lt;/span&gt;&lt;span class="lnt"&gt;46&#10;&lt;/span&gt;&lt;span class="lnt"&gt;47&#10;&lt;/span&gt;&lt;span class="lnt"&gt;48&#10;&lt;/span&gt;&lt;span class="lnt"&gt;49&#10;&lt;/span&gt;&lt;span class="lnt"&gt;50&#10;&lt;/span&gt;&lt;span class="lnt"&gt;51&#10;&lt;/span&gt;&lt;span class="lnt"&gt;52&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get deployments&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY UP-TO-DATE AVAILABLE AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp 1/1 &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; 24s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get rs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME DESIRED CURRENT READY AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579 &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; 110s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl scale deployments/kubernetes-bootcamp --replicas&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deployment.apps/kubernetes-bootcamp scaled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl scale deployments/kubernetes-bootcamp --replicas&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deployment.apps/kubernetes-bootcamp scaled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get deployments&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY UP-TO-DATE AVAILABLE AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp 4/4 &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; 10m&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get pods -o wide&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-bfp5g 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 89s 172.18.0.9 minikube &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-c7h8c 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 89s 172.18.0.7 minikube &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-dmksw 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 89s 172.18.0.8 minikube &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-v5zx5 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 10m 172.18.0.3 minikube &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl describe deployments/kubernetes-bootcamp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name: kubernetes-bootcamp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Namespace: default&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CreationTimestamp: Sun, &lt;span class="m"&gt;26&lt;/span&gt; Feb &lt;span class="m"&gt;2023&lt;/span&gt; 12:00:22 +0000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Labels: &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubernetes-bootcamp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Annotations: deployment.kubernetes.io/revision: &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Selector: &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubernetes-bootcamp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Replicas: &lt;span class="m"&gt;4&lt;/span&gt; desired &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; updated &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; total &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; available &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; unavailable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StrategyType: RollingUpdate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MinReadySeconds: &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RollingUpdateStrategy: 25% max unavailable, 25% max surge&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pod Template:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Labels: &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubernetes-bootcamp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Containers:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; kubernetes-bootcamp:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Image: gcr.io/google-samples/kubernetes-bootcamp:v1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port: 8080/TCP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Host Port: 0/TCP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Mounts: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Volumes: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Conditions:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type Status Reason&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ---- ------ ------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Progressing True NewReplicaSetAvailable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Available True MinimumReplicasAvailable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OldReplicaSets: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NewReplicaSet: kubernetes-bootcamp-fb5c67579 &lt;span class="o"&gt;(&lt;/span&gt;4/4 replicas created&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Events:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type Reason Age From Message&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ---- ------ ---- ---- -------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Normal ScalingReplicaSet 10m deployment-controller Scaled up replica &lt;span class="nb"&gt;set&lt;/span&gt; kubernetes-bootcamp-fb5c67579 to &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Normal ScalingReplicaSet 101s deployment-controller Scaled up replica &lt;span class="nb"&gt;set&lt;/span&gt; kubernetes-bootcamp-fb5c67579 to &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="执行滚动更新"&gt;执行滚动更新&#10;&lt;/h3&gt;&lt;p&gt;用户希望应用程序始终可用，而开发人员则需要每天多次部署它们的新版本。在 Kubernetes 中，这些是通过滚动更新（Rolling Updates）完成的。 &lt;strong&gt;滚动更新&lt;/strong&gt; 允许通过使用新的实例逐步更新 Pod 实例，零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度。在 Kubernetes 中，更新是经过版本控制的，任何 Deployment 更新都可以恢复到以前的（稳定）版本。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://kepulsary.github.io/2023/02/26/k8s-basics/module-06-rolling-updates.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;滚动更新允许以下操作：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;将应用程序从一个环境提升到另一个环境（通过容器镜像更新）&lt;/li&gt;&#10;&lt;li&gt;回滚到以前的版本&lt;/li&gt;&#10;&lt;li&gt;持续集成和持续交付应用程序，无需停机&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl get&lt;/strong&gt; deployments - 获取deployment&lt;/li&gt;&#10;&lt;li&gt;kubectl get pods - 获取pods&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kubectl set image&lt;/strong&gt; deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2 设置deployments/kubernetes-bootcamp的镜像 —&amp;gt; 更新镜像 会自己升级&lt;/li&gt;&#10;&lt;li&gt;kubectl describe pods - 查看应用的版本&lt;/li&gt;&#10;&lt;li&gt;kubectl rollout status deployments/kubernetes-bootcamp - 还可以通过运行 rollout status 命令来确认更新&lt;/li&gt;&#10;&lt;li&gt;kubectl rollout undo deployments/kubernetes-bootcamp - 要将部署回滚到上一个工作版本，请使用 rollout undo 命令：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get deployments&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY UP-TO-DATE AVAILABLE AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp 4/4 &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; 36s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get pods&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY STATUS RESTARTS AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-8k8n2 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 26s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-8mpqr 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 26s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-fw2wj 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 26s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-hnk24 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 26s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl &lt;span class="nb"&gt;set&lt;/span&gt; image deployments/kubernetes-bootcamp kubernetes-bootcamp&lt;span class="o"&gt;=&lt;/span&gt;jocatalin/kubernetes-bootcamp:v2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deployment.apps/kubernetes-bootcamp image updated&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get pods&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY STATUS RESTARTS AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-7d44784b7c-9pb8f 0/1 ContainerCreating &lt;span class="m"&gt;0&lt;/span&gt; 1s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-7d44784b7c-fgxlb 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 4s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-7d44784b7c-lfskb 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 4s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-7d44784b7c-v95wl 0/1 ContainerCreating &lt;span class="m"&gt;0&lt;/span&gt; 1s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-8k8n2 1/1 Terminating &lt;span class="m"&gt;0&lt;/span&gt; 42s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-8mpqr 1/1 Terminating &lt;span class="m"&gt;0&lt;/span&gt; 42s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-fw2wj 1/1 Terminating &lt;span class="m"&gt;0&lt;/span&gt; 42s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-bootcamp-fb5c67579-hnk24 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 42s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="k8s配置"&gt;k8s配置&#10;&lt;/h2&gt;&lt;p&gt;在 Kubernetes 中，为 docker 容器设置环境变量有几种不同的方式，比如： Dockerfile、kubernetes.yml、Kubernetes ConfigMaps、和 Kubernetes Secrets。&lt;/p&gt;&#10;</description></item></channel></rss>