Kubernetes 学习笔记(二)--- K8S应用快速入门

简介: 目录一、获取资源二、手动部署一个应用 2.1 手动创建一个控制器deployment 2.2 部署一个service 2.3 动态扩缩容Pod副本 2.4 滚动更新 2.5 动态回滚 2.6 配置从集群外部访问myapp此篇接上一篇 《Kubernetes 学习笔记(一)--- 基本概念及利用kubeadm部署K8S》命令kubectl是API Server的客户端程序。

目录

一、获取资源

二、手动部署一个应用
    2.1 手动创建一个控制器deployment
    2.2 部署一个service
    2.3 动态扩缩容Pod副本
    2.4 滚动更新
    2.5 动态回滚
    2.6 配置从集群外部访问myapp

此篇接上一篇 《Kubernetes 学习笔记(一)--- 基本概念及利用kubeadm部署K8S》
命令kubectl是API Server的客户端程序。

taints :污点,用于描述节点的污点。Pod调度到某个节点,取决于能够容忍某个节点的污点的最大限度。
命令: kubectl describe node k8s-master.fhw.com可查看节点的污点(taints)

img_6740329420ead1219dc49b10d35f0d32.png
image.png

一、获取资源

命令: kubectl get <资源名称>
帮助:kubectl get --help
使用 kubectl api-resources 获取支持的资源的完整列表。

img_94cf347fa8c00eca680477c6347d0ef7.png
image.png

以node资源为例:
kubectl get nodes

img_7ca0c3500863c47a9825e426d0537910.png
image.png

参数:

  • -o wide 输出格式,常用格式:json | yaml | wide;
  • -w 监控输出结果,类似tail命令的-f选项;
  • --show-labels 显示标签;

获取资源的详细信息:
kubectl describe node k8s-master.fhw.com

获取集群信息:

[root@k8s-master .kube]# kubectl cluster-info
Kubernetes master is running at https://192.168.100.135:6443
KubeDNS is running at https://192.168.100.135:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

二、手动部署一个应用

2.1 手动创建一个控制器deployment

创建一个控制器

[root@k8s-master .kube]# kubectl run nginx-deploy --image=nginx:1.14-alpine --replicas=1 --port=80
deployment.apps/nginx-deploy created

参数:

  • --restart=[Always, OnFailure, Never],pod重启策略,Always是pod退出后总是立即重启,Never是pod退出后不再重启。默认是Always
  • --command -- <cmd> <arg1> ... <argN>,指定在容器中运行的命令;
  • --schedule="0/5 * * * ?" ,创建一个Cron Job控制器。

查看deployment列表:

[root@k8s-master .kube]# kubectl get deployment
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1         1         1            1           11m

控制器创建后,会自动部署Pod:

[root@k8s-master .kube]# kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE                NOMINATED NODE
nginx-deploy-5b595999-54c56   1/1       Running   0          1h        10.244.2.3   k8s-node2.fhw.com   <none>

通过pod 的IP访问pod中运行的nginx服务:
curl 10.244.2.3

img_95fc04001e6fda01422271cc11d77350.png
image.png

能够正常访问。

2.2 部署一个service

service为pod提供一个固定访问端点。

用法:

Usage:
  kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name]
[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]

部署service

[root@k8s-master .kube]# kubectl expose deployment nginx-deploy --port=80 --target-port=80 --protocol=TCP --type=ClusterIP
service/nginx-deploy exposed
  • deployment:暴露的资源类型为控制器deployment;
  • nginx-deploy: deployment的名称
  • --port=80: service的端口
  • --target-port=80 : Pod的端口
  • --type="": service类型有ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'.
    -- ClusterIP:表示这个service只能在群集内部访问,不能在集群外部访问;
    -- NodePort:表示可以在集群外部访问到;

获取service列表:

[root@k8s-master .kube]# kubectl get svc -o wide
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE       SELECTOR
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP   20h       <none>
nginx          ClusterIP   10.106.125.69   <none>        80/TCP    8s

通过service IP 访问pod中的nginx服务:
curl 10.106.125.69

img_6768c286c028a4ec5f74315499bc9149.png
image.png

可以正常访问。

运行一个客户端Pod,在客户端Pod内部通过service的名称去访问nginx服务。

 kubectl run client -it --image=busybox --replicas=1 --restart=Never

如下图,直接通过service的名称nginx,可以正常访问:


img_c9e163874d5008d88238f6244d9f46f7.png
image.png

service通过label去关联pod:


img_c5bcc59230746bf0a3d13526b136feea.png
image.png

这时你删除这个关联的pod,控制器会立即启动一个新pod,并且关联至名为nginx这个service。

2.3 动态扩缩容Pod副本

先创建一个新应用,叫myapp:

