Kubernetes快速入门
文章目录
一、Kubernetes简介
本质上来说,Kubernetes是云原生微服务(cloud-native microservice)应用的编排器(orchestrator)。
- 微服务:是有由很多小型专用部件组成,这些部件被松散的耦合在一起,形成一个有用的应用。
- 云原生:
- 按需扩缩容:应用和相关基础设施根据需求自动扩缩容
- 自我修复
- 支持零停机时间滚动更新:无需关闭应用的更新,是用户无感的
- 可以在任何有Kubernetes的地方运行
- 编排器:将一组微服务聚集在一起,并将它们组织成一个能创造价值的应用。同时提供云原生功能。
Kubernetes(“舵手”)
二、为什么需要Kubernetes
- 平衡竞争环境
- Kubernetes作为云的操作系统的概念
- 可以部署时随时在不同的云之间过渡
- 可以实现多云
- 可以更轻松地在云和本地之间过渡
三、Kubernetes集群构成
一个Kubernetes集群是一个或多个安装了Kubernetes的机器。这些机器被称为节点。
- 主节点:托管控制面板(拥有多个主节点可以实现高可用性,隔离故障域)。
- API服务器:提供管理控制的接口
- 调度器:选择在哪些节点运行用户应用
- 存储器:存储集群及所有应用的状态
- 云控制器:允许Kubernetes与云服务器集成
- …
- 工作节点:运行用户应用
- kubelet:是主Kubernetes代理,将工作节点加到集群中,并与控制面板进行通信
- 容器运行时:负责启动和关闭容器
kubectl命令行工具
四、获取Kubernetes
4.1 在笔记本电脑上通过Docker Desktop获取Kubernetes
(单节点Kubernetes集群,仅仅适合开发使用,不建议用于生产)
-
安装 Docker Desktop(Windows)
-
进入Docker官网
-
运行安装程序,无脑Next即可
-
安装完成打开Docker Desktop
-
如果遇到如下问题(WSL版本问题)
根据提示有两个方法可以解决,这里我试了方法一不行,方法二成功解决-
方法一:控制台运行如下命令
wsl --update
-
方法二:下载wsl更新程序并运行
-
-
-
Kubernetes默认是disable的,需要在设置中勾选(settings->Kubernetes->Enable Kuberentes)
-
启动成功左下将出现Kubernetes状态图标
-
可以通过如下命令验证docker是否安装成功
docker --version
-
可以通过如下命令查看Kubernetes是否安装并成功启动
kubectl version -o yaml
4.2 在云上通过LKE获取Kubernetes
Linode Kubernetes Engine https://www.linode.com/
五、创建容器化应用
5.1 前提条件
- git https://git-scm.com/
- Docker https://www.docker.com/
- Docker Hub https://hub.docker.com/
5.2 准备好你的应用代码
示例代码
git clone https://github.com/nigelpoulton/qsk-book.git
- App目录为应用源代码及配置文件所在
- Dockerfile:是Docker指令,用于创建容器镜像 https://www.cnblogs.com/ilovebath/p/16271645.html
- app.js:是应用主文件,是一个node.js应用
- botstrap.css:样式文件
- package.json:依赖配置文件
- views:页面视图目录
5.3 构建容器镜像
Docker 常用命令 https://www.cnblogs.com/qkshhan/p/14781515.html
在App目录下运行如下命令(运行很久,耐心等待):
docker image build -t yourDockerHubId/qsk-book:1.0 .
运行如下命令确认镜像构建成功
docker image ls
5.4 在代码库上托管镜像(可选)
这里以Docker Hub为例
使用如下命令将镜像推送到Docker Hub
docker image push yourDockerHubId/qsk-book:1.0
-
首次push会出现如下错误
原因是你还没有登录,所以没有权限,运行如下命令登录docker即可(按照提示输入用户名及密码)docker login
再次使用上面的命令推送镜像
访问Docker Hub确认推送成功
六、在Kubernetes上运行应用
6.1 验证K8s集群
kubectl get nodes
6.2 将应用部署到K8s
-
Pod:是一个围绕容器的轻量级包装器
-
pod.yml为其配置文件(在qsk-book目录下) https://blog.csdn.net/qq_48480384/article/details/126989905
apiVersion: v1 # 正在部署的对象的版本 kind: Pod # 正在部署的对象的类型 metadata: # Pod的名称和一个标记 name: first-pod labels: project: qsk-book spec: # 指定Pod将执行的容器及运行它的端口 containers: - name: web-ctr image: yourDockerHubId/qsk-book:1.0 # 这里需要换成你的ID ports: - containerPort: 8080
-
通过以下命令部署上述Pod(在qsk-book目录下)
kubectl apply -f pod.yml
-
确认部署pod成功
kubectl get pods
-
通过以下两个命令可以查看pod的配置和状态
kubectl describe pod first-pod
kubectl get pod first-pod
-
可以通过以下命令删除一个pod
kubectl delete pod first-pod
6.3 连接到应用
-
Service: 提供与运行在pod中的应用的连通性
-
svc-local.yml为其配置文件(在qsk-book目录下,svc-cloud.yml是部署在云上所用的配置文件,如LKE)
apiVersion: v1 # 正在部署的对象的版本 kind: Service # 正在部署的对象的类型 metadata: name: svc-local # 名称 spec: type: NodePort # 本地集群无法访问面向互联网的负载均衡器 # type: LoadBalancer #在云上配置一个面向互联网的负载均衡器 ports: - port: 8080 protocol: TCP targetPort: 8080 nodePort: 31111 selector: # 选择器,与pod对应 project: qsk-book
-
部署Service
kubectl apply -f svc-local.yml
-
验证部署结果
kubectl get svc
-
同上,你可以使用如下命令查看详细信息
kubectl describe svc svc-local
-
在本地浏览器访问http://localhost:31111
-
可以通过如下命令删除一个svc
kubectl delete svc svc-local
七、Kubernetes自我修复功能演示
7.1 Deployment对象介绍
-
Deployment:提供自我修复、自动扩缩容、滚动更新功能
-
deploy.yml为其配置文件(在qsk-book目录下)
apiVersion: apps/v1 # 对象版本 kind: Deployment # 对象类型 metadata: name: qsk-deploy spec: replicas: 5 # pod有多少个副本 selector: matchLabels: # 告诉Deployment控制器 project: qsk-book # 管理哪些pod template: metadata: labels: project: qsk-book # pod标签 spec: containers: - name: qsk-pod imagePullPolicy: Always # 永远不使用本地镜像 ports: - containerPort: 8080 # 端口号 image: yourDockerHubId/qsk-book:1.0 # 镜像
7.2 pod故障的自我修复
-
删除之前的pod
kubectl delete pod first-pod
-
查看pod及deployment
kubectl get pods
kubectl get deployments
-
部署Deployment
kubectl apply -f deploy.yml
-
再次查看pod及deployment
部署需要一定时间,需要多次查看确认 -
删除某一个pod来模拟故障
kubectl delete pod xxxxx
- 重新查看pod及deployment
八、扩缩容操作
-
通过修改deploy.yml文件spec.replicas来实现扩缩容,修改后需要重新发送给K8s
kubectl apply -f deploy.yml
-
通过Cli指令
kubectl scale --replicas 5 deployment/qsk-deploy
-
注意!
建议通过修改文件来进行操作,如果在使用Cli命令操作后出现重新提交yml文件的操作,将会导致相应的自动更新,这将会导致意想不到的问题。
只选择一种方法来进行更新操作即可,推荐通过修改文件来更新。
九、滚动更新
-
编辑deploy.yml配置滚动更新
apiVersion: apps/v1 kind: Deployment metadata: name: qsk-deploy spec: replicas: 5 selector: matchLabels: project: qsk-book minReadySeconds: 20 # 添加这一行 更新间隔时间 strategy: # 添加这一行 type: RollingUpdate # 添加这一行 更新方式 滚动更新 rollingUpdate: # 添加这一行 maxUnavailable: 0 # 添加这一行 运行更新过程中减少0个pod maxSurge: 1 # 添加这一行 允许更新过程中增加1个pod 这两行配合起来即一次替换一个pod template: metadata: labels: project: qsk-book spec: containers: - name: qsk-pod imagePullPolicy: Always ports: - containerPort: 8080 image: yourDockerHubId/qsk-book:1.1 # 版本改为1.1
-
重新提交deploy.yml
kubectl apply -f deploy.yml
-
可以通过如下命令查看更新进度
kubectl rollout status deployment qsk-deploy
- 在更新的同时查看http://localhost:31111/可以观察应用变化,最终结果如下