Kubernetes 核心实战之二(精华篇 2/3)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Kubernetes 核心实战之二(精华篇 2/3)

4、Deployment ★

Deployment:控制 Pod,使 Pod 拥有多副本、自愈、扩缩容 等能力。(工作负载)

4.1 自愈 和 故障转移

应用:某一个 节点宕机后,用 Deployment 部署的容器 会在 另一个 节点 重新启动。

4.1.1 自愈

使用depolyment创建的pod天生自带自愈能力。

# 删除之前的 Pod
kubectl get pods
kubectl delete pod xxx xxx -n default
# 比较下面两个命令有何不同效果?
kubectl run mgnginx --image=nginx
kubectl create deployment mytomcat --image=tomcat:8.5.68
kubectl get pods
# 删了就没了
kubectl delete pod mgnginx -n default
# 删了之后,以一个 新的 ID 重新启动了;用 delete 删不掉的
kubectl delete pod mytomcat-xxx -n default
# 查看 deployment 创建的资源
kubectl get deploy
# 删除 deployment 创建的资源
kubectl delete deploy mytomcat

使用kubectl run创建的pod,没有自愈能力,可以delete掉;然而使用deployment 创建的 Pod 用 kubectl delete 删不掉的,会自愈。

删除 deployment 创建的 Pod,就要使用kubectl delete deploy xxx这个命令才能删除pod。

4.1.2 故障转移
kubectl create deployment mytomcat --image=tomcat:8.5.68
kubectl get pod -owide
docker ps | grep xxx
docker stop xxx

Restarts,重启次数 + 1。

查看 Pod 所在 的 node

到 所在的 node 服务器 docker stop,回到 master 可以看到 restart + 1, 然后 接着 Running

把 部署节点 的服务器关机,强制关机。

把 一开始所在的 node2 关机后,又在 node1 启了一个。

这样子,k8s 天天 杀 Pod,起 Pod;可以设置一个时间 2min / 5min 等。

4.2 多副本

–replicas:一次性部署多个 Pod。

4.2.1 命令行 创建
# --replicas=3,部署 3个 Pod my-dep
kubectl create deployment my-dep --image=nginx --replicas=3
kubectl get deploy
kubectl get pod -A -owide

4.2.2 yaml 创建
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep1
  name: my-dep1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep1
  template:
    metadata:
      labels:
        app: my-dep1
    spec:
      containers:
      - image: nginx
        name: mynginx

4.2.3 可视化界面 创建

# 查看部署的 NODE 和 IP
kubectl get pod -owide
kubectl get deploy

4.3 扩缩容

kubectl scale

上图举出了 扩容,缩容类似。 Kubernetes 可以 动态的 对 Pod 扩缩容

kubectl get deploy
kubectl get pod -owide
# 扩容
kubectl scale deploy/my-dep --replicas=5
kubectl get pod -owide
# 缩容
kubectl scale deploy/my-dep --replicas=2
kubectl get pod -owide
kubectl get deploy
# 也可以通过 修改 yaml 中的 replicas 来达到 扩缩容
kubectl edit deploy my-dep
kubectl get pod
kubectl get deploy

将 deploy my-dep 由 3 扩容到 5

将 deploy my-dep 由 5 缩容到 3

修改 yaml 中的 replicas 来达到 扩缩容

kubectl edit deploy my-dep

使用kubernetes dashboard可视化界面 扩缩容进行pod的扩缩容

4.4 滚动更新

类似于 灰度发布,先启动 一个新的 Pod,然后将旧的 Pod 下线

更改 nginx 版本

# 查看之前用的镜像名称(spec.container.name)
kubectl get deploy my-dep -oyaml
# 改变 my-dep 中 nginx 的版本 (最新 -> 1.16.1)   --record 在 rollout histroy 中记录
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
kubectl rollout status deployment/my-dep

当前 deploy

查看 spec.containers.name,此时镜像是 nginx

更换 nginx 镜像版本

用 kubectl get pod -w 观察过程

之前那旧的 还在,先准备 新的。 可以看到 新的 先 Running 后 在 Terminating 旧的

新开一个选项,用 kubectl get pod -w 观察过程

查看 spec.containers.name,镜像改成 nginx:1.16.1

kubectl get deploy my-dep -oyaml

4.5 版本回退

# 历史记录
kubectl rollout history deployment/my-dep
# 查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
# 回滚(回到上个版本)
kubectl rollout undo deployment/my-dep
# 观察过程,也是 先 启动新的,在终止旧的
kubectl get pod
kubectl get pod -w
# 查看 nginx 版本
kubectl get deploy/my-dep -oyaml | grep image
# 回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2

查看历史版本:

my-dep 回退到 上个版本

kubectl rollout undo deployment/my-dep

