玩转Kubernetes—使用minikube操作集群(下)

简介: 玩转Kubernetes—使用minikube操作集群

4 使用Service暴露应用服务

4.1 概念

Kubernetes 中的服务(Service)是一种抽象概念,它定义了 Pod 的逻辑集和访问 Pod 的协议。

每个 Pod 都有唯一的 IP 地址,但是类似于内网IP,需要 Service进行对外暴露 。

Service 也可以用在 ServiceSpec 标记type有以下几种:

  • ClusterIP(默认) :在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。
  • NodePort:使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。是 ClusterIP 的超集。
  • LoadBalancer:在当前集群中创建一个外部负载均衡器,并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
  • ExternalName :通过返回带有该名称的 CNAME 记录,使用任意名称公开 Service。

网络异常,图片无法展示
|


4.2 演示

基本步骤:

  • 根据Deployment,指定type和port生成Service
  • 查看Service生成情况
  • 进行服务测试
root@ymx-ubuntu:~# kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-65d5b99f84-9kll4   1/1     Running   0          18m
root@ymx-ubuntu:~# kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   31m
root@ymx-ubuntu:~# kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
root@ymx-ubuntu:~# kubectl get services
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1        <none>        443/TCP          31m
kubernetes-bootcamp   NodePort    10.104.163.225   <none>        8080:31209/TCP   1s
root@ymx-ubuntu:~# kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
......
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.104.163.225
IPs:                      10.104.163.225
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31209/TCP
Endpoints:                172.17.0.4:8080
......
root@ymx-ubuntu:~# export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
root@ymx-ubuntu:~# echo NODE_PORT=$NODE_PORT
NODE_PORT=31209
root@ymx-ubuntu:~# curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-65d5b99f84-9kll4 | v=1
复制代码

5 扩展和缩放应用

5.1 概念

扩展 Deployment 将创建新的 Pods,并将资源调度请求分配到有可用资源的节点上,收缩 会将 Pods 数量减少至所需的状态。扩缩是通过改变 Deployment 中的副本数量来实现的。Kubernetes 还支持 Pods 的自动缩放

网络异常,图片无法展示
|


网络异常,图片无法展示
|


5.2 演示

基本步骤较为简单,最常用的两个命令:

  • kubectl get rs:查看目前所有的replica set,显示了所有的pod的副本数,以及他们的可用数量以及状态等信息
  • kubectl scale:扩容或缩容 DeploymentReplicaSetReplication ControllerJobPod数量
root@ymx-ubuntu:~# kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           34m
root@ymx-ubuntu:~# kubectl get rs
NAME                             DESIRED   CURRENT   READY   AGE
kubernetes-bootcamp-65d5b99f84   1         1         1       35m
复制代码

扩展:

root@ymx-ubuntu:~# kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.apps/kubernetes-bootcamp scaled
root@ymx-ubuntu:~# kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4/4     4            4           36m
root@ymx-ubuntu:~# kubectl get rs
NAME                             DESIRED   CURRENT   READY   AGE
kubernetes-bootcamp-65d5b99f84   4         4         4       36m
root@ymx-ubuntu:~# kubectl get pods -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-65d5b99f84-8knvl   1/1     Running   0          29s   172.17.0.6   minikube   <none>           <none>
kubernetes-bootcamp-65d5b99f84-9kll4   1/1     Running   0          36m   172.17.0.4   minikube   <none>           <none>
kubernetes-bootcamp-65d5b99f84-9vd7m   1/1     Running   0          29s   172.17.0.3   minikube   <none>           <none>
kubernetes-bootcamp-65d5b99f84-gp6jv   1/1     Running   0          29s   172.17.0.5   minikube   <none>           <none>
root@ymx-ubuntu:~# kubectl describe deployments/kubernetes-bootcamp
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Fri, 13 May 2022 19:42:01 +0800
Labels:                 app=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=kubernetes-bootcamp
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
......
root@ymx-ubuntu:~# kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
......
NodePort:                 <unset>  31209/TCP
Endpoints:                172.17.0.3:8080,172.17.0.4:8080,172.17.0.5:8080 + 1 more...
......
root@ymx-ubuntu:~# export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
root@ymx-ubuntu:~# echo NODE_PORT=$NODE_PORT
NODE_PORT=31209
root@ymx-ubuntu:~# 
root@ymx-ubuntu:~# curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-65d5b99f84-9vd7m | v=1
复制代码