[root@k8s-master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
deployment.apps/myapp created
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get deployment -w
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
myapp          2         2         2            2           22s
nginx-deploy   1         1         1            1           3h
[root@k8s-master ~]# 
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE                NOMINATED NODE
client                        1/1       Running   0          1h        10.244.2.4   k8s-node2.fhw.com   <none>
myapp-848b5b879b-fqbkd        1/1       Running   0          42s       10.244.1.6   k8s-node1.fhw.com   <none>
myapp-848b5b879b-j7lj5        1/1       Running   0          42s       10.244.2.5   k8s-node2.fhw.com   <none>
nginx-deploy-5b595999-54c56   1/1       Running   0          2h        10.244.2.3   k8s-node2.fhw.com   <none>

在第2.2节创建的客户端Pod中通过ip访问新建的应用myapp:


img_985094818e814d8a7249fe94629c76a4.png
image.png

两个Pod中的内容分别对应Pod名称。

为myapp创建一个service。
kubectl expose deployment myapp --name=myapp --port=80

img_51f8e22ce6a68dcaacab960a89ef699a.png
image.png

再到客户端Pod中使用service名称myapp去访问:


img_3b6ef763f6e0ad7866939b8f8386f7e9.png
image.png

如图,两个myapp Pod做负载均衡。

将myapp扩容至5个
kubectl scale deployment myapp --replicas=5

img_548aaaadde2651636e91892ed8399aa2.png
image.png

这时新增的Pod会立即加入到myapp service中接受请求。


img_2bf550bb89d2ddb021bcbfa7b5e101c4.png
image.png

再将myapp缩减至3个


img_5de13b6bfdad9d98d1de588e1a734231.png
image.png

2.4 滚动更新

升级myapp镜像的版本。
命令:

[root@k8s-master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
deployment.extensions/myapp image updated
img_9141518989d2ee51a12e8544c985a1db.png
image.png

查看滚动更新状态

[root@k8s-master ~]# kubectl rollout status deployment myapp
deployment "myapp" successfully rolled out

查看滚动更新后的结果


img_28434fc41bd9d29dd159be226b45b387.png
image.png

myapp更新过后,pod名称也更新了


img_c0abdaceecea6c97954801ad81533b26.png
image.png

查看pod内容器的镜像版本:


img_554b588ba378a8c16146f1cc9867944c.png
image.png

2.5 动态回滚

kubectl rollout undo deployment myapp
默认回滚至上一版本

img_a5432ab2377a67c80aa9a525d9b1a93f.png
image.png

查看回滚结果:


img_55925423aa75f3cdf6f5dc37aa56e95c.png
image.png

自动扩缩容依赖于监控系统,去监控系统资源使用率,根据系统资源去判断是否需要扩容。这个问题后续再记录。

2.6 配置从集群外部访问myapp

修改service myapp的类型为NodePort
命令:kubectl edit svc myapp

img_0bf7a2cdc5a1d5dc8e10d52bddc66bf3.png
image.png

修改后:


img_b95faab7f05d5e6d5a6e5ea8b2a518bc.png
image.png

查看service myapp


img_8343be0c5d295f4529de046372bc6a22.png
image.png

在集群中每个节点上都会开启一个31679端口(这个端口是随机生成的),映射到K8S集群的myapp service的80端口。可自行在其它节点验证。


img_2da43ec347ef52184ff3880ae7fb8b6f.png
image.png

提供给集群外部的访问端口为31679。
外部访问地址:http://192.168.100.135:31679
在192.168.100.200这台主机上验证,如图:


img_5ba220e3fb390a15e7e699650678ca56.png
image.png

三个节点均可正常访问。

如果想通过一个固定地址去访问这个myapp,可以利用nginx做反向代理:


img_dafd425d2637c3f3049c769b559fefa7.png
image.png

此篇结尾:
这一篇笔记只是演示如何通过手动去创建、更新、回滚一个应用。这只是在使用K8S中,最简单但是无法实现其全部功能 、全部定制的一种使用方式。而在真正使用K8S时,基本不会这样去操作。我们使用K8S的常用方式,应该是基于YAML格式的配置文件来定义和创建资源。

下一篇学习用YAML配置文件来创建资源。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
14天前
|
运维 Kubernetes 安全
高分通过Kubernetes/k8s CKS认证考试!
高分通过Kubernetes/k8s CKS认证考试!
|
14天前
|
存储 运维 Kubernetes
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
|
1天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
2天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
23 1
|
8天前
|
Kubernetes API 调度
|
11天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:以Kubernetes为核心
【4月更文挑战第27天】 在当今数字化转型的浪潮中,企业急需构建灵活、可扩展的应用来应对不断变化的市场需求。云原生技术以其独特的优势应运而生,成为推动现代应用开发和部署的重要力量。本文深入探讨了云原生的核心组件之一——Kubernetes,解析其如何通过容器编排优化资源利用,提高应用的弹性和可维护性。同时,文章将展示如何在云平台上实现高效的服务发现、自动扩缩容以及持续集成和持续部署(CI/CD),进一步阐述云原生架构下的最佳实践和面临的挑战。
|
14天前
|
Kubernetes Ubuntu Linux
Kubernetes(K8S)集群管理Docker容器(部署篇)
Kubernetes(K8S)集群管理Docker容器(部署篇)
|
14天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
14天前
|
Kubernetes Shell 网络安全
Shell脚本快速部署Kubernetes(K8S v1.1版本)集群系统
Shell脚本快速部署Kubernetes(K8S v1.1版本)集群系统
|
12天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第26天】 在动态且不断增长的云计算环境中,维护高性能的 Kubernetes 集群是一个挑战。本文将探讨一系列实用的策略和工具,旨在帮助运维专家监控、分析和优化 Kubernetes 集群的性能。我们将讨论资源分配的最佳实践,包括 CPU 和内存管理,以及集群规模调整的策略。此外,文中还将介绍延迟和吞吐量的重要性,并提供日志和监控工具的使用技巧,以实现持续改进的目标。