kubectl get pods -w 观察过程

查看版本,已经退回到原来的版本。

4.6 其他工作负载

除了Deployment,k8s 还有 StatefulSet 、DaemonSet 、Job 等 类型资源,我们都称为 工作负载

有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署。

无状态的 进容器,有状态的 物理部署(如Mysql、Redis等)

官网文档:https://kubernetes.io/zh/docs/concepts/workloads/controllers/

可视化页面 — 工作负载

5、Service ★

Service:Pod 的服务发现 与 负载均衡;将一组 Pods 公开为 网络服务的抽象方法。(服务)

5.1 ClusterIP

ClusterIP 分配的 IP 在 这里配置。


kubectl expose: 暴露端口,只能在集群内部 通过 ClusterIP 访问。

pod:my-dep-5b7868d854-xbrz7

cd /usr/share/nginx/html
echo 'my-dep-5b7868d854-xbrz7' > index.html
cat index.html

pod:my-dep-5b7868d854-dbzhc

cd /usr/share/nginx/html
echo 'my-dep-5b7868d854-dbzhc' > index.html
cat index.html

pod:my-dep-5b7868d854-5sfvn

cd /usr/share/nginx/html
echo 'my-dep-5b7868d854-5sfvn' > index.html
cat index.html

启动的3个 pod,分别 修改 index.html 演示负载均衡 。

5.1.1 命令行 创建
# kubectl expose 暴露端口,只能在集群内部 ClusterIP 访问。--type=ClusterIP 不传默认就是 ClusterP,target-port 目标端口(源端口) 
kubectl expose deploy my-dep --port=8000 --target-port=80
# 查看 service,里面有 CLUSTER-IP
# kubectl get service 或者 kubectl get svc
kubectl get service
# 查看 pod 标签
kubectl get pod --show-labels
# 删除
kubectl delete svc my-dep

cluster-ip 在集群内都可以调用,无法在外网访问。

删除 service

5.1.2 可视化界面 创建
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: my-dep-01
  name: my-dep-01
spec:
  selector:
    k8s-app: my-dep-01
  ports:
    - port: 8000
      protocal: TCP
      targetPort: 80

域名:默认是 服务.所在命名空间.svc, my-dep-01.default.svc

进入到 pod 内部 curl my-dep-01.default.svc:8000 也可以访问。

这个域名只能在 pod 内可以访问。

如果在 外部,访问 域名是不行的。 但是访问 IP 是可以的。

5.2 NodePort

可以在 公网 访问。 这个缺点:暴露出来的端口是 随机的。

# 只能集群内部访问(--type不写 默认 ClusterIP)
kubectl expose deploy my-dep-02 --port=8000 --target-port=80 --type=ClusterIP
# 集群外部也可以访问
kubectl expose deploy my-dep-02 --port=8000 --target-port=80 --type=NodePort
# 查看
kubectl get svc

每个 pod 都开放了 31951 端口。(如果有,则安全组开放)

然后 任何一台 公网的 IP:30948 即可发 负载均衡的访问。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5月前
|
Kubernetes 监控 安全
Kubernetes实战:集群管理与自动化技术详解
【6月更文挑战第27天】Kubernetes实战聚焦集群自动化管理,涵盖核心概念如主从架构、API Server及工作节点,强调自动扩缩容、RBAC安全控制与日志监控。通过IaC工具如Helm实现配置自动化,结合Prometheus等进行持续监控,强调安全策略与资源优化,展现K8s在现代应用管理中的威力。
|
2月前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
410 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
2月前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
100 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
1月前
|
Kubernetes 网络协议 Docker
Kubernetes入门到进阶实战
Kubernetes入门到进阶实战
77 0
|
2月前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
71 0
|
2月前
|
Kubernetes Ubuntu 网络安全
Ubuntu基于kubeadm快速部署K8S实战
关于如何在Ubuntu系统上使用kubeadm工具快速部署Kubernetes集群的详细实战指南。
177 2
|
2月前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
117 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
|
2月前
|
Kubernetes 容器
Kubernetes附加组件Dashboard部署实战篇
关于如何在Kubernetes集群中部署和配置Dashboard组件的详细实战指南,涵盖了从创建证书、部署Dashboard、设置服务访问到登录认证的完整流程。
381 0
Kubernetes附加组件Dashboard部署实战篇
|
3月前
|
Kubernetes Cloud Native Docker
云原生入门:Docker容器化部署实战
【8月更文挑战第31天】在数字化浪潮中,云原生技术成为企业转型的助推器。本文通过Docker容器化部署的实践案例,引导读者从零基础到掌握基础的云原生应用部署技能。我们将一起探索Docker的魅力,学习如何将一个应用容器化,并在云平台上运行起来,为深入云原生世界打下坚实基础。