收缩:

root@ymx-ubuntu:~# kubectl scale deployments/kubernetes-bootcamp --replicas=2
deployment.apps/kubernetes-bootcamp scaled
root@ymx-ubuntu:~# kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2/2     2            2           14h
root@ymx-ubuntu:~# kubectl get pods -o wide
NAME                                   READY   STATUS        RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-65d5b99f84-8knvl   1/1     Terminating   0          13h   172.17.0.6   minikube   <none>           <none>
kubernetes-bootcamp-65d5b99f84-9kll4   1/1     Running       0          14h   172.17.0.4   minikube   <none>           <none>
kubernetes-bootcamp-65d5b99f84-9vd7m   1/1     Terminating   0          13h   172.17.0.3   minikube   <none>           <none>
kubernetes-bootcamp-65d5b99f84-gp6jv   1/1     Running       0          13h   172.17.0.5   minikube   <none>           <none>
复制代码

6 更新和滚动更新应用

6.1 概念

用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度。

在 Kubernetes 中,更新是经过版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本。

网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|
网络异常,图片无法展示
|


网络异常,图片无法展示
|


如果公开了 Deployment,服务将在更新期间仅对可用的 pod 进行负载均衡

滚动更新允许以下操作:

  • 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
  • 回滚到以前的版本
  • 持续集成和持续交付应用程序,无需停机

如果 Deployment 是公开的,则服务将仅在更新期间对可用的 pod 进行负载均衡。

6.2 演示

基本步骤:

  • 获取将要更新的镜像
  • 使用新镜像进行对Deployment的替换(回滚)
  • 查看更新详情
root@ymx-ubuntu:~# kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2/2     2            2           14h
root@ymx-ubuntu:~# kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-65d5b99f84-9kll4   1/1     Running   0          14h
kubernetes-bootcamp-65d5b99f84-gp6jv   1/1     Running   0          13h
root@ymx-ubuntu:~# kubectl describe pods
Name:         kubernetes-bootcamp-65d5b99f84-9kll4
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Fri, 13 May 2022 19:42:01 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=65d5b99f84
Annotations:  <none>
Status:       Running
IP:           172.17.0.4
IPs:
  IP:           172.17.0.4
Controlled By:  ReplicaSet/kubernetes-bootcamp-65d5b99f84
......
Name:         kubernetes-bootcamp-65d5b99f84-gp6jv
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Fri, 13 May 2022 20:17:57 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=65d5b99f84
Annotations:  <none>
Status:       Running
IP:           172.17.0.5
IPs:
  IP:           172.17.0.5
