编程导航K8s话题讨论

K8s

4 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡
综合
交流
文章
问答

今天准备复盘和学习的 一、自建搭一套K8S集群有哪些步骤? 二、master节点有哪些组件需要安装的(master节点有哪些组件)? 三、K8S集群master节点的组件是通过哪些方式运行起来的? 四、当投票能力不足时master节点的组件是通过哪些方式运行起来的? 五、什么是静态Pod? 六、deployment的常用参数有哪些? 七、deployment配置参数中requests和limits是控制什么的? 八、deployment配置参数中requests调大调小会影响什么? 九、k8s 中deployment在滚动更新时客户端会出现502或504等的网关错误,这个可能什么造成的,如何避免? 十、k8s中services有哪几种类型 十一、在K8S主机节点上请求一个Pod是正常的,但是通过service请求是异常的,检查发现Pod关联service是正常的,如何排查该问题。 十二、K8S中在Pod里探测存活探针是正常的,但Pod一直在重启,如何排查该问题? 十三、K8S的探针命令是由什么发起的? 十四、你们公司K8S使用的存储有哪些,如何挂载? 十五、K8S监控用的什么组件? 十六、在K8S中手动部署的prometheus如何自动发现Pod的端点(endpoints)? 十七、在K8S中operator部署的prometheus是哪个组件来实现自动发现? 十八、K8S的监控指标有哪些? 十九、prometheus的采集器有哪些?分别能采集哪些信息? 二十、prometheus中黑盒测试是如何监控的? 二十一、prometheus哪个采集器负责采集K8S资源的副本数、重启等指标的? 二十二、prometheus如何实现自定义监控? 二十三、请简述ELK的日志采集流程? 二十四、filebeat是如何实现从行首开始采集或从行末开始采集? 二十五、请简述CI/CD的流程 二十六、用Python写过什么东西? 二十七、请简述Nginx核心配置参数及优化建议 二十八、请简述Linux主机负载告警排查思路 二十九、如何根据CPU不同的核心数来监控Linux的负载 三十、请简述MHA的切换逻辑 三十一、MHA的监控指标有哪些? 三十二、MySQL数据库的CPU利用率很高会是由哪些原因引起的?

基于腾讯云轻量云服务器搭建k8s集群

## 前言 Kubernetes,也被称为K8s,是一个开源平台,用于自动化容器的部署、扩展和管理。它源于Google,现被各类中大厂与云平台广泛使用。 后续所有项目的分享与改造均部署在Kubernetes集群上,故现在提供简单的部署教程,方便大家实践学习与交流。 ## 服务器配置 1. 腾讯云轻量云服务器 2. 操作系统:Ubuntu Server 24.04 LTS 64bit 3. 规格:2c 2G 4. 数量:3(像平时做简单项目练习,1个也足够了) 5. 位置:香港(推荐,如果是大陆的服务器可能会造成镜像拉不下来,被墙) ## 开启root登录 腾讯轻量服务器安装ubuntu后,系统的默认用户名是 ubuntu,并在安装过程中默认不设置 root 帐户和密码。 想要设置中开启允许 root 用户登录。具体操作步骤如下: 1. 使用 ubuntu 帐户登录。 2. 执行以下命令,设置 root 密码 ```js sudo passwd root ``` 3. 执行以下命令,打开 sshd_config 配置文件 ``` sudo vi /etc/ssh/sshd_config ``` 4. 找到#Authentication, 将 PermitRootLogin 参数修改为 yes,如果 PermitRootLogin 参数被注释,请去掉首行的注释符号(#) 5. 依旧在 #Authentication, 将 PasswordAuthentication 参数修改为 yes,若 sshd_config 配置文件中无此配置项,则添加 PasswordAuthentication yes 项即可 6. 保存/etc/ssh/sshd_config退出后,执行以下命令,重启 ssh 服务 ```js sudo service ssh restart ``` <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/BIIqHaFr34XXfW52.webp" alt="undefined" width="657" /> ## 安装 ### 设置 Host Name 更新 hosts 文件 登录到各个主机,并使用 hostnamectl 命令设置它们各自的主机名。 ```js sudo hostnamectl set-hostname "k8s-master-noble" // Master Node sudo hostnamectl set-hostname "k8s-worker01-noble" // Worker Node 1 sudo hostnamectl set-hostname "k8s-worker02-noble" // Worker Node 2 ``` ### 禁用 swap,加载内核模块 在每个实例上运行以下命令来禁用交换空间,这样 Kubernetes 集群才能顺利工作。 ```js sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab ``` 使用 modprobe 命令加载以下内核模块。 ```js sudo modprobe overlay sudo modprobe br_netfilter ``` 要永久加载这些模块,请创建包含以下内容的文件。 ```js sudo tee /etc/modules-load.d/k8s.conf <<EOF overlay br_netfilter EOF ``` 添加像 IP 转发这样的内核参数。创建一个文件,并使用 sysctl 命令加载参数。 ```js sudo tee /etc/sysctl.d/kubernetes.conf <<EOT net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOT ``` 运行以下命令,加载上述内核参数。 ```js sudo sysctl --system ``` ### 安装配置 Containerd Containerd 为 Kubernetes 提供了容器运行时,在所有三个实例上安装 containerd 首先,安装容器依赖项 ```js sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates ``` 接下来,使用以下命令添加 containerd 存储库。 ```js sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" ``` 现在,使用以下 apt 命令安装 containerd ```js sudo apt update && sudo apt install containerd.io -y ``` 接下来,配置 containerd,使其开始使用 SystemdCgroup 运行下面的命令。 ```js containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1 sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml ``` 配置 containerd 使用正确的 pause 镜像 ```js sudo sed -i 's|registry.k8s.io/pause:3.8|registry.aliyuncs.com/google_containers/pause:3.9|g' /etc/containerd/config.toml ``` 重新启动 containerd 服务,使上述更改生效。 ```js sudo systemctl restart containerd ``` ### 添加 Kubernetes Package Repository Kubernetes 软件包在 Ubuntu 24.04 的默认包存储库中不可用,所以要先添加它的存储库。在每个实例上运行这些步骤。 使用 curl 命令下载 Kubernetes 包存储库的公共签名密钥。 ```js curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/k8s.gpg ``` 接下来,通过运行以下命令添加 Kubernetes 存储库。 ```js echo 'deb [signed-by=/etc/apt/keyrings/k8s.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/k8s.list ``` ### 安装 Kubernetes 部件 (Kubeadm, kubelet & kubectl) ```js sudo apt update sudo apt install kubelet kubeadm kubectl -y ``` ### 安装 Kubernetes 所有的先决条件都满足了,我们可以开始安装 Kubernetes 了。 在 master 节点上执行 Kubeadm 命令,仅用于初始化 Kubernetes 集群。 ```js sudo kubeadm init --pod-network-cidr=192.168.0.0/16 ``` 该命令将为 Kubernetes 集群拉取所需的镜像。成功执行此命令后,我们将得到如下所示的输出。 <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/VRzIU3YbvOhqI1ld.webp" alt="image.png" width="100%" /> 在上面的输出中,我们将获得一系列命令。例如:如何与 kubernetes 群集互动,如何添加 worker 节点到此群集。 在 master 节点上运行以下命令。 ```js mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 接下来,从输出中复制命令以连接 woker 节点,在两个 woker 节点上运行它(当然如果你是单节点,那就没必要了)。 ```js kubeadm join k8s-master-noble:6443 --token qim97y.l0elbuslud7v4yex \ --discovery-token-ca-cert-hash sha256:b3142f33f7cda9a25cfba0c1ab630e2dfbe724887160493edb6d40df014f94df \ --control-plane ``` 运行 kubectl get nodes 命令来验证 worker 节点的状态。 ```js root@k8s-master-noble:~# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master-noble NotReady control-plane 3m27s v1.30.9 ``` 输出确认 worker 节点已加入集群,但状态为 NotReady。我们需要在这个集群上安装 Network Add-on Plugin,例如:calico。 ### 安装 Calico Network Add-on Plugin 安装 Tigera Calico 操作员和自定义资源定义。 ```js kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml ``` 通过创建必要的自定义资源来安装 Calico ```js kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/custom-resources.yaml ``` 使用以下命令确认所有 pod 都在运行。 ```js kubectl get pods -n calico-system k8s-master-noble: Sun Feb 9 18:17:15 2025 NAME READY STATUS RESTARTS AGE calico-kube-controllers-7bcb4d87c9-2mb2s 1/1 Running 0 11m calico-node-7wc66 1/1 Running 0 11m calico-typha-7bfcc9fcc6-t92tw 1/1 Running 0 11m csi-node-driver-rrwlj 2/2 Running 0 11m ``` 删除控制平面上的污点,以便您可以在其上调度 pod ```js kubectl taint nodes --all node-role.kubernetes.io/control-plane- ``` 运行 kubectl get nodes 命令来验证 worker 节点的状态 ```js root@VM-4-7-ubuntu:~# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master-noble Ready control-plane 3m48s v1.30.9 ``` ready,表面集群已经拉起 ## 测试 Kubernetes Installation 为了测试 Kubernetes 安装,我们将创建基于 nginx 的部署,副本计数为 1在 master 节点上执行下面的kubectl 命令。 ```js kubectl create ns demo-app kubectl create deployment nginx-app --image nginx --replicas 1--namespace demo-app kubectl get deployment -n demo-app kubectl get pods -n demo-app root@VM-4-7-ubuntu:~# kubectl get pods -n demo-app NAME READY STATUS RESTARTS AGE nginx-app-69999bf9b8-txj9h 1/1 Running 0 14s ``` 接下来,使用 NodePort 类型公开此部署,运行如下命令 ```js kubectl expose deployment nginx-app -n demo-app --type NodePort --port 80 kubectl get svc -n demo-app NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-app NodePort 10.104.112.105 <none> 80:32556/TCP 0s ``` 在控制台开放端口 <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/mfS84xvEiFyYxaKk.png" alt="image.png" width="100%" /> 然后在浏览器:ip:port验证,至此,集群部署结束~ <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/PIBow5QvGg5wVxV9.webp" alt="image.png" width="100%" />