Controlled By:  ReplicaSet/kubernetes-bootcamp-65d5b99f84
......
root@ymx-ubuntu:~# docker images
REPOSITORY                                  TAG       IMAGE ID       CREATED        SIZE
gcr.io/k8s-minikube/kicbase                 v0.0.30   1312ccd2422d   3 months ago   1.14GB
gcr.io/google-samples/kubernetes-bootcamp   v1        8fafd8af70e9   5 years ago    211MB
root@ymx-ubuntu:~# docker pull jocatalin/kubernetes-bootcamp:v2
......
docker.io/jocatalin/kubernetes-bootcamp:v2
root@ymx-ubuntu:~# docker images
REPOSITORY                                  TAG       IMAGE ID       CREATED        SIZE
gcr.io/k8s-minikube/kicbase                 v0.0.30   1312ccd2422d   3 months ago   1.14GB
jocatalin/kubernetes-bootcamp               v2        b6556396ebd4   5 years ago    211MB
gcr.io/google-samples/kubernetes-bootcamp   v1        8fafd8af70e9   5 years ago    211MB
root@ymx-ubuntu:~# kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated
root@ymx-ubuntu:~# kubectl get pods
NAME                                   READY   STATUS        RESTARTS   AGE
kubernetes-bootcamp-65d5b99f84-9kll4   1/1     Terminating   0          14h
kubernetes-bootcamp-65d5b99f84-gp6jv   1/1     Terminating   0          14h
kubernetes-bootcamp-684bd555bb-hfkk7   1/1     Running       0          24s
kubernetes-bootcamp-684bd555bb-sxsg9   1/1     Running       0          10s
root@ymx-ubuntu:~# kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   app=kubernetes-bootcamp
Annotations:              <none>
Selector:                 app=kubernetes-bootcamp
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.104.163.225
IPs:                      10.104.163.225
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31209/TCP
Endpoints:                172.17.0.3:8080,172.17.0.6:8080
Session Affinity:         None
......
root@ymx-ubuntu:~# export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
root@ymx-ubuntu:~# echo NODE_PORT=$NODE_PORT
NODE_PORT=31209
root@ymx-ubuntu:~# curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-684bd555bb-sxsg9 | v=2
root@ymx-ubuntu:~# kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
root@ymx-ubuntu:~# kubectl describe pods
Name:         kubernetes-bootcamp-684bd555bb-hfkk7
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Sat, 14 May 2022 10:18:39 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=684bd555bb
Annotations:  <none>
Status:       Running
IP:           172.17.0.3
IPs:
  IP:           172.17.0.3
Controlled By:  ReplicaSet/kubernetes-bootcamp-684bd555bb
......
Name:         kubernetes-bootcamp-684bd555bb-sxsg9
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Sat, 14 May 2022 10:18:53 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=684bd555bb
Annotations:  <none>
Status:       Running
IP:           172.17.0.6
IPs:
  IP:           172.17.0.6
Controlled By:  ReplicaSet/kubernetes-bootcamp-684bd555bb
......
复制代码

回滚:

root@ymx-ubuntu:~# kubectl rollout undo deployments/kubernetes-bootcampdeployment.apps/kubernetes-bootcamp rolled back
root@ymx-ubuntu:~# kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-684bd555bb-hfkk7   1/1     Running   0          3m22s
kubernetes-bootcamp-684bd555bb-sxsg9   1/1     Running   0          3m8s
root@ymx-ubuntu:~# kubectl describe pods
Name:         kubernetes-bootcamp-684bd555bb-hfkk7
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Sat, 14 May 2022 10:18:39 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=684bd555bb
Annotations:  <none>
Status:       Running
IP:           172.17.0.3
IPs:
  IP:           172.17.0.3
Controlled By:  ReplicaSet/kubernetes-bootcamp-684bd555bb
......
Name:         kubernetes-bootcamp-684bd555bb-sxsg9
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Sat, 14 May 2022 10:18:53 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=684bd555bb
Annotations:  <none>
Status:       Running
IP:           172.17.0.6
IPs:
  IP:           172.17.0.6
Controlled By:  ReplicaSet/kubernetes-bootcamp-684bd555bb
......
复制代码

7 小总结下吧

经过了实际的操作,我们终于知道了在Kubernetes集群中是如何将自己的应用,也可以说是打包好的Docker镜像在集群中进行灵活运用的,这种方式无论是相比虚拟机部署还是容器部署都更加的灵活高效,当然这种方式是基于容器部署的,在此基础上能够让我们更好的对容器进行集成和管理。

当然本文是基于Kubernetes官方文档(kubernetes.io/zh/docs)进行的…

参考:

blog.csdn.net/lly337/arti…

kubernetes.io/zh/docs/tut…

www.jianshu.com/p/07455dbfd…

本文图片均来自:kubernetes.io/zh/docs/tut…

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
330 1
|
3月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
266 89
|
8月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
333 9
|
8月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
10月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
926 33
|
10月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
544 19
|
10月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
10月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
373 0
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
|
12月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
11月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。

推荐镜像

更多