K8S中查看某个服务的日志-PJK

<html> <head></head> <body> <div class="content ql-editor"> <p>今天有一个服务出问题了</p> <p>想去服务器上查看日志</p> <p>之前没怎么用过k8s</p> <p>所以出现了一些小插曲</p> <p>现在把具体的过程记录一下 做自己的记录</p> <p>kubectl get pods -n 命名空间名字;</p> <p>得到的是当前命名空间下所有的pod</p> <p>但是pod并不是你得服务 pod是容器组 对应得是一个或多个容器</p> <p>你想要查看这个容器组里得某个服务得日志应该用下面得命令</p> <p>kubectl logs -f --tail 500 容器组名 -c 容器名 -n 命名空间名;</p> <p>举例:kubectl logs -f --tail 500 podName -c container -n namespqce;</p> <p>这里的-c 表示指定容器 c是 container容器 的缩写</p> <p>这里得-f f表示持续输出 是follow 跟随得缩写 表示跟随日志 一直监听输出</p> <p>--tail 500 表示 输出日志得最后500行 tail是尾的意思</p> </div> </body> </html>

k8s 笔记

<html> <head></head> <body> <div class="content ql-editor"> <p><a href="https://www.yuque.com/attachments/yuque/0/2022/xmind/21572765/1670574392633-5bf5eb76-9056-459f-a0cf-44e9f24796fe.xmind" target="_blank">k8s.xmind</a></p> <p><br></p> <p><a href="https://www.yuque.com/attachments/yuque/0/2022/pdf/21572765/1670574485119-a734280f-4493-4282-bcd5-b5d0debdf169.pdf" target="_blank">k8s笔记.pdf</a></p> <p><br></p> <h2>k3s 集群</h2> <p><br></p> <p><br></p> <p><a href="https://blog.csdn.net/huiqiwei321/article/details/118155681" target="_blank">k3s停止命令_唐僧爱程序的博客-CSDN博客_停止k3s</a></p> <p><br></p> <p><a href="https://blog.csdn.net/sinat_28371057/article/details/109895159" target="_blank">问题“The connection to the server....:6443 was refused - did you specify the right host or port?”的处理!</a></p> <p><br></p> <p><br></p> <h2><span style="color: rgb(51, 51, 51);">k8s 解决的问题</span></h2> <h3><span style="color: rgb(51, 51, 51);">Borg 解决的问题</span></h3> <p><br></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">谷歌在线和离线任务的混布(non-prod 、 prod),提高物理资源利用率 ==&gt; 降本提效</span></p> <p><span style="color: rgb(51, 51, 51);">解决的问题:计算中心集群管理——作业调度、应用隔离、故障转移……</span></p> <p><br></p> <p><br></p> <h3><span style="color: rgb(51, 51, 51);">k8s 解决的问题</span></h3> <p><br></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">开源的</span><strong style="color: rgb(51, 51, 51);">容器编排</strong><span style="color: rgb(51, 51, 51);">引擎和</span><strong style="color: rgb(51, 51, 51);">容器集群管理工具</strong><span style="color: rgb(51, 51, 51);">,用来对容器化应用进行自动化部署、 扩缩和管理。</span></p> <p><span style="color: rgb(51, 51, 51);">容器编排:容器间的协作</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(51, 51, 51);">自我修复</strong></li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(51, 51, 51);">自动部署和回滚</strong></li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(51, 51, 51);">滚动更新</strong></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">自动扩缩容</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">打通 CI/CD 工具链</span></li> </ol> <p><br></p> <p><br></p> <h2><span style="color: rgb(51, 51, 51);">K8s 的架构</span></h2> <p><br></p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/05effcpr.jpeg"></p> <p><br></p> <h3><span style="color: rgb(51, 51, 51);">控制平面:</span></h3> <h4><span style="color: rgb(51, 51, 51);">etcd : 配置中心</span></h4> <p><br></p> <p><span style="color: rgb(51, 51, 51);">分布式数据库,k-v,服务发现、共享配置以及一致性保障</span></p> <p><br></p> <h4><span style="color: rgb(51, 51, 51);">controller-manager : 控制器管理工具</span></h4> <p><br></p> <p><span style="color: rgb(51, 51, 51);">Controller Manager 是集群的大脑,是确保整个集群动起来的关键;</span></p> <p><span style="color: rgb(51, 51, 51);">其作用是确保 Kubernetes 遵循声明式系统规范,确保系统的真实状态(Actual State)与用户定义的期望状态(Desired State 一致);</span></p> <p><span style="color: rgb(51, 51, 51);">Controller Manager 是多个控制器的组合,每个 Controller 事实上都是一个 control loop,负责侦听其管控的对象,当对象发生变更时完成配置;</span></p> <p><span style="color: rgb(51, 51, 51);">Controller 配置失败通常会触发自动重试,整个集群会在控制器不断重试的机制下确保最终一致性( Eventual Consistency)。</span></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(51, 51, 51);">scheduer : pod 调度器</span></h4> <p><br></p> <p><span style="color: rgb(51, 51, 51);">特殊的 Controller,工作原理与其他控制器无差别;Scheduler 的特殊职责在于监控当前集群所有未调度的Pod,并且获取当前集群所有节点的健康状况和资源使用情况,为待调度 Pod 选择最佳计算节点,完成调度。</span></p> <p><span style="color: rgb(51, 51, 51);">调度阶段分为:</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">Predict:过滤不能满足业务需求的节点,如资源不足,端口冲突等。</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">Priority:按既定要素将满足调度需求的节点评分,选择最佳节点。</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">Bind:将计算节点与 Pod 绑定,完成调度。</span></li> </ol> <p><br></p> <p><br></p> <h4><span style="color: rgb(51, 51, 51);">api-service : 服务网关</span></h4> <p><br></p> <p><span style="color: rgb(51, 51, 51);">提供集群管理的 REST API 接口,包括:</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">认证 Authentication;</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">授权 Authorization;</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">准入 Admission(Mutating &amp; Valiating)。</span></li> </ol> <p><span style="color: rgb(51, 51, 51);">提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd)。</span></p> <p><span style="color: rgb(51, 51, 51);">APIServer 提供 etcd 数据缓存以减少集群对 etcd 的访问。</span></p> <p><br></p> <p><br></p> <h3><span style="color: rgb(51, 51, 51);">工作平面:</span></h3> <h4><span style="color: rgb(51, 51, 51);">proxy-service:负载均衡器</span></h4> <p><br></p> <p><span style="color: rgb(51, 51, 51);">它是一个分布式代理服务器,实现 service 的基础</span></p> <p><br></p> <h4><span style="color: rgb(51, 51, 51);">kubelet:</span></h4> <p><br></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">Kubernetes 的初始化系统(init system)</span></p> <p><span style="color: inherit;">kubelet</span><span style="color: rgb(34, 34, 34);"> 会在集群中每个</span><a href="https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/" target="_blank">节点(node)</a><span style="color: rgb(34, 34, 34);">上运行。 它保证</span><a href="https://kubernetes.io/zh-cn/docs/concepts/overview/what-is-kubernetes/#why-containers" target="_blank">容器(containers)</a><span style="color: rgb(34, 34, 34);">都运行在 </span><a href="https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/" target="_blank">Pod</a><span style="color: rgb(34, 34, 34);"> 中。</span></p> <p><span style="color: rgb(21, 21, 21);">当控制平面需要在节点中执行某个操作时,kubelet 就会执行该操作。</span></p> <p><span style="color: rgb(51, 51, 51);">负责汇报当前节点的资源信息和健康状态;</span></p> <p><span style="color: rgb(51, 51, 51);">负责 Pod 的健康检查和状态汇报</span></p> <p><br></p> <p><br></p> <h2><span style="color: rgb(51, 51, 51);">资源对象</span></h2> <p><br></p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/396nk5jq.jpeg"></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(51, 51, 51);">核心资源对象</span></h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">pod :</span></li> </ol> <p><span style="color: rgb(51, 51, 51);">容器集合,共享除 PID 、文件之外的进程资源;对计算任务应用的描述;</span></p> <p><span style="color: rgb(51, 51, 51);">k8s pod = borg non prod + prod;Kubernetes 中最核心的对象,也是打通应用和基础架构的秘密武器;</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">node:</span></li> </ol> <p><span style="color: rgb(51, 51, 51);">节点,对应物理机器/虚拟机,对计算资源的抽象</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">replicaSet:</span></li> </ol> <p><span style="color: rgb(51, 51, 51);">副本集,管理 pod,保证应用的高可用,生命期望</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">deployment:</span></li> </ol> <p><span style="color: rgb(51, 51, 51);">部署文件,对 应用部署/pod 的描述文件,表示用户对 Kubernetes 集群的一次</span><strong style="color: rgb(51, 51, 51);">更新操作</strong></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">service:</span></li> </ol> <p><strong style="color: rgb(51, 51, 51);">服务发布</strong><span style="color: rgb(51, 51, 51);">,负载均衡,pod 地址是易变的,service会对应一个集群内部有效的虚拟 IP,集群内部通过虚拟 IP 访问一个服务。在 Kubernetes 集群中微服务的负载均衡是由 Kube-proxy 实现的。</span></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(51, 51, 51);">对象的通用设计</span></h4> <p><br></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">Deployment 示例:</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> annotations: </div> <div class="ql-code-block"> &nbsp; deployment.kubernetes.io/revision: "2" </div> <div class="ql-code-block"> creationTimestamp: "2022-12-06T06:17:17Z" </div> <div class="ql-code-block"> generation: 2 </div> <div class="ql-code-block"> labels: # 搭配选择器 </div> <div class="ql-code-block"> &nbsp; app: xxx </div> <div class="ql-code-block"> annotation: # 自定义配置 </div> <div class="ql-code-block"> a: b </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> ... </div> <div class="ql-code-block"> status: </div> <div class="ql-code-block"> ... </div> </div> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">TypeMeta </span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">G(roup)</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">K(ind)</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">V(ersion)</span></li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> </div> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">Metadata</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">Namespace</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">Name</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">Labels &amp; Annotation</span></li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> annotations: </div> <div class="ql-code-block"> &nbsp; deployment.kubernetes.io/revision: "2" </div> <div class="ql-code-block"> creationTimestamp: "2022-12-06T06:17:17Z" </div> <div class="ql-code-block"> generation: 2 </div> <div class="ql-code-block"> labels: # 搭配选择器 </div> <div class="ql-code-block"> &nbsp; app: xxx </div> <div class="ql-code-block"> annotation: # 自定义配置 </div> <div class="ql-code-block"> a: b </div> </div> <p><br></p> <p><br></p> <h2><span style="color: rgb(51, 51, 51);">设计思想</span></h2> <h3><span style="color: rgb(51, 51, 51);">面向资源</span></h3> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">k8s 把分布式集群中的一切都看做资源;</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">工作荷载资源 pod 、deployment</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">存储资源 volume、</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">身份资源 limitRange</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">策略资源 role</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">声明式 API</span></li> <li data-list="bullet" class="ql-indent-1"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">最终一致性</span></li> </ol> <p><br></p> <p><br></p> <h3><span style="color: rgb(51, 51, 51);">控制器模式</span></h3> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">各种 controller</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">watch 机制</span></li> </ol> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/y15e95up.jpeg"></p> <p><br></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">自动恢复:</span></p> <p><span style="color: rgb(51, 51, 51);">Deployment -&gt; ReplicaSet -&gt; pod</span></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">滚动更新:</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> strategy: </div> <div class="ql-code-block"> &nbsp; rollingUpdate: </div> <div class="ql-code-block"> &nbsp; &nbsp; maxSurge: 25% </div> <div class="ql-code-block"> &nbsp; &nbsp; maxUnavailable: 25% </div> <div class="ql-code-block"> &nbsp; type: RollingUpdate </div> </div> <p><br></p> <p><span style="color: rgb(51, 51, 51);">自动扩缩容:</span></p> <p><span style="color: rgb(51, 51, 51);">Autoscaling -&gt; Deployment -&gt; ReplicaSet -&gt; Pod</span></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">kubectl scale deploy nginx --replicas=5</span></p> <p><br></p> <p><br></p> <p><br></p> <h2><span style="color: rgb(51, 51, 51);">容器技术底层技术</span></h2> <p><br></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">基于 linux 内核:</span></p> <p><span style="color: rgb(51, 51, 51);">namespace :进程命名空间隔离</span></p> <p><span style="color: rgb(51, 51, 51);">cgroups :资源限额</span></p> <p><span style="color: rgb(51, 51, 51);">Union FS : 文件系统</span></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <h2><span style="color: rgb(51, 51, 51);">指令笔记:</span></h2> <p><br></p> <p><br></p> <p><span style="color: rgb(51, 51, 51);">autoscaling:自动扩缩容</span></p> <p><a href="https://www.cnblogs.com/caonw/p/13273512.html" target="_blank">https://www.cnblogs.com/caonw/p/13273512.html</a></p> <p><span style="color: rgb(51, 51, 51);">Namespace:资源隔离的基本单位,可以简单理解为文件系统中的目录结构;</span></p> <p><span style="color: rgb(51, 51, 51);">kubectl create -f </span><a href="http://nginx.yaml" target="_blank" style="color: rgb(51, 51, 51);">nginx.yaml</a></p> <p><span style="color: rgb(51, 51, 51);">kubectl scale deploy nginx --replicas=5</span></p> <p><span style="color: rgb(51, 51, 51);">kubectl apply -f </span><a href="http://nginx.yaml" target="_blank" style="color: rgb(51, 51, 51);">nginx.yaml</a></p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 3 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> &nbsp; matchLabels: </div> <div class="ql-code-block"> &nbsp; &nbsp; app: nginx </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> &nbsp; metadata: </div> <div class="ql-code-block"> &nbsp; &nbsp; labels: </div> <div class="ql-code-block"> &nbsp; &nbsp; &nbsp; app: nginx </div> <div class="ql-code-block"> &nbsp; spec: </div> <div class="ql-code-block"> &nbsp; &nbsp; containers: </div> <div class="ql-code-block"> &nbsp; &nbsp; - name: nginx </div> <div class="ql-code-block"> &nbsp; &nbsp; &nbsp; image: nginx:latest </div> <div class="ql-code-block"> &nbsp; &nbsp; &nbsp; ports: </div> <div class="ql-code-block"> &nbsp; &nbsp; &nbsp; - containerPort: 80 </div> <div class="ql-code-block"> --- </div> <div class="ql-code-block"> apiVersion: v1 </div> <div class="ql-code-block"> kind: Service </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx-service </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> &nbsp; app: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> type: NodePort </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> &nbsp; app: nginx </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - port: 80 </div> <div class="ql-code-block"> &nbsp; targetPort: 80 </div> <div class="ql-code-block"> &nbsp; nodePort: 32500 </div> </div> <p><a href="https://juejin.cn/post/7056003117221380104" target="_blank">https://juejin.cn/post/7056003117221380104</a></p> <p><span style="color: rgb(51, 51, 51);">kubectl get po nginx-cd55c47f5-swm8q -oyaml</span></p> <p><span style="color: rgb(51, 51, 51);">kubectl get svc nginx-service -oyaml</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51);">输出某个pods为yaml文件</span></li> </ol> <p><span style="color: rgb(51, 51, 51);">// 查看 pod 及其标签</span></p> <p><span style="color: rgb(51, 51, 51);">kubectl get pod --show-labels</span></p> <p><span style="color: rgb(51, 51, 51);">// 过滤名称为 mynginx 的 pod(过滤)</span></p> <p><span style="color: rgb(51, 51, 51);">[root@VM-16-13-centos mine]# kubectl get pod -l run=mynginxNAME READY STATUS RESTARTS AGEmynginx 1/1 Running 0 2d1h</span></p> <p><span style="color: rgb(51, 51, 51);">// 添加注解(扩展)</span></p> <p><span style="color: rgb(51, 51, 51);">kubectl annotate po nginx-cd55c47f5-swm8q a=b</span></p> <p><span style="color: rgb(51, 51, 51);">// -v 9 打印日志(实际是一个 REST 调用)</span></p> <p><span style="color: rgb(51, 51, 51);">kubectl create -f </span><a href="http://nginx.yaml" target="_blank" style="color: rgb(51, 51, 51);">nginx.yaml</a><span style="color: rgb(51, 51, 51);"> -v 9</span></p> <p><br></p> <p><br></p> <p><br></p> <h2><span style="color: rgb(51, 51, 51);">部署无状态服务</span></h2> <p><br></p> <p><br></p> <p>重点:</p> <ol> <li data-list="bullet"><span class="ql-ui"></span>部署有状态服务的核心对象:pod、rs、deploy、service、namesapce</li> <li data-list="bullet"><span class="ql-ui"></span>配置文件和命令</li> <li data-list="bullet"><span class="ql-ui"></span>对象的正确使用方法 / 最佳实践</li> </ol> <p><br></p> <p><br></p> <h3>无状态服务</h3> <h4>无状态服务</h4> <p><br></p> <p><br></p> <p>没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息);</p> <p><br></p> <p><br></p> <h4>有状态服务</h4> <p><br></p> <p><br></p> <p>与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等。</p> <p>k8s 更推荐将应用设计为无状态服务,无状态服务可以调度到任意节点,更方便和灵活。</p> <p><br></p> <p><br></p> <p><br></p> <h3>声明式 vs 命令式</h3> <h4>声明式系统</h4> <p><br></p> <p><br></p> <p>在软件工程领域,声明式系统指程序代码<strong>描述系统应该做什么</strong>而不是怎么做。仅限于描述要达到什么目的,如何达到目的交给系统。</p> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/u67d8961.jpeg"></p> <p><br></p> <h4>命令式系统</h4> <p><br></p> <p><br></p> <p>命令式系统在软件工程领域,命令式系统是写出解决某个问题,完成某个任务,或者达到某个目标的的<strong>明确步骤</strong>。此方法明确写出系统应该执行某指令,并且期待系统返回期望结果。</p> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/ytdsusqv.jpeg"></p> <p><br></p> <p>Kubernetes 将一切都看做是对象,一切皆对象的设计思想为 k8s 实现声明式配置系统提供支撑。k8s 的所有管理能力构建在对象抽象的基础上。</p> <p><br></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(34, 34, 34);">对比</span></h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(34, 34, 34);">命令行指令</strong></li> </ol> <p><span style="color: rgb(34, 34, 34);">例如,使用kubectl命令来创建和管理 Kubernetes 对象。</span></p> <p><span style="color: rgb(34, 34, 34);">命令行就好比口头传达,简单、快速、高效。</span></p> <p><span style="color: rgb(34, 34, 34);">但它功能有限,不适合复杂场景,操作不容易追溯,多用于开发和调试。</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(34, 34, 34);">声明式配置</strong></li> </ol> <p><span style="color: rgb(34, 34, 34);">kubernetes使用yaml文件来描述 Kubernetes 对象。</span></p> <p><span style="color: rgb(34, 34, 34);">声明式配置就好比申请表,学习难度大且配置麻烦。</span></p> <p><span style="color: rgb(34, 34, 34);">好处是操作留痕,适合操作复杂的对象,多用于生产。</span></p> <p><br></p> <p><br></p> <p><br></p> <h4>配置对象</h4> <p><br></p> <p><br></p> <p>k8s 配置对象支持 yaml 格式:</p> <p><span style="color: rgb(34, 34, 34);">在创建的 Kubernetes 对象所对应的 </span><span style="color: inherit; font-size: 14px;">yaml</span><span style="color: rgb(34, 34, 34);">文件中,需要配置的字段如下:</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: inherit;">apiVersion</strong><span style="color: rgb(34, 34, 34);"> - Kubernetes API 的版本</span></li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: inherit;">kind</strong><span style="color: rgb(34, 34, 34);"> - 对象类别,例如</span>Pod、Deployment、Service、ReplicaSet等</li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: inherit;">metadata</strong><span style="color: rgb(34, 34, 34);"> - 描述对象的元数据,包括一个 </span><span style="color: inherit; font-size: 14px;">name</span><span style="color: rgb(34, 34, 34);"> 字符串、</span><span style="color: inherit; font-size: 14px;">UID</span><span style="color: rgb(34, 34, 34);"> 和可选的 </span><span style="color: inherit; font-size: 14px;">namespace</span></li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: inherit;">spec</strong><span style="color: rgb(34, 34, 34);"> - 对象的配置</span></li> </ol> <p><br></p> <p><br></p> <h3>node</h3> <h4>说明:</h4> <p><br></p> <p><br></p> <p>计算节点的抽象,用来描述计算节点的资源抽象,健康状态等;</p> <p>对应在机器(物理机或虚拟机);</p> <p><br></p> <p><br></p> <p><br></p> <h4>常用指令:</h4> <p><br></p> <p><br></p> <p>查看 node 信息</p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl get node -owide </div> </div> <p><br></p> <p>查看 node 的声明配置文件:</p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl get node vm-16-13-centos -oyaml </div> </div> <p><br></p> <p><br></p> <p><br></p> <h3>pod</h3> <h4>说明</h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>表示工作负载的资源对象</li> <li data-list="bullet"><span class="ql-ui"></span>是一组容器的集合</li> <li data-list="bullet"><span class="ql-ui"></span>k8s 集群调度的最小单位</li> <li data-list="bullet"><span class="ql-ui"></span>pod 中<span style="color: rgb(34, 34, 34);">容器共享存储、网络和配置声明(如资源限制)。</span></li> </ol> <p><br></p> <p><br></p> <p><br></p> <h4>指令</h4> <p><br></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">直接创建 pod</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl run nginx-demo --image=nginx </div> </div> <p><span style="color: rgb(38, 38, 38);">删除 pod</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl delete pod nginx-demo --force </div> </div> <p><br></p> <p><br></p> <h4>配置文件</h4> <p><br></p> <p><br></p> <p>以 nginx 为例:</p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: v1 </div> <div class="ql-code-block"> kind: Pod </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - name: nginx </div> <div class="ql-code-block"> image: nginx:1.14.2 </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> </div> <p><br></p> <p><br></p> <p><br></p> <h4>pod 的正确使用</h4> <p><br></p> <p><br></p> <p><strong style="color: rgb(223, 42, 63);">对应微服务中的一个服务,在部署系统时,一般不会直接部署 pod ,而是通过编写 deployment 和 rs 控制 pod 的声明周期。直接创建的 pod 和直接在物理机上部署应用上没有任何优势。</strong></p> <p><strong style="color: rgb(223, 42, 63);">而通过 deployment 和 rs 可以很轻松的实现服务自愈,手动/自动扩缩容/滚动发布等在直接在物理机上部署很难实现的功能。</strong></p> <p><br></p> <p><br></p> <p><br></p> <h4>踩坑</h4> <p><br></p> <p><br></p> <p><span style="color: rgb(18, 18, 18);">CrashLoopBackOff :循环重启</span></p> <p><a href="https://zhuanlan.zhihu.com/p/558957039" target="_blank">https://zhuanlan.zhihu.com/p/558957039</a></p> <p><br></p> <p><br></p> <h5><br></h5> <h3>ReplaceSet(副本集)</h3> <h4>说明</h4> <p><br></p> <p><br></p> <p><strong style="color: rgb(34, 34, 34);">ReplicaSet</strong><span style="color: rgb(34, 34, 34);">(副本集)是一个Pod的集合。</span></p> <p><span style="color: rgb(34, 34, 34);">它可以设置运行Pod的数量,确保任何时间都有指定数量的 Pod 副本在运行。</span></p> <p><br></p> <p><br></p> <p><br></p> <h4>作用</h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>Pod 描述的是具体的应用实例,当 Pod 被删除后,就彻底消失了;<strong style="color: rgb(223, 42, 63);">为保证应用的高可用,引入副本集来确保应用的总副本数永远与期望一致;</strong></li> <li data-list="bullet"><span class="ql-ui"></span>若某个 Pod 隶属于某个副本集,若该 Pod 被删除,则 ReplicaSet Controller 会发现当前运行的副本数量与用户的期望不一致,则会创建新的 Pod。</li> </ol> <p><br></p> <p><br></p> <p><br></p> <h4>配置文件</h4> <p><br></p> <p><br></p> <p>以 nginx rs 为例:</p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: ReplicaSet </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> annotations: </div> <div class="ql-code-block"> deployment.kubernetes.io/desired-replicas: "3" </div> <div class="ql-code-block"> deployment.kubernetes.io/max-replicas: "4" </div> <div class="ql-code-block"> deployment.kubernetes.io/revision: "1" </div> <div class="ql-code-block"> creationTimestamp: "2022-12-29T11:14:29Z" </div> <div class="ql-code-block"> generation: 1 </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> pod-template-hash: 7fb96c846b </div> <div class="ql-code-block"> name: nginx-deployment-7fb96c846b </div> <div class="ql-code-block"> namespace: default </div> <div class="ql-code-block"> ownerReferences: </div> <div class="ql-code-block"> - apiVersion: apps/v1 </div> <div class="ql-code-block"> blockOwnerDeletion: true </div> <div class="ql-code-block"> controller: true </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> name: nginx-deployment </div> <div class="ql-code-block"> uid: d180afa3-7a3f-4248-ba49-316013f174ab </div> <div class="ql-code-block"> resourceVersion: "421409" </div> <div class="ql-code-block"> uid: 25289219-0713-41ad-8e46-ac8eb8a45c9a </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 3 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> matchLabels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> pod-template-hash: 7fb96c846b </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> creationTimestamp: null </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> pod-template-hash: 7fb96c846b </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - image: nginx:1.14.2 </div> <div class="ql-code-block"> imagePullPolicy: IfNotPresent </div> <div class="ql-code-block"> name: nginx </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> <div class="ql-code-block"> protocol: TCP </div> <div class="ql-code-block"> resources: {} </div> <div class="ql-code-block"> terminationMessagePath: /dev/termination-log </div> <div class="ql-code-block"> terminationMessagePolicy: File </div> <div class="ql-code-block"> dnsPolicy: ClusterFirst </div> <div class="ql-code-block"> restartPolicy: Always </div> <div class="ql-code-block"> schedulerName: default-scheduler </div> <div class="ql-code-block"> securityContext: {} </div> <div class="ql-code-block"> terminationGracePeriodSeconds: 30 </div> <div class="ql-code-block"> status: </div> <div class="ql-code-block"> availableReplicas: 3 </div> <div class="ql-code-block"> fullyLabeledReplicas: 3 </div> <div class="ql-code-block"> observedGeneration: 1 </div> <div class="ql-code-block"> readyReplicas: 3 </div> <div class="ql-code-block"> replicas: 3 </div> </div> <p><br></p> <p><br></p> <h4><span style="color: rgb(34, 34, 34);">使用</span></h4> <p><br></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">通常我们不直接使用ReplicaSet,而是在Deployment中声明。</span></p> <p><br></p> <p><br></p> <p><br></p> <h3>Deployment(部署)</h3> <p><br></p> <p><br></p> <p>参考官网地址: <a href="https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/" target="_blank">https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/</a></p> <p><br></p> <p><br></p> <h4>说明</h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(34, 34, 34);">Deployment</strong><span style="color: rgb(34, 34, 34);">是对ReplicaSet和Pod更高级的抽象。</span></li> <li data-list="bullet"><span class="ql-ui"></span>部署表示用户对 Kubernetes 集群的一次更新操作。</li> </ol> <p><br></p> <p><br></p> <p><br></p> <h4>作用</h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>部署是一个比 RS 应用模式更广的 API 对象,可以是<strong style="color: rgb(223, 42, 63);">创建一个新的应用</strong>,<strong style="color: rgb(223, 42, 63);">更新一个已存在的应用</strong>,也可以是<strong style="color: rgb(223, 42, 63);">滚动升级一个应用</strong>。</li> <li data-list="bullet"><span class="ql-ui"></span>滚动升级一个服务,实际是创建一个新的 RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧 RS 中的副本数减小到 0 的复合操作;这样一个复合操作用一个 RS 是不太好描述的,所以用一个更通用的Deployment 来描述。以 Kubernetes 的发展方向,未来对所有长期伺服型的的业务的管理,都会通过 Deployment 来管理。</li> </ol> <p><br></p> <p><br></p> <p><br></p> <h4>示例 yaml 文件</h4> <p><br></p> <p><br></p> <p><a href="http://nginx-deployment.yaml" target="_blank">nginx-deployment.yaml</a></p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx-deployment </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 3 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> matchLabels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - name: nginx </div> <div class="ql-code-block"> image: nginx:1.14.2 </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> </div> <p><br></p> <p><br></p> <p><br></p> <h5><span style="font-size: 15px;">k8s 镜像拉取策略: imagePullPolicy</span></h5> <p><br></p> <p><br></p> <p><a href="https://blog.csdn.net/lanwp5302/article/details/87348132" target="_blank">k8s-imagePullPolicy拉取策略_中国lanwp的博客-CSDN博客_imagepullpolicy</a></p> <p>Always :总是拉取 pull</p> <p>imagePullPolicy: Always</p> <p><br></p> <p>IfNotPresent :默认值,本地有则使用本地镜像,不拉取</p> <p>imagePullPolicy: IfNotPresent</p> <p><br></p> <p>Never :只使用本地镜像,从不拉取</p> <p>imagePullPolicy: Never</p> <p><br></p> <p><br></p> <p><br></p> <h4>使用方式</h4> <p><br></p> <p><br></p> <p>以上面的 <a href="http://nginx-deployment.yaml" target="_blank">nginx-deployment.yaml</a> 为例:</p> <ol> <li data-list="bullet"><span class="ql-ui"></span>创建新应用</li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl create -f nginx-deployment.yaml </div> </div> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>更新应用</li> </ol> <p>更新 yaml 文件并应用,应用指令:</p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl apply -f nginx-deployment.yaml </div> </div> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>滚动更新</li> </ol> <p>滚动更新配置:</p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> annotations: </div> <div class="ql-code-block"> deployment.kubernetes.io/revision: "1" </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> name: nginx-deployment </div> <div class="ql-code-block"> namespace: default </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 3 </div> <div class="ql-code-block"> revisionHistoryLimit: 10 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> matchLabels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> strategy: </div> <div class="ql-code-block"> # 滚动更新 </div> <div class="ql-code-block"> rollingUpdate: </div> <div class="ql-code-block"> maxSurge: 25% </div> <div class="ql-code-block"> maxUnavailable: 25% </div> <div class="ql-code-block"> type: RollingUpdate </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> creationTimestamp: null </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - image: nginx:1.14.2 </div> <div class="ql-code-block"> imagePullPolicy: IfNotPresent </div> <div class="ql-code-block"> name: nginx </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> <div class="ql-code-block"> protocol: TCP </div> <div class="ql-code-block"> resources: {} </div> <div class="ql-code-block"> terminationMessagePath: /dev/termination-log </div> <div class="ql-code-block"> terminationMessagePolicy: File </div> <div class="ql-code-block"> dnsPolicy: ClusterFirst </div> <div class="ql-code-block"> restartPolicy: Always </div> <div class="ql-code-block"> schedulerName: default-scheduler </div> <div class="ql-code-block"> terminationGracePeriodSeconds: 30 </div> </div> <p><br></p> <p>使用指令:</p> <div class="ql-code-block-container"> <div class="ql-code-block"> #查看版本和Pod </div> <div class="ql-code-block"> kubectl get deployment/nginx-deployment -owide </div> <div class="ql-code-block"> kubectl get pods </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> #更新容器镜像 </div> <div class="ql-code-block"> kubectl set image deployment/nginx-deployment nginx=nginx:1.23 </div> <div class="ql-code-block"> #滚动更新 </div> <div class="ql-code-block"> kubectl rollout status deployment/nginx-deployment </div> <div class="ql-code-block"> #查看过程 </div> <div class="ql-code-block"> kubectl get rs --watch </div> </div> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span>版本回滚</li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> #查看历史版本 </div> <div class="ql-code-block"> kubectl rollout history deployment/nginx-deployment </div> <div class="ql-code-block"> #查看指定版本的信息 </div> <div class="ql-code-block"> kubectl rollout history deployment/nginx-deployment --revision=2 </div> <div class="ql-code-block"> #回滚到历史版本 </div> <div class="ql-code-block"> kubectl rollout undo deployment/nginx-deployment --to-revision=2 </div> </div> <p><br></p> <p><br></p> <h3>Service</h3> <p><br></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">参考官网地址:</span><a href="https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/" target="_blank">https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/</a></p> <p><br></p> <p><br></p> <h4>说明</h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(34, 34, 34);">Service将运行在一组 </span><a href="https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/" target="_blank">Pods</a><span style="color: rgb(34, 34, 34);"> 上的应用程序公开为网络服务的抽象方法。</span></li> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(34, 34, 34);">Kubernetes Service 定义了这样一种抽象:</span></li> </ol> <p><br></p> <p>逻辑上的一组可以互相替换的 Pod,通常称为微服务。</p> <p>Service 对应的 Pod 集合通常是通过选择算符来确定的。</p> <p>举个例子,在一个Service中运行了3个nginx的副本。这些副本是可互换的,我们不需要关心它们调用了哪个nginx,也不需要关注 Pod的运行状态,只需要调用这个服务就可以了。</p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(34, 34, 34);">作用</span></h4> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(34, 34, 34);">Service为一组 Pod 提供相同的 DNS 名,并且在它们之间进行负载均衡。</span></li> </ol> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(34, 34, 34);">配置文件示例</span></h4> <p><br></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">假定有一组 Pod,它们对外暴露了 9376 端口,同时还被打上 </span><a href="http://app.kubernetes.io/name=MyApp" target="_blank" style="color: rgb(34, 34, 34); font-size: 14px;">app.kubernetes.io/name=MyApp</a><span style="color: rgb(34, 34, 34);"> 标签:</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: v1 </div> <div class="ql-code-block"> kind: Service </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: my-service </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> app.kubernetes.io/name: MyApp </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - protocol: TCP </div> <div class="ql-code-block"> port: 80 </div> <div class="ql-code-block"> targetPort: 9376 </div> </div> <p><br></p> <p><span style="color: rgb(34, 34, 34);">上述配置创建一个名称为 "my-service" 的 Service 对象,它会将请求代理到使用 TCP 端口 9376,并且具有标签 </span><a href="http://app.kubernetes.io/name=MyApp" target="_blank" style="color: rgb(34, 34, 34); font-size: 14px;">app.kubernetes.io/name=MyApp</a><span style="color: rgb(34, 34, 34);"> 的 Pod 上。</span></p> <p><br></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(34, 34, 34);">使用方式</span></h4> <p><br></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">Kubernetes 为 Pod 提供分配了IP 地址,但IP地址可能会发生变化。</span></p> <p><span style="color: rgb(34, 34, 34);">集群内的容器可以通过service名称访问服务,而不需要担心Pod的IP发生变化。</span></p> <p><br></p> <p><br></p> <p><br></p> <h5><span style="font-size: 15px;">ServiceType 取值</span></h5> <p><br></p> <p><br></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: inherit;">ClusterIP</span>:<span style="color: rgb(223, 42, 63);">将服务公开在集群内部。</span>kubernetes会<strong>给服务分配一个集群内部的 IP</strong>,集群内的所有主机都可以通过这个Cluster-IP访问服务。<strong>集群内部的Pod可以通过service名称访问服务。</strong></li> <li data-list="bullet"><span class="ql-ui"></span><a href="https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#type-nodeport" target="_blank">NodePort</a>:<span style="color: rgb(223, 42, 63);">通过每个节点的主机IP 和静态端口(NodePort)暴露服务。</span> <strong>集群的外部主机可以使用节点IP和</strong><strong style="color: inherit;">NodePort访问</strong><strong>服务。</strong></li> <li data-list="bullet"><span class="ql-ui"></span><a href="https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#externalname" target="_blank">ExternalName</a><span style="color: rgb(34, 34, 34);">:将集群外部的网络引入集群内部。</span></li> <li data-list="bullet"><span class="ql-ui"></span><a href="https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer" target="_blank">LoadBalancer</a>:使用云提供商的负载均衡器向外部暴露服务。</li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> # port是service访问端口,target-port是Pod端口 </div> <div class="ql-code-block"> # 二者通常是一样的 </div> <div class="ql-code-block"> kubectl expose deployment/nginx-deployment \ </div> <div class="ql-code-block"> --name=nginx-service --type=ClusterIP --port=80 --target-port=80 </div> <div class="ql-code-block"> # 随机产生主机端口 </div> <div class="ql-code-block"> kubectl expose deployment/nginx-deployment \ </div> <div class="ql-code-block"> --name=nginx-service2 --type=NodePort --port=8080 --target-port=80 </div> </div> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/dlvj18kn.jpeg"></p> <p><br></p> <h5><span style="font-size: 15px;">访问Service</span></h5> <p><br></p> <p><br></p> <p>外部主机访问:192.168.56.109:32296。</p> <p><br></p> <p>1.NodePort 端口是随机的,<span style="color: rgb(34, 34, 34);">范围为:30000-32767。</span></p> <p><span style="color: rgb(34, 34, 34);">2.</span>集群中每一个主机节点的 NodePort 端口都可以访问。</p> <p>3.如果需要指定端口,不想随机产生,需要使用配置文件来声明。</p> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/rr1vfprz.jpeg"></p> <div class="ql-code-block-container"> <div class="ql-code-block"> #集群内访问 </div> <div class="ql-code-block"> curl 10.43.65.187:80 </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> #容器内访问 </div> <div class="ql-code-block"> kubectl run nginx-test --image=nginx:1.22 -it --rm -- sh </div> <div class="ql-code-block"> # </div> <div class="ql-code-block"> curl nginx-service:80 </div> </div> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <h3>Namespace</h3> <h4>说明</h4> <p><br></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">命名空间(Namespace)是一种资源隔离机制,将同一集群中的资源划分为相互隔离的组。</span></p> <p><strong style="color: rgb(34, 34, 34);">Kubernetes 会创建四个初始命名空间:</strong></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(34, 34, 34);">default</strong><span style="color: rgb(34, 34, 34);"> 默认的命名空间,不可删除,</span><strong style="color: rgb(34, 34, 34);">未指定命名空间的对象都会被分配到default中</strong><span style="color: rgb(34, 34, 34);">。</span></li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(34, 34, 34);">kube-system</strong><span style="color: rgb(34, 34, 34);"> Kubernetes 系统对象(控制平面和Node组件)所使用的命名空间。</span></li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(34, 34, 34);">kube-public </strong><span style="color: rgb(34, 34, 34);">自动创建的公共命名空间,所有用户(包括未经过身份验证的用户)都可以读取它。通常我们约定,将</span><strong style="color: rgb(34, 34, 34);">整个集群中公用的可见和可读的资源放在这个空间中</strong><span style="color: rgb(34, 34, 34);">。 </span></li> <li data-list="bullet"><span class="ql-ui"></span><strong style="color: rgb(34, 34, 34);">kube-node-lease </strong><span style="color: rgb(34, 34, 34);"> </span><a href="https://kubernetes.io/docs/reference/kubernetes-api/cluster-resources/lease-v1/" target="_blank">租约(Lease)</a><span style="color: rgb(34, 34, 34);">对象使用的命名空间。每个节点都有一个关联的 lease 对象,lease 是一种轻量级资源。lease对象通过发送</span><a href="https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/#heartbeats" target="_blank">心跳</a><span style="color: rgb(34, 34, 34);">,检测集群中的每个节点是否发生故障。</span></li> </ol> <p><br></p> <p>使用kubectl get lease -A查看lease对象</p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <h4>作用</h4> <p><br></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">命名空间可以在多个用户之间划分集群资源(通过</span><a href="https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/" target="_blank">资源配额</a><span style="color: rgb(34, 34, 34);">)。</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(34, 34, 34);">例如我们可以设置</span><strong style="color: rgb(34, 34, 34);">开发、测试、生产</strong><span style="color: rgb(34, 34, 34);">等多个命名空间。</span></li> </ol> <p><br></p> <p><br></p> <p><br></p> <h4>使用方式</h4> <p><br></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">同一命名空间内的资源名称要唯一,但跨命名空间时没有这个要求。 </span></p> <p><span style="color: rgb(34, 34, 34);">命名空间作用域</span><strong style="color: rgb(34, 34, 34);">仅针对带有名称空间的对象</strong><span style="color: rgb(34, 34, 34);">,例如 Deployment、Service 等。</span></p> <p><span style="color: rgb(34, 34, 34);">这种作用域</span><strong style="color: rgb(34, 34, 34);">对集群访问的对象不适用</strong><span style="color: rgb(34, 34, 34);">,例如 StorageClass、Node、PersistentVolume 等。</span></p> <p><br></p> <p><strong style="color: rgb(34, 34, 34);">使用多个命名空间</strong></p> <p><span style="color: rgb(38, 38, 38);">●</span><span style="color: rgb(34, 34, 34);">命名空间是在多个用户之间划分集群资源的一种方法(通过</span><a href="https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/" target="_blank">资源配额</a><span style="color: rgb(34, 34, 34);">)。</span></p> <p><span style="color: rgb(34, 34, 34);">例如我们可以设置</span><strong style="color: rgb(34, 34, 34);">开发、测试、生产</strong><span style="color: rgb(34, 34, 34);">等多个命名空间。</span></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">●不必使用多个命名空间来分隔轻微不同的资源。</span></p> <p><span style="color: rgb(34, 34, 34);">例如同一软件的不同版本: 应该使用</span><a href="https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/" target="_blank">标签</a><span style="color: rgb(34, 34, 34);"> 来区分同一命名空间中的不同资源。</span></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">●命名空间适用于跨多个团队或项目的场景。</span></p> <p><span style="color: rgb(34, 34, 34);">对于只有几到几十个用户的集群,可以不用创建命名空间。</span></p> <p><br></p> <p><span style="color: rgb(34, 34, 34);">●命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。</span></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">ns</span></p> <p><span style="color: rgb(38, 38, 38);">查看 ns</span></p> <p><span style="color: rgb(38, 38, 38);">创建 ns</span></p> <p><span style="color: rgb(38, 38, 38);">ns 使用说明</span></p> <p><br></p> <p><br></p> <p><br></p> <h5><span style="color: rgb(34, 34, 34); font-size: 15px;">管理命名空间</span></h5> <p><br></p> <p><br></p> <div class="ql-code-block-container"> <div class="ql-code-block"> #创建命名空间 </div> <div class="ql-code-block"> kubectl create namespace dev </div> <div class="ql-code-block"> #查看命名空间 </div> <div class="ql-code-block"> kubectl get ns </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> #在命名空间内运行Pod </div> <div class="ql-code-block"> kubectl run nginx --image=nginx --namespace=dev </div> <div class="ql-code-block"> kubectl run my-nginx --image=nginx -n=dev </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> #查看命名空间内的Pod </div> <div class="ql-code-block"> kubectl get pods -n=dev </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> #查看命名空间内所有对象 </div> <div class="ql-code-block"> kubectl get all </div> <div class="ql-code-block"> # 删除命名空间会删除命名空间下的所有内容 </div> <div class="ql-code-block"> kubectl delete ns dev </div> </div> <p><br></p> <p><br></p> <h5><span style="color: rgb(34, 34, 34); font-size: 15px;">切换当前命名空间</span></h5> <p><br></p> <p><br></p> <div class="ql-code-block-container"> <div class="ql-code-block"> #查看当前上下文 </div> <div class="ql-code-block"> kubectl config current-context </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> #将dev设为当前命名空间,后续所有操作都在此命名空间下执行。 </div> <div class="ql-code-block"> kubectl config set-context $(kubectl config current-context) --namespace=dev </div> </div> <p><br></p> <p><br></p> <p><br></p> <h3><span style="color: rgb(38, 38, 38);">示例:</span></h3> <p><br></p> <p><br></p> <p>示例过程:</p> <ol> <li data-list="ordered"><span class="ql-ui"></span>pod 的直接使用</li> <li data-list="ordered" class="ql-indent-1"><span class="ql-ui"></span>为什么不直接创建 pod -&gt; 不保证高可用</li> <li data-list="ordered"><span class="ql-ui"></span>rs 的使用</li> <li data-list="ordered"><span class="ql-ui"></span>deploy 的使用</li> <li data-list="ordered" class="ql-indent-1"><span class="ql-ui"></span>命令式 vs 声明式(结合 gitlab/gitbook 可追溯)</li> <li data-list="ordered" class="ql-indent-1"><span class="ql-ui"></span>应用部署的正确打开方式:deploy -&gt; rs -&gt; pod</li> <li data-list="ordered" class="ql-indent-2"><span class="ql-ui"></span>为什么不直接应用 rs 而是用 deploy -&gt; deploy 功能更强大</li> <li data-list="ordered"><span class="ql-ui"></span>service 使用</li> <li data-list="ordered" class="ql-indent-1"><span class="ql-ui"></span>service 的作用 -&gt;</li> <li data-list="ordered"><span class="ql-ui"></span>namespace 使用</li> </ol> <p><br></p> <p><a href="https://blog.csdn.net/An1090239782/article/details/110129400" target="_blank">https://blog.csdn.net/An1090239782/article/details/110129400</a></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(38, 38, 38);">pod 的使用</span></h4> <p><br></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">直接创建 pod</span></p> <p>kubectl run nginx-demo --image=nginx</p> <p><span style="color: rgb(38, 38, 38);">删除 pod</span></p> <p>kubectl delete pod nginx-demo --force</p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">删除 pod 之后 pod 就会被彻底删除</span></p> <p><br></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(38, 38, 38);">rs 的使用</span></h4> <p><br></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">声明式 rs 使用</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(38, 38, 38);">创建配置文件:</span><a href="http://pod_nginx_rs.yaml" target="_blank">pod_nginx_rs.yaml</a></li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: ReplicaSet </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx-rs </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> tier: nginx-rs </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 3 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> matchLabels: </div> <div class="ql-code-block"> tier: nginx-rs </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx-rs </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> tier: nginx-rs </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - name: nginx </div> <div class="ql-code-block"> image: nginx:1.22 </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> </div> <p><br></p> <p><span style="color: rgb(38, 38, 38);">应用配置文件:</span></p> <p>kubectl create -f <a href="http://pod_nginx_rs.yaml" target="_blank">pod_nginx_rs.yaml</a></p> <p>kubectl apply -f <a href="http://pod_nginx_rs.yaml" target="_blank">pod_nginx_rs.yaml</a></p> <p><br></p> <p>kubectl create VS kubectl apply</p> <p><a href="https://blog.csdn.net/textdemo123/article/details/104400985" target="_blank">https://blog.csdn.net/textdemo123/article/details/104400985</a></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">删除 rs</span></p> <p>kubectl delete rs nginx-rs</p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <h4><span style="color: rgb(38, 38, 38);">deployment</span></h4> <p><br></p> <p><br></p> <p>命令式:</p> <p><span style="color: rgb(38, 38, 38);">直接创建 deployment</span></p> <p>#创建deployment,部署3个运行nginx的Pod</p> <p>kubectl create deployment nginx-deployment --image=nginx:1.22 --replicas=3</p> <div class="ql-code-block-container"> <div class="ql-code-block"> #创建deployment,部署3个运行nginx的Pod </div> <div class="ql-code-block"> kubectl create deployment nginx-deployment --image=nginx:1.22 --replicas=3 </div> <div class="ql-code-block"> #查看deployment </div> <div class="ql-code-block"> kubectl get deploy </div> <div class="ql-code-block"> #查看 replicaSet </div> <div class="ql-code-block"> kubectl get rs </div> <div class="ql-code-block"> #删除deployment </div> <div class="ql-code-block"> kubectl delete deploy nginx-deployment </div> </div> <p><br></p> <p><br></p> <p>通常使用声明式配置文件:</p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx-deploy </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 3 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> matchLabels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - name: nginx </div> <div class="ql-code-block"> image: nginx:1.22 </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> </div> <p><br></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">查看创建 rs</span></p> <p><span style="color: rgb(38, 38, 38);">kubectl get rs </span></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">查看创建 pod</span></p> <p><span style="color: rgb(38, 38, 38);">kubectl get pod</span></p> <p><br></p> <div class="ql-code-block-container"> <div class="ql-code-block"> #创建deployment,部署3个运行nginx的Pod </div> <div class="ql-code-block"> kubectl create deployment nginx-deployment --image=nginx:1.22 --replicas=3 </div> <div class="ql-code-block"> #查看deployment </div> <div class="ql-code-block"> kubectl get deploy </div> <div class="ql-code-block"> #查看replicaSet </div> <div class="ql-code-block"> kubectl get rs </div> <div class="ql-code-block"> #删除deployment </div> <div class="ql-code-block"> kubectl delete deploy nginx-deployment </div> </div> <p><br></p> <p><span style="color: rgb(38, 38, 38);">pod 扩缩容</span></p> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(38, 38, 38);">手动</span></li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> #将副本数量调整为5 </div> <div class="ql-code-block"> kubectl scale deployment/nginx-deployment --replicas=5 </div> <div class="ql-code-block"> kubectl get deploy </div> </div> <ol> <li data-list="bullet"><span class="ql-ui"></span><span style="color: rgb(38, 38, 38);">自动</span></li> </ol> <div class="ql-code-block-container"> <div class="ql-code-block"> #自动缩放 </div> <div class="ql-code-block"> kubectl autoscale deployment/nginx-deployment --min=3 --max=10 --cpu-percent=75 </div> <div class="ql-code-block"> kubectl autoscale deployment/tomcat --min=3 --max=10 --cpu-percent=5 </div> <div class="ql-code-block"> #查看自动缩放 </div> <div class="ql-code-block"> kubectl get hpa </div> <div class="ql-code-block"> #删除自动缩放 </div> <div class="ql-code-block"> kubectl delete hpa nginx-deployment </div> <div class="ql-code-block"> kubectl delete hpa tomcat </div> </div> <p><br></p> <p><span style="color: rgb(38, 38, 38);">滚动更新</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> #查看版本和Pod </div> <div class="ql-code-block"> kubectl get deployment/nginx-deployment -owide </div> <div class="ql-code-block"> kubectl get pods </div> <div class="ql-code-block"><br> </div> <div class="ql-code-block"> #更新容器镜像 </div> <div class="ql-code-block"> kubectl set image deployment/nginx-deployment nginx=nginx:1.23 </div> <div class="ql-code-block"> #滚动更新 </div> <div class="ql-code-block"> kubectl rollout status deployment/nginx-deployment </div> <div class="ql-code-block"> #查看过程 </div> <div class="ql-code-block"> kubectl get rs --watch </div> </div> <p><br></p> <p><span style="color: rgb(38, 38, 38);">版本回滚</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> #查看历史版本 </div> <div class="ql-code-block"> kubectl rollout history deployment/nginx-deployment </div> <div class="ql-code-block"> #查看指定版本的信息 </div> <div class="ql-code-block"> kubectl rollout history deployment/nginx-deployment --revision=2 </div> <div class="ql-code-block"> #回滚到历史版本 </div> <div class="ql-code-block"> kubectl rollout undo deployment/nginx-deployment --to-revision=2 </div> </div> <p><br></p> <p><br></p> <p><br></p> <h4>金丝雀发布</h4> <p><br></p> <p><br></p> <p><br></p> <p><a href="http://deploy-v1.yaml" target="_blank">deploy-v1.yaml</a></p> <p><br></p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: v1 </div> <div class="ql-code-block"> kind: Namespace </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: canary </div> <div class="ql-code-block"> --- </div> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx-deployment-v1 </div> <div class="ql-code-block"> namespace: canary </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx-deployment-v1 </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 3 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> matchLabels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - name: nginx </div> <div class="ql-code-block"> image: nginx:1.22 </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> <div class="ql-code-block"> --- </div> <div class="ql-code-block"> apiVersion: v1 </div> <div class="ql-code-block"> kind: Service </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: canary-demo </div> <div class="ql-code-block"> namespace: canary </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> type: NodePort </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - port: 80 </div> <div class="ql-code-block"> targetPort: 80 </div> <div class="ql-code-block"> nodePort: 30008 </div> </div> <p><br></p> <p>发布新版本的应用,镜像使用docker/getting-started,数量为 1。</p> <p><br></p> <p><a href="http://deploy-canary.yaml" target="_blank">deploy-canary.yaml</a></p> <p><br></p> <div class="ql-code-block-container"> <div class="ql-code-block"> apiVersion: apps/v1 </div> <div class="ql-code-block"> kind: Deployment </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> name: nginx-deployment-canary </div> <div class="ql-code-block"> namespace: canary </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx-deployment-canary </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> replicas: 1 </div> <div class="ql-code-block"> selector: </div> <div class="ql-code-block"> matchLabels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> template: </div> <div class="ql-code-block"> metadata: </div> <div class="ql-code-block"> labels: </div> <div class="ql-code-block"> app: nginx </div> <div class="ql-code-block"> track: canary </div> <div class="ql-code-block"> spec: </div> <div class="ql-code-block"> containers: </div> <div class="ql-code-block"> - name: new-nginx </div> <div class="ql-code-block"> image: docker/getting-started </div> <div class="ql-code-block"> ports: </div> <div class="ql-code-block"> - containerPort: 80 </div> </div> <p>应用文件:</p> <p>kubectl apply -f <a href="http://deploy-canary.yaml" target="_blank">deploy-canary.yaml</a></p> <p><br></p> <p><strong style="color: rgb(38, 38, 38);">分配流量</strong></p> <p><br></p> <div class="ql-code-block-container"> <div class="ql-code-block"> # 查看服务 </div> <div class="ql-code-block"> kubectl describe svc canary-demo --namespace=canary </div> </div> <p><img src="https://pic.code-nav.cn/planet_post_image/1619331527399800834/47gc2zsj.jpeg"></p> <p><br></p> <p><span style="color: rgb(38, 38, 38);">●调整比例</span></p> <p><span style="color: rgb(38, 38, 38);">待稳定运行一段时间后,扩大试用范围,将部署的v2版本数量调整为3,v1和v2的数量都是3个。</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl scale deployment/nginx-deployment-canary --replicas=3 -n=canary </div> </div> <p><br></p> <p><span style="color: rgb(38, 38, 38);">●下线旧版本</span></p> <p><span style="color: rgb(38, 38, 38);">最后下线所有v1版本,所有服务升级为v2版本。</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl scale deployment/nginx-deployment-v1 --replicas=0 -n=canary </div> </div> <p><br></p> <p><strong style="color: rgb(38, 38, 38);">清空环境</strong></p> <p><span style="color: rgb(38, 38, 38);">使用namespace可以方便的清空环境:</span></p> <div class="ql-code-block-container"> <div class="ql-code-block"> kubectl delete all --all -n=canary </div> </div> </div> </body> </html>

下载 APP